home *** CD-ROM | disk | FTP | other *** search
/ Programmer Power Tools / Programmer Power Tools.iso / pibterm / pibt41s3.arc / PROCESS4.MOD < prev    next >
Encoding:
Text File  |  1988-03-07  |  45.2 KB  |  1,330 lines

  1. (*----------------------------------------------------------------------*)
  2. (*             Get_Script_Name --- Get script name                      *)
  3. (*----------------------------------------------------------------------*)
  4.  
  5. PROCEDURE Get_Script_Name;
  6.  
  7. (*----------------------------------------------------------------------*)
  8. (*                                                                      *)
  9. (*     Procedure:  Get_Script_Name                                      *)
  10. (*                                                                      *)
  11. (*     Purpose:    Gets script name if not already supplied             *)
  12. (*                                                                      *)
  13. (*     Calling Sequence:                                                *)
  14. (*                                                                      *)
  15. (*        Get_Script_Name;                                              *)
  16. (*                                                                      *)
  17. (*----------------------------------------------------------------------*)
  18.  
  19. VAR
  20.    X : INTEGER;
  21.    Y : INTEGER;
  22.    Ch: CHAR;
  23.  
  24. BEGIN (* Get_Script_Name *)
  25.                                    (* Pick up script file name *)
  26.                                    (* if not already supplied  *)
  27.  
  28.    IF ( LENGTH( Script_File_Name ) = 0 ) THEN
  29.       BEGIN
  30.          TextColor( Menu_Text_Color_2 );
  31.          WRITELN('Script name (hit ENTER for menu, ESC to quit)');
  32.          WRITE('>');
  33.          TextColor( Menu_Text_Color );
  34.          X  := WhereX;
  35.          Y  := WhereY;
  36.          Ch := Edit_String( Script_File_Name, 255, X, X, Y, 64, FALSE, 0 );
  37.          IF ( Ch = CHR( ESC ) ) THEN
  38.             Script_File_Name := CHR( ESC );
  39.          WRITELN;
  40.       END;
  41.  
  42. END   (* Get_Script_Name *);
  43.  
  44. (*----------------------------------------------------------------------*)
  45. (*       Get_Script_File_Name --- Get file name from script name        *)
  46. (*----------------------------------------------------------------------*)
  47.  
  48. PROCEDURE Get_Script_File_Name( VAR Script_Name      : AnyStr;
  49.                                 VAR Script_File_Name : AnyStr );
  50.  
  51. (*----------------------------------------------------------------------*)
  52. (*                                                                      *)
  53. (*     Procedure:  Get_Script_File_Name                                 *)
  54. (*                                                                      *)
  55. (*     Purpose:    Gets file name from script name                      *)
  56. (*                                                                      *)
  57. (*     Calling Sequence:                                                *)
  58. (*                                                                      *)
  59. (*        Get_Script_File_Name( VAR Script_Name      : AnyStr;          *)
  60. (*                              VAR Script_File_Name : AnyStr );        *)
  61. (*                                                                      *)
  62. (*----------------------------------------------------------------------*)
  63.  
  64. VAR
  65.    I        : INTEGER;
  66.    J        : INTEGER;
  67.  
  68. BEGIN (* Get_Script_File_Name *)
  69.                                    (* If leading '*', then script is   *)
  70.                                    (* member of PIBTERM.SCL library.   *)
  71.  
  72.    IF ( Script_Name[1] = '*' ) THEN
  73.       BEGIN
  74.          Use_Script_Library := TRUE;
  75.          Script_Name        := COPY( Script_Name, 2,
  76.                                        LENGTH( Script_Name ) - 1 );
  77.       END
  78.    ELSE
  79.       Use_Script_Library := FALSE;
  80.                                    (* Convert script name to file name *)
  81.  
  82.    Script_File_Name := Script_Name;
  83.  
  84.    IF ( POS( '.', Script_File_Name ) = 0 ) THEN
  85.       Script_File_Name := Script_File_Name + '.SCR';
  86.  
  87.                                    (* Now strip off directory stuff *)
  88.                                    (* from script name itself.      *)
  89.  
  90.    I := POS( '.', Script_Name );
  91.                                    (* Remove trailing filetype      *)
  92.    IF ( I > 0 ) THEN
  93.       Script_Name := COPY( Script_Name, 1, I - 1 );
  94.  
  95.                                    (* Remove drive indicator        *)
  96.    I := POS( ':', Script_Name );
  97.  
  98.    IF ( I > 0 ) THEN
  99.       Script_Name := COPY( Script_Name, I + 1, LENGTH( Script_Name ) - I );
  100.  
  101.                                    (* Remove directory indicator *)
  102.  
  103.    IF ( POS( '\', Script_Name ) > 0 ) THEN
  104.       BEGIN
  105.          J := LENGTH( Script_Name );
  106.          FOR I := J DOWNTO 1 DO
  107.             IF ( Script_Name[I] = '\' ) THEN
  108.                BEGIN
  109.                   Script_Name := COPY( Script_Name, I + 1 , J - I );
  110.                   EXIT;
  111.                END;
  112.       END
  113.    ELSE
  114.       Script_File_Name := Script_Path + Script_File_Name;
  115.  
  116. END   (* Get_Script_File_Name *);
  117.  
  118. (*----------------------------------------------------------------------*)
  119. (*        Skip_To_Script --- Skips to script in script library          *)
  120. (*----------------------------------------------------------------------*)
  121.  
  122. FUNCTION Skip_To_Script( Script_Short_Name : AnyStr ) : BOOLEAN;
  123.  
  124. (*----------------------------------------------------------------------*)
  125. (*                                                                      *)
  126. (*     Function:  Skip_To_Script                                        *)
  127. (*                                                                      *)
  128. (*     Purpose:   Skips to script in library file                       *)
  129. (*                                                                      *)
  130. (*     Calling Sequence:                                                *)
  131. (*                                                                      *)
  132. (*        Found := Skip_To_Script( Script_Short_Name ) : BOOLEAN;       *)
  133. (*                                                                      *)
  134. (*           Script_Short_Name --- Script name to look for              *)
  135. (*           Found             --- TRUE if script found                 *)
  136. (*                                                                      *)
  137. (*----------------------------------------------------------------------*)
  138.  
  139. VAR
  140.    Found : BOOLEAN;
  141.  
  142. BEGIN (* Skip_To_Script *)
  143.  
  144.    Found := FALSE;
  145.  
  146.    Script_Short_Name := TRIM( Script_Short_Name );
  147.  
  148.    REPEAT
  149.  
  150.       READLN( Script_File , Script_Line );
  151.  
  152.       IF ( LENGTH( Script_Line ) > 2 ) THEN
  153.          IF ( COPY( Script_Line, 1, 2 ) = '==' ) THEN
  154.             Found := UpperCase( COPY( Script_Line, 3,
  155.                                         LENGTH( Script_Line ) - 2 ) ) =
  156.                      Script_Short_Name;
  157.  
  158.    UNTIL ( Found OR EOF( Script_File ) );
  159.  
  160.    Skip_To_Script := Found;
  161.  
  162. END   (* Skip_To_Script *);
  163.  
  164. (*----------------------------------------------------------------------*)
  165. (*               Store_Script --- Store script in script list           *)
  166. (*----------------------------------------------------------------------*)
  167.  
  168. PROCEDURE Store_Script( VAR Script_Slot : INTEGER );
  169.  
  170. (*----------------------------------------------------------------------*)
  171. (*                                                                      *)
  172. (*     Procedure:  Store_Script                                         *)
  173. (*                                                                      *)
  174. (*     Purpose:    Stores just-compiled script in script list           *)
  175. (*                                                                      *)
  176. (*     Calling Sequence:                                                *)
  177. (*                                                                      *)
  178. (*        Store_Script;                                                 *)
  179. (*                                                                      *)
  180. (*----------------------------------------------------------------------*)
  181.  
  182. VAR
  183.    I           : INTEGER;
  184.    Com_Line    : BOOLEAN;
  185.  
  186. BEGIN (* Store_Script *)
  187.                                    (* See if command line being faked   *)
  188.                                    (* as script.                        *)
  189.  
  190.    Com_Line := ( Script_Short_Name[1] = '!' );
  191.  
  192.                                    (* See if name already exists.       *)
  193.    Script_Slot := 0;
  194.  
  195.    IF ( NOT Com_Line ) THEN
  196.       FOR I := 1 TO Script_Count DO
  197.          IF ( Script_Short_Name = Scripts[I].Script_Name ) THEN
  198.             Script_Slot := I;
  199.                                    (* If slot specified, release memory *)
  200.                                    (* associated with it.               *)
  201.    IF ( Script_Slot > 0 ) THEN
  202.       BEGIN
  203.          WRITELN;
  204.          WRITELN( Script_Short_Name, ' replaced.' );
  205.          MyFreeMem( Scripts[Script_Slot].Script_Ptr ,
  206.                     Scripts[Script_Slot].Script_Len );
  207.       END
  208.    ELSE
  209.                                    (* Check if room to add script.  *)
  210.                                    (* If not, replace earliest one. *)
  211.  
  212.       IF ( Script_Count < MaxScripts ) THEN
  213.          BEGIN
  214.             INC( Script_Count );
  215.             Script_Slot  := Script_Count;
  216.          END
  217.       ELSE
  218.          BEGIN
  219.             IF ( NOT Com_Line ) THEN
  220.                BEGIN
  221.                   WRITELN;
  222.                   WRITELN('This script replaces script ',Scripts[1].Script_Name );
  223.                END;
  224.             Script_Slot := 1;
  225.             MyFreeMem( Scripts[1].Script_Ptr , Scripts[1].Script_Len );
  226.          END;
  227.  
  228.    WITH Scripts[Script_Slot] DO
  229.       BEGIN
  230.          Script_Name         := Script_Short_Name;
  231.          Script_Ptr          := Script_Buffer;
  232.          Script_Len          := Script_Buffer_Size;
  233.          Script_Vars_Count   := Script_Variable_MaxKount;
  234.          Script_Vars         := NIL;
  235.          Script_Params_Count := Import_Count;
  236.          Script_Params       := NIL;
  237.       END;
  238.  
  239. END   (* Store_Script *);
  240.  
  241. (*----------------------------------------------------------------------*)
  242. (*         Get_Library_Script --- Compile a script from library file    *)
  243. (*----------------------------------------------------------------------*)
  244.  
  245. PROCEDURE Get_Library_Script;
  246.  
  247. VAR
  248.    I: INTEGER;
  249.  
  250. BEGIN (* Get_Library_Script *)
  251.                                    (* Assign script library name *)
  252.  
  253.    ASSIGN( Script_File , Home_Dir + 'PIBTERM.SCL' );
  254.       (*!I-*)
  255.    RESET ( Script_File );
  256.       (*!I+*)
  257.                                    (* Skip down to selected member. *)
  258.  
  259.    Script_File_OK := ( Int24Result = 0 );
  260.  
  261.    IF Script_File_OK THEN
  262.       BEGIN
  263.          Script_File_Ok := Skip_To_Script( Script_Short_Name );
  264.          IF Script_File_OK THEN
  265.             Use_Script_Library := TRUE;
  266.       END
  267.    ELSE
  268.       BEGIN
  269.             (*!I-*)
  270.          CLOSE( Script_File );
  271.             (*!I+*)
  272.          I := INT24Result;
  273.       END;
  274.  
  275. END   (* Get_Library_Script *);
  276.  
  277. (*----------------------------------------------------------------------*)
  278. (*         Get_Dir_Script --- Compile a script from disk file           *)
  279. (*----------------------------------------------------------------------*)
  280.  
  281. PROCEDURE Get_Dir_Script;
  282.  
  283. VAR
  284.    I: INTEGER;
  285.  
  286. BEGIN (* Get_Dir_Script *)
  287.                                    (* Assign script library name *)
  288.  
  289.    ASSIGN( Script_File , Script_File_Name );
  290.       (*!I-*)
  291.    RESET ( Script_File );
  292.       (*!I+*)
  293.                                    (* See if open went OK        *)
  294.  
  295.    Script_File_OK := ( Int24Result = 0 );
  296.  
  297.    IF ( NOT Script_File_OK ) THEN
  298.          (*!I-*)
  299.       CLOSE( Script_File );
  300.          (*!I+*)
  301.  
  302.    I := INT24Result;
  303.  
  304. END   (* Get_Dir_Script *);
  305.  
  306. (*----------------------------------------------------------------------*)
  307. (*           Locate_Script_File --- Locate script file                  *)
  308. (*----------------------------------------------------------------------*)
  309.  
  310. PROCEDURE Locate_Script_File;
  311.  
  312. BEGIN (* Locate_Script_File *)
  313.                                    (* Check if library search forced *)
  314.    IF Use_Script_Library THEN
  315.       Get_Library_Script
  316.    ELSE                            (* Otherwise do search in proper order *)
  317.       CASE Script_Search_Order OF
  318.  
  319.          Dir_Then_Lib : BEGIN
  320.                            Get_Dir_Script;
  321.                            IF ( NOT Script_File_OK ) THEN
  322.                               Get_Library_Script;
  323.                         END;
  324.  
  325.          Lib_Then_Dir : BEGIN
  326.                            Get_Library_Script;
  327.                            IF ( NOT Script_File_OK ) THEN
  328.                               Get_Dir_Script;
  329.                         END;
  330.  
  331.          Dir_Only     : Get_Dir_Script;
  332.  
  333.          Lib_Only     : Get_Library_Script;
  334.  
  335.       END (* CASE *);
  336.  
  337. END   (* Locate_Script_File *);
  338.  
  339. (*----------------------------------------------------------------------*)
  340. (*              Compile_Script --- Compile a script to memory           *)
  341. (*----------------------------------------------------------------------*)
  342.  
  343. PROCEDURE Compile_Script;
  344.  
  345. (*----------------------------------------------------------------------*)
  346. (*                                                                      *)
  347. (*     Procedure:  Compile_Script                                       *)
  348. (*                                                                      *)
  349. (*     Purpose:    Compiles a script to memory                          *)
  350. (*                                                                      *)
  351. (*     Calling Sequence:                                                *)
  352. (*                                                                      *)
  353. (*        Compile_Script;                                               *)
  354. (*                                                                      *)
  355. (*----------------------------------------------------------------------*)
  356.  
  357. VAR
  358.    I          : INTEGER;
  359.    Local_Save : Saved_Screen_Ptr;
  360.  
  361. LABEL 99;
  362.  
  363. (*----------------------------------------------------------------------*)
  364.  
  365. PROCEDURE Cant_Store( S : AnyStr );
  366.  
  367. BEGIN (* Cant_Store *)
  368.  
  369.    IF ( LENGTH( S ) > 0 ) THEN
  370.       WRITELN( S );
  371.  
  372.    WRITELN('Script will not be stored.');
  373.  
  374.    Script_File_Mode   := FALSE;
  375.  
  376.    MyFreeMem( Script_Buffer , Script_Buffer_Size );
  377.  
  378.    Script_File_Mode := FALSE;
  379.  
  380. {--IMP
  381.    IF Script_Debug_Mode THEN
  382.       BEGIN
  383.             (*!I-*)
  384.          WRITELN( Script_Debug_File , '---> Fatal error: ' , S );
  385.             (*!I+*)
  386.          I := Int24Result;
  387.       END;
  388. }
  389. END   (* Cant_Store *);
  390.  
  391. (*----------------------------------------------------------------------*)
  392.  
  393. PROCEDURE Read_Write_Spill_File;
  394.  
  395. VAR
  396.    L: INTEGER;
  397.  
  398. BEGIN (* Read_Write_Spill_File *)
  399.  
  400. {--IMP
  401.    IF Script_Debug_Mode THEN
  402.       BEGIN
  403.             (*!I-*)
  404.          WRITELN( Script_Debug_File , '---> Copy uses spill file.' );
  405.             (*!I+*)
  406.          I := Int24Result;
  407.       END;
  408. }
  409.    ASSIGN ( Spill_File , Script_Path + 'ZZSPILL.DAT' );
  410.       (*!I-*)
  411.    REWRITE( Spill_File , 1 );
  412.       (*!I+*)
  413.  
  414.    IF ( INT24Result <> 0 ) THEN
  415.       BEGIN
  416.          Cant_Store('Can''t open spill file.');
  417.          EXIT;
  418.       END;
  419.  
  420.    L := Script_Buffer_Pos;
  421.  
  422.       (*!I-*)
  423.    BlockWrite( Spill_File, Script_Buffer^[1], L );
  424.       (*!I+*)
  425.  
  426.    IF ( INT24Result <> 0 ) THEN
  427.       BEGIN
  428.          Cant_Store('Error writing to spill file.');
  429.          EXIT;
  430.       END;
  431.  
  432.    MyFreeMem( Script_Buffer , Script_Buffer_Size );
  433.  
  434.    GETMEM ( Script_Buffer , Script_Buffer_Pos );
  435.  
  436.       (*!I-*)
  437.    CLOSE  ( Spill_File );
  438.       (*!I+*)
  439.  
  440.    IF ( INT24Result <> 0 ) THEN
  441.       BEGIN
  442.          Cant_Store('Error closing spill file.');
  443.          EXIT;
  444.       END;
  445.  
  446.    IF ( Script_Buffer = NIL ) THEN
  447.       BEGIN
  448.          Cant_Store('Not enough memory to store script.');
  449.          EXIT;
  450.       END;
  451.  
  452.       (*!I-*)
  453.    RESET  ( Spill_File , Script_Buffer_Pos );
  454.       (*!I+*)
  455.  
  456.    IF ( INT24Result <> 0 ) THEN
  457.       BEGIN
  458.          Cant_Store('Error re-opening spill file.');
  459.          EXIT;
  460.       END;
  461.  
  462.       (*!I-*)
  463.    BlockRead( Spill_File, Script_Buffer^[1], 1 );
  464.       (*!I+*)
  465.  
  466.    IF ( INT24Result <> 0 ) THEN
  467.       BEGIN
  468.          Cant_Store('Error reading spill file.');
  469.          EXIT;
  470.       END;
  471.  
  472.       (*!I-*)
  473.    CLOSE( Spill_File );
  474.       (*!I+*)
  475.  
  476.    IF ( INT24Result <> 0 ) THEN
  477.       BEGIN
  478.          Cant_Store('Error closing spill file.');
  479.          EXIT;
  480.       END;
  481.  
  482.       (*!I-*)
  483.    ERASE( Spill_File );
  484.       (*!I+*)
  485.  
  486.    IF ( INT24Result <> 0 ) THEN
  487.       BEGIN
  488.          Cant_Store('Error erasing spill file.');
  489.          EXIT;
  490.       END;
  491.  
  492. END   (* Read_Write_Spill_File *);
  493.  
  494. (*----------------------------------------------------------------------*)
  495.  
  496. BEGIN (* Compile_Script *)
  497.                                    (* Save current screen *)
  498.  
  499.    Draw_Titled_Box( Local_Save, 10, 10, 78, 20, 'Compile script file' );
  500.  
  501.                                    (* Get script name to compile *)
  502.    Get_Script_Name;
  503.                                    (* Quit if null entry *)
  504.  
  505.    IF LENGTH( Script_File_Name ) <= 0 THEN
  506.       BEGIN
  507.          Restore_Screen_And_Colors( Local_Save );
  508.          EXIT;
  509.       END;
  510.                                    (* Fix up script file name *)
  511.  
  512.    Script_Short_Name := UpperCase( TRIM( Script_File_Name ) );
  513.  
  514.    Get_Script_File_Name( Script_Short_Name , Script_File_Name );
  515.  
  516.                                    (* Get the script from a .SCR file *)
  517.                                    (* or from library PIBTERM.SCL     *)
  518.    Locate_Script_File;
  519.                                    (* Quit now if we couldn't find *)
  520.                                    (* the script.                  *)
  521.    IF ( NOT Script_File_OK ) THEN
  522.       BEGIN
  523.  
  524.          WRITELN(' ');
  525.          WRITELN('Script ',Script_Short_Name,' not found');
  526.          WRITELN(' ');
  527.  
  528.          Really_Wait_String  := FALSE;
  529.          Script_Suspend_Time := 0;
  530.          Script_File_Mode    := FALSE;
  531.  
  532.                                    (* Restore previous screen *)
  533.          Window_Delay;
  534.  
  535.          Restore_Screen_And_Colors( Local_Save );
  536.  
  537.                                    (* Quit now *)
  538.          EXIT;
  539.  
  540.       END;
  541.                                    (* Tell where script found *)
  542.    WRITELN(' ');
  543.    IF ( NOT Use_Script_Library ) THEN
  544.       WRITELN('Beginning scan of ',Script_File_Name)
  545.    ELSE
  546.       WRITELN('Beginning scan of ',Script_Short_Name,' in PIBTERM.SCL');
  547.    WRITELN(' ');
  548.                                    (* Allocate long buffer to hold  *)
  549.                                    (* compiled script commands.  It *)
  550.                                    (* will be truncated later as    *)
  551.                                    (* necessary.                    *)
  552.  
  553.    Script_Memory_Avail := MaxAvail - 8000;
  554.  
  555.    IF ( Script_Memory_Avail > 32000 ) THEN
  556.       Script_Memory_Avail := 32000
  557.    ELSE IF ( Script_Memory_Avail <= 2048 ) THEN
  558.       BEGIN
  559.          Cant_Store('Not enough memory to compile script.');
  560.          GOTO 99;
  561.       END;
  562.  
  563.    Script_Buffer_Size := Script_Memory_Avail;
  564.  
  565.    GETMEM( Script_Buffer , Script_Buffer_Size );
  566.  
  567.                                    (* Open debugging file if needed *)
  568.    Script_Debug_Mode := FALSE;
  569.  
  570. {--IMP
  571.    IF ( POS( 'ZZBOGUS.SCR' , Script_File_Name ) > 0 ) THEN
  572.       BEGIN
  573.          ASSIGN ( Script_Debug_File , 'ZZBOGUS.DBG' );
  574.          REWRITE( Script_Debug_File );
  575.          Script_Debug_Mode := TRUE;
  576.          WRITELN( Script_Debug_File ,
  577.                   '=== Script buffer size = ',Script_Buffer_Size);
  578.       END;
  579. }
  580.                                    (* Current offset in script buffer *)
  581.    Script_Buffer_Pos     := 0;
  582.                                    (* No procedures yet defined     *)
  583.    Script_Proc_Count     := 0;
  584.    Script_Proc_Start     := 0;
  585.                                    (* All stacks empty              *)
  586.    Script_Repeat_Level   := 0;
  587.    Script_If_Level       := 0;
  588.    Script_While_Level    := 0;
  589.    Script_Case_Level     := 0;
  590.    Script_For_Level      := 0;
  591.    Script_Proc_Level     := 0;
  592.                                    (* Script line number            *)
  593.    Script_Line_Number    := 0;
  594.                                    (* No variables yet              *)
  595.    Script_Variable_Kount    := 2;
  596.    Script_Variable_MaxKount := 2;
  597.    Import_Count             := 0;
  598.  
  599.    WITH Script_Vars[1] DO
  600.       BEGIN
  601.          Var_Name   := ' ';
  602.          Var_Type   := String_Variable_Type;
  603.       END;
  604.  
  605.    WITH Script_Vars[2] DO
  606.       BEGIN
  607.          Var_Name   := ' ';
  608.          Var_Type   := String_Variable_Type;
  609.       END;
  610.                                    (* Not special EOF marker        *)
  611.    Script_EOF := FALSE;
  612.                                    (* Read and compile lines from   *)
  613.                                    (* script file                   *)
  614.    REPEAT
  615.                                    (* Read script line             *)
  616.  
  617.       READLN( Script_File , Script_Line );
  618.  
  619.                                    (* Increment count read         *)
  620.  
  621.       INC( Script_Line_Number );
  622.  
  623.                                    (* Length of line read          *)
  624.  
  625.       Length_Script_Line := LENGTH( Script_Line );
  626.  
  627.       Saved_Script_Line := Script_Line;
  628.       OK_Script_Command := TRUE;
  629.  
  630.                                    (* Check for serious read error *)
  631.       IF Int24Result <> 0 THEN
  632.          OK_Script_Command := FALSE
  633.  
  634.                                    (* Skip comment lines           *)
  635.  
  636.       ELSE IF ( Length_Script_Line > 0 ) THEN
  637.          IF ( Script_Line[1] = '=' ) THEN
  638.             BEGIN
  639.                IF ( Length_Script_Line > 1 ) THEN
  640.                   IF ( Script_Line[2] = '=' ) THEN
  641.                      IF ( Length_Script_Line > 2 ) THEN
  642.                         IF ( Script_Line[3] <> ' ' ) THEN
  643.                            Script_EOF := ( Script_Line_Number > 1 );
  644.             END
  645.          ELSE IF ( Script_Line[1] <> '*' ) THEN
  646.  
  647.                                    (* Parse and store compiled command *)
  648.             BEGIN
  649. {--IMP
  650.                IF Script_Debug_Mode THEN
  651.                   BEGIN
  652.                      WRITELN( Script_Debug_File , '--- next statement --- ' );
  653.                      WRITELN( Script_Debug_File , '<', Script_Line, '>' );
  654.                      WRITELN( Script_Debug_File , '--- ');
  655.                   END;
  656. }
  657.                Extract_Script_Command( OK_Script_Command );
  658.  
  659.                IF OK_Script_Command THEN
  660.                   Parse_Script_Command  ( OK_Script_Command )
  661.                ELSE
  662.                   WRITELN('Unrecognized script command');
  663.  
  664.                IF ( NOT Ok_Script_Command ) THEN
  665.                   BEGIN
  666.  
  667.                      WRITELN('>>> Error in line ',
  668.                               Script_Line_Number, ' of script: ');
  669.                      WRITELN( Saved_Script_Line );
  670.  
  671.                      Press_Any;
  672.  
  673.                   END;
  674.  
  675.          END;
  676.  
  677.    UNTIL ( EOF( Script_File ) OR ( NOT OK_Script_Command ) OR Script_EOF );
  678.  
  679.                                    (* Close script file.             *)
  680.       (*!I-*)
  681.    CLOSE( Script_File );
  682.       (*!I+*)
  683.  
  684.    I := Int24Result;
  685.                                    (* Drop "finish script" command   *)
  686.                                    (* into script buffer.            *)
  687. {--IMP
  688.    IF Script_Debug_Mode THEN
  689.       WRITELN( Script_Debug_File , '--- Exit statement follows ... ');
  690. }
  691.    Copy_Byte_To_Buffer( ORD( ExitSy ) );
  692.  
  693.                                    (* Check if stacks empty.  If not,  *)
  694.                                    (* error from unclosed loop.        *)
  695.  
  696.    OK_Script_Command := OK_Script_Command           AND
  697.                         ( Script_Repeat_Level = 0 ) AND
  698.                         ( Script_If_Level     = 0 ) AND
  699.                         ( Script_Case_Level   = 0 ) AND
  700.                         ( Script_For_Level    = 0 ) AND
  701.                         ( Script_While_Level  = 0 ) AND
  702.                         ( Script_Proc_Level   = 0 );
  703.  
  704.                                    (* Release memory from proc ptrs     *)
  705.                                    (* if error caused script scan abort *)
  706.  
  707.    Dispose_Proc_Stuff( 1 , Script_Proc_Count );
  708.  
  709.                                    (* If everything OK, allow script   *)
  710.                                    (* to execute, else release buffer. *)
  711.    Really_Wait_String  := FALSE;
  712.    Script_Suspend_Time := 0;
  713.  
  714.    IF OK_Script_Command THEN
  715.       BEGIN
  716.                                    (* Truncate script memory to what  *)
  717.                                    (* is actually needed.             *)
  718.                                    (* First, see if compiled script   *)
  719.                                    (* can be move via Sector_Data.    *)
  720.                                    (* If so, do that.  If not, open   *)
  721.                                    (* spill file, write out code,     *)
  722.                                    (* release memory, reallocate, and *)
  723.                                    (* read code back in into shorter  *)
  724.                                    (* memory block.                   *)
  725.  
  726.          Script_File_Mode := TRUE;
  727.  
  728.          IF ( Script_Buffer_Pos <= MaxSectorLength ) THEN
  729.             BEGIN
  730.  
  731.                MOVE     ( Script_Buffer^[1], Sector_Data, Script_Buffer_Pos );
  732.                MyFreeMem( Script_Buffer , Script_Buffer_Size );
  733.                GETMEM   ( Script_Buffer , Script_Buffer_Pos  );
  734.                IF( Script_Buffer = NIL ) THEN
  735.                   Cant_Store('');
  736.                MOVE   ( Sector_Data, Script_Buffer^[1], Script_Buffer_Pos );
  737. {--IMP
  738.                IF Script_Debug_Mode THEN
  739.                   BEGIN
  740.                         (*!I-*)
  741.                      WRITELN( Script_Debug_File ,
  742.                               '---> Copy uses Sector_Data.' );
  743.                         (*!I+*)
  744.                      I := Int24Result;
  745.                   END;
  746. }
  747.             END
  748.          ELSE
  749.             BEGIN
  750.                Read_Write_Spill_File;
  751.             END;
  752.  
  753.          IF Script_File_Mode THEN
  754.             BEGIN
  755.  
  756.                Script_Buffer_Size := Script_Buffer_Pos;
  757.                Script_Buffer_Pos  := 0;
  758.                Script_File_Mode   := TRUE;
  759.  
  760.                WRITELN('Script file OK.');
  761.  
  762.                Store_Script( Current_Script_Num );
  763.  
  764.                Window_Delay;
  765.  
  766.             END
  767.          ELSE
  768.             MyFreeMem( Script_Buffer , Script_Buffer_Pos );
  769.  
  770.       END
  771.    ELSE
  772.       BEGIN
  773.          Cant_Store('');
  774.          MyFreeMem( Script_Buffer , Script_Buffer_Size );
  775.       END;
  776.                                    (* Close debugging file    *)
  777. 99:
  778.  
  779. {--IMP
  780.    IF Script_Debug_Mode THEN
  781.       BEGIN
  782.             (*!I-*)
  783.          CLOSE( Script_Debug_File );
  784.             (*!I+*)
  785.          I := Int24Result;
  786.       END;
  787. }
  788.                                    (* Restore previous screen *)
  789.  
  790.    Restore_Screen_And_Colors( Local_Save );
  791.  
  792. END   (* Compile_Script *);
  793.  
  794. (*----------------------------------------------------------------------*)
  795. (*         Push_Current_Script --- Push current script onto stack       *)
  796. (*----------------------------------------------------------------------*)
  797.  
  798. PROCEDURE Push_Current_Script;
  799.  
  800. BEGIN (* Push_Current_Script *)
  801.  
  802.    IF Script_File_Mode THEN
  803.       BEGIN
  804.  
  805.          INC( Script_Stack_Depth );
  806.  
  807.          WITH Script_Stack_Position[Script_Stack_Depth] DO
  808.             BEGIN
  809.                Buffer_Pos   := Script_Buffer_Pos;
  810.                Buffer_Ptr   := Script_Buffer;
  811.                Script_Num   := Current_Script_Num;
  812.                Vars_Ptr     := Script_Variables;
  813.                Vars_Count   := Script_Variable_Count;
  814.                Params_Ptr   := Script_Parameters;
  815.                Params_Count := Script_Parameter_Count;
  816.                Params_Got   := Script_Parameter_Got;
  817.                Prev_Ptr     := Prev_Script_Variables;
  818.             END;
  819.  
  820.       END;
  821.  
  822. END   (* Push_Current_Script *);
  823.  
  824. (*----------------------------------------------------------------------*)
  825. (*         Pop_Current_Script --- Pop current script off of stack       *)
  826. (*----------------------------------------------------------------------*)
  827.  
  828. PROCEDURE Pop_Current_Script;
  829.  
  830. BEGIN (* Pop_Current_Script *)
  831.  
  832.    IF ( Script_Stack_Depth > 0 ) THEN
  833.       BEGIN
  834.  
  835.          WITH Script_Stack_Position[Script_Stack_Depth] DO
  836.             BEGIN
  837.                Script_Buffer_Pos       := Buffer_Pos;
  838.                Script_Buffer           := Buffer_Ptr;
  839.                Current_Script_Num      := Script_Num;
  840.                Script_Variables        := Vars_Ptr;
  841.                Script_Variable_Count   := Vars_Count;
  842.                Script_Parameters       := Params_Ptr;
  843.                Script_Parameter_Count  := Params_Count;
  844.                Script_Parameter_Got    := Params_Got;
  845.                Prev_Script_Variables   := Prev_Ptr;
  846.             END;
  847.  
  848.          DEC( Script_Stack_Depth );
  849.          Script_File_Mode   := TRUE;
  850.  
  851.       END;
  852.  
  853. END   (* Pop_Current_Script *);
  854.  
  855. (*----------------------------------------------------------------------*)
  856. (*   Allocate_Script_Variables --- allocate memory for script variables *)
  857. (*----------------------------------------------------------------------*)
  858.  
  859. PROCEDURE Allocate_Script_Variables;
  860.  
  861. VAR
  862.    Var_Mem : INTEGER;
  863.    I       : INTEGER;
  864.  
  865. BEGIN (* Allocate_Script_Variables *)
  866.  
  867.                                    (* Make sure calling script's variables *)
  868.                                    (* are accessible.                      *)
  869.  
  870.    Prev_Script_Variables := Script_Variables;
  871.  
  872.                                    (* Allocate and clear all script *)
  873.                                    (* variables                     *)
  874.  
  875.    Var_Mem := ( Script_Variable_Count + 3 ) * SizeOf( Script_Variables^[1] );
  876.  
  877.    GETMEM( Script_Variables , Var_Mem );
  878.  
  879.    FOR I := 3 TO Script_Variable_Count DO
  880.       WITH Script_Variables^[I] DO
  881.          BEGIN
  882.             Var_Name   := '';
  883.             Var_Type   := Bad_Operand_Type;
  884.             Var_Value  := NIL;
  885.             Var_Passed := FALSE;
  886.          END;
  887.                                    (* Define special variables        *)
  888.  
  889.                                    (* Accumulator *)
  890.    WITH Script_Variables^[0] DO
  891.       BEGIN
  892.          Var_Name  := '$ACCUM';
  893.          Var_Type  := Integer_Variable_Type;
  894.          GETMEM( Var_Value , 5 );
  895.          Var_Value^ := CHR( 0 ) + CHR( 0 ) + CHR( 0 ) + CHR( 0 );
  896.          Var_Passed := FALSE;
  897.       END;
  898.                                    (* Local input string *)
  899.    WITH Script_Variables^[1] DO
  900.       BEGIN
  901.          Var_Name  := '$LOCAL';
  902.          Var_Type  := String_Variable_Type;
  903.          GETMEM( Var_Value , 256 );
  904.          Var_Value^ := '';
  905.          Var_Passed := FALSE;
  906.       END;
  907.                                    (* Remote input string *)
  908.    WITH Script_Variables^[2] DO
  909.       BEGIN
  910.          Var_Name  := '$REMOTE';
  911.          Var_Type  := String_Variable_Type;
  912.          GETMEM( Var_Value , 256 );
  913.          Var_Value^ := '';
  914.          Var_Passed := FALSE;
  915.       END;
  916.                                    (* No script parameters yet retrieved *)
  917.    Script_Parameter_Got := 0;
  918.                                    (* No procedure parameters yet retrieved *)
  919.    Proc_Parameter_Got   := 0;
  920.  
  921. END   (* Allocate_Script_Variables *);
  922.  
  923. (*----------------------------------------------------------------------*)
  924. (*              Execute_Script --- Begin execution of a script          *)
  925. (*----------------------------------------------------------------------*)
  926.  
  927. PROCEDURE Execute_Script(     Force_Recompilation : BOOLEAN;
  928.                           VAR Got_Script          : BOOLEAN );
  929.  
  930. (*----------------------------------------------------------------------*)
  931. (*                                                                      *)
  932. (*     Procedure:  Execute_Script                                       *)
  933. (*                                                                      *)
  934. (*     Purpose:    Begins execution of a script                         *)
  935. (*                                                                      *)
  936. (*     Calling Sequence:                                                *)
  937. (*                                                                      *)
  938. (*        Execute_Script(     Force_Recompilation: BOOLEAN;             *)
  939. (*                        VAR Got_Script         : BOOLEAN );           *)
  940. (*                                                                      *)
  941. (*           Force_Recompilation --- TRUE to force recompilation        *)
  942. (*           Got_Script --- TRUE if script name entered                 *)
  943. (*                                                                      *)
  944. (*----------------------------------------------------------------------*)
  945.  
  946. VAR
  947.    Local_Save_2: Saved_Screen_Ptr;
  948.    I           : INTEGER;
  949.    L           : INTEGER;
  950.    Found       : BOOLEAN;
  951.    Save_Name   : AnyStr;
  952.    Save_Pos    : INTEGER;
  953.    Save_Ptr    : Script_Buffer_Ptr;
  954.  
  955. BEGIN (* Execute_Script *)
  956.                                    (* Save current screen *)
  957.  
  958.    Save_Partial_Screen( Local_Save_2, 10, 10, 78, 20 );
  959.  
  960.                                    (* Get length of name, if any *)
  961.    L := LENGTH( Script_File_Name );
  962.  
  963.                                    (* Avoid display if called from script *)
  964.  
  965.    IF ( ( NOT Script_File_Mode ) OR ( L <= 0 ) ) THEN
  966.       Draw_Menu_Frame( 10, 10, 78, 20, Menu_Frame_Color, Menu_Title_Color,
  967.                        Menu_Text_Color, 'Execute Script' );
  968.  
  969.                                    (* Get script name to execute *)
  970.    IF ( L <= 0 ) THEN
  971.       Get_Script_Name;
  972.                                    (* Quit if null entry *)
  973.  
  974.    IF ( LENGTH( Script_File_Name ) <= 0 ) OR
  975.       ( Script_File_Name           = CHR( ESC ) ) THEN
  976.       BEGIN
  977.          Got_Script := ( Script_File_Name = CHR( ESC ) );
  978.          Restore_Screen_And_Colors( Local_Save_2 );
  979.          EXIT;
  980.       END
  981.    ELSE
  982.       Got_Script := TRUE;
  983.                                    (* Save script name        *)
  984.    Save_Name := Script_File_Name;
  985.                                    (* Fix up script file name *)
  986.  
  987.    Script_Short_Name := UpperCase( TRIM( Script_File_Name ) );
  988.  
  989.    Get_Script_File_Name( Script_Short_Name , Script_File_Name );
  990.  
  991.                                    (* Save current script stuff *)
  992.    Push_Current_Script;
  993.                                    (* See if requested script is already  *)
  994.                                    (* loaded into memory.  However, we    *)
  995.                                    (* always recompile if any arguments   *)
  996.                                    (* given.                              *)
  997.    Found := FALSE;
  998.  
  999.    IF ( NOT Force_Recompilation ) THEN
  1000.       FOR I := 1 TO Script_Count DO
  1001.          IF ( Script_Short_Name = Scripts[I].Script_Name ) THEN
  1002.             BEGIN
  1003.                Found                  := TRUE;
  1004.                Script_Buffer          := Scripts[I].Script_Ptr;
  1005.                Script_Buffer_Pos      := 0;
  1006.                Really_Wait_String     := FALSE;
  1007.                Script_Suspend_Time    := 0;
  1008.                Script_File_Mode       := TRUE;
  1009.                Current_Script_Num     := I;
  1010.                Script_Variable_Count  := Scripts[I].Script_Vars_Count;
  1011.                Import_Count           := Scripts[I].Script_Params_Count;
  1012.                Got_Script             := TRUE;
  1013.             END;
  1014.                                    (* Not in memory -- compile it.  *)
  1015.    IF ( NOT Found ) THEN
  1016.       BEGIN
  1017.  
  1018.          Script_File_Name := Save_Name;
  1019.  
  1020.          Compile_Script;
  1021.  
  1022.          Script_Variable_Count := Script_Variable_MaxKount;
  1023.  
  1024.          IF ( NOT Script_File_Mode ) THEN
  1025.             BEGIN
  1026.                Pop_Current_Script;
  1027.                Got_Script := FALSE;
  1028.             END;
  1029.  
  1030.       END;
  1031.                                    (* Check that right number of    *)
  1032.                                    (* parameters passed.            *)
  1033.  
  1034.    IF Got_Script THEN
  1035.       IF Script_File_Mode THEN
  1036.          IF ( Import_Count <> Script_Parameter_Count ) THEN
  1037.             BEGIN
  1038.                Script_File_Mode := FALSE;
  1039.                Parse_Error( Script_Short_Name );
  1040.                Parse_Error('Wrong number of parameters passed to this script.');
  1041.                Press_Any;
  1042.                Pop_Current_Script;
  1043.                Got_Script := FALSE;
  1044.             END;
  1045.                                    (* Allocate memory for variables *)
  1046.    IF Got_Script THEN
  1047.       IF Script_File_Mode THEN
  1048.          Allocate_Script_Variables;
  1049.  
  1050.                                    (* Restore previous screen *)
  1051.  
  1052.    Restore_Screen_And_Colors( Local_Save_2 );
  1053.  
  1054. END   (* Execute_Script *);
  1055.  
  1056. (*----------------------------------------------------------------------*)
  1057. (*                Learn_Script --- Begin script learn mode              *)
  1058. (*----------------------------------------------------------------------*)
  1059.  
  1060. PROCEDURE Learn_Script;
  1061.  
  1062. (*----------------------------------------------------------------------*)
  1063. (*                                                                      *)
  1064. (*     Procedure:  Learn_Script                                         *)
  1065. (*                                                                      *)
  1066. (*     Purpose:    Begins script learn mode                             *)
  1067. (*                                                                      *)
  1068. (*     Calling Sequence:                                                *)
  1069. (*                                                                      *)
  1070. (*        Learn_Script;                                                 *)
  1071. (*                                                                      *)
  1072. (*----------------------------------------------------------------------*)
  1073.  
  1074. VAR
  1075.    Local_Save_2: Saved_Screen_Ptr;
  1076.    Ch          : CHAR;
  1077.    N           : LongInt;
  1078.    NN          : INTEGER;
  1079.    SSS         : STRING[10];
  1080.  
  1081. BEGIN (* Learn_Script *)
  1082.                                    (* Save current screen *)
  1083.  
  1084.    Draw_Titled_Box( Local_Save_2, 10, 10, 78, 20, 'Learn Script' );
  1085.  
  1086.                                    (* If already learning, just *)
  1087.                                    (* close up and return.      *)
  1088.    TextColor( Menu_Text_Color_2 );
  1089.  
  1090.    IF Script_Learn_Mode THEN
  1091.       BEGIN
  1092.  
  1093.          Learn_A_Character( CHR( CR ) );
  1094.  
  1095.          Script_Learn_Mode := FALSE;
  1096.  
  1097.          WRITELN;
  1098.          WRITELN('Finished learning ',Saved_Script_File_Name);
  1099.  
  1100.             (*!I-*)
  1101.          CLOSE( Script_File );
  1102.             (*!I+*)
  1103.  
  1104.          IF ( Int24Result <> 0 ) THEN
  1105.             BEGIN
  1106.                WRITELN('*** Error --- problem closing learned script file.');
  1107.                WRITELN('*** Check script file contents.');
  1108.                Press_Any;
  1109.             END;
  1110.  
  1111.          Window_Delay;
  1112.  
  1113.          Restore_Screen_And_Colors( Local_Save_2 );
  1114.  
  1115.          EXIT;
  1116.  
  1117.       END;
  1118.                                    (* Make sure script not in progress *)
  1119.    IF Script_File_Mode THEN
  1120.       BEGIN
  1121.  
  1122.          WRITELN('*** Error --- Cannot learn script while another');
  1123.          WRITELN('*** script is being executed.');
  1124.          WRITELN('*** Script learning will not be done.');
  1125.  
  1126.          Press_Any;
  1127.  
  1128.          Script_Learn_Mode := FALSE;
  1129.  
  1130.          Restore_Screen_And_Colors( Local_Save_2 );
  1131.  
  1132.          EXIT;
  1133.  
  1134.       END;
  1135.                                    (* Get script name to learn *)
  1136.    Get_Script_Name;
  1137.                                    (* Quit if null entry       *)
  1138.  
  1139.    IF ( LENGTH( Script_File_Name ) <= 0 ) OR
  1140.       ( Script_File_Name = CHR( ESC ) ) THEN
  1141.       BEGIN
  1142.          Restore_Screen_And_Colors( Local_Save_2 );
  1143.          EXIT;
  1144.       END;
  1145.                                    (* Fix up script file name *)
  1146.  
  1147.    Script_Short_Name := UpperCase( Script_File_Name );
  1148.  
  1149.    Get_Script_File_Name( Script_Short_Name , Script_File_Name );
  1150.  
  1151.    ASSIGN( Script_File , Script_File_Name );
  1152.       (*!I-*)
  1153.    REWRITE( Script_File );
  1154.       (*!I+*)
  1155.  
  1156.    Saved_Script_File_Name := '';
  1157.  
  1158.    IF ( Int24Result <> 0 ) THEN
  1159.       BEGIN
  1160.          WRITELN('*** Error --- Cannot open script file for output.');
  1161.          WRITELN('*** Script learning will not be done.');
  1162.          Press_Any;
  1163.       END
  1164.    ELSE
  1165.       BEGIN
  1166.  
  1167.          TextColor( Menu_Text_Color_2 );
  1168.  
  1169.          WRITE('Enter maximum length for each WAITSTRING: ');
  1170.  
  1171.          TextColor( Menu_Text_Color );
  1172.  
  1173.          N := Script_Learn_Buffer_Size;
  1174.  
  1175.          IF Read_Number( N , TRUE , N ) THEN
  1176.             IF ( N > 0 ) THEN
  1177.                BEGIN
  1178.                   NN := N;
  1179.                   Script_Learn_Buffer_Size := MIN( NN , 255 );
  1180.                END;
  1181.  
  1182.          WRITELN;
  1183.  
  1184.          TextColor( Menu_Text_Color_2 );
  1185.  
  1186.          WRITE('Enter maximum lines kept for WAITSTRING: ');
  1187.  
  1188.          TextColor( Menu_Text_Color );
  1189.  
  1190.          N := Script_Learn_Lines;
  1191.  
  1192.          IF Read_Number( N , TRUE , N ) THEN
  1193.             BEGIN
  1194.                NN := N;
  1195.                Script_Learn_Lines := MAX( 1 , NN );
  1196.             END;
  1197.  
  1198.          TextColor( Menu_Text_Color_2 );
  1199.  
  1200.          WRITELN;
  1201.          WRITELN;
  1202.          WRITELN('Beginning script learn mode.');
  1203.          WRITELN;
  1204.  
  1205.          Window_Delay;
  1206.  
  1207.          Script_Learn_Mode       := TRUE;
  1208.          Script_String           := '';
  1209.          Script_String_2         := '';
  1210.          Saved_Script_File_Name  := Script_File_Name;
  1211.          Script_Learn_Line_Count := 0;
  1212.          Script_Wait_Generated   := FALSE;
  1213.          Script_File_Name        := Script_Short_Name;
  1214.  
  1215.       END;
  1216.  
  1217.    Restore_Screen_And_Colors( Local_Save_2 );
  1218.  
  1219. END   (* Learn_Script *);
  1220.  
  1221. (*----------------------------------------------------------------------*)
  1222. (*              Unload_Script --- Unload memory-resident script         *)
  1223. (*----------------------------------------------------------------------*)
  1224.  
  1225. PROCEDURE Unload_Script;
  1226.  
  1227. (*----------------------------------------------------------------------*)
  1228. (*                                                                      *)
  1229. (*     Procedure:  Unload_Script                                        *)
  1230. (*                                                                      *)
  1231. (*     Purpose:    Unloads stored script                                *)
  1232. (*                                                                      *)
  1233. (*     Calling Sequence:                                                *)
  1234. (*                                                                      *)
  1235. (*        Unload_Script;                                                *)
  1236. (*                                                                      *)
  1237. (*----------------------------------------------------------------------*)
  1238.  
  1239. VAR
  1240.    Local_Save_2: Saved_Screen_Ptr;
  1241.    I           : INTEGER;
  1242.    IPos        : INTEGER;
  1243.    J           : INTEGER;
  1244.  
  1245. BEGIN (* Unload_Script *)
  1246.                                    (* Save current screen *)
  1247.  
  1248.    Draw_Titled_Box( Local_Save_2, 10, 10, 78, 20, 'Unload Script' );
  1249.  
  1250.                                    (* Get script name to unload *)
  1251.    Get_Script_Name;
  1252.                                    (* Quit if null entry *)
  1253.  
  1254.    IF LENGTH( Script_File_Name ) <= 0 THEN
  1255.       BEGIN
  1256.          Restore_Screen_And_Colors( Local_Save_2 );
  1257.          EXIT;
  1258.       END;
  1259.                                    (* Fix up script file name *)
  1260.  
  1261.    Script_File_Name := UpperCase( Script_File_Name );
  1262.  
  1263.    WRITELN;
  1264.                                    (* See if this script in memory. *)
  1265.    IPos := 0;
  1266.  
  1267.    FOR I := 1 TO Script_Count DO
  1268.       IF ( Script_File_Name = Scripts[I].Script_Name ) THEN
  1269.          IPos := I;
  1270.                                    (* If found, remove it. *)
  1271.    IF ( IPos = 0 ) THEN
  1272.       WRITELN('Script ', Script_File_Name, ' not found to unload.')
  1273.    ELSE
  1274.       BEGIN
  1275.          MyFreeMem( Scripts[IPos].Script_Ptr , Scripts[IPos].Script_Len );
  1276.          FOR J := SUCC( IPos ) TO Script_Count DO
  1277.             MOVE( Scripts[J], Scripts[J-1], SizeOf( Scripts[1] ) );
  1278.          DEC( Script_Count );
  1279.          WRITELN('Script unloaded.');
  1280.       END;
  1281.  
  1282.    Window_Delay;
  1283.  
  1284.    Restore_Screen_And_Colors( Local_Save_2 );
  1285.  
  1286. END   (* Unload_Script *);
  1287.  
  1288. (*----------------------------------------------------------------------*)
  1289. (*           Unload_All_Scripts --- Unload memory-resident script       *)
  1290. (*----------------------------------------------------------------------*)
  1291.  
  1292. PROCEDURE Unload_All_Scripts;
  1293.  
  1294. (*----------------------------------------------------------------------*)
  1295. (*                                                                      *)
  1296. (*     Procedure:  Unload_All_Scripts                                   *)
  1297. (*                                                                      *)
  1298. (*     Purpose:    Unloads all stored scripts                           *)
  1299. (*                                                                      *)
  1300. (*     Calling Sequence:                                                *)
  1301. (*                                                                      *)
  1302. (*        Unload_All_Scripts;                                           *)
  1303. (*                                                                      *)
  1304. (*----------------------------------------------------------------------*)
  1305.  
  1306. VAR
  1307.    Local_Save_2: Saved_Screen_Ptr;
  1308.    I           : INTEGER;
  1309.    J           : INTEGER;
  1310.  
  1311. BEGIN (* Unload_All_Scripts *)
  1312.                                    (* Save current screen *)
  1313.  
  1314.    Draw_Titled_Box( Local_Save_2, 10, 10, 78, 14, 'Unload All Scripts' );
  1315.  
  1316.                                    (* Run over all scripts and unload them *)
  1317.    FOR I := 1 TO Script_Count DO
  1318.       MyFreeMem( Scripts[I].Script_Ptr , Scripts[I].Script_Len );
  1319.  
  1320.    WRITELN( Script_Count, ' scripts unloaded.');
  1321.  
  1322.    Script_Count := 0;
  1323.  
  1324.    Window_Delay;
  1325.  
  1326.    Restore_Screen_And_Colors( Local_Save_2 );
  1327.  
  1328. END   (* Unload_All_Scripts *);
  1329.  
  1330.