Trailing-Edge
-
PDP-10 Archives
-
decuslib10-08
-
43,50476/damenu.for
There are 2 other files named damenu.for in the archive. Click here to see a list.
C RENBR(DAMENU/WRITE DATA STATEMENTS DEFINING COMMANDS)
C
C DONALD BARTH, HARVARD BUSINESS SCHOOL
C
C THIS PROGRAM CONSTRUCTS DATA STATEMENTS WHICH DEFINE
C THE DICTIONARY REQUIRED BY FASP ROUTINES SUCH AS
C DAWORD AND DAHEST FOR WORD IDENTIFICATION. THE FIRST
C 80 CHARACTERS ARE READ FROM EACH LINE OF THE INPUT
C FILE. THE FIRST LINE OF THE INPUT FILE IS COPIED
C INTO THE OUTPUT FILE AS A COMMENT AND SHOULD DESCRIBE
C THE CONTENTS OF THE FILE. THE SECOND LINE OF THE
C INPUT FILE MUST CONTAIN SEPARATED BY SPACES THE NAMES
C BY WHICH THE FOLLOWING 6 ITEMS ARE TO BE REPRESENTED
C IN THE DATA STATEMENTS GENERATED BY THIS PROGRAM
C 1 THE VARIABLE WHICH CONTAINS THE TOTAL NUMBER OF
C CHARACTERS IN ALL WORDS IN THE DICTIONARY.
C 2 THE VARIABLE WHICH CONTAINS THE TOTAL NUMBER OF
C WORDS IN THE DICTIONARY.
C 3 THE ARRAY WHICH CONTAINS IDENTICAL VALUES FOR
C WORDS WHICH ARE SYNONYMS. THESE VALUES ARE
C SPECIFIED FOR EACH WORD BY A NUMBER AT THE LEFT
C END OF EACH SUBSEQUENT LINE IN THE FILE. DATA
C STATEMENTS DEFINING THIS ARRAY ARE GENERATED ONLY
C IF SOME VALUES WITHIN THE ARRAY ARE SPECIFIED,
C BUT THE NAME OF THE ARRAY MUST STILL BE SUPPLIED.
C 4 THE ARRAY WHICH CONTAINS THE CHARACTERS FORMING
C THE WORDS IN THE DICTIONARY.
C 5 THE ARRAY WHICH CONTAINS THE LENGTH OF EACH WORD
C IN THE DICTIONARY.
C 6 THE ARRAY WHICH CONTAINS THE ARGUMENT TYPE
C ASSOCIATED WITH EACH WORD IN THE DICTIONARY.
C THIS IS SPECIFIED FOR EACH WORD BY A NUMBER AT
C THE RIGHT END OF EACH SUBSEQUENT LINE IN THE
C FILE. DATA STATEMENTS DEFINING THIS ARRAY ARE
C GENERATED ONLY IF SOME VALUES WITHIN THE ARRAY
C ARE SPECIFIED, BUT THE NAME OF THE ARRAY MUST
C STILL BE SUPPLIED.
C IF THE SECOND LINE DOES NOT CONTAIN AT LEAST 6 GROUPS
C OF CHARACTERS, THEN ADDITIONAL NAMES WILL BE READ
C FROM SUBSEQUENT LINES UNTIL 6 HAVE BEEN SPECIFIED.
C
C EACH SUBSEQUENT LINE CONTAINS A WORD IDENTIFICATION
C NUMBER FOLLOWED BY THE SPELLING OF THE WORD. IF AN
C ABBREVIATION OF THIS WORD IS TO BE RECOGNIZED EVEN
C THOUGH IT IS NOT UNIQUE ACROSS THE ENTIRE DICTIONARY,
C THEN THIS ABBREVIATION OR ABBREVIATIONS SHOULD FOLLOW
C THE COMPLETE SPELLING SEPARATED FROM IT AND EACH
C OTHER BY COMMAS, WITH THE LONGEST ABBREVIATIONS
C COMING FIRST. SPACES ARE IGNORED AT THE START OR END
C OF THE SPELLING OF A WORD. IF TWO OR MORE WORDS
C APPEAR ON A SINGLE LINE BUT ARE NOT SEPARATED BY
C COMMAS, THEN THE RESULTING DICTIONARY WILL INCLUCE
C THESE WORDS AS A SINGLE ENTRY IN WHICH THESE WORDS
C ARE SEPARATED BY SINGLE SPACES. FOR EXAMPLE, IF THE
C FIRST 3 LETTERS OF THE WORD DUPLICATE THOSE OF SOME
C OTHER WORD, BUT THE WORD BEING DESCRIBED ON THE
C CURRENT LINE IS TO BE SELECTED BY ITS 1, 2 OR 3
C LETTER ABBREVIATIONS, THEN THE FULL SPELLING WOULD BE
C FOLLOWED BY A COMMA AND THE 3 LETTER ABBREVIATION,
C THEN BY A COMMA AND THE 2 LETTER ABBREVIATION AND
C FINALLY BY A COMMA AND THE SINGLE LETTER
C ABBREVIATION. (ALTERNATIVELY, THE ABBREVIATIONS CAN
C BE ENTERED IN SUBSEQUENT LINES, BUT AGAIN THE FULL
C SPELLING SHOULD APPEAR FIRST AND BE FOLLOWED BY ITS
C LONGEST ABBREVIATION.) A SINGLE DIGIT APPEARING AT
C THE RIGHT END OF EACH LINE WOULD DESCRIBE FOR THE
C ROUTINE DAHEST THAT THE WORDS APPEARING TO THE LEFT
C OF THE DIGIT ARE TO TAKE ARGUMENTS OF THE FOLLOWING
C TYPES
C 0 (OR ABSENT NUMBER) WILL NOT ALLOW THE WORD TO
C ACCEPT ANY ARGUMENTS.
C 1 WILL ALLOW THE WORD TO ACCEPT MULTIPLE ARGUMENTS
C OF THE SAME TYPE AS ITS FIRST ARGUMENT.
C 2 WILL ALLOW THE WORD TO ACCEPT MULTIPLE WORD
C ARGUMENTS.
C 3 WILL ALLOW THE WORD TO ACCEPT MULTIPLE NUMERIC
C ARGUMENTS.
C 4 WILL ALLOW THE WORD TO ACCEPT MULTIPLE TEXT
C STRING ARGUMENTS.
C 5 6 7 OR 8, SAME AS 1 2 3 OR 4 RESPECTIVELY, EXCEPT
C THAT NUMBERS IF FOUND ARE RETURNED AS REALS
C RATHER THAN AS INTEGERS.
C 9 WILL ALLOW WORD TO ACCEPT MULTIPLE TEXT STRINGS
C WHICH BEGIN WITH ANY CHARACTER WHICH IS NOT A
C PUNCTUATION MARK.
C THE INPUT FILE IS TERMINATED BY A BLANK LINE.
C
C FOR EXAMPLE, IF THE DICTIONARY CONTAINS THE WORD
C EXAMINE WHICH IS TO
C BE IDENTIFIED BY THE NUMBER 135
C BE ABBREVIATED AS EITHER EX OR E
C TAKE MULTIPLE ARGUMENTS OF SAME TYPE AS ITS FIRST
C AND THE WORD EXCHANGE WHICH IS TO
C BE IDENTIFIED BY THE NUMBER -8
C NOT BE ABBREVIATED AS EITHER EX OR E
C TAKE MULTIPLE NUMERIC ARGUMENTS
C THEN THE INPUT FILE WOULD CONTAIN
C
C 135 EXAMINE,EX,E 1
C -8 EXCHANGE 3
C
C OR
C
C 135 EXAMINE 1
C 135 EX 1
C 135 E 1
C -8 EXCHANGE 3
C
DIMENSION IBUFFR(80),KMDLTR(1000),KMDTYP(200),
1KMDWID(200),KMDARG(200),INAME(6),JNAME(6),KNAME(6),
2LNAME(6),MNAME(6),NNAME(6),IDIGIT(10)
DOUBLE PRECISION NAMSRC,NAMOUT
DATA IDIGIT/1H0,1H1,1H2,1H3,1H4,1H5,1H6,1H7,1H8,1H9/
DATA ISPACE,KOMMA,KLEFT,KRIGHT/1H ,1H,,1H(,1H)/
C
C MAXBFR = NUMBER OF CHARACTERS READ INTO IBUFFR ARRAY
C FROM EACH LINE OF INPUT FILE
C MAXCMD = DIMENSION OF KMDTYP AND KMDWID AND KMDARG
C ARRAYS, MAXIMUM NUMBER OF WORDS IN
C DICTIONARY
C MAXLTR = DIMENSION OF KMDLTR ARRAY, MAXIMUM NUMBER OF
C CHARACTERS IN ALL WORDS IN DICTIONARY
C IDSK = UNIT NUMBER CONTAINING INPUT FILE
C JDSK = UNIT NUMBER TO WHICH OUTPUT IS WRITTEN
DATA MAXBFR,MAXLTR,MAXCMD/80,1000,200/
DATA IDSK,JDSK/1,20/
C
C ASK USER FOR FILE NAMES AND OPEN FILES
TYPE 1
1 FORMAT(19H INPUT FILE NAME = ,$)
ACCEPT 2,NAMSRC
2 FORMAT(1A10)
OPEN(UNIT=IDSK,FILE=NAMSRC,ACCESS='SEQIN')
TYPE 3
3 FORMAT(20H OUTPUT FILE NAME = ,$)
ACCEPT 2,NAMOUT
OPEN(UNIT=JDSK,FILE=NAMOUT,ACCESS='SEQOUT')
C
C KNTLTR = NUMBER OF CHARACTERS IN KMDLTR ARRAY
C KNTCMD = NUMBER OF COMMANDS IN KMDTYP, KMDWID AND
C KMDARG ARRAYS
KNTLTR=0
KNTCMD=0
IFANY=0
JFANY=0
C
C READ FIRST LINE OF FILE CONTAINING COMMENT
READ(IDSK,19)IBUFFR
LIMIT=MAXBFR+1
4 LIMIT=LIMIT-1
IF(LIMIT.LE.1)GO TO 5
IF(IBUFFR(LIMIT).EQ.ISPACE)GO TO 4
5 WRITE(JDSK,6)(IBUFFR(I),I=1,LIMIT)
6 FORMAT(1HC,80A1)
WRITE(JDSK,6)
C
C READ SECOND LINE OF FILE CONTAINING ARRAY NAMES
DO 7 I=1,6
INAME(I)=ISPACE
7 JNAME(I)=ISPACE
KONTRL=0
8 READ(IDSK,19)IBUFFR
LOCAL=0
DO 17 INDEX=1,MAXBFR
IF(IBUFFR(INDEX).EQ.ISPACE)GO TO 16
IF(IBUFFR(INDEX).EQ.KOMMA)GO TO 16
IF(LOCAL.NE.0)GO TO 9
KONTRL=KONTRL+1
IF(KONTRL.GT.6)GO TO 18
9 LOCAL=LOCAL+1
IF(LOCAL.GT.6)GO TO 17
GO TO(10,11,12,13,14,15),KONTRL
10 ILONG=LOCAL
INAME(ILONG)=IBUFFR(INDEX)
GO TO 17
11 JLONG=LOCAL
JNAME(JLONG)=IBUFFR(INDEX)
GO TO 17
12 KLONG=LOCAL
KNAME(KLONG)=IBUFFR(INDEX)
GO TO 17
13 LLONG=LOCAL
LNAME(LLONG)=IBUFFR(INDEX)
GO TO 17
14 MLONG=LOCAL
MNAME(MLONG)=IBUFFR(INDEX)
GO TO 17
15 NLONG=LOCAL
NNAME(NLONG)=IBUFFR(INDEX)
GO TO 17
16 LOCAL=0
17 CONTINUE
IF(KONTRL.LT.6)GO TO 8
C
C READ THE DESCRIPTIONS OF THE COMMANDS
18 READ(IDSK,19,END=30)IBUFFR
19 FORMAT(80A1)
ITYPE=0
C
C GET IDENTIFYING NUMBER
INDEX=1
CALL DAIHFT(0,1,0,IBUFFR,MAXBFR,
1INDEX,KIND,ISHIFT,JSHIFT,KSHIFT,LSHIFT,ITYPE)
C
C GET ARGUMENT TYPE
LIMIT=MAXBFR+1
20 LIMIT=LIMIT-1
IF(LIMIT.LT.INDEX)GO TO 30
IF(IBUFFR(LIMIT).EQ.ISPACE)GO TO 20
DO 21 I=1,10
IF(IBUFFR(LIMIT).NE.IDIGIT(I))GO TO 21
JTYPE=I-1
KTYPE=1
GO TO 22
21 CONTINUE
LIMIT=LIMIT+1
JTYPE=0
KTYPE=0
C
C STORE COMMAND NAME OR NAMES
22 KNTINI=KNTLTR
JSPACE=0
KSPACE=0
23 IF(INDEX.LT.LIMIT)GO TO 24
IF(JSPACE.EQ.0)GO TO 18
GO TO 29
24 IF(IBUFFR(INDEX).EQ.KOMMA)GO TO 28
IF(IBUFFR(INDEX).EQ.ISPACE)GO TO 26
IF(JSPACE.LE.0)GO TO 25
IF(KNTINI.GE.MAXLTR)GO TO 30
KNTINI=KNTINI+1
KMDLTR(KNTINI)=ISPACE
KSPACE=100
25 IF(KNTINI.GE.MAXLTR)GO TO 30
KNTINI=KNTINI+1
KMDLTR(KNTINI)=IBUFFR(INDEX)
JSPACE=-1
GO TO 27
26 IF(JSPACE.LT.0)JSPACE=1
27 INDEX=INDEX+1
GO TO 23
28 INDEX=INDEX+1
IF(JSPACE.EQ.0)GO TO 23
29 IF(KNTCMD.GE.MAXCMD)GO TO 30
KNTCMD=KNTCMD+1
KMDTYP(KNTCMD)=ITYPE
KMDWID(KNTCMD)=KNTINI-KNTLTR+KSPACE
KNTLTR=KNTINI
KMDARG(KNTCMD)=JTYPE
IF(KIND.EQ.3)IFANY=1
IF(KTYPE.NE.0)JFANY=1
GO TO 22
C
C PREPARE TO WRITE COMMENT LINES DESCRIBING COMMANDS
30 IF(JFANY.EQ.0)GO TO 58
WRITE(JDSK,31)
31 FORMAT(1HC,5X,25HMULTIPLE NUMERIC LENGTH/1HC)
INDEX=0
IRIGHT=0
LAST=KMDTYP(1)+1
C
C OBTAIN NEXT COMMAND TO BE INCLUDED IN COMMENTS
32 INDEX=INDEX+1
IF(INDEX.GT.KNTCMD)GO TO 56
ILEFT=IRIGHT+1
I=KMDWID(INDEX)
IF(I.GE.100)I=I-100
IRIGHT=IRIGHT+I
C
C TEST IF COMMAND IS ABBREVIATION OF PREVIOUS COMMAND
IF(IFANY.EQ.0)GO TO 34
IF(LAST.NE.KMDTYP(INDEX))GO TO 34
IF((JRIGHT-JLEFT).LE.(IRIGHT-ILEFT))GO TO 34
J=JLEFT
DO 33 I=ILEFT,IRIGHT
IF(KMDLTR(I).NE.KMDLTR(J))GO TO 34
33 J=J+1
J=IRIGHT-ILEFT+1
K=JLEFT+J
WRITE(JDSK,45)J,(KMDLTR(I),I=ILEFT,IRIGHT),KLEFT,
1(KMDLTR(I),I=K,JRIGHT),KRIGHT
GO TO 32
C
C COMMENT DESCRIBING COMMAND WHICH IS NOT ABBREVIATED
34 LAST=KMDTYP(INDEX)
JLEFT=ILEFT
JRIGHT=IRIGHT
JTYPE=KMDARG(INDEX)+1
J=IRIGHT-ILEFT+1
GO TO(35,36,37,38,39,40,41,42,43,44),JTYPE
35 WRITE(JDSK,46)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
36 WRITE(JDSK,47)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
37 WRITE(JDSK,48)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
38 WRITE(JDSK,49)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
39 WRITE(JDSK,50)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
40 WRITE(JDSK,51)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
41 WRITE(JDSK,52)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
42 WRITE(JDSK,53)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
43 WRITE(JDSK,54)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
44 WRITE(JDSK,55)LAST,J,(KMDLTR(I),I=ILEFT,IRIGHT)
GO TO 32
45 FORMAT(1HC,23X,1I3,1X,80A1)
46 FORMAT(1HC,1I7,16H NONE NONE ,1I3,1X,80A1)
47 FORMAT(1HC,1I7,16H DYNAMIC INTEGER,1I3,1X,80A1)
48 FORMAT(1HC,1I7,16H WORD INTEGER,1I3,1X,80A1)
49 FORMAT(1HC,1I7,16H NUMBER INTEGER,1I3,1X,80A1)
50 FORMAT(1HC,1I7,16H TEXT INTEGER,1I3,1X,80A1)
51 FORMAT(1HC,1I7,16H DYNAMIC REAL ,1I3,1X,80A1)
52 FORMAT(1HC,1I7,16H WORD REAL ,1I3,1X,80A1)
53 FORMAT(1HC,1I7,16H NUMBER REAL ,1I3,1X,80A1)
54 FORMAT(1HC,1I7,16H TEXT REAL ,1I3,1X,80A1)
55 FORMAT(1HC,1I7,16H PARENTHETICAL ,1I3,1X,80A1)
C
C GENERATE DIMENSION STATEMENTS
56 WRITE(JDSK,57)
57 FORMAT(1HC)
58 IF(IFANY.NE.0)CALL DASAVE(1,3,53,10,KMDTYP,
1KNTCMD,KMDLTR,KNTLTR,KNAME,KLONG,JDSK,IERR)
CALL DASAVE(1,-1,53,10,KMDTYP,
1KNTCMD,KMDLTR,KNTLTR,LNAME,LLONG,JDSK,IERR)
CALL DASAVE(1,3,53,10,KMDWID,
1KNTCMD,KMDLTR,KNTLTR,MNAME,MLONG,JDSK,IERR)
IF(JFANY.NE.0)CALL DASAVE(1,3,53,10,KMDARG,
1KNTCMD,KMDLTR,KNTLTR,NNAME,NLONG,JDSK,IERR)
C
C GENERATE EQUIVALENCE STATEMENTS
WRITE(JDSK,57)
IF(IFANY.NE.0)CALL DASAVE(2,3,53,10,KMDTYP,
1KNTCMD,KMDLTR,KNTLTR,KNAME,KLONG,JDSK,IERR)
CALL DASAVE(2,-1,53,10,KMDTYP,
1KNTCMD,KMDLTR,KNTLTR,LNAME,LLONG,JDSK,IERR)
CALL DASAVE(2,3,53,10,KMDWID,
1KNTCMD,KMDLTR,KNTLTR,MNAME,MLONG,JDSK,IERR)
IF(JFANY.NE.0)CALL DASAVE(2,3,53,10,KMDARG,
1KNTCMD,KMDLTR,KNTLTR,NNAME,NLONG,JDSK,IERR)
C
C GENERATE DATA STATEMENTS
WRITE(JDSK,59)INAME,JNAME,KNTLTR,KNTCMD
59 FORMAT(1HC/36HC NUMBER OF CHARACTERS AND WORDS/
111H DATA ,6A1,1H,6A1,1H/,1I4,1H,,1I4,1H/)
IF(IFANY.EQ.0)GO TO 61
WRITE(JDSK,60)
60 FORMAT(1HC/37HC NUMBER IDENTIFYING EACH COMMAND)
CALL DASAVE(3,3,53,10,KMDTYP,
1KNTCMD,KMDLTR,KNTLTR,KNAME,KLONG,JDSK,IERR)
61 WRITE(JDSK,62)
62 FORMAT(1HC/34HC LETTERS FORMING EACH COMMAND)
CALL DASAVE(3,-1,53,10,KMDTYP,
1KNTCMD,KMDLTR,KNTLTR,LNAME,LLONG,JDSK,IERR)
WRITE(JDSK,63)
63 FORMAT(1HC/28HC LENGTH OF EACH COMMAND)
CALL DASAVE(3,3,53,10,KMDWID,
1KNTCMD,KMDLTR,KNTLTR,MNAME,MLONG,JDSK,IERR)
IF(JFANY.EQ.0)GO TO 65
WRITE(JDSK,64)
64 FORMAT(1HC/27HC TYPE OF ARGUMENT LIST)
CALL DASAVE(3,3,53,10,KMDARG,
1KNTCMD,KMDLTR,KNTLTR,NNAME,NLONG,JDSK,IERR)
65 STOP
C376787486395$'
END