/SNOBOL 8.2 JMS I XINIT XIND X0 XVLEN XTOP //WORKING DOCUMENTATION GENERATOR // // WRITTEN BY BILL NOWICKI // NORTHWESTERN UNIVERSITY // COMPUTER SCIENCE RESEARCH LABORATORY // MAY, 1976 // UPDATED: DECMEBER 1, 1976 // //+GENERAL INFORMATION // // THIS PROGRAM CAN BE USED TO GENERATE A WORKING DOCUMENT //FROM A SOURCE PROGRAM WHICH FOLLOWS THE RULES FOR COMMENTING //OUTLINED BELOW. USUALLY THIS WILL BE A "PAL" SOURCE, ALTHOUGH //OTHER LANGUAGES MAY BE ADDED IN THE FUTURE. //THIS IS A "SNOBOL" PROGRAM WRITTEN FOR THE "SNOBOL 8.2" COMPILER //TO RUN UNDER "OS/8". // // THE PROGRAM GENERATES COMMANDS FOR THE PROGRAM "RUNOFF" //(FORMERLY CALLED "PRINTR") //WHICH ASSUMES ALL INPUT IS IN UPPER CASE. HOWEVER, ANY LOWER CASE //COMMENTS WILL BE TRANSMITTED IN LOWER CASE. //THE ONLY MAJOR DRAWBACK IS THAT THE PARAGRAPH DESCRIPTIONS //FOLLOWING THE /+ FLAG CHARACTER ARE MAPPED INTO //UPPER/LOWER CASE IN A NON-INTELLIGENT FASHION. //TO SEE EXACTLY HOW THIS IS DONE, CONSULT THE "RUNOFF" MANUAL, //KEEPING IN MIND THAT THE MODE USED IS: "FILL", "JUSTIFY", //"AUTOPARAGRAPH", "AUTOCAPITALIZE", AND "FLAGCAPITALIZE#_"". //THIS ESSENTIALLY MEANS THAT ALL SENTANCES MUST END WITH A PERIOD, //PARAGRAPHS MUST BE SEPARATED BY A BLANK "COMMENT" LINE //FOLLOWED BY A LINE STARTING WITH TWO SPACES, AND NAMES //WHICH SHOULD REMAIN IN CAPS SHOULD BE ENCLOSED IN QUOTES. //IF THIS AUTOMATIC CAPITALIZTION FEATURE IS NOT DESIRED, //ANSWER THE RUN-TIME QUESTION: ^^AUTO CAPS (Y OR N) ?\\ //WITH AN "N". // // ALL FLAG CHARACTERS MUST BE PRECEEDED BY A //SLASH AS THE FIRST NON-BLANK CHARACTER IN THE LINE. //THE FOLOWING IS A TABLE OF THE PRESENT FLAG CHARACTERS //AND A SHORT DESCRIPTION OF THE EFFECT OF EACH: // //=FLAG NAME EFFECT // + "PLUS" ^PARAGRAPH DESCRIPTION // - "MINUS" ^SEARCHES FOR NEXT "PLUS" // & "CALLING" "SEQUENCE" ^OUTPUTS COMMENTS AS THEY ARE, // WITH NO FILLING, CASE MAPPING, ETC. // # "ROUTINES" "USED" ^DITTO // ; "LOGIC" ^DITTO // * "GLOBAL" "VARIABLES" ^DITTO // = "TABLE" ^DITTO // $ "LOCATIONS" ^DITTO // @ "VARIABLES" ^PRINTS OUT EVERYTHING UNTIL THE NEXT // FLAG CHARACTER. // ! "ENTRY" "POINTS" ^TREATS FOLLOWING LINES STARTING WITH // "PLUS" AS NAMES OF ENTRY POINTS. // " "TIMING" ^SEPARATE PARAGRAPH IF IN "PLUS" MODE // : "CODE" ^MUST BE ONE OF THESE OR ANOTHER FLAG // CHARACTER AFTER EVERY "PLUS". // //-GENERAL INFORMATION //+STRING CONSTANTS // // THE USER CAN CHANGE THE FLAG CHARACTERS FOR USE WITH //SOME OTHER LANGUAGE IF DESIRED. //THE FOLLOWING ARE THE PRESENT SETTINGS: //@ / T = .A211 /TAB (ASCII 211) MAY WANT TO DEFINE AS JMS I XPAT 0002 T XEQC XL0001 / /THE SEQUENCE .A377 .A211 / SP = " " /SPACE JMS I XPAT 0002 SP XEQC XL0002 / S = "/" /COMMENT CHARACTER JMS I XPAT 0002 S XEQC XL0003 / FP = "+" /START OF MODULE JMS I XPAT 0002 FP XEQC XL0004 / FS = "&" /CALLING SEQUENCE JMS I XPAT 0002 FS XEQC XL0005 / FS2 = "<" /OLD FORM FOR CALLING SEQUENCE JMS I XPAT 0002 FS2 XEQC XL0006 / FR = "#" /ROUTINES CALLED JMS I XPAT 0002 FR XEQC XL0007 / FR2 = ">" /OLD FORM FOR ROUTINES USED JMS I XPAT 0002 FR2 XEQC XL0010 / FL = ";" /LOGIC JMS I XPAT 0002 FL XEQC XL0011 / FC = ":" /CODE JMS I XPAT 0002 FC XEQC XL0012 / FM = "-" /MINUS (END OF MODULE) JMS I XPAT 0002 FM XEQC XL0013 / FG = "*" /GLOBAL VARIABLES JMS I XPAT 0002 FG XEQC XL0014 / FV = "@" /LOCAL VARIABLES JMS I XPAT 0002 FV XEQC XL0015 / FE = "!" /ENTRY POINTS JMS I XPAT 0002 FE XEQC XL0016 / FT = "=" /TABULAR DATA JMS I XPAT 0002 FT XEQC XL0017 / FD = "$" /LOCATIONS USED JMS I XPAT 0002 FD XEQC XL0020 //-STRING CONSTANTS // // //+USER INPUT // THE PROGRAM FIRST ASKS FOR THE INPUT AND //OUTPUT FILES. AFTER GETTING //TWO GOOD RESPOSES, THE PROGRAM WILL PRINT: // ^^AUTO CAPS (Y OR N) ?\\ // ANSWER THIS QUESTION DEPENDING ON IF IT IS DESIRED //FOR "RUNOFF" TO DO THE UPPER/LOWER CASE CONVERSIONS. //THE PROGRAM WILL THEN PRINT: // "MODULES" "DOCUMENTED:" // // IT WILL OUTPUT SOME "RUNOFF" COMMANDS TO THE FILE //AND USE THE FIRST LINE OF INPUT (IF IT IS A COMMENT) AS //THE TITLE OF THE DOCUMENT. //THE PROGRAM PASSES DOCUMENTATION THROUGH IN FIVE MAJOR //MODES WHICH ARE DESCRIBED BELOW. // //:CODE: /ASK, OUTHOLD = "INPUT:" ASK,JMS I XPAT 0002 OUTHOL XEQC XL0021 / .LOOKUP INPUT :F(ASK) JMS I XLOOKUP INPUT TAD XSUCCES SZA CLA JMP ASK /ASKO, OUTHOLD = "OUTPUT:" ASKO,JMS I XPAT 0002 OUTHOL XEQC XL0022 / .ENTER INPUT :F(ASKO) JMS I XENTER INPUT TAD XSUCCES SZA CLA JMP ASKO /ASKOP, OUTHOLD = "AUTO CAPS (Y OR N) ?" ASKOP,JMS I XPAT 0002 OUTHOL XEQC XL0023 // / AUTO = INPUT JMS I XPAT 0002 AUTO XEQC INPUT JMP I (.&7600+200 PAGE XP0001=. / AUTO_ "Y"!"N" :F(ASKOP) /CHECK FOR VALID RESPONSE JMS I XPAT 0003-4000 AUTO XL0024 XORC XL0025 TAD XSUCCES SZA CLA JMP ASKOP / AUTO_ "Y" ** = "\\" /SETUP FOR FLAG JMS I XPAT 0006-4000 AUTO XL0024 XFLC;0;0 XEQC XL0026 / AUTO_ "N" **= /FORGET ABOUT OTHER GARBAGE JMS I XPAT 0005-4000 AUTO XL0025 XFLC;0;0 XEQC // // WE HAVE GOOD FILES, SET UP SOME STUFF // / OUTPUT = "MODULES DOCUMENTED:" JMS I XPAT 0002 OUTPUT XEQC XL0027 / WRITE = ".NF;.UC" JMS I XPAT 0002 WRITE XEQC XL0030 / LINE = READ /READ THE TITLE LINE JMS I XPAT 0002 LINE XEQC READ / LINE ** "/" = :F(SETUP) /IGNORE IF NON-COMMENT JMS I XPAT 0005 LINE XFLC;0;0 XL0003 XEQC TAD XSUCCES SZA CLA JMP SETUP / WRITE = ".CW; ^&" LINE "\&" /OUTPUT THE UNDERLINED TITLE JMS I XPAT 0004 WRITE XEQC XL0031 LINE XL0032 / WRITE = ".TITLE " LINE JMS I XPAT 0003 WRITE XEQC XL0033 LINE /SETUP, WRITE = AUTO '.AP;.AC;.FLAG CAPITAlIZE ";.NUMBER 1' SETUP,JMS I XPAT 0003 WRITE XEQC AUTO XL0034 // //-USER INPUT // // //+CODE, MINUS, LOOP MODES // // "CODE" MODE IS OBTAINED AT THE BEGINING OF THE FILE, //AND AFTER ANY /- OR /:. IN THIS MODE, NOTHING IS OUTPUT //ALTHOUGH EACH LINE IS SCANNED FOR A /+ IN THE FIRST COLUMN. // //:CODE: /LOOP, LINE = READ :F(EOF) CODE,MINUS,LOOP,JMS I XPAT 0002 LINE XEQC READ TAD XSUCCES SZA CLA JMP EOF / LINE_ S FP = :F(LOOP) /IGNORE EVERYTHING TILL /+ JMS I XPAT 0003-4000 LINE S FP XEQC TAD XSUCCES SZA CLA JMP LOOP //-CODE, MINUS, LOOP // //+PLUS // "PLUS" MODE IS ENTERED AFTER SEEING A SLASH PLUS //IN COLUMN 1. THE COMMENTS AFTER A SLASH PLUS //ARE FIRST SCANNED FOR OTHER FLAG CHARACTERS, //AND THEN ARE SIMPLY TRANSMITTED TO THE OUTPUT //FILE. HOWEVER, THE "RUNOFF" COMMANDS PLACED BEFORE //THE LINES IMPLY THAT ANYTHING ON THE COMMENT LINE IS //PART OF A TEXT PARAGRAPH, AND WILL THEREFORE BE //FILLED AND JUSTIFIED. //:CODE /PLUS, OUTPUT = LINE PLUS,JMS I XPAT 0002 OUTPUT XEQC LINE / /THE FOLOWING MESS OUTPUTS / /SOME NEEDED RUNOFF COMMANDS / WRITE = ".TP 8;.B 2;.CW; ^&^^" LINE "\&" AUTO JMS I XPAT 0005 WRITE XEQC XL0035 LINE XL0032 AUTO / WRITE = ".FILL;.P" /START THE PARAGRAPH JMS I XPAT 0002 WRITE XEQC XL0036 / CAPSYM = ".B 2;.NF;^^" /RESET THE CAPITALIZE SYMBOL JMS I XPAT 0002 CAPSYM XEQC XL0037 / COMSYM = S /RESET THE COMMENT SYMBOL JMS I XPAT 0002 COMSYM XEQC S / TABSYM = T /TAB CHARACTER JMS I XPAT 0002 TABSYM XEQC T JMP I (.&7600+200 PAGE XP0002=. / SPSYM = " " /SET THE SPACE CHARACTER JMS I XPAT 0002 SPSYM XEQC XL0002 /PLOOP, LINE = READ :F(EOF) PLOOP,JMS I XPAT 0002 LINE XEQC READ TAD XSUCCES SZA CLA JMP EOF / LINE_ T COMSYM = COMSYM T /ZAP LEADING TABS SEARCH,JMS I XPAT 0005-4000 LINE T COMSYM XEQC COMSYM T / LINE_ S = :F(PASTST) /IS IT A GOOD COMMENT ? JMS I XPAT 0002-4000 LINE S XEQC TAD XSUCCES SZA CLA JMP PASTST / LINE_ FS = :S(CALSEQ) /& MEANS CALLING SEQUENCE JMS I XPAT 0002-4000 LINE FS XEQC TAD XSUCCES SNA CLA JMP CALSEQ / LINE_ FS2= :S(CALSEQ) /OLD FORM OF CALLING SEQUENCE JMS I XPAT 0002-4000 LINE FS2 XEQC TAD XSUCCES SNA CLA JMP CALSEQ / LINE_ FR = :S(ROUTIN) /# ROUTINES CALLED JMS I XPAT 0002-4000 LINE FR XEQC TAD XSUCCES SNA CLA JMP ROUTIN / LINE_ FR2= :S(ROUTIN) /OLD FORM FOR ROUTINES USED JMS I XPAT 0002-4000 LINE FR2 XEQC TAD XSUCCES SNA CLA JMP ROUTIN / LINE_ FL = :S(LOGIC) /; LOGIC JMS I XPAT 0002-4000 LINE FL XEQC TAD XSUCCES SNA CLA JMP LOGIC / LINE_ FC = :S(CODE) /: CODE JMS I XPAT 0002-4000 LINE FC XEQC TAD XSUCCES SNA CLA JMP CODE / LINE_ FM = :S(MINUS) /- END OF MODULE JMS I XPAT 0002-4000 LINE FM XEQC TAD XSUCCES SNA CLA JMP MINUS / LINE_ FG = :S(GLOBAL) /* GLOBAL VARIABLES JMS I XPAT 0002-4000 LINE FG XEQC TAD XSUCCES SNA CLA JMP GLOBAL / LINE_ FV = :S(VARIABL) /@ VARIABLES JMS I XPAT 0002-4000 LINE FV XEQC TAD XSUCCES SNA CLA JMP VARIAB / LINE_ FE = :S(ENTRYS) /! ENTRY POINTS JMS I XPAT 0002-4000 LINE FE XEQC TAD XSUCCES SNA CLA JMP ENTRYS JMP I (.&7600+200 PAGE XP0003=. / LINE_ FT = :S(TABLE) /= TABLE JMS I XPAT 0002-4000 LINE FT XEQC TAD XSUCCES SNA CLA JMP TABLE / LINE_ FD = :S(LOCS) /$ LOCATIONS JMS I XPAT 0002-4000 LINE FD XEQC TAD XSUCCES SNA CLA JMP LOCS / LINE_ FP = :S(PLUS) /COULD HAVE NESTED /+'S JMS I XPAT 0002-4000 LINE FP XEQC TAD XSUCCES SNA CLA JMP PLUS / :(TABZAP) JMP TABZAP /PASTST, LINE "/" = :S(TABZAP) /WE WANT ALL COMMENTS PASTST,JMS I XPAT 0002 LINE XL0003 XEQC TAD XSUCCES SNA CLA JMP TABZAP / ""_ COMSYM :F(PLOOP) /SHOULD WE PASS NON-COMMENTS ? JMS I XPAT 0001-4000 XL0040 COMSYM TAD XSUCCES SZA CLA JMP PLOOP /TABZAP, LINE TABSYM = :S(TABZAP) /GET RID OF TABS TABZAP,JMS I XPAT 0002 LINE TABSYM XEQC TAD XSUCCES SNA CLA JMP TABZAP / LINE_ SPSYM = /GET RID OF SINGLE SPACES JMS I XPAT 0002-4000 LINE SPSYM XEQC / WRITE = LINE :(PLOOP) /OUTPUT AND CONTINUE JMS I XPAT 0002 WRITE XEQC LINE JMP PLOOP //-PLUS // //+CALSEQ, ROUTINES, LOGIC, GLOBAL, TABLE, LOCS // "TABLE" MODE IS OBTAINED BY ANY OF THE //FOLLOWING FLAG CHARACTERS: < _# * = ; $. //IN THIS MODE EVERYTHING IS PUT IN UPPER CASE THROUGH //"RUNOFF" WITH NO FILLING SO THAT SPACING IS NOT AFFECTED. //:CODE: / COMSYM = S /WE ONLY WANT COMMENTS LOCS,CALSEQ,ROUTIN,LOGIC,GLOBAL,TABLE,JMS I XPAT 0002 COMSYM XEQC S /OUTCAP, WRITE = CAPSYM LINE OUTCAP,JMS I XPAT 0003 WRITE XEQC CAPSYM LINE / TABSYM = .A232 .A232 /CONTROL Z'S SHOULD NEVER EXIST JMS I XPAT 0003 TABSYM XEQC XL0041 XL0041 / SPSYM = TABSYM /SAME FOR HERE JMS I XPAT 0002 SPSYM XEQC TABSYM / CAPSYM = "" :(PLOOP) /CONTINUE JMS I XPAT 0002 CAPSYM XEQC XL0040 JMP PLOOP //-CALSEQ, ROUTINES, LOGIC, GLOBAL, TABLE // //+VARIABLES // "VARIABLE" MODE IS OBTAINED BY THE /@ FLAG. //IN THIS MODE "EVERY" LINE OF INPUT IS SENT TO THE //OUTPUT FILE, ALTHOUGH SLASHES ARE REMOVED FROM COMMENTS. //IT IS VERY IMPORTANT THAT ANOTHER FLAG CHARACTER //IS USED TO GET OUT OF THIS MODE OR THE ENTIRE //PROGRAM WILL BE SENT TO THE OUTPUT FILE. // //:CODE: / COMSYM = "" /SET TO PRINT OUT EVERYTHING VARIAB,JMS I XPAT 0002 COMSYM XEQC XL0040 / :S(OUTCAP) TAD XSUCCES SNA CLA JMP OUTCAP // //-VARIABLES // //+ENTRYS // "ENTRY" MODE IS THE MODE USED TO PROCESS THE //"/!ENTRY" "POINT" FLAG. IN THIS MODE FOLLOWING LINES //STARTING WITH "/+" WILL BE PUT IN CAPS ON THE SAME LINE. //THE FIRST LINE NOT STARTING WITH "/+" GOES BACK INTO "PLUS" //MODE. //:CODE: /ENTRYS, WRITEH = ".P;^" LINE ENTRYS,JMS I XPAT 0003 WRITEH XEQC XL0042 LINE /ENLOOP, LINE = READ :F(EOF) ENLOOP,JMS I XPAT 0002 LINE XEQC READ TAD XSUCCES SZA CLA JMP EOF JMP I (.&7600+200 PAGE XP0004=. / LINE_ S FP = :F(ENEND) JMS I XPAT 0003-4000 LINE S FP XEQC TAD XSUCCES SZA CLA JMP ENEND / WRITE = '"' LINE :(ENLOOP) /OUTPUT AN ENTRY POINT JMS I XPAT 0003 WRITE XEQC XL0043 LINE JMP ENLOOP // /ENEND, WRITEH = ".P;" :(SEARCH) /END OF ENTRY POINTS ENEND,JMS I XPAT 0002 WRITEH XEQC XL0044 JMP SEARCH // //-ENTRYS // /EOF, .OCLOSE :F(CERROR) EOF,JMS I XOCLOSE TAD XSUCCES SZA CLA JMP CERROR / .ICLOSE JMS I XICLOSE / .EXIT JMP I (7600 /CERROR, OUTPUT = "CLOSING ERROR !" CERROR,JMS I XPAT 0002 OUTPUT XEQC XL0045 / .EXIT JMP I (7600 /IOBAD, OUTPUT = "OUTPUT ERROR !" IOBAD,JMS I XPAT 0002 OUTPUT XEQC XL0046 / .END JMP I (7600 //-EOF PAGE X0, T, 0 SP, 0 S, 0 FP, 0 FS, 0 FS2, 0 FR, 0 FR2, 0 FL, 0 FC, 0 FM, 0 FG, 0 FV, 0 FE, 0 FT, 0 FD, 0 AUTO, 0 LINE, 0 CAPSYM, 0 COMSYM, 0 TABSYM, 0 SPSYM, 0 XVLEN=.-X0 XL0002, XX0002 XL0015, XX0015 XL0040, XX0040 XL0001, XX0001 XL0016, XX0016 XL0021, XX0021 XL0023, XX0023 XL0024, XX0024 XL0012, XX0012 XL0014, XX0014 XL0041, XX0041 XL0043, XX0043 XL0004, XX0004 XL0007, XX0007 XL0011, XX0011 XL0045, XX0045 XL0006, XX0006 XL0020, XX0020 XL0026, XX0026 XL0032, XX0032 XL0013, XX0013 XL0017, XX0017 XL0027, XX0027 XL0005, XX0005 XL0010, XX0010 XL0025, XX0025 XL0030, XX0030 XL0031, XX0031 XL0033, XX0033 XL0034, XX0034 XL0035, XX0035 XL0036, XX0036 XL0037, XX0037 XL0042, XX0042 XL0044, XX0044 XL0003, XX0003 XL0022, XX0022 XL0046, XX0046 FIELD 1 *XFIELD1 XIND=0 XX0002,0240 0000 7777 XX0015,0300 0000 7777 XX0040,0000 0000 7777 XX0001,0211 0000 7777 XX0016,0241 0000 7777 XX0021,6711 0316 5725 5324 0000 0000 7777 XX0023,6701 2325 6317 1640 6701 1720 6640 4650 6640 1317 5240 4716 0240 0277 7777 XX0024,0331 0000 7777 XX0012,0272 0000 7777 XX0014,0252 0000 7777 XX0041,0232 0000 7777 XX0043,0242 0000 7777 XX0004,0253 0000 7777 XX0007,0243 0000 7777 XX0011,0273 0000 7777 XX0045,6303 7714 6323 7311 6307 2640 6322 7722 5322 0640 0000 0000 7777 XX0006,0274 0000 7777 XX0020,0244 0000 7777 XX0026,0334 0334 7777 XX0032,0334 0246 7777 XX0013,0255 0000 7777 XX0017,0275 0000 7777 XX0027,6315 2317 6325 2714 6323 2240 6717 2703 6315 7305 6324 2305 0272 0000 7777 XX0005,0246 0000 7777 XX0010,0276 0000 7777 XX0025,0316 0000 7777 XX0030,6256 3316 6673 2656 0303 0000 7777 XX0031,6656 3703 6673 7240 0246 0000 7777 XX0033,6256 4724 6324 2714 0240 0000 7777 XX0034,6656 0301 6273 0656 5303 7273 6306 0714 6307 1640 6301 4720 7324 6301 6311 2732 5640 5642 6656 2716 6315 2702 5722 0640 0000 0000 7777 XX0035,6656 0324 5640 5670 5256 0302 5262 7273 5703 5727 5240 3336 0336 0336 7777 XX0036,6256 4706 5714 5714 0256 0320 7777 XX0037,5256 0302 5262 7273 5716 5706 0336 0336 7777 XX0042,5656 5720 0336 0000 7777 XX0044,5656 5720 0000 0000 7777 XX0003,0257 0000 7777 XX0022,6717 2325 6720 2325 0272 0000 7777 XX0046,6717 2325 6720 2325 6640 1305 6722 1317 0240 0241 7777 XTOP=. $$$