home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / P4MAT202.ZIP / P4MSETUP.PAS < prev    next >
Encoding:
Pascal/Delphi Source File  |  1985-08-30  |  18.9 KB  |  694 lines

  1.  
  2. PROGRAM p4msetup;
  3. {----------------------------------------------------------------------------}
  4. {
  5.   p4mSetUp.PAS
  6.   Author : Andy Decepida
  7.   Written: 15-Aug-1985
  8.  
  9.   This program is a companion configuration utility to pFormat.
  10.  
  11.   p4msetup (pFormat Table Maker) will let you initialize the
  12.   'token' array in pFormat.
  13.  
  14.   This is meant as an assistance to users who want to change
  15.   pFormat's processing of reserved words.
  16.  
  17.   Input
  18.      BASE.RES  ::= contains the ISO Pascal reserved words
  19.      EXTNS.RES ::= contains the Turbo Pascal Extensions
  20.  
  21.   Output (these filenames correspond to the $Include directives
  22.           in pFormat ... therefore, changing them here or at
  23.           the DOS command level will impact your compilation
  24.           of pFormat):
  25.  
  26.      TBLSIZE.INC ::= contains the VAR declaration of the array 'token'
  27.      TOKEN.INC   ::= contains the init statements of the array 'token'
  28.      EXTNS.INC   ::= contains the statements to handle "type-setting"
  29.                      of reserved words (e.g., "GoToXY" instead of
  30.                      GOTOXY | gotoxy; or ShL instead of shl | SHL)
  31.  
  32.   Optional Output (the Input files BASE.RES & EXTNS.RES may be
  33.                    reorganized [upper_case'd and alphabetized for
  34.                    BASE.RES and as is for EXTNS.RES]
  35.                    into BASE.$$$ & EXTNS.$$$ respectively)
  36.                    When you are satisfied with these output
  37.                    files (review 'em carefully, then you can
  38.                    copy them to BASE.RES or EXTNS.RES for your
  39.                    next session with p4mSetUp.PAS for which you
  40.                    might want to carry over the results of your
  41.                    session.
  42.  
  43.   Changing Your Tables:
  44.     Prior to running p4msetup.pas:
  45.       - if you wanted to expand or contract the table you should
  46.         use copies of BASE.RES & EXTNS.RES files in the current
  47.         directory in which you'll be running p4msetup.
  48.       - edit either BASE.RES or EXTNS.RES to suit your taste.
  49.         Remember, these files contain the words which will
  50.         be recognized as "reserved" words in your compiled
  51.         version of pFormat ... at your pleasure.
  52. }
  53. {----------------------------------------------------------------------------}
  54. CONST
  55. {----------------------------------------------------------------------------}
  56.   baseipt    = 'BASE.RES';
  57.   extnsipt   = 'EXTNS.RES';
  58.   varout     = 'TBLSIZE.INC';
  59.   tokenout   = 'TOKEN.INC';
  60.   extnout    = 'EXTNS.INC';
  61.   newbaseout = 'BASE.$$$';
  62.   newextnout = 'EXTNS.$$$';
  63.   apostrophe = '''';
  64.   semicolon  = ';';
  65.   space      = ' ';
  66.   nullstr    = '';
  67. {----------------------------------------------------------------------------}
  68. TYPE
  69. {----------------------------------------------------------------------------}
  70.   dtstr      = STRING[8];
  71.   register   = RECORD
  72.                  ax,bx,cx,dx,bp,si,di,ds,es,flags : INTEGER;
  73.                END;
  74.   s255  = STRING[255];
  75.   entryptr = ^entry;
  76.   entry = RECORD
  77.             wordstrg : s255;
  78.             iso      : BOOLEAN;
  79.             next     : entryptr;
  80.           END; {entry}
  81. {----------------------------------------------------------------------------}
  82. VAR
  83. {----------------------------------------------------------------------------}
  84.   basef,
  85.   extnf,
  86.   newbase,
  87.   newextns,
  88.   tokenf,
  89.   extensf,
  90.   varf : TEXT;
  91.   headentry,
  92.   currentry,
  93.   preventry,
  94.   newentry : entryptr;
  95.   linebuf,
  96.   currword,
  97.   wordbuf : s255;
  98.   date,
  99.   time    : dtstr;
  100.   cnt,
  101.   arraylen: INTEGER;
  102.   found,
  103.   firstpass,
  104.   greater,
  105.   base    : BOOLEAN;
  106. {----------------------------------------------------------------------------}
  107. FUNCTION yes : BOOLEAN;
  108. {----------------------------------------------------------------------------}
  109. CONST
  110.   bks = 8;
  111.  
  112. VAR
  113.   c : CHAR;
  114. BEGIN
  115.   c := ' ';
  116.   WRITE ('[ ]', CHR(bks), CHR(bks),' ', CHR(bks));
  117.     REPEAT
  118.     READ  (KBD, c);
  119.     c := UpCase(c);
  120.     IF NOT (c IN ['Y','N'])
  121.     THEN
  122.       BEGIN
  123.       Sound (300);
  124.       Delay (60);
  125.       NoSound;
  126.       Sound (950);
  127.       Delay (100);
  128.       NoSound
  129.       END;
  130.    UNTIL c IN ['Y','N'];
  131.  yes := c = 'Y';
  132. END;
  133. {----------------------------------------------------------------------------}
  134. FUNCTION getdate : dtstr;
  135. {----------------------------------------------------------------------------}
  136. VAR
  137.   allregs : register;
  138.   month, day,
  139.   year    : STRING[2];
  140.   i       : INTEGER;
  141.   tstr    : dtstr;
  142.  
  143. BEGIN
  144.   allregs.ax := $2A * 256;
  145.   MsDos(allregs);
  146.   Str((allregs.dx DIV 256): 2,month);
  147.   Str((allregs.dx MOD 256): 2,day);
  148.   Str((allregs.cx - 1900): 2,year);
  149.   tstr := month + '-' + day + '-' + year;
  150.   FOR i := 1 TO 8
  151.   DO
  152.     IF tstr[i] = ' '
  153.     THEN
  154.       tstr[i] := '0';
  155.   getdate := tstr;
  156. END;  {getdate}
  157. {----------------------------------------------------------------------------}
  158. FUNCTION gettime : dtstr;
  159. {----------------------------------------------------------------------------}
  160. VAR
  161.   allregs : register;
  162.   hour, minute,
  163.   second  : STRING[2];
  164.   i       : INTEGER;
  165.   tstr    : dtstr;
  166.  
  167. BEGIN
  168.   allregs.ax := $2C * 256;
  169.   MsDos(allregs);
  170.   Str((allregs.cx DIV 256): 2,hour);
  171.   Str((allregs.cx MOD 256): 2,minute);
  172.   Str((allregs.dx DIV 256): 2,second);
  173.   tstr := hour + ':' + minute + ':' + second;
  174.   FOR i := 1 TO 8
  175.   DO
  176.     IF tstr[i] = ' '
  177.     THEN
  178.       tstr[i] := '0';
  179.  gettime := tstr;
  180. END;  {gettime}
  181. {----------------------------------------------------------------------------}
  182. FUNCTION datime : s255;
  183. {----------------------------------------------------------------------------}
  184. BEGIN
  185.   date   := getdate;
  186.   time   := gettime;
  187.   datime := '  (*  -- Generated by p4mSetUp on '+date+' '+time+' -- *)';
  188. END;
  189. {----------------------------------------------------------------------------}
  190. FUNCTION trim (strg : s255) : s255;
  191. {----------------------------------------------------------------------------}
  192. VAR
  193.   j : INTEGER;
  194. BEGIN
  195.   WHILE (Pos(space,strg) <> 0)
  196.   DO
  197.     Delete (strg,Pos(space,strg),1);
  198.   trim := strg;
  199. END;
  200. {----------------------------------------------------------------------------}
  201. FUNCTION upper (strg : s255) : s255;
  202. {----------------------------------------------------------------------------}
  203. VAR
  204.   j : INTEGER;
  205.  
  206. BEGIN
  207.   FOR j := 1 TO Length (strg)
  208.   DO
  209.     strg[j] := UpCase(strg[j]);
  210.   upper := strg;
  211. END;
  212. {----------------------------------------------------------------------------}
  213. FUNCTION locase (c:CHAR) : CHAR;
  214. {----------------------------------------------------------------------------}
  215. BEGIN
  216.   IF c IN ['A'..'Z']
  217.   THEN
  218.     c := CHR(ORD(c) - ORD('A') + ORD('a'));
  219.   locase := c
  220. END;
  221. {----------------------------------------------------------------------------}
  222. FUNCTION lower (strg : s255) : s255;
  223. {----------------------------------------------------------------------------}
  224. VAR
  225.   j : INTEGER;
  226.  
  227. BEGIN
  228.   FOR j := 1 TO Length (strg)
  229.   DO
  230.     strg[j] := locase(strg[j]);
  231.   lower := strg;
  232. END;
  233. {----------------------------------------------------------------------------}
  234. PROCEDURE load;
  235. {----------------------------------------------------------------------------}
  236. PROCEDURE search;
  237. {----------------------------------------------------------------------------}
  238. BEGIN
  239.   preventry := NIL;
  240.   currentry  := headentry;
  241.   greater  := TRUE;
  242.   WHILE (currentry <> NIL) AND greater
  243.   DO
  244.     BEGIN
  245.     IF wordbuf > currentry^.wordstrg
  246.     THEN
  247.       BEGIN
  248.       preventry := currentry;
  249.       currentry  := currentry^.next;
  250.       END
  251.     ELSE
  252.       IF wordbuf = currentry^.wordstrg
  253.       THEN
  254.         BEGIN
  255.         found := TRUE;
  256.         greater := FALSE;
  257.         END
  258.       ELSE
  259.         greater := FALSE;
  260.     END;
  261. END;
  262. {----------------------------------------------------------------------------}
  263. PROCEDURE insrt;
  264. {----------------------------------------------------------------------------}
  265. BEGIN {insrt}
  266.   IF preventry = NIL
  267.   THEN
  268.     BEGIN
  269.     newentry^.next := headentry;
  270.     headentry := newentry;
  271.     END
  272.   ELSE
  273.     IF currentry <> NIL
  274.     THEN
  275.       BEGIN
  276.       preventry^.next := newentry;
  277.       newentry^.next  := currentry;
  278.       END
  279.     ELSE
  280.       BEGIN
  281.       preventry^.next := newentry;
  282.       newentry^.next  := NIL;
  283.       END;
  284.   END;
  285. {----------------------------------------------------------------------------}
  286. FUNCTION duplicate : BOOLEAN;
  287. {----------------------------------------------------------------------------}
  288. BEGIN
  289.   found := FALSE;
  290.   search;
  291.   duplicate := found;
  292. END;
  293. {----------------------------------------------------------------------------}
  294. PROCEDURE actual_load;
  295. {----------------------------------------------------------------------------}
  296. BEGIN
  297.   NEW (newentry);
  298.   newentry^.wordstrg := wordbuf;
  299.   newentry^.iso := base;
  300.   found := FALSE;
  301.   search;
  302.   insrt;
  303. END;
  304.  
  305. BEGIN {load}
  306.   wordbuf := trim(wordbuf);
  307.   IF firstpass
  308.   THEN
  309.     BEGIN
  310.     firstpass := FALSE;
  311.     actual_load;
  312.     END
  313.   ELSE
  314.     IF NOT duplicate
  315.     THEN
  316.       actual_load
  317. END; {load}
  318. {----------------------------------------------------------------------------}
  319. FUNCTION spaces (cnt : INTEGER) : s255;
  320. {----------------------------------------------------------------------------}
  321. VAR
  322.   j : INTEGER;
  323.   s : s255;
  324.  
  325. BEGIN
  326.   s := nullstr;
  327.   FOR j := 1 TO cnt
  328.   DO
  329.     s := s + space;
  330.   spaces := s;
  331. END;
  332. {----------------------------------------------------------------------------}
  333. FUNCTION cnt2int(x : INTEGER) : s255;
  334. {----------------------------------------------------------------------------}
  335. VAR
  336.   tmps : s255;
  337. BEGIN
  338.   Str (x:5, tmps);
  339.   WHILE tmps[1] = space
  340.   DO
  341.     Delete (tmps,1,1);
  342.   cnt2int := tmps;
  343. END;
  344. {----------------------------------------------------------------------------}
  345. FUNCTION token (currs : s255) : s255;
  346. {----------------------------------------------------------------------------}
  347.  
  348. VAR
  349.   tmps : s255;
  350.   tmpi : INTEGER;
  351. BEGIN
  352.   tmps := nullstr;
  353.   tmps := (spaces(2)+'Token ['+cnt2int(cnt));
  354.   tmpi := Length(tmps);
  355.   tmps := tmps+']'+spaces(14-tmpi)+':= '+
  356.           apostrophe+upper(currs)+apostrophe+semicolon;
  357.   token := tmps;
  358. END;
  359. {----------------------------------------------------------------------------}
  360. FUNCTION extension (currs : s255) : s255;
  361. {----------------------------------------------------------------------------}
  362. VAR
  363.   tmps : s255;
  364.   tmpi : INTEGER;
  365. BEGIN
  366.   tmps := nullstr;
  367.   tmps := cnt2int(cnt)+' : Extension := ';
  368.   tmpi := Length(tmps);
  369.   currs[1] := UpCase(currs[1]);
  370.   tmps := spaces(22-tmpi)+tmps+spaces(1)+
  371.           apostrophe+currs+apostrophe+semicolon;
  372.   extension := tmps;
  373. END;
  374. {----------------------------------------------------------------------------}
  375. PROCEDURE evalio (fnam : s255);
  376. {----------------------------------------------------------------------------}
  377. VAR
  378.   iores : INTEGER;
  379. BEGIN
  380.   iores := IOResult;
  381.   IF iores <> 0
  382.   THEN
  383.     BEGIN
  384.     WRITE (' File ',fnam,' could NOT be opened ... aborting');
  385.     HALT
  386.     END
  387. END;
  388. {----------------------------------------------------------------------------}
  389. PROCEDURE read_iso_reserved_words;
  390. {----------------------------------------------------------------------------}
  391. BEGIN
  392.   WRITE ('  ■ Loading the ISO Pascal Reserved Words from BASE.RES ');
  393.   Assign (basef, baseipt);
  394.   {$I-}
  395.   RESET  (basef);
  396.   {$I+}
  397.   evalio (baseipt);
  398.   { load from base }
  399.   base := TRUE;
  400.   headentry := NIL;
  401.   WHILE NOT EOF(basef)
  402.   DO
  403.     BEGIN
  404.     READLN (basef, linebuf);
  405.     wordbuf := upper(Copy(linebuf,1,20));
  406.     WRITE ('.');
  407.     IF Length(wordbuf) <> 0
  408.     THEN
  409.       load;
  410.     END;
  411.   Close (basef);
  412.   WRITELN;
  413.   WRITELN;
  414. END;
  415. {----------------------------------------------------------------------------}
  416. PROCEDURE read_extensions;
  417. {----------------------------------------------------------------------------}
  418. BEGIN
  419.   WRITE ('  ■ Loading the Pascal Extensions from EXTNS.RES  ');
  420.   Assign (extnf, extnsipt);
  421.   {$I-}
  422.   RESET  (extnf);
  423.   {$I+}
  424.   evalio (extnsipt);
  425.   { load from extensions }
  426.   base := FALSE;
  427.   firstpass := FALSE;
  428.   WHILE NOT EOF(extnf)
  429.   DO
  430.     BEGIN
  431.     READLN (extnf, linebuf);
  432.     wordbuf := Copy(linebuf,1,20);
  433.     WRITE ('.');
  434.     IF Length(wordbuf) <> 0
  435.     THEN
  436.       load
  437.     END;
  438.   Close  (extnf);
  439.   WRITELN;
  440.   WRITELN;
  441. END;
  442. {----------------------------------------------------------------------------}
  443. PROCEDURE write_token;
  444. {----------------------------------------------------------------------------}
  445. BEGIN
  446.   Assign (tokenf, tokenout);
  447.   REWRITE(tokenf);
  448.   base := FALSE;
  449.   cnt := 0;
  450.   currentry  := headentry;
  451.   WRITE ('  ■ Writing ',tokenout);
  452.   WRITELN (tokenf,datime);
  453.   WHILE currentry <> NIL
  454.   DO
  455.     BEGIN
  456.     currword := currentry^.wordstrg;
  457.     cnt := cnt + 1;
  458.     WRITELN (tokenf, token (currword));
  459.     WRITE ('.');
  460.     currentry := currentry^.next;
  461.     END;
  462.   Close (tokenf);
  463. END;
  464. {----------------------------------------------------------------------------}
  465. PROCEDURE write_declaration;
  466. {----------------------------------------------------------------------------}
  467. BEGIN
  468.   arraylen := cnt;
  469.   Assign (varf, varout);
  470.   WRITELN ('  ■ Writing ',varout);
  471.   WRITELN ('    The Array is ',arraylen,' entries long.');
  472.   REWRITE (varf);
  473.   WRITELN (varf,datime);
  474.   WRITELN (varf,'  tbl_size = ',cnt2int(arraylen),semicolon);
  475.   Close   (varf);
  476. END;
  477. {----------------------------------------------------------------------------}
  478. PROCEDURE write_extensions;
  479. {----------------------------------------------------------------------------}
  480.   VAR
  481.     compstr,
  482.     holdstr,
  483.     tmpstr,
  484.     currword,
  485.     newstr : s255;
  486.     done   : BOOLEAN;
  487.     tmplen,
  488.     inlen  : INTEGER;
  489. {----------------------------------------------------------------------------}
  490. PROCEDURE alter_extensions;
  491. {----------------------------------------------------------------------------}
  492. PROCEDURE query_user;
  493. {----------------------------------------------------------------------------}
  494. BEGIN
  495.   WRITELN;
  496.   WRITE (' Type in new word ,');
  497.   WRITE ('or press <CR> to leave unchanged ',currword, ' -> ');
  498.   newstr := '';
  499.   done   := FALSE;
  500.   READLN (newstr);
  501.   newstr := trim(newstr);
  502.   inlen  := Length(newstr);
  503.   IF inlen <> 0
  504.   THEN
  505.     BEGIN {non null string}
  506.     IF upper(currword) = upper(newstr)
  507.     THEN
  508.       BEGIN
  509.       WRITE (' -- Change ',currword,' to ',newstr,' -> ');
  510.       currword := newstr;
  511.       done     := yes;
  512.       IF NOT done
  513.       THEN
  514.         BEGIN
  515.         newstr   := holdstr;
  516.         currword := holdstr;
  517.         END
  518.       ELSE {done}
  519.         BEGIN
  520.         {do nothing}
  521.         END
  522.       END
  523.     ELSE      {despite undue CASE & spacing influence}
  524.       BEGIN   {the keyed-in string was found to be too different}
  525.       WRITELN (CHR(7));
  526.       WRITELN (' ■ ',newstr,' radically differs from ',
  527.                      currword,' ... be careful.  RETRY');
  528.       done := FALSE;
  529.       newstr := holdstr;
  530.       currword := holdstr;
  531.       END
  532.     END {non null string}
  533.   ELSE
  534.     BEGIN {null string}
  535.     newstr := currword;
  536.     done   := TRUE;
  537.     END;
  538. END;
  539.  
  540. BEGIN
  541.   WRITELN;
  542.   currentry := headentry;
  543.   cnt := 0;
  544.   WRITELN;
  545.   WRITELN (' You have the option of changing the Case-Mix of the Extensions now or');
  546.   WRITELN ('   later, on your own --- manually with an editor ');
  547.   WRITELN;
  548.   WHILE currentry <> NIL
  549.   DO
  550.     BEGIN
  551.     currword := currentry^.wordstrg;
  552.     IF NOT currentry^.iso
  553.     THEN
  554.       BEGIN
  555.       currword[1] := UpCase(currword[1]);
  556.       holdstr     := currword;
  557.       WRITELN ('---');
  558.       done := FALSE;
  559.       inlen := Length(newstr);
  560.       WHILE NOT done
  561.       DO
  562.         query_user;
  563.       WRITELN;
  564.       currentry^.wordstrg := newstr;
  565.       END;
  566.       currentry := currentry^.next;
  567.     END;
  568. END;
  569.  
  570. BEGIN
  571.   Assign (extensf, extnout);
  572.   REWRITE(extensf);
  573.   alter_extensions;
  574.   cnt := 0;
  575.   currentry  := headentry;
  576.   WRITELN;
  577.   WRITE ('  ■ Writing ',extnout);
  578.   WRITELN (extensf,datime);
  579.   WHILE currentry <> NIL
  580.   DO
  581.     BEGIN
  582.     currword := currentry^.wordstrg;
  583.     cnt := cnt +1;
  584.     IF NOT currentry^.iso
  585.     THEN
  586.       BEGIN
  587.       currword := currword;
  588.       WRITELN (extensf, extension(currword));
  589.       WRITE ('.');
  590.       END;
  591.     currentry := currentry^.next;
  592.     END;
  593.   Close (extensf);
  594. END;
  595. {----------------------------------------------------------------------------}
  596. PROCEDURE reorg_inputs;
  597. {----------------------------------------------------------------------------}
  598. BEGIN
  599.   WRITELN;
  600.   WRITE ('   Write to BASE.$$$ & EXTNS.$$$ respectively ? ');
  601.   IF NOT yes
  602.   THEN
  603.     BEGIN
  604.     WRITELN (' Very well ... bye ');
  605.     Exit;
  606.     END;
  607.   Assign (newbase, newbaseout);
  608.   REWRITE(newbase);
  609.   Assign (newextns,newextnout);
  610.   REWRITE(newextns);
  611.   currentry := headentry;
  612.   WRITELN;
  613.   WRITELN;
  614.   WRITELN ('       Reorganization of Input files BASE.RES & EXTNS.RES ');
  615.   WRITELN;
  616.   WRITELN ('   This will prune (remove duplicates within and across files,');
  617.   WRITELN ('   ensure alphabetic sequence & proper cases).');
  618.   WRITELN;
  619.   WRITE   ('   Making BASE.$$$ & EXTNS.$$$');
  620.   WHILE currentry <> NIL
  621.   DO
  622.     BEGIN
  623.     currword := currentry^.wordstrg;
  624.     cnt := cnt +1;
  625.     WRITE ('.');
  626.     IF currentry^.iso
  627.     THEN
  628.       WRITELN (newbase,currword)
  629.     ELSE
  630.       WRITELN (newextns,currword);
  631.     currentry := currentry^.next;
  632.     END;
  633.   Close (newbase);
  634.   Close (newextns);
  635. END;
  636. {----------------------------------------------------------------------------}
  637. PROCEDURE banner;
  638. {----------------------------------------------------------------------------}
  639. BEGIN
  640.   WRITELN;
  641.   WRITELN ('┌───────────────────────────────┐');
  642.   WRITELN ('│   p4mSetUp ─ Andy Decepida    │');
  643.   WRITELN ('└───────────────────────────────┘');
  644.   WRITELN;
  645.   date := getdate;
  646.   time := gettime;
  647.   WRITELN ('  Run Date : ',date,' ',time);
  648.   WRITELN (CHR(7));
  649.   WRITELN ('┌───────────────────────────────┐');
  650.   WRITELN ('│       ■■■ WARNING ■■■         │');
  651.   WRITELN ('├───────────────────────────────┤');
  652.   WRITELN ('│ Since p4mSetUp will generate  │');
  653.   WRITELN ('│ the new versions of the files │');
  654.   WRITELN ('│         TOKEN.INC,            │');
  655.   WRITELN ('│         EXTNS.INC             │');
  656.   WRITELN ('│     and TBLSIZE.INC,          │');
  657.   WRITELN ('│ which are required to compile │');
  658.   WRITELN ('│ pFormat.PAS, you should not   │');
  659.   WRITELN ('│ run THIS program with copies  │');
  660.   WRITELN ('│ of those files in the current │');
  661.   WRITELN ('│ directory.                    │');
  662.   WRITELN ('└───────────────────────────────┘');
  663.   WRITELN;
  664.   WRITE   ('    Continue ? [y/n] ');
  665.   IF yes
  666.   THEN
  667.     BEGIN
  668.     WRITELN;
  669.     WRITELN;
  670.     WRITE ('This is your LAST ');
  671.     WRITELN ('chance to backout of this run');
  672.     WRITELN;
  673.     WRITE ('Proceed ? [y/n] ');
  674.     IF NOT yes
  675.     THEN
  676.       HALT
  677.     END
  678.   ELSE
  679.     HALT;
  680. END;
  681. {────────────────────────────────────────────────────────────────────────────}
  682. BEGIN
  683.   firstpass := TRUE;
  684.   LowVideo;
  685.   banner;
  686.   WRITELN;
  687.   read_iso_reserved_words;
  688.   read_extensions;
  689.   write_token;
  690.   write_extensions;
  691.   write_declaration;
  692.   reorg_inputs;
  693. END.
  694.