home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / demos / 26 / pascal / pforma.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1986-06-19  |  29.6 KB  |  1,179 lines

  1. PROGRAM Pformat (INPUT, OUTPUT);
  2. {
  3.   AUTHOR:  andy j s decepida
  4.            16 Nov 1984
  5.  
  6.   DESCRIPTION: Reads in a .PAS text file and, depending on the user's
  7.                choice/s, generates a copy with alterations in the case of
  8.                the contained text.
  9. }
  10.  
  11. {
  12.  Converted to O.S.S. Personal Pascal for the Atari 520ST by
  13.    Jerry LaPeer of LaPeer Systems Inc.
  14.  
  15.  05/20/86 - Concentrated on implementing Alert Boxes, and Dialog Boxes
  16.             for input.
  17. }
  18.  
  19. CONST
  20.   Array_Size  =  177;
  21.  
  22.   {$I GEMCONST.PAS}
  23.  
  24. TYPE
  25.   Answer_Set  =  SET OF CHAR;
  26.  
  27.   Cursor_Size =  (Full, Half, Minimum, Invisible);
  28.  
  29.   Global_Strg =  STRING[255];
  30.  
  31.   Case_Types  =  (Upper,
  32.                  Lower,
  33.                  Asis);
  34.  
  35.   OptTypes =    (UCase,LCase,AsIsOpt,BoreLand);
  36.  
  37.   {$I gemtype.pas}
  38.  
  39. VAR
  40.   Io_Template,
  41.   Work_Template,
  42.   Proc_Label,
  43.   Mask,
  44.   Temp,
  45.   Temp_String,
  46.   Ifname,
  47.   Ofname : Global_Strg;
  48.  
  49.   Text_File,
  50.   Pretty_Output : TEXT;
  51.  
  52.   Token         : ARRAY [1..Array_Size] OF STRING[20];
  53.  
  54.   Res_Case,
  55.   Non_Res_Case  : Case_Types;
  56.  
  57.   Strt,
  58.   Endd,
  59.   Indx,
  60.   Token_Locn,
  61.   Len,
  62.   Cnt           : INTEGER;
  63.  
  64.   Cd_Char,
  65.   Prior,
  66.   Next          : CHAR;
  67.  
  68.   Borland_Convention,
  69.   Interruptable,
  70.   Comment_Active,
  71.   Ok            : BOOLEAN;
  72.  
  73.   Dialog : Dialog_Ptr ;
  74.   Button,
  75.   Ok_Btn,
  76.   Cancel_Btn,
  77.   Prompt_Item,
  78.   Date_Item : INTEGER ;
  79.  
  80.   Can_Prog:   BOOLEAN;
  81.   ResOpt:       OptTypes;
  82.   NrsOpt:       OptTypes;
  83.   ExtOpt:       OptTypes;
  84.   Reply:        Str255;
  85.  
  86. {$I gemsubs}
  87.  
  88. {*****************************************************************************}
  89.  
  90. FUNCTION Io_Result : INTEGER;
  91. EXTERNAL;
  92.  
  93. PROCEDURE Delay(I : INTEGER);
  94.  
  95. BEGIN
  96.  
  97. END;
  98.  
  99. FUNCTION KeyPressed : BOOLEAN;
  100.  
  101. BEGIN
  102.   KeyPressed := KeyPress;
  103. END;
  104.  
  105. {*****************************************************************************}
  106.  
  107. PROCEDURE GotoXY(Col,Row : INTEGER);
  108.  
  109. BEGIN
  110.   WRITE(CHR($1b),'Y',CHR(Row+$1f),CHR(Col+$1f));
  111. END;
  112.  
  113. PROCEDURE CrtExit;
  114.  
  115. BEGIN
  116.  
  117. END;
  118.  
  119. PROCEDURE ClrScr;
  120.  
  121. BEGIN
  122.   Clear_Screen;
  123. END;
  124.  
  125. PROCEDURE ClrEol;
  126.  
  127. BEGIN
  128.  
  129. END;
  130.  
  131. {*****************************************************************************}
  132.  
  133. PROCEDURE Sound(Slen : INTEGER);
  134.  
  135. BEGIN
  136.  
  137. END;
  138.  
  139. PROCEDURE NoSound;
  140.  
  141. BEGIN
  142.  
  143. END;
  144.  
  145. PROCEDURE TextColor (Color : INTEGER);
  146.  
  147. BEGIN
  148.  
  149. END;
  150.  
  151. PROCEDURE TextBackGround (Color : INTEGER);
  152.  
  153. BEGIN
  154.  
  155. END;
  156.  
  157. PROCEDURE Set_Cursor (Size : Cursor_Size);
  158.   {
  159.     cursor is set according to the passed Size ... IBM-PC specific!
  160.   }
  161.  
  162. BEGIN
  163.  
  164. END;
  165.  
  166. {*****************************************************************************}
  167.  
  168. PROCEDURE Init_A1;
  169.  
  170. BEGIN
  171.     Token [  1] := 'ABSOLUTE';
  172.     Token [  2] := 'ARCTAN';
  173.     Token [  3] := 'ASSIGN';
  174.     Token [  4] := 'AUXINPTR';
  175.     Token [  5] := 'AUXOUTPTR';
  176.     Token [  6] := 'BLOCKREAD';
  177.     Token [  7] := 'BLOCKWRITE';
  178.     Token [  8] := 'BOOLEAN';
  179.     Token [  9] := 'BUFLEN';
  180.     Token [ 10] := 'CLREOL';
  181.     Token [ 11] := 'CLRSCR';
  182.     Token [ 12] := 'CONCAT';
  183.     Token [ 13] := 'CONINPTR';
  184.     Token [ 14] := 'CONOUTPTR';
  185.     Token [ 15] := 'CONSTPTR';
  186.     Token [ 16] := 'CRTEXIT';
  187.     Token [ 17] := 'CRTINIT';
  188.     Token [ 18] := 'DELETE';
  189.     Token [ 19] := 'DELLINE';
  190.     Token [ 20] := 'DOWNTO';
  191.     Token [ 21] := 'EXECUTE';
  192.     Token [ 22] := 'EXTERNAL';
  193.     Token [ 23] := 'FILEPOS';
  194.     Token [ 24] := 'FILESIZE';
  195.     Token [ 25] := 'FILLCHAR';
  196.     Token [ 26] := 'FORWARD';
  197.     Token [ 27] := 'FREEMEM';
  198.     Token [ 28] := 'FUNCTION';
  199.     Token [ 29] := 'GETMEM';
  200.     Token [ 30] := 'GOTOXY';
  201.     Token [ 31] := 'GRAPHBACKGROUND';
  202.     Token [ 32] := 'GRAPHCOLORMODE';
  203.     Token [ 33] := 'GRAPHMODE';
  204.     Token [ 34] := 'GRAPHWINDOW';
  205.     Token [ 35] := 'HEAPSTR';
  206.     Token [ 36] := 'HIRESCOLOR';
  207.     Token [ 37] := 'INLINE';
  208.     Token [ 38] := 'INSERT';
  209.     Token [ 39] := 'INSLINE';
  210.     Token [ 40] := 'INTEGER';
  211.     Token [ 41] := 'IORESULT';
  212.     Token [ 42] := 'KEYPRESSED';
  213.     Token [ 43] := 'LENGTH';
  214.     Token [ 44] := 'LONGFILEPOS';
  215.     Token [ 45] := 'LONGFILESIZE';
  216.     Token [ 46] := 'LONGSEEK';
  217.     Token [ 47] := 'LOWVIDEO';
  218.     Token [ 48] := 'LSTOUTPTR';
  219.     Token [ 49] := 'MAXAVAIL';
  220.     Token [ 50] := 'MAXINT';
  221.     Token [ 51] := 'MEMAVAIL';
  222.     Token [ 52] := 'NORMVIDEO';
  223.     Token [ 53] := 'NOSOUND';
  224.     Token [ 54] := 'OUTPUT';
  225.     Token [ 55] := 'PACKED';
  226.     Token [ 56] := 'PALETTE';
  227.     Token [ 57] := 'PROCEDURE';
  228.     Token [ 58] := 'PROGRAM';
  229.     Token [ 59] := 'RANDOMIZE';
  230.     Token [ 60] := 'RANDOM';
  231.     Token [ 61] := 'READLN';
  232.     Token [ 62] := 'RECORD';
  233.     Token [ 63] := 'RELEASE';
  234.     Token [ 64] := 'RENAME';
  235.     Token [ 65] := 'REPEAT';
  236.     Token [ 66] := 'REWRITE';
  237.     Token [ 67] := 'SIZEOF';
  238.     Token [ 68] := 'STRING';
  239.     Token [ 69] := 'TEXTBACKGROUND';
  240.     Token [ 70] := 'TEXTCOLOR';
  241.     Token [ 71] := 'TEXTMODE';
  242.     Token [ 72] := 'UPCASE';
  243.     Token [ 73] := 'USRINPTR';
  244.     Token [ 74] := 'USROUTPTR';
  245.     Token [ 75] := 'WHEREX';
  246.     Token [ 76] := 'WHEREY';
  247.     Token [ 77] := 'WINDOW';
  248.     Token [ 78] := 'WRITELN';
  249.     Token [ 79] := 'ARRAY';
  250.     Token [ 80] := 'BEGIN';
  251.     Token [ 81] := 'CHAIN';
  252.     Token [ 82] := 'CLOSE';
  253.     Token [ 83] := 'CONST';
  254.     Token [ 84] := 'DELAY';
  255.     Token [ 85] := 'ERASE';
  256.     Token [ 86] := 'FALSE';
  257.     Token [ 87] := 'FLUSH';
  258.     Token [ 88] := 'HIRES';
  259. END;
  260.  
  261. PROCEDURE Init_A2;
  262.  
  263. BEGIN
  264.     Token [ 89] := 'INPUT';
  265.     Token [ 90] := 'LABEL';
  266.     Token [ 91] := 'MSDOS';
  267.     Token [ 92] := 'PORTW';
  268.     Token [ 93] := 'RESET';
  269.     Token [ 94] := 'ROUND';
  270.     Token [ 95] := 'SOUND';
  271.     Token [ 96] := 'TRUNC';
  272.     Token [ 97] := 'UNTIL';
  273.     Token [ 98] := 'WHILE';
  274.     Token [ 99] := 'WRITE';
  275.     Token [100] := 'ADDR';
  276.     Token [101] := 'BYTE';
  277.     Token [102] := 'CASE';
  278.     Token [103] := 'CHAR';
  279.     Token [104] := 'COPY';
  280.     Token [105] := 'CSEG';
  281.     Token [106] := 'DRAW';
  282.     Token [107] := 'DSEG';
  283.     Token [108] := 'ELSE';
  284.     Token [109] := 'EOLN';
  285.     Token [110] := 'FILE';
  286.     Token [111] := 'FRAC';
  287.     Token [112] := 'GOTO';
  288.     Token [113] := 'HALT';
  289.     Token [114] := 'INTR';
  290.     Token [115] := 'MARK';
  291.     Token [116] := 'MEMW';
  292.     Token [117] := 'MOVE';
  293.     Token [118] := 'PLOT';
  294.     Token [119] := 'PORT';
  295.     Token [120] := 'PRED';
  296.     Token [121] := 'READ';
  297.     Token [122] := 'REAL';
  298.     Token [123] := 'SEEK';
  299.     Token [124] := 'SQRT';
  300.     Token [125] := 'SSEG';
  301.     Token [126] := 'SUCC';
  302.     Token [127] := 'SWAP';
  303.     Token [128] := 'TEXT';
  304.     Token [129] := 'THEN';
  305.     Token [130] := 'TRUE';
  306.     Token [131] := 'TYPE';
  307.     Token [132] := 'WITH';
  308.     Token [133] := 'AND';
  309.     Token [134] := 'AUX';
  310.     Token [135] := 'CHR';
  311.     Token [136] := 'CON';
  312.     Token [137] := 'COS';
  313.     Token [138] := 'DIV';
  314.     Token [139] := 'END';
  315.     Token [140] := 'EOF';
  316.     Token [141] := 'EXP';
  317.     Token [142] := 'FOR';
  318.     Token [143] := 'INT';
  319.     Token [144] := 'KBD';
  320.     Token [145] := 'LST';
  321.     Token [146] := 'MEM';
  322.     Token [147] := 'MOD';
  323.     Token [148] := 'NEW';
  324.     Token [149] := 'NIL';
  325.     Token [150] := 'NOT';
  326.     Token [151] := 'ODD';
  327.     Token [152] := 'OFS';
  328.     Token [153] := 'ORD';
  329.     Token [154] := 'POS';
  330.     Token [155] := 'PTR';
  331.     Token [156] := 'SEG';
  332.     Token [157] := 'SET';
  333.     Token [158] := 'SHL';
  334.     Token [159] := 'SHR';
  335.     Token [160] := 'SIN';
  336.     Token [161] := 'SQR';
  337.     Token [162] := 'STR';
  338.     Token [163] := 'TRM';
  339.     Token [164] := 'USR';
  340.     Token [165] := 'VAL';
  341.     Token [166] := 'VAR';
  342.     Token [167] := 'XOR';
  343.     Token [168] := 'DO';
  344.     Token [169] := 'HI';
  345.     Token [170] := 'IF';
  346.     Token [171] := 'IN';
  347.     Token [172] := 'LN';
  348.     Token [173] := 'LO';
  349.     Token [174] := 'OF';
  350.     Token [175] := 'OR';
  351.     Token [176] := 'PI';
  352.     Token [177] := 'TO';
  353.  
  354. END;
  355.  
  356. PROCEDURE Init_A3;
  357.  
  358. BEGIN
  359.  
  360. END;
  361.  
  362. PROCEDURE Init_Array;
  363.   {
  364.     initialize the reserved word array
  365.  
  366.   Warning: because the primitive parsing method employed here centred
  367.   crucially on this array it is NOT recommended that you alter the
  368.   contents and sequence of the entries.  My apologies non MS-DOS users
  369.   for not including the reserved words that their TurboPascal editions do
  370.   support.  Should you, as say as CP/M Turbo programmer, wish to alter
  371.   this table keep in mind two things:
  372.  
  373.  
  374.   ~ Do_Turbo_Extension uses the index (INDX) corresponding to the table
  375.     entry of a found reserved word to assign the Borland type setting style
  376.     to the output substring ... ergo, keep the new array indices in synch
  377.     with the CASE selectors in Do_Turbo_Extension.
  378.  
  379.   ~ Since pFORMAT sequentially steps through this array to find a corresponding
  380.     pattern occurrences in the text line currently being processed, it
  381.     becomes important to keep the shorter reserved words that are embedded in
  382.     other, longer reserved words as substrings towards the bottom of the
  383.     array!
  384. }
  385. BEGIN {Init_Array}
  386.   Init_A1;
  387.   Init_A2;
  388. END;  {Init_Array}
  389.  
  390. {*****************************************************************************}
  391.  
  392. FUNCTION Is_Special_Char (Ch : CHAR) : BOOLEAN;
  393.   {
  394.     TRUE if Ch is a special char
  395.   }
  396.  
  397. BEGIN
  398.   Is_Special_Char := (ORD(Ch) IN [32, 39..47, 58..62, 91, 93, 123, 125])
  399. END;
  400.  
  401. {*****************************************************************************}
  402.  
  403. FUNCTION Lo_Case (Ch : CHAR) : CHAR;
  404.   {
  405.     returns lower case of an alpha char
  406.   }
  407.  
  408. BEGIN
  409.   IF (Ch IN ['A'..'Z'])
  410.     THEN Ch := CHR (ORD(Ch) - ORD('A') + ORD('a'));
  411.   Lo_Case := Ch
  412. END;
  413.  
  414. {*****************************************************************************}
  415.  
  416. FUNCTION UpCase(C : CHAR) : CHAR;
  417.  
  418. BEGIN
  419.  
  420.   IF C IN ['a'..'z']
  421.     THEN UpCase := CHR(ORD(C) - (ORD('a') - ORD('A')))
  422.     ELSE UpCase := C;
  423.  
  424. END;
  425.  
  426. PROCEDURE Up_Strg (VAR Strg : Global_Strg);
  427.  
  428. VAR
  429.   Slot : INTEGER;
  430.  
  431. BEGIN
  432.   IF (LENGTH(Strg) > 0)
  433.     THEN FOR Slot := 1 TO LENGTH(Strg) DO
  434.       Strg[Slot] := UpCase(Strg[Slot])
  435. END;
  436.  
  437. {*****************************************************************************}
  438.  
  439. PROCEDURE Lo_Strg (VAR Strg : Global_Strg);
  440.  
  441. VAR
  442.   Slot : INTEGER;
  443.  
  444. BEGIN
  445.   IF (LENGTH(Strg) > 0)
  446.     THEN FOR Slot := 1 TO LENGTH(Strg) DO
  447.       Strg[Slot] := Lo_Case(Strg[Slot])
  448. END;
  449.  
  450. {*****************************************************************************}
  451.  
  452. FUNCTION Get_Char (Legal_Commands : Answer_Set) : CHAR;
  453.   {
  454.     waits for a CHAR input belonging in Legal_Commands
  455.   }
  456.  
  457. CONST
  458.   Bks = 8;
  459.  
  460. VAR
  461.   Ch_In : CHAR;
  462.  
  463. BEGIN
  464.   WRITE ('[ ]');
  465.   WRITE (CHR(Bks), CHR(Bks), ' ',CHR(Bks));
  466.   REPEAT
  467.     Set_Cursor (Full);
  468.     READ (Ch_In);
  469.     Ch_In := UpCase (Ch_In);
  470.     IF NOT (Ch_In IN Legal_Commands)
  471.       THEN BEGIN
  472.         Sound (8900);
  473.         Delay (10);
  474.         NoSound;
  475.         Sound (90);
  476.         Delay (30);
  477.         NoSound;
  478.       END;
  479.   UNTIL (Ch_In IN Legal_Commands);
  480.   Set_Cursor (Minimum);
  481.   Get_Char := Ch_In;
  482. END;
  483.  
  484. {*****************************************************************************}
  485.  
  486. FUNCTION User_Says_Yes : BOOLEAN;
  487.   {
  488.     waits for a y/Y or n/N CHAR input
  489.   }
  490.  
  491. VAR
  492.   Reply : CHAR;
  493.  
  494. BEGIN
  495.   WRITE (' [y/n] ~ ');
  496.   User_Says_Yes := (Get_Char(['Y','N']) = 'Y')
  497. END;
  498.  
  499. {*****************************************************************************}
  500.  
  501.   PROCEDURE User_Quits;
  502.  
  503.   BEGIN
  504.     Set_Cursor (Minimum);
  505.     CrtExit;
  506.     ClrScr;
  507.     HALT;
  508.   END;
  509.  
  510. {*****************************************************************************}
  511.  
  512.   FUNCTION Is_A_Token : BOOLEAN;
  513.   {
  514.     returns TRUE if the pattern found is properly delimited
  515.   }
  516.   BEGIN {Is_A_Token}
  517.     IF (Token_Locn + LENGTH(Token[Indx])) < Len THEN
  518.       Next := Work_Template[Token_Locn + (LENGTH(Token[Indx]))]
  519.     ELSE
  520.       Next := '.';
  521.  
  522.     IF Token_Locn > 1 THEN
  523.       BEGIN
  524.         Prior := Work_Template[Token_Locn - 1];
  525.         Is_A_Token := ((Is_Special_Char(Prior)) AND (Is_Special_Char(Next)));
  526.       END
  527.     ELSE
  528.       IF Token_Locn = 1 THEN
  529.         Is_A_Token := (Is_Special_Char (Next));
  530.   END; {Is_A_Token}
  531.  
  532. {*****************************************************************************}
  533.  
  534. PROCEDURE Mask_Out (Keyword : Global_Strg);
  535.   {
  536.     mask out a pattern match ... to enable multi-occurrences
  537.   }
  538. VAR
  539.   Slot : INTEGER;
  540.  
  541. BEGIN {Mask_Out}
  542.   DELETE (Work_Template, Token_Locn, LENGTH(Token[Indx]));
  543.   Mask := Keyword;
  544.   FOR Slot := 1 TO LENGTH(Keyword) DO
  545.     Mask[Slot] := '\';
  546.   IF Work_Template = ''
  547.     THEN Work_Template := Mask
  548.     ELSE IF LENGTH(Work_Template) < Token_Locn
  549.            THEN Work_Template := CONCAT(Work_Template, Mask)
  550.            ELSE INSERT (Mask, Work_Template, Token_Locn);
  551. END;  {Mask_Out}
  552.  
  553. {*****************************************************************************}
  554.  
  555.  PROCEDURE Do_Turbo_Extension (VAR Extension : Global_Strg);
  556.  
  557.  BEGIN {Do_Turbo_Extension}
  558.    CASE Indx OF
  559.       1 : Extension := 'Absolute';
  560.       3 : Extension := 'Assign';
  561.       4 : Extension := 'AuxInPtr';
  562.       5 : Extension := 'AuxOutPtr';
  563.       9 : Extension := 'BufLen';
  564.      10 : Extension := 'ClrEol';
  565.      11 : Extension := 'ClrScr';
  566.      13 : Extension := 'ConInPtr';
  567.      14 : Extension := 'ConOutPtr';
  568.      15 : Extension := 'ConstPtr';
  569.      16 : Extension := 'CrtExit';
  570.      17 : Extension := 'CrtInit';
  571.      19 : Extension := 'DelLine';
  572.      21 : Extension := 'Execute';
  573.      23 : Extension := 'FilePos';
  574.      24 : Extension := 'FileSize';
  575.      25 : Extension := 'FillChar';
  576.      27 : Extension := 'FreeMem';
  577.      29 : Extension := 'GetMem';
  578.      30 : Extension := 'GotoXY';
  579.      31 : Extension := 'GraphBackGround';
  580.      32 : Extension := 'GraphColorMode';
  581.      33 : Extension := 'GraphMode';
  582.      34 : Extension := 'GraphWindow';
  583.      35 : Extension := 'HeapStr';
  584.      36 : Extension := 'HiResColor';
  585.      37 : Extension := 'InLine';
  586.      39 : Extension := 'InsLine';
  587.      41 : Extension := 'IOResult';
  588.      42 : Extension := 'KeyPressed';
  589.      44 : Extension := 'LongFilePos';
  590.      45 : Extension := 'LongFileSize';
  591.      46 : Extension := 'LongSeek';
  592.      47 : Extension := 'LowVideo';
  593.      48 : Extension := 'LstOutPtr';
  594.      49 : Extension := 'MaxAvail';
  595.      52 : Extension := 'NormVideo';
  596.      53 : Extension := 'NoSound';
  597.      56 : Extension := 'Palette';
  598.      59 : Extension := 'Randomize';
  599.      60 : Extension := 'Random';
  600.      64 : Extension := 'Rename';
  601.      69 : Extension := 'TextBackGround';
  602.      70 : Extension := 'TextColor';
  603.      71 : Extension := 'TextMode';
  604.      72 : Extension := 'UpCase';
  605.      73 : Extension := 'UsrInPtr';
  606.      74 : Extension := 'UsrOutPtr';
  607.      75 : Extension := 'WhereX';
  608.      76 : Extension := 'WhereY';
  609.      77 : Extension := 'Window';
  610.      81 : Extension := 'Chain';
  611.      84 : Extension := 'Delay';
  612.      85 : Extension := 'Erase';
  613.      87 : Extension := 'Flush';
  614.      88 : Extension := 'HiRes';
  615.      91 : Extension := 'MSDos';
  616.      92 : Extension := 'PortW';
  617.      95 : Extension := 'Sound';
  618.     100 : Extension := 'Addr';
  619.     101 : Extension := 'Byte';
  620.     105 : Extension := 'CSeg';
  621.     106 : Extension := 'Draw';
  622.     107 : Extension := 'DSeg';
  623.     111 : Extension := 'Frac';
  624.     114 : Extension := 'Intr';
  625.     116 : Extension := 'MemW';
  626.     117 : Extension := 'Move';
  627.     118 : Extension := 'Plot';
  628.     119 : Extension := 'Port';
  629.     123 : Extension := 'Seek';
  630.     124 : Extension := 'Sqrt';
  631.     125 : Extension := 'SSeg';
  632.     127 : Extension := 'Swap';
  633.     134 : Extension := 'Aux';
  634.     136 : Extension := 'Con';
  635.     144 : Extension := 'Kbd';
  636.     145 : Extension := 'Lst';
  637.     146 : Extension := 'Mem';
  638.     152 : Extension := 'Ofs';
  639.     155 : Extension := 'Ptr';
  640.     156 : Extension := 'Seg';
  641.     158 : Extension := 'ShL';
  642.     159 : Extension := 'ShR';
  643.     163 : Extension := 'Trm';
  644.     164 : Extension := 'Usr';
  645.     167 : Extension := 'XOr';
  646.     169 : Extension := 'Hi';
  647.     173 : Extension := 'Lo';
  648.     176 : Extension := 'Pi';
  649.    END; {CASE Indx OF}
  650.  END;  {Do_Turbo_Extension}
  651.  
  652. {*****************************************************************************}
  653.  
  654. PROCEDURE Do_Reserved_Word;
  655.  
  656. BEGIN
  657.   Temp := Token [Indx];
  658.   DELETE (Io_Template, Token_Locn, LENGTH(Token[Indx]));
  659.   IF Res_Case = Lower
  660.     THEN Lo_Strg (Temp);
  661.   IF Borland_Convention
  662.     THEN Do_Turbo_Extension (Temp);
  663.   IF Io_Template = ''
  664.     THEN Io_Template := Temp
  665.     ELSE IF LENGTH(Io_Template) < Token_Locn
  666.            THEN Io_Template := CONCAT(Io_Template, Temp)
  667.            ELSE INSERT (Temp, Io_Template, Token_Locn);
  668. END;
  669.  
  670. {*****************************************************************************}
  671.  
  672.    PROCEDURE Tablesearch;
  673.  
  674.    BEGIN
  675.      Indx := 1;
  676.      REPEAT
  677.        Token_Locn := POS (Token[Indx], Work_Template);
  678.        IF (Token_Locn <> 0) AND Is_A_Token THEN
  679.          BEGIN                    {pattern match is reserved word}
  680.            IF Res_Case <> Asis THEN
  681.              Do_Reserved_Word;
  682.            Mask_Out (Token[Indx]);
  683.            Tablesearch            {recurse!!!}
  684.          END;
  685.        IF Token_Locn <> 0 THEN    {pattern match NOT reserved}
  686.          Mask_Out (Token[Indx]);
  687.        IF Token_Locn = 0 THEN     {no pattern match}
  688.          Indx := Indx + 1;
  689.      UNTIL ( (Indx > Array_Size) AND (Token_Locn = 0) );
  690.    END;
  691.  
  692. {*****************************************************************************}
  693.  
  694.    PROCEDURE Find_Token_Match;
  695.  
  696.    BEGIN {Find_Token_Match}
  697.      REPEAT      {exhaust all keyword occurrences in a line of text}
  698.        Tablesearch;
  699.        IF Interruptable THEN
  700.          IF KeyPressed THEN
  701.            BEGIN
  702.              TextColor (24); TextBackGround (1);
  703.              WRITELN;
  704.              WRITE ('Abort pFORMAT of ',Ifname,'? ');
  705.              IF User_Says_Yes THEN User_Quits
  706.            END;
  707.      UNTIL Token_Locn = 0;
  708.    END;  {Find_Token_Match}
  709.  
  710. {*****************************************************************************}
  711.  
  712. PROCEDURE Fix_Comment_Strings;
  713.   {
  714.     mask out comments & strings so as-is chars can be restored from
  715.     Temp_String onto IO_Template
  716.   }
  717.  
  718.   PROCEDURE Mask_String (Len_Comment : INTEGER);
  719.  
  720.   VAR
  721.     Slot : INTEGER;
  722.  
  723.   BEGIN
  724.     Temp_String := COPY (Work_Template, Strt, Len_Comment);
  725.     FOR Slot := 1 TO LENGTH(Temp_String) DO
  726.       Temp_String[Slot] := ' ';
  727.     DELETE (Work_Template, Strt, Len_Comment);
  728.     IF Work_Template = ''
  729.       THEN Work_Template := Temp_String
  730.       ELSE IF LENGTH(Work_Template) < STRt
  731.              THEN Work_Template := CONCAT(Work_Template,Temp_String)
  732.              ELSE INSERT (Temp_String, Work_Template, Strt);
  733.   END;
  734.  
  735. BEGIN {Fix_Comment_Strings} {DO Strings}
  736.  
  737.   REPEAT
  738.     Strt := POS('''', Work_Template);
  739.     IF Strt <> 0
  740.       THEN Work_Template[Strt] := ' ';
  741.     Endd := POS ('''', Work_Template);
  742.     IF Endd <> 0
  743.       THEN Work_Template[Endd] := ' ';
  744.     IF ((Endd <> 0) AND (Strt <> 0))
  745.       THEN Mask_String (Endd - Strt + 1);
  746.   UNTIL ((Endd = 0) OR (Strt = 0));
  747.  
  748.   Strt := POS('{', Work_Template);
  749.   IF Strt = 0
  750.     THEN {check again for alternative delimiter}
  751.          Strt := POS ('(*', Work_Template);
  752.  
  753.   Endd := POS('}', Work_Template);
  754.   IF Endd = 0
  755.     THEN {check again for alternate delimiter}
  756.          Endd := POS('*)', Work_Template);
  757.  
  758.   IF Strt <> 0
  759.     THEN Comment_Active := TRUE;
  760.  
  761.   IF Endd <> 0
  762.     THEN Comment_Active := FALSE;
  763.  
  764.   IF Strt = 0
  765.     THEN IF Endd = 0
  766.            THEN IF Comment_Active
  767.                   THEN BEGIN
  768.                     Strt := 1;
  769.                     Mask_String (Len - Strt + 1)
  770.                   END
  771.                   ELSE BEGIN {no active comment}
  772.                     {do nothing}
  773.                   END
  774.            ELSE BEGIN {endd <> 0}
  775.              Strt := 1;
  776.              Mask_String (Endd - Strt + 1)
  777.            END
  778.     ELSE IF Endd <> 0
  779.            THEN Mask_String (Endd - Strt + 1)
  780.            ELSE Mask_String (Len - Strt + 1);
  781.  
  782. END; {Fix_Comment_Strings}
  783.  
  784. {*****************************************************************************}
  785.  
  786. PROCEDURE Parse;
  787.  
  788. VAR
  789.   Slot : INTEGER;
  790.   Makeup : BOOLEAN;
  791.  
  792. BEGIN
  793.  
  794.   Work_Template := Io_Template;
  795.   Len := LENGTH (Io_Template);
  796.  
  797.   Fix_Comment_Strings;
  798.  
  799.   Up_Strg (Work_Template);
  800.  
  801.   Temp_String := Io_Template;
  802.  
  803.   IF Non_Res_Case = Upper
  804.     THEN Up_Strg (Io_Template)
  805.     ELSE IF Non_Res_Case = Lower
  806.            THEN Lo_Strg (Io_Template);
  807.  
  808.   Makeup := TRUE;
  809.  
  810.   FOR Slot := 1 TO LENGTH(Io_Template) DO
  811.     IF Work_Template[Slot] = ' '
  812.       THEN Io_Template[Slot] := Temp_String[Slot];
  813.  
  814.   Find_Token_Match;
  815.  
  816.   Makeup := TRUE;
  817.  
  818.   FOR Slot := 1 TO LENGTH(Io_Template) DO
  819.     IF Work_Template[Slot] = ' '
  820.       THEN BEGIN
  821.         Io_Template[Slot] := Temp_String[Slot];
  822.         Makeup := TRUE;
  823.       END
  824.       ELSE BEGIN
  825.         IF ((Makeup) AND (Io_Template[Slot] <> ' '))
  826.           THEN BEGIN
  827.             Io_Template[Slot] := UpCase(Io_Template[Slot]);
  828.             Makeup := FALSE;
  829.           END;
  830.         IF Io_Template[Slot] IN ['_',' ','=',':',
  831.                                  '(',')','[',']',
  832.                                  '<','>',';','+',
  833.                                  '-','/','*','^',
  834.                                  ',','@','$','.']
  835.           THEN Makeup := TRUE;
  836.       END;
  837. END;
  838.  
  839. PROCEDURE Get_Options;
  840.  
  841. VAR
  842.   SelId:        INTEGER;
  843.   Alert_Prompt: Str255;
  844.   UcBtn,LcBtn,AiBtn,BlBtn : INTEGER;
  845.  
  846.   FUNCTION GetOption(Title : Str255;
  847.                      DefOpt : OptTypes) : OptTypes;
  848.  
  849.   VAR
  850.     I:          INTEGER;
  851.  
  852.   BEGIN
  853.  
  854.     Dialog := New_Dialog( 8, 0, 0, 40, 9 ) ;
  855.  
  856.     I := (38  DIV 2) - (LENGTH(Title) DIV 2);
  857.  
  858.     IF I < 1 THEN I := 0;
  859.  
  860.     Prompt_Item := Add_Ditem( Dialog, G_String, None, I+2, 1, 35, 1, 0, 0 ) ;
  861.  
  862.     Set_Dtext( Dialog, Prompt_Item, Title,
  863.                        System_Font, Te_Left ) ;
  864.  
  865.     UcBtn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn,
  866.                                 2, 3, 9, 2, 2, $0000 ) ;
  867.  
  868.     Set_Dtext( Dialog, UcBtn, 'UPPERCASE', System_Font, Te_Center ) ;
  869.  
  870.     LcBtn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn,
  871.                                 13, 3, 9, 2, 2, $0000 ) ;
  872.  
  873.     Set_Dtext( Dialog, LcBtn, 'lowercase', System_Font, Te_Center ) ;
  874.  
  875.     AiBtn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn,
  876.                                 24, 3, 4, 2, 2, $1180 ) ;
  877.  
  878.     Set_Dtext( Dialog, AiBtn, 'AsIs', System_Font, Te_Center ) ;
  879.  
  880.     BlBtn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn,
  881.                                 30, 3, 8, 2, 2, $1180 ) ;
  882.  
  883.     Set_Dtext( Dialog, BlBtn, 'BoreLand', System_Font, Te_Center ) ;
  884.  
  885.     Ok_Btn := Add_Ditem( Dialog, G_Button, Selectable|Default|exit_Btn,
  886.                                  9, 6, 8, 2, 2, $1180 ) ;
  887.  
  888.     Set_Dtext( Dialog, Ok_Btn, 'OK', System_Font, Te_Center ) ;
  889.  
  890.     Cancel_Btn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn,
  891.                                      23, 6, 8, 2, 2, $1180 ) ;
  892.  
  893.     Set_Dtext( Dialog, Cancel_Btn, 'Cancel', System_Font, Te_Center ) ;
  894.  
  895.     Center_Dialog( Dialog ) ;
  896.  
  897.     Button := Do_Dialog( Dialog, 0) ;
  898.  
  899.     End_Dialog(Dialog);
  900.  
  901.     Delete_Dialog(Dialog);
  902.  
  903.     IF Button = UcBtn        THEN GetOption := UCase
  904.       ELSE IF Button = LcBtn THEN GetOption := LCase
  905.       ELSE IF Button = AiBtn THEN GetOption := AsIsOpt
  906.       ELSE IF Button = BlBtn THEN GetOption := BoreLand
  907.       ELSE GetOption := DefOpt;
  908.  
  909.     Clear_Screen;
  910.  
  911.   END;
  912.  
  913. BEGIN
  914.  
  915.   REPEAT
  916.  
  917.     Alert_Prompt := '[0][Defaults Reserved     ';
  918.  
  919.     CASE ResOpt OF
  920.       UCase    : Alert_Prompt := ConCat(Alert_Prompt,'UPPERCASE|');
  921.       LCase    : Alert_Prompt := ConCat(Alert_Prompt,'lowercase|');
  922.       AsIsOpt  : Alert_Prompt := ConCat(Alert_Prompt,'As Is|');
  923.       BoreLand : Alert_Prompt := ConCat(Alert_Prompt,'BoreLand|');
  924.     END;
  925.  
  926.     Alert_Prompt := ConCat(Alert_Prompt,'         Non-Reserved ');
  927.  
  928.     CASE NrsOpt OF
  929.       UCase    : Alert_Prompt := ConCat(Alert_Prompt,'UPPERCASE|');
  930.       LCase    : Alert_Prompt := ConCat(Alert_Prompt,'lowercase|');
  931.       AsIsOpt  : Alert_Prompt := ConCat(Alert_Prompt,'As Is|');
  932.       BoreLand : Alert_Prompt := ConCat(Alert_Prompt,'BoreLand|');
  933.     END;
  934.  
  935.     Alert_Prompt := ConCat(Alert_Prompt,'         Extentions   ');
  936.  
  937.     CASE ExtOpt OF
  938.       UCase    : Alert_Prompt := ConCat(Alert_Prompt,'UPPERCASE]');
  939.       LCase    : Alert_Prompt := ConCat(Alert_Prompt,'lowercase]');
  940.       AsIsOpt  : Alert_Prompt := ConCat(Alert_Prompt,'As Is]');
  941.       BoreLand : Alert_Prompt := ConCat(Alert_Prompt,'BoreLand]');
  942.     END;
  943.  
  944.     Alert_Prompt := ConCat(Alert_Prompt,'[ Change | Ok | Cancel ]');
  945.  
  946.     SelId := Do_Alert(Alert_Prompt,0);
  947.  
  948.     Clear_Screen;
  949.  
  950.     IF SelId = 1
  951.       THEN BEGIN
  952.         Alert_Prompt := '';
  953.         Alert_Prompt := ConCat('[0]',
  954.   '[           Select One           ]',
  955.   '[ Res | Non Res | Ext ]');
  956.         SelId := Do_Alert(Alert_Prompt,0);
  957.         Clear_Screen;
  958.         CASE SelId OF
  959.           1 : ResOpt := GetOption('Reserved',ResOpt);
  960.           2 : NrsOpt := GetOption('Non-Reserved',NrsOpt);
  961.           3 : ExtOpt := GetOPtion('Extension',ExtOpt);
  962.         END;
  963.         SelId := 0;
  964.       END;
  965.  
  966.   UNTIL SeLid IN [2..3];
  967.  
  968. END;
  969.  
  970. FUNCTION Get_Ofname(    Prompt : Str255;
  971.                     VAR Path : Path_Name) : BOOLEAN;
  972.  
  973. VAR
  974.   Template:     Str255;
  975.   Validation:   Str255;
  976.   I:            INTEGER;
  977.   I1:           INTEGER;
  978.  
  979.   Dialog : Dialog_Ptr ;
  980.   Button,
  981.   Ok_Btn,
  982.   Cancel_Btn,
  983.   Prompt_Item,
  984.   Fname_Item : INTEGER ;
  985.  
  986. BEGIN
  987.  
  988.   IF LENGTH(Prompt) > LENGTH(Path)
  989.     THEN I := LENGTH(Prompt) + 12
  990.     ELSE I := LENGTH(Path) + 12;
  991.  
  992.   IF I < 45 THEN I := 45;
  993.  
  994.   IF I > 75 THEN I := 75;
  995.  
  996.   Dialog := New_Dialog( 4, 0, 0, I+4, 8 ) ;
  997.  
  998.   I1 := (I DIV 2) - (LENGTH(Prompt) DIV 2);
  999.  
  1000.   Prompt_Item := Add_Ditem( Dialog, G_String, None,
  1001.                             I1+2, 1, I, 0, 0, 0 ) ;
  1002.  
  1003.   Set_Dtext( Dialog, Prompt_Item, Prompt,
  1004.                      System_Font, Te_Center ) ;
  1005.  
  1006.   Fname_Item := Add_Ditem( Dialog, G_FText, None, 2, 3, I, 1, 0, $1180 );
  1007.  
  1008.   Template := '';
  1009.  
  1010.   FOR I1 := 1 TO I DO Template := ConCat(Template,'_');
  1011.  
  1012.   Validation := '';
  1013.  
  1014.   FOR I1 := 1 TO I DO Validation := ConCat(Validation,'p');
  1015.  
  1016.   Set_Dedit( Dialog, Fname_Item, Template, Validation, Path,
  1017.                      System_Font, Te_Left ) ;
  1018.  
  1019.   I1 := (I DIV 2) - 11;
  1020.  
  1021.   Ok_Btn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn|default,
  1022.                                I1+2, 5, 8, 2, 2, $1180 ) ;
  1023.  
  1024.   Set_Dtext( Dialog, Ok_Btn, 'OK', System_Font, Te_Center ) ;
  1025.  
  1026.   Cancel_Btn := Add_Ditem( Dialog, G_Button, Selectable|exit_Btn,
  1027.                                    I1+16, 5, 8, 2, 2, $1180 ) ;
  1028.  
  1029.   Set_Dtext( Dialog, Cancel_Btn, 'Cancel', System_Font, Te_Center ) ;
  1030.  
  1031.   Center_Dialog( Dialog ) ;
  1032.  
  1033.   Button := Do_Dialog( Dialog, Date_Item ) ;
  1034.  
  1035.   Get_Dedit( Dialog, Date_Item, Template);
  1036.  
  1037.   End_Dialog(Dialog);
  1038.  
  1039.   Delete_Dialog(Dialog);
  1040.  
  1041.   Path := Template;
  1042.  
  1043.   IF Button = Cancel_Btn
  1044.     THEN Get_Ofname := TRUE
  1045.     ELSE Get_Ofname := FALSE;
  1046.  
  1047.   Clear_Screen;
  1048.  
  1049. END;
  1050.  
  1051. PROCEDURE Get_Ifname;
  1052.  
  1053. VAR
  1054.   Path:         Path_Name;
  1055.  
  1056. BEGIN
  1057.  
  1058.   Path := 'd:*.*';
  1059.  
  1060.   IF Get_In_File(Path, Ifname)
  1061.     THEN BEGIN
  1062.       Clear_Screen;
  1063.       Ofname := Ifname;
  1064.       Can_Prog := Get_Ofname('Pascal Formated File Name',
  1065.                              Ofname);
  1066.     END
  1067.     ELSE BEGIN
  1068.       Clear_Screen;
  1069.       Can_Prog := TRUE;
  1070.     END;
  1071.  
  1072. END;
  1073.  
  1074. {*****************************************************************************}
  1075.  
  1076. BEGIN {--------------------------------------------------------------- pFormat}
  1077.  
  1078.   IF Init_Gem >= 0
  1079.     THEN BEGIN
  1080.  
  1081.       Clear_Screen;
  1082.  
  1083.       ResOpt := UCase;
  1084.       NrsOpt := LCase;
  1085.       ExtOpt := BoreLand;
  1086.  
  1087.       Can_Prog := FALSE;
  1088.  
  1089.       Init_Array;
  1090.  
  1091.       Reply := ConCat('[0]',
  1092.                       '[  Abort with a Keypress?   ]',
  1093.                       '[ Yes | No | Cancel]');
  1094.  
  1095.       CASE Do_Alert(Reply,0) OF
  1096.         1 : Interruptable := TRUE;
  1097.         2 : Interruptable := FALSE;
  1098.         3 : Can_Prog := TRUE;
  1099.       END;
  1100.  
  1101.       Clear_Screen;
  1102.  
  1103.       WHILE NOT Can_Prog DO BEGIN
  1104.  
  1105.         Clear_Screen;
  1106.  
  1107.         GotoXY (1,1);
  1108.  
  1109.         Get_Ifname;
  1110.  
  1111.         IF NOT Can_Prog
  1112.           THEN BEGIN
  1113.  
  1114.             Get_Options;
  1115.  
  1116.             IF NOT Can_Prog
  1117.               THEN BEGIN
  1118.                 CASE ResOpt OF
  1119.                   UCase   : Res_Case := Upper;
  1120.                   LCase   : Res_Case := Lower;
  1121.                   AsIsOpt : Res_Case := AsIs;
  1122.                 END;
  1123.  
  1124.                 CASE NrsOpt OF
  1125.                   UCase   : Non_Res_Case := Upper;
  1126.                   LCase   : Non_Res_Case := Lower;
  1127.                   AsIsOpt : Non_Res_Case := AsIs;
  1128.                 END;
  1129.  
  1130.                 CASE ExtOpt OF
  1131.                   UCase   : Borland_Convention := FALSE;
  1132.                   LCase   : Borland_Convention := FALSE;
  1133.                   AsIsOpt : Borland_Convention := FALSE;
  1134.                   BoreLand: Borland_Convention := TRUE;
  1135.                 END;
  1136.  
  1137.                 Clear_Screen;
  1138.  
  1139.                 Hide_Mouse;
  1140.  
  1141.                 Comment_Active := FALSE;
  1142.  
  1143.                 RESET(Text_File,Ifname);
  1144.                 REWRITE(Pretty_Output,Ofname);
  1145.  
  1146.                 WHILE (NOT (EOF(Text_File))) AND
  1147.                       (NOT Can_Prog) DO BEGIN
  1148.                   READLN  (Text_File, Io_Template);
  1149.                   Parse;
  1150.                   WRITELN (Io_Template);
  1151.                   WRITELN (Pretty_Output, Io_Template);
  1152.                 END;
  1153.  
  1154.                 CLOSE (Text_File);
  1155.                 CLOSE (Pretty_Output);
  1156.  
  1157.                 Show_Mouse;
  1158.  
  1159.               END;
  1160.           END;
  1161.  
  1162.         IF NOT Can_Prog
  1163.           THEN CASE Do_Alert('[0][Format another program?][ Yes | No ]',0) OF
  1164.                  1 : Can_Prog := FALSE;
  1165.                  2 : Can_Prog := TRUE;
  1166.                END;
  1167.  
  1168.         Clear_Screen;
  1169.  
  1170.       END;
  1171.  
  1172.       Exit_Gem ;
  1173.  
  1174.     END ;
  1175.  
  1176. END.  {---------------------------------------------------------------pFormat}
  1177. ;
  1178.      35 : Extension := 'HeapStr';
  1179.      36 : Extension := 'HiRes