home *** CD-ROM | disk | FTP | other *** search
/ Simtel MSDOS 1992 December / simtel1292_SIMTEL_1292_Walnut_Creek.iso / msdos / sysutl / sysgn132.arc / SYSGEN.PAS < prev   
Pascal/Delphi Source File  |  1989-12-11  |  12KB  |  415 lines

  1. PROGRAM Sysgen;
  2.  
  3. (*
  4.  
  5.   Roger Link 12/08/89
  6.  
  7. *)
  8.  
  9. USES
  10.   DOS, CRT;
  11.  
  12. CONST
  13.   Black     = 0;     Blue      = 1;    Green     = 2;     Cyan      = 3;
  14.   Red       = 4;     Magenta   = 5;    Brown     = 6;     L_Gray    = 7;
  15.   Gray      = 8;     L_Blue    = 9;    L_Green   = 10;    L_Cyan    = 11;
  16.   L_Red     = 12;    L_Magenta = 13;   Yellow    = 14;    White     = 15;
  17.  
  18.   ErrorColor = Red;
  19.  
  20. TYPE
  21.   LineType = STRING[ 255 ];
  22.  
  23. VAR
  24.   Sysgen_Value     : INTEGER;
  25.  
  26.   OutputFile       : TEXT;
  27.  
  28.   Sysgen_FileName  : LineType;
  29.  
  30.   FileOpen         : BOOLEAN;
  31.  
  32.   Help             : BOOLEAN;
  33.   FatalError       : BOOLEAN;
  34.   QueryUser        : BOOLEAN;
  35.  
  36.  
  37. PROCEDURE SignOn;
  38. BEGIN
  39.   TextColor( Magenta );
  40.   WriteLn;
  41.   WriteLn( '** Link Sysgen Utility - V1.32 12/08/89 **' );
  42.   WriteLn;
  43. END;  (* SignOn *)
  44.  
  45.  
  46. PROCEDURE DoHelpScreen;
  47. BEGIN
  48.  TextColor( L_Green );
  49.  WriteLn( 'SYSGEN [-Ffilename.type] [-Q] [-?] [?] [#]' );
  50.  TextColor( Green);
  51.  WriteLn( '  - Square brackets "[ ]" indicate a option' );
  52.  WriteLn( '  - filename.type is the configuration file to use (defaults to sysgen.cfg)' );
  53.  WriteLn( '  - # = sysgen value number in range 0-9' );
  54.  WriteLn( '  - ALL OPTIONS MUST have spaces proceeding and preceding that option' );
  55.  WriteLn( '  "-Q" -> Enter Query mode      "-?" or "?" This help screen' );
  56.  WriteLn( ' If no parameters, sysgen enters query mode.'  );
  57.  WriteLn;
  58.  WriteLn( ' Column one of each line in the config file controls the primary use of that' );
  59.  WriteLn( 'line. Columns 2-10 control the secondary use of the line. If the line is to' );
  60.  WriteLn( 'be included/interperted, a character is put in the sysgen value+1 position to' );
  61.  WriteLn( 'indicate it.' );
  62.  WriteLn( '  The following commands are used: ' );
  63.  WriteLn( '  "V" -> Variable line used for naming/allocating sysgen value when' );
  64.  WriteLn( '         sysgen is used in query mode.' );
  65.  WriteLn( '  "F" -> FILENAME.TYPE to put following SYSGEN.File data lines into' );
  66.  WriteLn( '  "-" -> Output file data line' );
  67.  WriteLn( '  "." -> Meta commands:' );
  68.  WriteLn( '         "E" -> Echo the line. (unconditional echo)' );
  69.  WriteLn( '         ";" -> comment line for sysgen config file. (ignored by sysgen)' );
  70.  WriteLn( '  "E" -> Echo line (conditional)' );
  71. END;  (* DoHelpScreen *)
  72.  
  73.  
  74. PROCEDURE Do_Error( Line : LineType; ErrorPointer : INTEGER );
  75. BEGIN
  76.   TextColor( ErrorColor );
  77.   WriteLn( Line );
  78.   WriteLn( ' ':ErrorPointer - 1, '^--- Error' );
  79. END;  (* Do_Error *)
  80.  
  81.  
  82. FUNCTION Check( Line : LineType; Sysgen_Value : INTEGER ) : BOOLEAN;
  83. (* Determine if this Line has a character in the proper position to *)
  84. (* match Sysgen_Value. Any character will do!!! *)
  85. BEGIN
  86.   IF Length( Line ) > 9 THEN              (* Check for short lines *)
  87.     Check := ( Line[ Sysgen_Value + 1 ] ) <> ' '
  88.   ELSE
  89.     BEGIN
  90.       Do_Error( Line, 3 );                (* Go if line is too short....*)
  91.       Check := FALSE;
  92.     END;
  93. END;  (* Check *)
  94.  
  95.  
  96. PROCEDURE Do_MetaStuff( Line : LineType );
  97. BEGIN
  98.   Case Line[ 2 ] OF
  99.     'E' : BEGIN
  100.             Delete( Line, 1, 2 );   (* Delete ".;" *)
  101.             TextColor( Green );
  102.             WriteLn( Line );        (* Display the rest to the user *)
  103.           END;
  104.     ';' : BEGIN END;       (* Do nothing for comment line *)
  105.   ELSE
  106.     Do_Error( Line, 2 );            (* Un recoginized meta command *)
  107.   END;
  108. END; (* Do_MetaStuff *)
  109.  
  110.  
  111. PROCEDURE Do_FileName( Line : LineType; Sysgen_Value : INTEGER );
  112. VAR
  113.   FileName : LineType;
  114. BEGIN
  115.   IF Check( Line, Sysgen_Value ) THEN         (* If this line is to be used *)
  116.     BEGIN                                     (*  for this system *)
  117.       IF FileOpen THEN
  118.         Close( OutputFile );                  (* Close any files that we are *)
  119.                                               (*  working on *)
  120.       TextColor( Green );
  121.       Delete( Line, 1, 10 );                  (* Delete prefix *)
  122.       FileName := Line;                       (* Fire up the Name *)
  123.       WriteLn( 'Output File = ', FileName );
  124.  
  125.       Assign( OutputFile, FileName );
  126.       ReWrite( OutputFile );
  127.  
  128.       FileOpen := TRUE;                      (* Remember that we have a file *)
  129.     END;                                     (*  open *)
  130. END;  (* Do_FileName*)
  131.  
  132.  
  133.  
  134. PROCEDURE Do_OutputLine( Line : LineType; Sysgen_Value : INTEGER );
  135. BEGIN
  136.   IF Check( Line, Sysgen_Value ) THEN        (* Check to see if this line is *)
  137.     BEGIN                                    (*  to be used *)
  138.       Delete( Line, 1, 10 );                 (* Delete prefix *)
  139.       WriteLn( OutputFile, Line );           (* Put out line *)
  140.     END;
  141. END;  (* Do_OutputLine *)
  142.  
  143.  
  144.  
  145. PROCEDURE Do_Echo( Line : LineType; Sysgen_Value : INTEGER );
  146. BEGIN
  147.   IF Check( Line, Sysgen_Value ) THEN        (* Check to see if this line is *)
  148.     BEGIN                                    (*  to be used *)
  149.       Delete( Line, 1, 10 );                 (* Delete prefix *)
  150.       TextColor( L_Green );
  151.       WriteLn( Line );                       (* Display to user *)
  152.     END;
  153. END;  (* Do_Echo *)
  154.  
  155.  
  156.  
  157. PROCEDURE SysgenWork( Sysgen_FileName : LineType; Sysgen_Value : INTEGER );
  158. VAR
  159.   Sysgen_File : TEXT;
  160.   Line        : LineType;
  161.   Test        : INTEGER;
  162. BEGIN
  163.   TextColor( Green );
  164.  
  165.   WriteLn( 'Using sysgen file -> ', Sysgen_FileName );
  166.  
  167.   Assign( Sysgen_File, Sysgen_FileName );  (* Open configuration file *)
  168.   Reset( Sysgen_File );
  169.  
  170.   FileOpen := FALSE;                       (* No files are currently open *)
  171.  
  172.   WHILE NOT( EOF( Sysgen_File )) DO
  173.     BEGIN
  174.       ReadLn( Sysgen_File, Line );         (* Get a config line *)
  175.  
  176.       IF Length( Line ) > 1 THEN
  177.         CASE Line[ 1 ] OF                  (* "Parse" config line *)
  178.           '.' : Do_MetaStuff( Line );
  179.           'F' : Do_FileName( Line, Sysgen_Value );
  180.           '-' : Do_OutputLine( Line, Sysgen_Value );
  181.           'E' : Do_Echo( Line, Sysgen_Value );
  182.           'V' : ;                          (* Ingore variable lines *)
  183.         ELSE
  184.           Do_Error( Line, 1 );
  185.         END;
  186.     END;
  187.  
  188.   IF FileOpen THEN Close( OutputFile );    (* Close any files that we have *)
  189.                                            (*  open *)
  190.   Close( Sysgen_File );
  191. END;  (* SysgenWork *)
  192.  
  193.  
  194.  
  195. PROCEDURE DoSysgen( Sysgen_FileName : LineType; Sysgen_Value : INTEGER );
  196. VAR
  197.   Character : CHAR;
  198. BEGIN
  199.   IF Sysgen_Value = 0 THEN
  200.     BEGIN
  201.       TextColor( Red );
  202.       WriteLn( '** Sysgening --> NO SYSTEM **' );
  203.       TextColor( CYAN );
  204.       WriteLn( 'THIS WILL ERASE \AUTOEXEC.BAT & \CONFIG.SYS', ^G );
  205.       Write( 'Do you want to do this? (Y/x) ' );
  206.       TextColor( Brown );
  207.       ReadLn( Character );
  208.  
  209.       TextColor( Green );
  210.       IF UpCase( Character ) = 'Y' THEN
  211.        BEGIN
  212.          WriteLn( '    Erasing \autoexec.bat' );
  213.          Assign( OutputFile, '\AUTOEXEC.BAT' );
  214.          Erase( OutputFile );
  215.          WriteLn( '    Erasing \config.sys' );
  216.          Assign( OutputFile, '\CONFIG.SYS' );
  217.          Erase( OutputFile );
  218.        END
  219.       ELSE
  220.         WriteLn( '* * * No Sysgen action taken * * *' );
  221.     END
  222.   ELSE
  223.     SysgenWork( Sysgen_FileName, Sysgen_Value );
  224. END;  (* DoSysgen *)
  225.  
  226.  
  227. PROCEDURE DoQueryUser;
  228. VAR
  229.   InputFile        : Text;
  230.   SystemAvailable  : Array[ 1..9 ] OF INTEGER;
  231.   SystemAvailPoint : INTEGER;
  232.   Line             : LineType;
  233.   GoodSysgen       : BOOLEAN;
  234.   X                : INTEGER;
  235.  
  236. PROCEDURE ProcessQueryLine;
  237. VAR
  238.   X                : INTEGER;
  239. BEGIN
  240.   IF Length( Line ) < 10 THEN Do_Error( Line, 1 );
  241.  
  242.   Delete( Line, 1, 1 );     (* Get rid of V *)
  243.  
  244.   TextColor( Cyan );
  245.  
  246.   FOR X := 1 TO 9 DO
  247.    BEGIN
  248.      IF Line[ 1 ] <> ' ' THEN   (* We have found a valid system value *)
  249.       BEGIN
  250.        INC( SystemAvailPoint );
  251.        SystemAvailable[ SystemAvailPoint ] := X; (* Remember valid system #s *)
  252.        Write( X:2 );                             (* Display # to user *)
  253.       END;
  254.      Delete( Line, 1, 1 );
  255.    END;
  256.  
  257.   TextColor( Green );
  258.  
  259.   WriteLn( ' ', Line );         (* Display system name/message to user *)
  260. END;
  261.  
  262.  
  263. BEGIN
  264.   TextColor( Yellow );
  265.  
  266.   WriteLn( 'For SYSGEN help, type "SYSGEN ?"' );
  267.   WriteLn;
  268.  
  269.   Assign( InputFile, Sysgen_FileName );
  270.   Reset( InputFile );
  271.  
  272.   SystemAvailPoint := 0;            (* No systems have been found *)
  273.  
  274.   TextColor( Cyan ); Write( ' 0 ' );
  275.   TextColor( Green ); WriteLn( '** NO autoexec.bat / NO config.sys ' );
  276.  
  277.   WHILE NOT EOF( InputFile ) DO
  278.    BEGIN
  279.      ReadLn( InputFile, Line );
  280.      IF Line[ 1 ] = 'V' THEN        (* Get and process all variable lines *)
  281.        ProcessQueryLine;
  282.    END;
  283.  
  284.   Close( InputFile );
  285.   WriteLn;
  286.  
  287.   GoodSysgen := FALSE;
  288.  
  289.   REPEAT
  290.     TextColor( Cyan );
  291.     Write( 'Enter number of system desired -> ' );
  292.     TextColor( Brown );
  293.     ReadLn( Sysgen_Value );
  294.  
  295.     IF Sysgen_Value = 0 THEN
  296.       GoodSysgen := TRUE            (* Determine if user has entered a good *)
  297.     ELSE                            (*  sysgen value *)
  298.       FOR X := 1 TO SystemAvailPoint DO
  299.         IF SystemAvailable[ X ] = Sysgen_Value THEN
  300.           GoodSysgen := TRUE;
  301.  
  302.   UNTIL GoodSysgen;
  303.  
  304.   WriteLn;
  305.  
  306.   DoSysgen( Sysgen_FileName, Sysgen_Value );
  307. END;  (* DoQueryUser *)
  308.  
  309.  
  310.  
  311. PROCEDURE ParseParameters;
  312. VAR
  313.   X        : INTEGER;
  314.   ValError : INTEGER;
  315.   Line     : LineType;
  316.  
  317. PROCEDURE ProcessDashCommands;
  318. BEGIN
  319.   CASE UpCase( Line[ 2 ] ) OF
  320.     '?' : Help := TRUE;
  321.     'F' : Sysgen_FileName := Copy( Line, 3, Length( Line ) - 2 );
  322.     'Q' : QueryUser := TRUE;
  323.   ELSE
  324.    BEGIN
  325.      WriteLn( 'Bad parameter -> "', Line, '"' );
  326.      FatalError := TRUE;
  327.    END;
  328.   END;
  329. END;  (* Process DashCommands *)
  330.  
  331. BEGIN
  332.   TextColor( ErrorColor );  (* Assume error color !!! *)
  333.  
  334.   X := 1;
  335.  
  336.   REPEAT
  337.     Line := ParamStr( X );              (* Get parameter *)
  338.  
  339.     CASE Line[ 1 ] OF
  340.       '-' : ProcessDashCommands;
  341.       '?' : Help := TRUE;
  342.     ELSE
  343.       IF Line[ 1 ] IN [ '0'..'9' ] THEN
  344.        BEGIN
  345.          Val( Line, Sysgen_Value, ValError );
  346.          IF ValError <> 0 THEN
  347.            BEGIN
  348.              WriteLn( 'Sysgen Value is not numeric' );
  349.              FatalError := TRUE;
  350.            END
  351.          ELSE
  352.            IF Sysgen_Value > 9 THEN
  353.             BEGIN
  354.              WriteLn( 'Sysgen Value is greater than 9. Must be in 0-9 range' );
  355.              FatalError := TRUE;
  356.             END;
  357.        END
  358.       ELSE
  359.        BEGIN
  360.          WriteLn( 'Bad parameter -> "', Line, '"' );
  361.          FatalError := TRUE;
  362.        END;
  363.     END;
  364.  
  365.     INC( X );
  366.  
  367.   UNTIL ( HELP ) OR ( FatalError ) OR ( X > ParamCount );
  368.  
  369.   TextColor( Green );
  370. END;  (* ParseParameters *)
  371.  
  372.  
  373.  
  374. (*** * * *  *  *  *   *   M A I N   P R O G R A M  *   *  *  *  * * * ***)
  375.  
  376. BEGIN
  377.   SignOn;
  378.  
  379.   Sysgen_FileName := 'SYSGEN.CFG';       (* Use default config file *)
  380.  
  381.   IF ParamCount = 0 THEN
  382.     DoQueryUser             (* If no parameters, query user for sysgen # *)
  383.   ELSE
  384.     BEGIN
  385.       TextColor( Green );
  386.  
  387.  
  388.       FatalError      := FALSE;      (* We're not dead yet!!! *)
  389.       Help            := FALSE;      (* No one has asked for help yet *)
  390.       QueryUser       := FALSE;      (* We are not in query mode yet *)
  391.  
  392.       Sysgen_Value    := -1;         (* Default to a bad sysgen value *)
  393.                                      (*  so we can tell if user input a *)
  394.                                      (*  sysgen value *)
  395.  
  396.       ParseParameters;               (* Attempt to figure out users request *)
  397.  
  398.       IF FatalError THEN
  399.        BEGIN
  400.         TextColor( ErrorColor );
  401.         WriteLn( 'Sysgen terminating on Fatal Error', ^G )
  402.        END
  403.       ELSE
  404.         BEGIN
  405.           IF Help THEN
  406.             DoHelpScreen
  407.           ELSE
  408.             IF ( QueryUser ) OR ( Sysgen_Value = -1 ) THEN
  409.               DoQueryUser
  410.             ELSE
  411.               DoSysgen( Sysgen_FileName, Sysgen_Value )
  412.         END;
  413.     END;
  414. END.
  415.