home *** CD-ROM | disk | FTP | other *** search
/ Programmer's ROM - The Computer Language Library / programmersrom.iso / ada / debug / sdtest.dat < prev    next >
Encoding:
Text File  |  1988-05-03  |  109.5 KB  |  1,961 lines

  1. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  2. --combine.ada
  3. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  4.  
  5. with TEXT_IO; 
  6. procedure COMBINE_FILES is
  7.   use TEXT_IO;
  8.   package int_io is new integer_io(integer);
  9.   use INT_IO;
  10.  
  11.   type HELP_TYPE is array (1..20) of STRING(1..70);
  12.   
  13.   HELP : HELP_TYPE := (
  14.     "This procedure reads file names from STANDARD_INPUT and copies those  ",
  15.     "files onto another separated by two rows of commented colons and the  ",
  16.     "basic name of the file, so that they may be automatically separated   ",
  17.     "The file name may be preceded by a directory name which is stripped   ",
  18.     "to make the basic name, and the procedure will affix a default        ",
  19.     "extension to the input name if the input named file does not exist    ",
  20.     "The directory format and default extension are system dependent       ",
  21.     "                                                                      ",
  22.     "USAGE:                                                                ",
  23.     "A target file name is requested,                                      ",
  24.     "Target file for combined text file <RETURN> =>                        ",
  25.     "then the files to be combined together                                ",
  26.     "File to be appended =>DBA4:[WHITAKER]COMBINE                          ",
  27.     "A default extension will be added if required e.g. COMBINE.TXT;       ",
  28.     "or the files may be referenced in a file of files preceded by '@'     ",
  29.     "and copy that file preceded by the header                             ",
  30.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
  31.     "--COMBINE                                                             ",
  32.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::",
  33.     "                                                                      ");
  34.  
  35.  
  36.  --  ############## S Y S T E M    D E P E N D E N C Y ##################
  37.   DEFAULT_INPUT_PREFIX_TERMINATOR : constant CHARACTER := ']';        --##
  38.   DEFAULT_EXTENSION : constant STRING := ".TXT";                      --##
  39.   --  Also see use of this and the removal of special characters      --##
  40.   --  ####################################################################
  41.   
  42.   PRE_FLAG : constant STRING :=
  43.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";
  44.   FILE_SEPARATION_FLAG  : constant STRING := "--";
  45.   POST_FLAG : constant STRING := 
  46.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::";
  47.  
  48.   MAXIMUM_NAME_SIZE             : constant NATURAL := 140;
  49.   MAXIMUM_LINE_SIZE             : constant NATURAL := 250;
  50.   
  51.   TARGET_FILE           : TEXT_IO.FILE_TYPE; 
  52.   TARGET_FILE_NAME      : STRING(1..MAXIMUM_NAME_SIZE) := (OTHERS => ' ');
  53.   TARGET_FILE_NAME_LAST : INTEGER := 0;
  54.   
  55.   INPUT_FILE            : TEXT_IO.FILE_TYPE; 
  56.   INPUT_FILE_NAME       : STRING(1..MAXIMUM_NAME_SIZE) := (OTHERS => ' ');
  57.   INPUT_FILE_NAME_LAST  : INTEGER := 0;
  58.   
  59.   FILE_OF_FILE_NAMES    : TEXT_IO.FILE_TYPE;
  60.   
  61.   BASIC_FILE_NAME_FIRST : INTEGER := 1;
  62.   BASIC_FILE_NAME_LAST  : INTEGER := 0;
  63.   
  64.   LINE                  : STRING(1..MAXIMUM_LINE_SIZE) := (OTHERS => ' ');
  65.   LINE_LAST             : INTEGER := 0;
  66.   
  67.   STATEMENTS            : NATURAL := 0;
  68.   LINE_COUNT            : NATURAL := 0;
  69.   COMMENTS              : NATURAL := 0;
  70.  
  71.   TOTAL_STATEMENTS      : NATURAL := 0;
  72.   TOTAL_LINE_COUNT      : NATURAL := 0;
  73.   TOTAL_COMMENTS        : NATURAL := 0;
  74.  
  75.  
  76.   ----------------------------------------------------------------------------
  77.   
  78.   procedure EAT_LEADING_BLANKS(NAME : in out STRING; LAST: in out NATURAL) is
  79.   begin
  80.     while LAST >= 1  and NAME(1) = ' '  loop
  81.       NAME(1..LAST-1) := NAME(2..LAST); 
  82.       LAST := LAST - 1;
  83.     end loop; 
  84.   end EAT_LEADING_BLANKS;
  85.     
  86.   procedure TERMINATE_NAME_AT_THE_BLANK(NAME : in out STRING; 
  87.                                         LAST : in out NATURAL) is
  88.   begin
  89.     for I in 2..LAST  loop
  90.       if NAME(I) = ' '  then
  91.         LAST := I - 1; 
  92.         exit;
  93.       end if;
  94.     end loop;
  95.   end TERMINATE_NAME_AT_THE_BLANK;
  96.     
  97.   procedure GET_FILE_NAME(INPUT_FILE_NAME : in out STRING;
  98.                      INPUT_FILE_NAME_LAST : in out NATURAL;
  99.                                      HELP : in     HELP_TYPE) is
  100.   begin
  101.     PUT("File name =>");
  102.     loop    --  until a valid name, absorbing commments, file-of-files, '?'
  103.       if IS_OPEN(FILE_OF_FILE_NAMES)  then    --  Check input file is used
  104.         if END_OF_FILE(FILE_OF_FILE_NAMES)  then
  105.           CLOSE(FILE_OF_FILE_NAMES);          --  Have come to the end of a
  106.           SET_INPUT(STANDARD_INPUT);          --  file-of-files and want to
  107.         end if;                               --  return to keyboard input
  108.       end if;
  109.       GET_LINE(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST);
  110.  
  111.       EAT_LEADING_BLANKS(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST);
  112.       TERMINATE_NAME_AT_THE_BLANK(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST);
  113.  
  114.       if INPUT_FILE_NAME_LAST = 1  and
  115.         INPUT_FILE_NAME(1) = '?'  then               --  Query for help
  116.         for I in HELP'FIRST..HELP'LAST  loop
  117.           PUT_LINE(HELP(I));
  118.         end loop;
  119.         PUT(""""); PUT(DEFAULT_EXTENSION);
  120.         PUT_LINE(""" is the current default extension");
  121.         PUT("File name =>");
  122.  
  123.       elsif INPUT_FILE_NAME_LAST >= 2  and
  124.          INPUT_FILE_NAME(1..2) = "--"  then          --  Skip comment lines
  125.         null;
  126.  
  127.       elsif INPUT_FILE_NAME_LAST >= 2 and
  128.             INPUT_FILE_NAME(1) = '@'  then           --  File of file names
  129.       TRY_FILE_OF_FILES:
  130.         begin
  131.           OPEN(FILE_OF_FILE_NAMES, IN_FILE,
  132.             INPUT_FILE_NAME(2..INPUT_FILE_NAME_LAST));
  133.           SET_INPUT(FILE_OF_FILE_NAMES);
  134.         exception
  135.           when NAME_ERROR  =>
  136.             PUT("NAME_ERROR in name given for file-of-files, give full name");
  137.  
  138.         end TRY_FILE_OF_FILES;
  139.         NEW_LINE;
  140.         PUT("File name =>");
  141.  
  142.       elsif INPUT_FILE_NAME_LAST = 0  then           --  Use a blank line to
  143.         NEW_LINE;                                    --  quit the program
  144.         exit;
  145.  
  146.       else                                           --  Regular file name
  147.         exit;
  148.       end if;
  149.     end loop;
  150.   exception
  151.   when END_ERROR  =>
  152.     SET_INPUT(STANDARD_INPUT);
  153.   end GET_FILE_NAME;
  154.  
  155.   procedure OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION
  156.                (INPUT_FILE : in out FILE_TYPE;
  157.            INPUT_FILE_NAME : in out STRING;
  158.       INPUT_FILE_NAME_LAST : in out NATURAL) is
  159.   begin
  160.     OPEN(INPUT_FILE, IN_FILE,
  161.       INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST));
  162.   exception
  163.     when NAME_ERROR  =>
  164.       INPUT_FILE_NAME_LAST := INPUT_FILE_NAME_LAST + 
  165.                               DEFAULT_EXTENSION'LAST;
  166.       INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST) :=
  167.       INPUT_FILE_NAME(1..
  168.               INPUT_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST) &
  169.           DEFAULT_EXTENSION;
  170.       OPEN(INPUT_FILE, IN_FILE,
  171.           INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST));
  172.   end OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION;
  173.         
  174. ----------------------------------------------------------------------------
  175.  
  176.   procedure COPY_FILE_AND_COUNT is
  177.     NEXT_CHAR    : NATURAL := 1;
  178.     C            : CHARACTER := ' ';
  179.     LEVEL        : INTEGER := 0;
  180.  
  181.     procedure FETCH (CH : in out CHARACTER) is
  182.     begin
  183.         if NEXT_CHAR > LINE_LAST  then
  184.             loop
  185.                 TEXT_IO.GET_LINE(INPUT_FILE, LINE, LINE_LAST);
  186.                 --  To take care of editors that fill out blocks with nulls
  187.                 if END_OF_FILE(INPUT_FILE) and LINE_LAST = 0  then
  188.                   raise END_ERROR;
  189.                 end if;
  190.                 TEXT_IO.PUT_LINE(TARGET_FILE, LINE(1..LINE_LAST));
  191.                 if END_OF_PAGE(INPUT_FILE)  then
  192.                   SKIP_PAGE(INPUT_FILE);
  193.                   NEW_PAGE(TARGET_FILE);
  194.                 end if;
  195.                 LINE_COUNT := LINE_COUNT + 1;
  196.                 NEXT_CHAR := 1;
  197.                 exit when NEXT_CHAR <= LINE_LAST;
  198.             end loop;
  199.         end if;
  200.         CH := LINE (NEXT_CHAR);
  201.         NEXT_CHAR := NEXT_CHAR + 1;
  202.     end FETCH;
  203.  
  204. begin
  205.   STATEMENTS := 0;
  206.   LINE_COUNT := 0;
  207.   COMMENTS   := 0;
  208.  
  209.   loop
  210.     FETCH (C);
  211.     --  Check for comment on the line
  212.     if C = '-' then
  213.       FETCH (C);
  214.       --  Which is signaled by the '-' following a '-'
  215.       if C = '-' then
  216.         --  Then just skip the rest of the line and go to the next
  217.         NEXT_CHAR := LINE_LAST + 1;
  218.         COMMENTS := COMMENTS + 1;
  219.       end if;
  220.     end if;
  221.  
  222.     --  Check for one of the characters which introduce code constructs
  223.     --  like string or character literal or formal parameter list
  224.     --  within which a ';' does not terminate a "line of code"
  225.     if C = '(' or C = '"' or C = '%' or C = ''' then
  226.  
  227.     --  Check for opening parentheses
  228.     --  Every ';' within is in a formal parameter list
  229.       if C = '(' then
  230.         --  Count the number of levels of parentheses
  231.         LEVEL := LEVEL + 1;
  232.         --  Read ahead until the whole construct is closed, LEVEL = 0
  233.         while LEVEL > 0 loop
  234.           FETCH (C);
  235.           if C = '(' then
  236.             --  Increase the level if another '(' is found
  237.             LEVEL := LEVEL + 1;
  238.           elsif C = ')' then
  239.             --  Decrease the level if a ')' is found
  240.             LEVEL := LEVEL - 1;
  241.           end if;
  242.         end loop;
  243.  
  244.       --  Now check for string brackets of either kind, " or %
  245.       elsif C = '"' or C = '%' then
  246.          --  Treat them in parallel, one must lead off
  247.          if C = '"' then
  248.            loop
  249.              FETCH (C);
  250.              --  Loop until the close comes
  251.              --  If there is a doubled character it just starts again
  252.              exit when C = '"';
  253.            end loop;
  254.             --  The '%' is handled exactly the same way as '"'
  255.           elsif C = '%' then
  256.             loop
  257.               FETCH (C);
  258.               exit when C = '%';
  259.             end loop;
  260.           end if;
  261.  
  262.         --  Character literals are just three characters long including '
  263.         elsif C = ''' then
  264.           FETCH (C);
  265.           FETCH (C);
  266.         end if;
  267.  
  268.       --  Any ';' that can be found at this point after all exclusions
  269.       --  must be a valid "Ada statement" terminator
  270.       elsif C = ';' then
  271.         STATEMENTS := STATEMENTS + 1;
  272.  
  273.       end if;
  274.  
  275.     end loop;
  276.  
  277.   end COPY_FILE_AND_COUNT;
  278.  
  279. ------------------------------------------------------------------------------
  280.  
  281. begin
  282.   PUT_LINE("COMBINE_FILES : (or '@' and a file of file names, ? for help)");
  283.   
  284.   loop                  --  To create a target file
  285.     PUT("Target file for combined text file <RETURN> =>");
  286.     GET_LINE(TARGET_FILE_NAME, TARGET_FILE_NAME_LAST);
  287.     if TARGET_FILE_NAME_LAST = 1  and
  288.       TARGET_FILE_NAME(1) = '?'  then               --  Query for help
  289.       for I in HELP'FIRST..HELP'LAST  loop
  290.         PUT_LINE(HELP(I));
  291.       end loop;
  292.     else
  293.     CREATE_TARGET_OR_RAISE_EXCEPTION:
  294.       begin
  295.         CREATE(TARGET_FILE, OUT_FILE,
  296.                TARGET_FILE_NAME(1..TARGET_FILE_NAME_LAST));
  297.       exception                 --  Checking for the prior existance of the file
  298.  
  299.         when NAME_ERROR  =>
  300.           PUT("########  NAME_ERROR in creating file name " &
  301.               INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST));
  302.               NEW_LINE;
  303.         when STATUS_ERROR  =>
  304.           PUT("########  STATUS_ERROR in creating file name " &
  305.               INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST));
  306.               NEW_LINE;
  307.         when USE_ERROR  =>
  308.           PUT("########  USE_ERROR in creating file name " &
  309.               INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST));
  310.               NEW_LINE; 
  311.       end CREATE_TARGET_OR_RAISE_EXCEPTION;
  312.     end if;
  313.     if IS_OPEN(TARGET_FILE)  then
  314.       exit;
  315.     end if;
  316.   end loop;
  317.  
  318.   PUT_LINE("Files to be combined:");
  319.   
  320.   loop                  --  on the processing of the series of files
  321.  
  322.     GET_FILE_NAME(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST, HELP);
  323.     
  324.     exit when INPUT_FILE_NAME_LAST = 0;                --  Finished
  325.       
  326.     --  Count off the prefix from the basic file name
  327.     BASIC_FILE_NAME_FIRST := 1;
  328.     for I in 1..INPUT_FILE_NAME_LAST-1  loop
  329.       if INPUT_FILE_NAME(I) = DEFAULT_INPUT_PREFIX_TERMINATOR  then
  330.         BASIC_FILE_NAME_FIRST := I + 1;
  331.         exit;
  332.       end if;
  333.     end loop;
  334.       
  335.     BASIC_FILE_NAME_LAST := INPUT_FILE_NAME_LAST;
  336.     --  Count back to the last ';' over any version number (for VAX/VMS)  #####
  337.     for I in reverse BASIC_FILE_NAME_FIRST..INPUT_FILE_NAME_LAST  loop
  338.       if INPUT_FILE_NAME(I) = ';'  then
  339.         BASIC_FILE_NAME_LAST := I - 1;
  340.         exit;
  341.       end if;
  342.     end loop;
  343.     
  344.     --  Check if the ending is the default extension, remove for basic name
  345. --    if BASIC_FILE_NAME_LAST > DEFAULT_EXTENSION'LAST  and then
  346.     if BASIC_FILE_NAME_LAST > DEFAULT_EXTENSION'LAST  then
  347. if
  348.        INPUT_FILE_NAME(BASIC_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST..
  349.                        BASIC_FILE_NAME_LAST) = DEFAULT_EXTENSION  then
  350.       BASIC_FILE_NAME_LAST := BASIC_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST;
  351.     end if;
  352. end if;
  353.  
  354.     OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION(INPUT_FILE, 
  355.         INPUT_FILE_NAME, INPUT_FILE_NAME_LAST);
  356.     
  357.     if IS_OPEN(INPUT_FILE)  then      --  If we were successful opening file
  358.       PUT_LINE(INPUT_FILE_NAME(1..INPUT_FILE_NAME_LAST));
  359.       --  Put out the interfile flags
  360.       PUT(TARGET_FILE, PRE_FLAG); NEW_LINE(TARGET_FILE);
  361.       PUT(TARGET_FILE, FILE_SEPARATION_FLAG);
  362.       PUT_LINE(TARGET_FILE, 
  363.                INPUT_FILE_NAME(BASIC_FILE_NAME_FIRST..BASIC_FILE_NAME_LAST));
  364.       PUT(TARGET_FILE, POST_FLAG); NEW_LINE(TARGET_FILE);
  365.       
  366.     TRANSFER_FILE:
  367.       --  Assuming that it is a text file of reasonable lines
  368.       begin
  369.           COPY_FILE_AND_COUNT;
  370.       exception
  371.         when END_ERROR  =>
  372.           null;
  373.       end TRANSFER_FILE;
  374.       
  375.       CLOSE(INPUT_FILE);
  376.       PUT("STATEMENTS = "); PUT(STATEMENTS);
  377.       PUT("   LINE_COUNT = "); PUT(LINE_COUNT);
  378.       PUT("   COMMENTS = "); PUT(COMMENTS);
  379.       NEW_LINE;
  380.       NEW_LINE;
  381.       TOTAL_STATEMENTS := TOTAL_STATEMENTS + STATEMENTS;
  382.       TOTAL_LINE_COUNT := TOTAL_LINE_COUNT + LINE_COUNT;
  383.       TOTAL_COMMENTS   := TOTAL_COMMENTS   + COMMENTS;
  384.  
  385.     end if;
  386.  
  387.   end loop;
  388.  
  389.   CLOSE(TARGET_FILE);
  390.   if (STATEMENTS = TOTAL_STATEMENTS) and (LINE_COUNT = TOTAL_LINE_COUNT)  then
  391.     null;
  392.   else
  393.     NEW_LINE; NEW_LINE;
  394.     PUT_LINE("TOTALS");
  395.     NEW_LINE;
  396.     PUT("STATEMENTS = "); PUT(TOTAL_STATEMENTS);
  397.     PUT("   LINE_COUNT = "); PUT(TOTAL_LINE_COUNT);
  398.     PUT("   COMMENTS = "); PUT(TOTAL_COMMENTS);
  399.     NEW_LINE;
  400.     NEW_LINE;
  401.   end if;
  402.  
  403. exception
  404.   when others  =>
  405.     PUT_LINE("Unexpected exception raised in COMBINE");
  406.     CLOSE(TARGET_FILE);
  407. end COMBINE_FILES;
  408.  
  409.  
  410. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  411. --combine.ins
  412. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  413. package SD_COMBINE_FILES is end;
  414. with SD_COMBINE_FILES;
  415. with SD_Run_Time_Monitor; use SD_Run_Time_Monitor;
  416. with SD_Type_Definitions; use SD_Type_Definitions;
  417. with SD_User_Interface; use SD_User_Interface;
  418. with SD_Runtime_Declarations; use SD_Runtime_Declarations;
  419. with SD_Runtime_Utilities; use SD_Runtime_Utilities;
  420. with SD_Trace_Predefined_Types; use SD_Trace_Predefined_Types;
  421. with SD_Generic_Templates; use SD_Generic_Templates;
  422. with String_Pkg;
  423.  
  424. with TEXT_IO; 
  425. procedure COMBINE_FILES is 
  426. SD_CURRENT_COMPILATION_UNIT: constant String := "COMBINE_FILES";
  427. procedure COMBINE_FILES_SI2AFSD_1861_F(S: STRING := "");
  428.  
  429.   use TEXT_IO; 
  430.   package INT_IO is 
  431.     new INTEGER_IO(INTEGER); 
  432.   use INT_IO; 
  433.   type HELP_TYPE is array(1 .. 20) of STRING(1 .. 70); 
  434. procedure SI2AFSD_1861_D(Name: String; Var: STANDARD.COMBINE_FILES.HELP_TYPE);
  435. procedure SI2AFSD_1861_S(Var: in out STANDARD.COMBINE_FILES.HELP_TYPE);
  436. function SI2AFSD_1861_M(Var: STANDARD.COMBINE_FILES.HELP_TYPE) return String;
  437.  
  438.   HELP : HELP_TYPE := (
  439.     "This procedure reads file names from STANDARD_INPUT and copies those  "
  440.     , 
  441.     "files onto another separated by two rows of commented colons and the  "
  442.     , 
  443.     "basic name of the file, so that they may be automatically separated   "
  444.     , 
  445.     "The file name may be preceded by a directory name which is stripped   "
  446.     , 
  447.     "to make the basic name, and the procedure will affix a default        "
  448.     , 
  449.     "extension to the input name if the input named file does not exist    "
  450.     , 
  451.     "The directory format and default extension are system dependent       "
  452.     , 
  453.     "                                                                      "
  454.     , 
  455.     "USAGE:                                                                "
  456.     , 
  457.     "A target file name is requested,                                      "
  458.     , 
  459.     "Target file for combined text file <RETURN> =>                        "
  460.     , 
  461.     "then the files to be combined together                                "
  462.     , 
  463.     "File to be appended =>DBA4:[WHITAKER]COMBINE                          "
  464.     , 
  465.     "A default extension will be added if required e.g. COMBINE.TXT;       "
  466.     , 
  467.     "or the files may be referenced in a file of files preceded by '@'     "
  468.     , 
  469.     "and copy that file preceded by the header                             "
  470.     , 
  471.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
  472.     , 
  473.     "--COMBINE                                                             "
  474.     , 
  475.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
  476.     , 
  477.     "                                                                      "
  478.     ); 
  479.   DEFAULT_INPUT_PREFIX_TERMINATOR : constant CHARACTER := ']'; 
  480.   DEFAULT_EXTENSION : constant STRING := ".TXT"; 
  481.   PRE_FLAG : constant STRING := 
  482.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
  483.     ; 
  484.   FILE_SEPARATION_FLAG : constant STRING := "--"; 
  485.   POST_FLAG : constant STRING := 
  486.     "--::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::"
  487.     ; 
  488.   MAXIMUM_NAME_SIZE : constant NATURAL := 140; 
  489.   MAXIMUM_LINE_SIZE : constant NATURAL := 250; 
  490.   TARGET_FILE : TEXT_IO.FILE_TYPE; 
  491.   TARGET_FILE_NAME : STRING(1 .. MAXIMUM_NAME_SIZE) := (others => ' '); 
  492.   TARGET_FILE_NAME_LAST : INTEGER := 0; 
  493.   INPUT_FILE : TEXT_IO.FILE_TYPE; 
  494.   INPUT_FILE_NAME : STRING(1 .. MAXIMUM_NAME_SIZE) := (others => ' '); 
  495.   INPUT_FILE_NAME_LAST : INTEGER := 0; 
  496.   FILE_OF_FILE_NAMES : TEXT_IO.FILE_TYPE; 
  497.   BASIC_FILE_NAME_FIRST : INTEGER := 1; 
  498.   BASIC_FILE_NAME_LAST : INTEGER := 0; 
  499.   LINE : STRING(1 .. MAXIMUM_LINE_SIZE) := (others => ' '); 
  500.   LINE_LAST : INTEGER := 0; 
  501.   STATEMENTS : NATURAL := 0; 
  502.   LINE_COUNT : NATURAL := 0; 
  503.   COMMENTS : NATURAL := 0; 
  504.   TOTAL_STATEMENTS : NATURAL := 0; 
  505.   TOTAL_LINE_COUNT : NATURAL := 0; 
  506.   TOTAL_COMMENTS : NATURAL := 0; 
  507.   procedure EAT_LEADING_BLANKS(NAME : in out STRING; 
  508.                                LAST : in out NATURAL) is 
  509. procedure EAT_LEADING_BLANKS_SI2AFSD_1861_F(S: STRING := "");
  510.  
  511. procedure EAT_LEADING_BLANKS_SI2AFSD_1861_F(S: STRING := "") is                 
  512. begin                                                                           
  513. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES." &                
  514. "EAT_LEADING_BLANKS.");                                                         
  515. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  516. case SD_Runtime_Utilities.Search_For_Variable("NAME LAST ") is                  
  517. when 1 =>                                                                       
  518.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  519.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.EAT_LEADING_BLANKS.NAME);             
  520.   else                                                                          
  521.     SI2AFSD_1861_D("COMBINE_FILES.EAT_LEADING_BLANKS.NAME",STANDARD.            
  522. COMBINE_FILES.EAT_LEADING_BLANKS.NAME);                                         
  523.   end if;                                                                       
  524.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  525. when 2 =>                                                                       
  526.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  527.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.EAT_LEADING_BLANKS.LAST);             
  528.   else                                                                          
  529.     SI2AFSD_1861_D("COMBINE_FILES.EAT_LEADING_BLANKS.LAST",STANDARD.            
  530. COMBINE_FILES.EAT_LEADING_BLANKS.LAST);                                         
  531.   end if;                                                                       
  532.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  533. when others =>                                                                  
  534.   null;                                                                         
  535. end case;                                                                       
  536. if SD_Runtime_Utilities.Search_Outer_Scope then                                 
  537.   COMBINE_FILES_SI2AFSD_1861_F;                                                 
  538. else                                                                            
  539.   SD_Runtime_Utilities.Error_Message("Variable not found");                     
  540. end if;                                                                         
  541. exception                                                                       
  542.   when Constraint_Error =>                                                      
  543.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  544.   when others => null;                                                          
  545. end;                                                                            
  546. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  547.   SD_Current_Compilation_Unit, 1,EAT_LEADING_BLANKS_SI2AFSD_1861_F);
  548.  
  549.   begin
  550. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  1);
  551. SI2AFSD_1861_Local_Break( 1, 89);
  552.     while LAST >= 1 and NAME(1) = ' ' loop
  553. SI2AFSD_1861_Local_Break( 2, 90);
  554.       NAME(1 .. LAST - 1) := NAME(2 .. LAST); 
  555. SI2AFSD_1861_Local_Break( 3, 91);
  556.       LAST := LAST - 1; 
  557.     end loop; 
  558. SI2AFSD_1861_Local_Break( 4, 93);
  559. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  1);
  560. exception
  561.   when others =>
  562.     if SD_RTM'CALLABLE then 
  563. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  1);
  564.       raise;
  565.     end if;
  566.   end EAT_LEADING_BLANKS; 
  567.   procedure TERMINATE_NAME_AT_THE_BLANK(NAME : in out STRING; 
  568.                                         LAST : in out NATURAL) is 
  569. procedure TERMINATE_NAME_AT_THE_BLANK_SI2AFSD_1861_F(S: STRING := "");
  570.  
  571. procedure TERMINATE_NAME_AT_THE_BLANK_SI2AFSD_1861_F(S: STRING := "") is        
  572. begin                                                                           
  573. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES." &                
  574. "TERMINATE_NAME_AT_THE_BLANK.");                                                
  575. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  576. case SD_Runtime_Utilities.Search_For_Variable("NAME LAST ") is                  
  577. when 1 =>                                                                       
  578.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  579.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK.NAME);    
  580.   else                                                                          
  581.     SI2AFSD_1861_D("COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK.NAME",STANDARD.   
  582. COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK.NAME);                                
  583.   end if;                                                                       
  584.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  585. when 2 =>                                                                       
  586.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  587.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK.LAST);    
  588.   else                                                                          
  589.     SI2AFSD_1861_D("COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK.LAST",STANDARD.   
  590. COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK.LAST);                                
  591.   end if;                                                                       
  592.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  593. when others =>                                                                  
  594.   null;                                                                         
  595. end case;                                                                       
  596. if SD_Runtime_Utilities.Search_Outer_Scope then                                 
  597.   COMBINE_FILES_SI2AFSD_1861_F;                                                 
  598. else                                                                            
  599.   SD_Runtime_Utilities.Error_Message("Variable not found");                     
  600. end if;                                                                         
  601. exception                                                                       
  602.   when Constraint_Error =>                                                      
  603.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  604.   when others => null;                                                          
  605. end;                                                                            
  606. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  607.   SD_Current_Compilation_Unit, 2,TERMINATE_NAME_AT_THE_BLANK_SI2AFSD_1861_F);
  608.  
  609.   begin
  610. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  2);
  611. SI2AFSD_1861_Local_Break( 5, 97);
  612.     for I in 2 .. LAST loop
  613. SI2AFSD_1861_Local_Break( 6, 98," I " & SI2AFSD_1861_M(I));
  614.       if NAME(I) = ' ' then 
  615. SI2AFSD_1861_Local_Break( 7, 99," I " & SI2AFSD_1861_M(I));
  616.         LAST := I - 1; 
  617. SI2AFSD_1861_Local_Break( 8, 100," I " & SI2AFSD_1861_M(I));
  618.         exit; 
  619.       end if; 
  620.     end loop; 
  621. SI2AFSD_1861_Local_Break( 9, 103);
  622. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  2);
  623. exception
  624.   when others =>
  625.     if SD_RTM'CALLABLE then 
  626. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  2);
  627.       raise;
  628.     end if;
  629.   end TERMINATE_NAME_AT_THE_BLANK; 
  630.   procedure GET_FILE_NAME(INPUT_FILE_NAME : in out STRING; 
  631.                           INPUT_FILE_NAME_LAST : in out NATURAL; 
  632.                           HELP : in HELP_TYPE) is 
  633. procedure GET_FILE_NAME_SI2AFSD_1861_F(S: STRING := "");
  634.  
  635. procedure GET_FILE_NAME_SI2AFSD_1861_F(S: STRING := "") is                      
  636. begin                                                                           
  637. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES.GET_FILE_NAME.");  
  638. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  639. case SD_Runtime_Utilities.Search_For_Variable("INPUT_FILE_NAME " &              
  640. "INPUT_FILE_NAME_LAST HELP ") is                                                
  641. when 1 =>                                                                       
  642.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  643.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.GET_FILE_NAME.INPUT_FILE_NAME);       
  644.   else                                                                          
  645.     SI2AFSD_1861_D("COMBINE_FILES.GET_FILE_NAME.INPUT_FILE_NAME",STANDARD.      
  646. COMBINE_FILES.GET_FILE_NAME.INPUT_FILE_NAME);                                   
  647.   end if;                                                                       
  648.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  649. when 2 =>                                                                       
  650.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  651.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.GET_FILE_NAME.INPUT_FILE_NAME_LAST);  
  652.   else                                                                          
  653.     SI2AFSD_1861_D("COMBINE_FILES.GET_FILE_NAME.INPUT_FILE_NAME_LAST",STANDARD. 
  654. COMBINE_FILES.GET_FILE_NAME.INPUT_FILE_NAME_LAST);                              
  655.   end if;                                                                       
  656.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  657. when 3 =>                                                                       
  658.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  659.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  660. "be set");                                                                      
  661.   else                                                                          
  662.     SI2AFSD_1861_D("COMBINE_FILES.GET_FILE_NAME.HELP", STANDARD.COMBINE_FILES.  
  663. GET_FILE_NAME.HELP);                                                            
  664.   end if;                                                                       
  665.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  666. when others =>                                                                  
  667.   null;                                                                         
  668. end case;                                                                       
  669. if SD_Runtime_Utilities.Search_Outer_Scope then                                 
  670.   COMBINE_FILES_SI2AFSD_1861_F;                                                 
  671. else                                                                            
  672.   SD_Runtime_Utilities.Error_Message("Variable not found");                     
  673. end if;                                                                         
  674. exception                                                                       
  675.   when Constraint_Error =>                                                      
  676.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  677.   when others => null;                                                          
  678. end;                                                                            
  679. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  680.   SD_Current_Compilation_Unit, 3,GET_FILE_NAME_SI2AFSD_1861_F);
  681.  
  682.   begin
  683. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  3);
  684. SI2AFSD_1861_Local_Break( 10, 108);
  685.     PUT("File name =>"); 
  686. SI2AFSD_1861_Local_Break( 11, 109);
  687.     loop
  688. SI2AFSD_1861_Local_Break( 12, 110);
  689.       if IS_OPEN(FILE_OF_FILE_NAMES) then 
  690. SI2AFSD_1861_Local_Break( 13, 111);
  691.         if END_OF_FILE(FILE_OF_FILE_NAMES) then 
  692. SI2AFSD_1861_Local_Break( 14, 112);
  693.           CLOSE(FILE_OF_FILE_NAMES); 
  694. SI2AFSD_1861_Local_Break( 15, 113);
  695.           SET_INPUT(STANDARD_INPUT); 
  696.         end if; 
  697.       end if; 
  698. SI2AFSD_1861_Local_Break( 16, 116);
  699.       GET_LINE(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST); 
  700. SI2AFSD_1861_Local_Break( 17, 117);
  701.       EAT_LEADING_BLANKS(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST); 
  702. SI2AFSD_1861_Local_Break( 18, 118);
  703.       TERMINATE_NAME_AT_THE_BLANK(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST); 
  704. SI2AFSD_1861_Local_Break( 19, 119);
  705.       if INPUT_FILE_NAME_LAST = 1 and INPUT_FILE_NAME(1) = '?' then 
  706. SI2AFSD_1861_Local_Break( 20, 121);
  707.         for I in HELP'FIRST .. HELP'LAST loop
  708. SI2AFSD_1861_Local_Break( 21, 122," I " & SI2AFSD_1861_M(I));
  709.           PUT_LINE(HELP(I)); 
  710.         end loop; 
  711. SI2AFSD_1861_Local_Break( 22, 124);
  712.         PUT(""""); 
  713. SI2AFSD_1861_Local_Break( 23, 125);
  714.         PUT(DEFAULT_EXTENSION); 
  715. SI2AFSD_1861_Local_Break( 24, 126);
  716.         PUT_LINE(""" is the current default extension"); 
  717. SI2AFSD_1861_Local_Break( 25, 127);
  718.         PUT("File name =>"); 
  719.       elsif INPUT_FILE_NAME_LAST >= 2 and INPUT_FILE_NAME(1 .. 2) = "--"
  720.         then 
  721. SI2AFSD_1861_Local_Break( 26, 130);
  722.         null; 
  723.       elsif INPUT_FILE_NAME_LAST >= 2 and INPUT_FILE_NAME(1) = '@' then 
  724. SI2AFSD_1861_Local_Break( 27, 133);
  725.         TRY_FILE_OF_FILES : begin
  726. SI2AFSD_1861_Local_Break( 28, 134);
  727.           OPEN(FILE_OF_FILE_NAMES, IN_FILE, INPUT_FILE_NAME(2 .. 
  728.             INPUT_FILE_NAME_LAST)); 
  729. SI2AFSD_1861_Local_Break( 29, 136);
  730.           SET_INPUT(FILE_OF_FILE_NAMES); 
  731.         exception
  732.           when NAME_ERROR => 
  733. SI2AFSD_1861_Local_Break( 30, 139);
  734.             PUT(
  735.               "NAME_ERROR in name given for file-of-files, give full name"
  736.               ); 
  737.         end TRY_FILE_OF_FILES; 
  738. SI2AFSD_1861_Local_Break( 31, 143);
  739.         NEW_LINE; 
  740. SI2AFSD_1861_Local_Break( 32, 144);
  741.         PUT("File name =>"); 
  742.       elsif INPUT_FILE_NAME_LAST = 0 then 
  743. SI2AFSD_1861_Local_Break( 33, 146);
  744.         NEW_LINE; 
  745. SI2AFSD_1861_Local_Break( 34, 147);
  746.         exit; 
  747.       else 
  748. SI2AFSD_1861_Local_Break( 35, 149);
  749.         exit; 
  750.       end if; 
  751.     end loop; 
  752. SI2AFSD_1861_Local_Break( 36, 152);
  753. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  3);
  754.   exception
  755.     when END_ERROR => 
  756. begin
  757. if SD_RTM'CALLABLE then 
  758. SI2AFSD_1861_Local_Break( 37, 154);
  759.       SET_INPUT(STANDARD_INPUT); 
  760. SI2AFSD_1861_Local_Break( 38, 155);
  761. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  3);
  762. end if;
  763. exception
  764.   when others =>
  765. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  3);
  766. raise;
  767. end;
  768.   when others =>
  769.     if SD_RTM'CALLABLE then 
  770. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  3);
  771.       raise;
  772.   end if;
  773.     end GET_FILE_NAME; 
  774.   procedure OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION(INPUT_FILE : in out 
  775.                                                        FILE_TYPE; 
  776.                                                      INPUT_FILE_NAME : in 
  777.                                                        out STRING; 
  778.                                                      INPUT_FILE_NAME_LAST
  779.                                                        : in out NATURAL)
  780.     is 
  781. procedure OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION_SI2AFSD_1861_F(S: STRING := 
  782. "");
  783.  
  784. procedure OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION_SI2AFSD_1861_F(S: STRING :=  
  785. "") is                                                                          
  786. begin                                                                           
  787. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES." &                
  788. "OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.");                                   
  789. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  790. case SD_Runtime_Utilities.Search_For_Variable("INPUT_FILE INPUT_FILE_NAME " &   
  791. "INPUT_FILE_NAME_LAST ") is                                                     
  792. when 1 =>                                                                       
  793.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  794.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.                                      
  795. OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.INPUT_FILE);                           
  796.   else                                                                          
  797.     SI2AFSD_1861_D("COMBINE_FILES.OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION." &  
  798. "INPUT_FILE",STANDARD.COMBINE_FILES.OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.   
  799. INPUT_FILE);                                                                    
  800.   end if;                                                                       
  801.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  802. when 2 =>                                                                       
  803.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  804.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.                                      
  805. OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.INPUT_FILE_NAME);                      
  806.   else                                                                          
  807.     SI2AFSD_1861_D("COMBINE_FILES.OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION." &  
  808. "INPUT_FILE_NAME",STANDARD.COMBINE_FILES.                                       
  809. OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.INPUT_FILE_NAME);                      
  810.   end if;                                                                       
  811.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  812. when 3 =>                                                                       
  813.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  814.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.                                      
  815. OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.INPUT_FILE_NAME_LAST);                 
  816.   else                                                                          
  817.     SI2AFSD_1861_D("COMBINE_FILES.OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION." &  
  818. "INPUT_FILE_NAME_LAST",STANDARD.COMBINE_FILES.                                  
  819. OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION.INPUT_FILE_NAME_LAST);                 
  820.   end if;                                                                       
  821.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  822. when others =>                                                                  
  823.   null;                                                                         
  824. end case;                                                                       
  825. if SD_Runtime_Utilities.Search_Outer_Scope then                                 
  826.   COMBINE_FILES_SI2AFSD_1861_F;                                                 
  827. else                                                                            
  828.   SD_Runtime_Utilities.Error_Message("Variable not found");                     
  829. end if;                                                                         
  830. exception                                                                       
  831.   when Constraint_Error =>                                                      
  832.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  833.   when others => null;                                                          
  834. end;                                                                            
  835. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  836.   SD_Current_Compilation_Unit, 4,
  837. OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION_SI2AFSD_1861_F);
  838.  
  839.   begin
  840. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  4);
  841. SI2AFSD_1861_Local_Break( 39, 164);
  842.     OPEN(INPUT_FILE, IN_FILE, INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST))
  843.       ; 
  844. SI2AFSD_1861_Local_Break( 40, 166);
  845. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  4);
  846.   exception
  847.     when NAME_ERROR => 
  848. begin
  849. if SD_RTM'CALLABLE then 
  850. SI2AFSD_1861_Local_Break( 41, 168);
  851.       INPUT_FILE_NAME_LAST := INPUT_FILE_NAME_LAST + DEFAULT_EXTENSION'
  852.         LAST; 
  853. SI2AFSD_1861_Local_Break( 42, 170);
  854.       INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST) := INPUT_FILE_NAME(1 .. 
  855.         INPUT_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST) & DEFAULT_EXTENSION
  856.         ; 
  857. SI2AFSD_1861_Local_Break( 43, 173);
  858.       OPEN(INPUT_FILE, IN_FILE, INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)
  859.         ); 
  860. SI2AFSD_1861_Local_Break( 44, 175);
  861. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  4);
  862. end if;
  863. exception
  864.   when others =>
  865. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  4);
  866. raise;
  867. end;
  868.   when others =>
  869.     if SD_RTM'CALLABLE then 
  870. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  4);
  871.       raise;
  872.   end if;
  873.     end OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION; 
  874.   procedure COPY_FILE_AND_COUNT is 
  875. procedure COPY_FILE_AND_COUNT_SI2AFSD_1861_F(S: STRING := "");
  876.  
  877.     NEXT_CHAR : NATURAL := 1; 
  878.     C : CHARACTER := ' '; 
  879.     LEVEL : INTEGER := 0; 
  880.     procedure FETCH(CH : in out CHARACTER) is 
  881. procedure FETCH_SI2AFSD_1861_F(S: STRING := "");
  882.  
  883. procedure FETCH_SI2AFSD_1861_F(S: STRING := "") is                              
  884. begin                                                                           
  885. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES." &                
  886. "COPY_FILE_AND_COUNT.FETCH.");                                                  
  887. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  888. case SD_Runtime_Utilities.Search_For_Variable("CH ") is                         
  889. when 1 =>                                                                       
  890.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  891.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.COPY_FILE_AND_COUNT.FETCH.CH);        
  892.   else                                                                          
  893.     SI2AFSD_1861_D("COMBINE_FILES.COPY_FILE_AND_COUNT.FETCH.CH",STANDARD.       
  894. COMBINE_FILES.COPY_FILE_AND_COUNT.FETCH.CH);                                    
  895.   end if;                                                                       
  896.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  897. when others =>                                                                  
  898.   null;                                                                         
  899. end case;                                                                       
  900. if SD_Runtime_Utilities.Search_Outer_Scope then                                 
  901.   COPY_FILE_AND_COUNT_SI2AFSD_1861_F;                                           
  902. else                                                                            
  903.   SD_Runtime_Utilities.Error_Message("Variable not found");                     
  904. end if;                                                                         
  905. exception                                                                       
  906.   when Constraint_Error =>                                                      
  907.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  908.   when others => null;                                                          
  909. end;                                                                            
  910. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  911.   SD_Current_Compilation_Unit, 5,FETCH_SI2AFSD_1861_F);
  912.  
  913.     begin
  914. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  5);
  915. SI2AFSD_1861_Local_Break( 45, 184);
  916.       if NEXT_CHAR > LINE_LAST then 
  917. SI2AFSD_1861_Local_Break( 46, 185);
  918.         loop
  919. SI2AFSD_1861_Local_Break( 47, 186);
  920.           TEXT_IO.GET_LINE(INPUT_FILE, LINE, LINE_LAST); 
  921. SI2AFSD_1861_Local_Break( 48, 188);
  922.           if END_OF_FILE(INPUT_FILE) and LINE_LAST = 0 then 
  923. SI2AFSD_1861_Local_Break( 49, 189);
  924.             raise END_ERROR; 
  925.           end if; 
  926. SI2AFSD_1861_Local_Break( 50, 191);
  927.           TEXT_IO.PUT_LINE(TARGET_FILE, LINE(1 .. LINE_LAST)); 
  928. SI2AFSD_1861_Local_Break( 51, 192);
  929.           if END_OF_PAGE(INPUT_FILE) then 
  930. SI2AFSD_1861_Local_Break( 52, 193);
  931.             SKIP_PAGE(INPUT_FILE); 
  932. SI2AFSD_1861_Local_Break( 53, 194);
  933.             NEW_PAGE(TARGET_FILE); 
  934.           end if; 
  935. SI2AFSD_1861_Local_Break( 54, 196);
  936.           LINE_COUNT := LINE_COUNT + 1; 
  937. SI2AFSD_1861_Local_Break( 55, 197);
  938.           NEXT_CHAR := 1; 
  939. SI2AFSD_1861_Local_Break( 56, 198);
  940.           exit when NEXT_CHAR <= LINE_LAST; 
  941.         end loop; 
  942.       end if; 
  943. SI2AFSD_1861_Local_Break( 57, 201);
  944.       CH := LINE(NEXT_CHAR); 
  945. SI2AFSD_1861_Local_Break( 58, 202);
  946.       NEXT_CHAR := NEXT_CHAR + 1; 
  947. SI2AFSD_1861_Local_Break( 59, 203);
  948. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  5);
  949. exception
  950.   when others =>
  951.     if SD_RTM'CALLABLE then 
  952. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  5);
  953.       raise;
  954.     end if;
  955.     end FETCH; 
  956. procedure COPY_FILE_AND_COUNT_SI2AFSD_1861_F(S: STRING := "") is                
  957. begin                                                                           
  958. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES." &                
  959. "COPY_FILE_AND_COUNT.");                                                        
  960. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  961. case SD_Runtime_Utilities.Search_For_Variable("NEXT_CHAR C LEVEL ") is          
  962. when 1 =>                                                                       
  963.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  964.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.COPY_FILE_AND_COUNT.NEXT_CHAR);       
  965.   else                                                                          
  966.     SI2AFSD_1861_D("COMBINE_FILES.COPY_FILE_AND_COUNT.NEXT_CHAR",STANDARD.      
  967. COMBINE_FILES.COPY_FILE_AND_COUNT.NEXT_CHAR);                                   
  968.   end if;                                                                       
  969.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  970. when 2 =>                                                                       
  971.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  972.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.COPY_FILE_AND_COUNT.C);               
  973.   else                                                                          
  974.     SI2AFSD_1861_D("COMBINE_FILES.COPY_FILE_AND_COUNT.C",STANDARD.COMBINE_FILES.
  975. COPY_FILE_AND_COUNT.C);                                                         
  976.   end if;                                                                       
  977.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  978. when 3 =>                                                                       
  979.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  980.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.COPY_FILE_AND_COUNT.LEVEL);           
  981.   else                                                                          
  982.     SI2AFSD_1861_D("COMBINE_FILES.COPY_FILE_AND_COUNT.LEVEL",STANDARD.          
  983. COMBINE_FILES.COPY_FILE_AND_COUNT.LEVEL);                                       
  984.   end if;                                                                       
  985.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  986. when others =>                                                                  
  987.   null;                                                                         
  988. end case;                                                                       
  989. if SD_Runtime_Utilities.Search_Outer_Scope then                                 
  990.   COMBINE_FILES_SI2AFSD_1861_F;                                                 
  991. else                                                                            
  992.   SD_Runtime_Utilities.Error_Message("Variable not found");                     
  993. end if;                                                                         
  994. exception                                                                       
  995.   when Constraint_Error =>                                                      
  996.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  997.   when others => null;                                                          
  998. end;                                                                            
  999. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  1000.   SD_Current_Compilation_Unit, 6,COPY_FILE_AND_COUNT_SI2AFSD_1861_F);
  1001.  
  1002.   begin
  1003. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  6);
  1004. SI2AFSD_1861_Local_Break( 60, 205);
  1005.     STATEMENTS := 0; 
  1006. SI2AFSD_1861_Local_Break( 61, 206);
  1007.     LINE_COUNT := 0; 
  1008. SI2AFSD_1861_Local_Break( 62, 207);
  1009.     COMMENTS := 0; 
  1010. SI2AFSD_1861_Local_Break( 63, 208);
  1011.     loop
  1012. SI2AFSD_1861_Local_Break( 64, 209);
  1013.       FETCH(C); 
  1014. SI2AFSD_1861_Local_Break( 65, 211);
  1015.       if C = '-' then 
  1016. SI2AFSD_1861_Local_Break( 66, 212);
  1017.         FETCH(C); 
  1018. SI2AFSD_1861_Local_Break( 67, 214);
  1019.         if C = '-' then 
  1020. SI2AFSD_1861_Local_Break( 68, 216);
  1021.           NEXT_CHAR := LINE_LAST + 1; 
  1022. SI2AFSD_1861_Local_Break( 69, 217);
  1023.           COMMENTS := COMMENTS + 1; 
  1024.         end if; 
  1025.       end if; 
  1026. SI2AFSD_1861_Local_Break( 70, 224);
  1027.       if C = '(' or C = '"' or C = '%' or C = ''' then 
  1028. SI2AFSD_1861_Local_Break( 71, 228);
  1029.         if C = '(' then 
  1030. SI2AFSD_1861_Local_Break( 72, 230);
  1031.           LEVEL := LEVEL + 1; 
  1032. SI2AFSD_1861_Local_Break( 73, 232);
  1033.           while LEVEL > 0 loop
  1034. SI2AFSD_1861_Local_Break( 74, 233);
  1035.             FETCH(C); 
  1036. SI2AFSD_1861_Local_Break( 75, 234);
  1037.             if C = '(' then 
  1038. SI2AFSD_1861_Local_Break( 76, 236);
  1039.               LEVEL := LEVEL + 1; 
  1040.             elsif C = ')' then 
  1041. SI2AFSD_1861_Local_Break( 77, 239);
  1042.               LEVEL := LEVEL - 1; 
  1043.             end if; 
  1044.           end loop; 
  1045.         elsif C = '"' or C = '%' then 
  1046. SI2AFSD_1861_Local_Break( 78, 246);
  1047.           if C = '"' then 
  1048. SI2AFSD_1861_Local_Break( 79, 247);
  1049.             loop
  1050. SI2AFSD_1861_Local_Break( 80, 248);
  1051.               FETCH(C); 
  1052. SI2AFSD_1861_Local_Break( 81, 251);
  1053.               exit when C = '"'; 
  1054.             end loop; 
  1055.           elsif C = '%' then 
  1056. SI2AFSD_1861_Local_Break( 82, 255);
  1057.             loop
  1058. SI2AFSD_1861_Local_Break( 83, 256);
  1059.               FETCH(C); 
  1060. SI2AFSD_1861_Local_Break( 84, 257);
  1061.               exit when C = '%'; 
  1062.             end loop; 
  1063.           end if; 
  1064.         elsif C = ''' then 
  1065. SI2AFSD_1861_Local_Break( 85, 263);
  1066.           FETCH(C); 
  1067. SI2AFSD_1861_Local_Break( 86, 264);
  1068.           FETCH(C); 
  1069.         end if; 
  1070.       elsif C = ';' then 
  1071. SI2AFSD_1861_Local_Break( 87, 270);
  1072.         STATEMENTS := STATEMENTS + 1; 
  1073.       end if; 
  1074.     end loop; 
  1075. SI2AFSD_1861_Local_Break( 88, 273);
  1076. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  6);
  1077. exception
  1078.   when others =>
  1079.     if SD_RTM'CALLABLE then 
  1080. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  6);
  1081.       raise;
  1082.     end if;
  1083.   end COPY_FILE_AND_COUNT; 
  1084. procedure SI2AFSD_1861_D(Name: String; Var: STANDARD.COMBINE_FILES.HELP_TYPE) is
  1085.   X: SD_Runtime_Utilities.Array_Info;                                           
  1086.   Y: Boolean;                                                                   
  1087. begin                                                                           
  1088. for i in Var'Range loop                                                         
  1089.   SD_Runtime_Utilities.Check_This_Element(SI2AFSD_1861_M(i),X,Y);               
  1090.   if Y then                                                                     
  1091.     SI2AFSD_1861_D(Name & "(" & SI2AFSD_1861_M(i) & ")", Var(i));               
  1092.   end if;                                                                       
  1093.   exit when X.Stop_Tracing_Array;                                               
  1094. end loop;                                                                       
  1095. SD_Runtime_Utilities.Check_Array(X);                                            
  1096. end;                                                                            
  1097. procedure SI2AFSD_1861_S(Var: in out STANDARD.COMBINE_FILES.HELP_TYPE) is       
  1098.   X: SD_Runtime_Utilities.Array_Info;                                           
  1099.   Y: Boolean;                                                                   
  1100. begin                                                                           
  1101. for i in Var'Range loop                                                         
  1102.   SD_Runtime_Utilities.Check_This_Element(SI2AFSD_1861_M(i),X,Y);               
  1103.   if Y then                                                                     
  1104.     SI2AFSD_1861_S(Var(i));                                                     
  1105.   end if;                                                                       
  1106.   exit when X.Stop_Tracing_Array;                                               
  1107. end loop;                                                                       
  1108. SD_Runtime_Utilities.Check_Array(X);                                            
  1109. end;                                                                            
  1110. function SI2AFSD_1861_M(Var: STANDARD.COMBINE_FILES.HELP_TYPE) return String is 
  1111. begin                                                                           
  1112.   return "";                                                                    
  1113. end;                                                                            
  1114. procedure COMBINE_FILES_SI2AFSD_1861_F(S: STRING := "") is                      
  1115. begin                                                                           
  1116. SD_Runtime_Utilities.Searching_Scope("STANDARD.COMBINE_FILES.");                
  1117. SD_Runtime_Utilities.Check_Loop_Param(S);                                       
  1118. case SD_Runtime_Utilities.Search_For_Variable("HELP " &                         
  1119. "DEFAULT_INPUT_PREFIX_TERMINATOR DEFAULT_EXTENSION PRE_FLAG " &                 
  1120. "FILE_SEPARATION_FLAG POST_FLAG MAXIMUM_NAME_SIZE MAXIMUM_LINE_SIZE " &         
  1121. "TARGET_FILE TARGET_FILE_NAME TARGET_FILE_NAME_LAST INPUT_FILE " &              
  1122. "INPUT_FILE_NAME INPUT_FILE_NAME_LAST FILE_OF_FILE_NAMES " &                    
  1123. "BASIC_FILE_NAME_FIRST BASIC_FILE_NAME_LAST LINE LINE_LAST STATEMENTS " &       
  1124. "LINE_COUNT COMMENTS TOTAL_STATEMENTS TOTAL_LINE_COUNT TOTAL_COMMENTS ") is     
  1125. when 1 =>                                                                       
  1126.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1127.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.HELP);                                
  1128.   else                                                                          
  1129.     SI2AFSD_1861_D("COMBINE_FILES.HELP",STANDARD.COMBINE_FILES.HELP);           
  1130.   end if;                                                                       
  1131.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1132. when 2 =>                                                                       
  1133.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1134.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1135. "be set");                                                                      
  1136.   else                                                                          
  1137.     SI2AFSD_1861_D("COMBINE_FILES.DEFAULT_INPUT_PREFIX_TERMINATOR", STANDARD.   
  1138. COMBINE_FILES.DEFAULT_INPUT_PREFIX_TERMINATOR);                                 
  1139.   end if;                                                                       
  1140.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1141. when 3 =>                                                                       
  1142.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1143.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1144. "be set");                                                                      
  1145.   else                                                                          
  1146.     SI2AFSD_1861_D("COMBINE_FILES.DEFAULT_EXTENSION", STANDARD.COMBINE_FILES.   
  1147. DEFAULT_EXTENSION);                                                             
  1148.   end if;                                                                       
  1149.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1150. when 4 =>                                                                       
  1151.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1152.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1153. "be set");                                                                      
  1154.   else                                                                          
  1155.     SI2AFSD_1861_D("COMBINE_FILES.PRE_FLAG", STANDARD.COMBINE_FILES.PRE_FLAG);  
  1156.   end if;                                                                       
  1157.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1158. when 5 =>                                                                       
  1159.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1160.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1161. "be set");                                                                      
  1162.   else                                                                          
  1163.     SI2AFSD_1861_D("COMBINE_FILES.FILE_SEPARATION_FLAG", STANDARD.COMBINE_FILES.
  1164. FILE_SEPARATION_FLAG);                                                          
  1165.   end if;                                                                       
  1166.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1167. when 6 =>                                                                       
  1168.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1169.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1170. "be set");                                                                      
  1171.   else                                                                          
  1172.     SI2AFSD_1861_D("COMBINE_FILES.POST_FLAG", STANDARD.COMBINE_FILES.POST_FLAG);
  1173.   end if;                                                                       
  1174.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1175. when 7 =>                                                                       
  1176.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1177.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1178. "be set");                                                                      
  1179.   else                                                                          
  1180.     SI2AFSD_1861_D("COMBINE_FILES.MAXIMUM_NAME_SIZE", STANDARD.COMBINE_FILES.   
  1181. MAXIMUM_NAME_SIZE);                                                             
  1182.   end if;                                                                       
  1183.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1184. when 8 =>                                                                       
  1185.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1186.     SD_Runtime_Utilities.General_Message("Constants or IN parameters cannot " & 
  1187. "be set");                                                                      
  1188.   else                                                                          
  1189.     SI2AFSD_1861_D("COMBINE_FILES.MAXIMUM_LINE_SIZE", STANDARD.COMBINE_FILES.   
  1190. MAXIMUM_LINE_SIZE);                                                             
  1191.   end if;                                                                       
  1192.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1193. when 9 =>                                                                       
  1194.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1195.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TARGET_FILE);                         
  1196.   else                                                                          
  1197.     SI2AFSD_1861_D("COMBINE_FILES.TARGET_FILE",STANDARD.COMBINE_FILES.          
  1198. TARGET_FILE);                                                                   
  1199.   end if;                                                                       
  1200.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1201. when 10 =>                                                                      
  1202.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1203.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TARGET_FILE_NAME);                    
  1204.   else                                                                          
  1205.     SI2AFSD_1861_D("COMBINE_FILES.TARGET_FILE_NAME",STANDARD.COMBINE_FILES.     
  1206. TARGET_FILE_NAME);                                                              
  1207.   end if;                                                                       
  1208.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1209. when 11 =>                                                                      
  1210.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1211.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TARGET_FILE_NAME_LAST);               
  1212.   else                                                                          
  1213.     SI2AFSD_1861_D("COMBINE_FILES.TARGET_FILE_NAME_LAST",STANDARD.COMBINE_FILES.
  1214. TARGET_FILE_NAME_LAST);                                                         
  1215.   end if;                                                                       
  1216.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1217. when 12 =>                                                                      
  1218.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1219.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.INPUT_FILE);                          
  1220.   else                                                                          
  1221.     SI2AFSD_1861_D("COMBINE_FILES.INPUT_FILE",STANDARD.COMBINE_FILES.INPUT_FILE)
  1222. ;                                                                               
  1223.   end if;                                                                       
  1224.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1225. when 13 =>                                                                      
  1226.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1227.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.INPUT_FILE_NAME);                     
  1228.   else                                                                          
  1229.     SI2AFSD_1861_D("COMBINE_FILES.INPUT_FILE_NAME",STANDARD.COMBINE_FILES.      
  1230. INPUT_FILE_NAME);                                                               
  1231.   end if;                                                                       
  1232.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1233. when 14 =>                                                                      
  1234.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1235.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.INPUT_FILE_NAME_LAST);                
  1236.   else                                                                          
  1237.     SI2AFSD_1861_D("COMBINE_FILES.INPUT_FILE_NAME_LAST",STANDARD.COMBINE_FILES. 
  1238. INPUT_FILE_NAME_LAST);                                                          
  1239.   end if;                                                                       
  1240.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1241. when 15 =>                                                                      
  1242.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1243.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.FILE_OF_FILE_NAMES);                  
  1244.   else                                                                          
  1245.     SI2AFSD_1861_D("COMBINE_FILES.FILE_OF_FILE_NAMES",STANDARD.COMBINE_FILES.   
  1246. FILE_OF_FILE_NAMES);                                                            
  1247.   end if;                                                                       
  1248.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1249. when 16 =>                                                                      
  1250.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1251.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.BASIC_FILE_NAME_FIRST);               
  1252.   else                                                                          
  1253.     SI2AFSD_1861_D("COMBINE_FILES.BASIC_FILE_NAME_FIRST",STANDARD.COMBINE_FILES.
  1254. BASIC_FILE_NAME_FIRST);                                                         
  1255.   end if;                                                                       
  1256.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1257. when 17 =>                                                                      
  1258.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1259.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.BASIC_FILE_NAME_LAST);                
  1260.   else                                                                          
  1261.     SI2AFSD_1861_D("COMBINE_FILES.BASIC_FILE_NAME_LAST",STANDARD.COMBINE_FILES. 
  1262. BASIC_FILE_NAME_LAST);                                                          
  1263.   end if;                                                                       
  1264.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1265. when 18 =>                                                                      
  1266.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1267.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.LINE);                                
  1268.   else                                                                          
  1269.     SI2AFSD_1861_D("COMBINE_FILES.LINE",STANDARD.COMBINE_FILES.LINE);           
  1270.   end if;                                                                       
  1271.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1272. when 19 =>                                                                      
  1273.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1274.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.LINE_LAST);                           
  1275.   else                                                                          
  1276.     SI2AFSD_1861_D("COMBINE_FILES.LINE_LAST",STANDARD.COMBINE_FILES.LINE_LAST); 
  1277.   end if;                                                                       
  1278.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1279. when 20 =>                                                                      
  1280.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1281.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.STATEMENTS);                          
  1282.   else                                                                          
  1283.     SI2AFSD_1861_D("COMBINE_FILES.STATEMENTS",STANDARD.COMBINE_FILES.STATEMENTS)
  1284. ;                                                                               
  1285.   end if;                                                                       
  1286.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1287. when 21 =>                                                                      
  1288.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1289.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.LINE_COUNT);                          
  1290.   else                                                                          
  1291.     SI2AFSD_1861_D("COMBINE_FILES.LINE_COUNT",STANDARD.COMBINE_FILES.LINE_COUNT)
  1292. ;                                                                               
  1293.   end if;                                                                       
  1294.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1295. when 22 =>                                                                      
  1296.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1297.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.COMMENTS);                            
  1298.   else                                                                          
  1299.     SI2AFSD_1861_D("COMBINE_FILES.COMMENTS",STANDARD.COMBINE_FILES.COMMENTS);   
  1300.   end if;                                                                       
  1301.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1302. when 23 =>                                                                      
  1303.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1304.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TOTAL_STATEMENTS);                    
  1305.   else                                                                          
  1306.     SI2AFSD_1861_D("COMBINE_FILES.TOTAL_STATEMENTS",STANDARD.COMBINE_FILES.     
  1307. TOTAL_STATEMENTS);                                                              
  1308.   end if;                                                                       
  1309.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1310. when 24 =>                                                                      
  1311.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1312.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TOTAL_LINE_COUNT);                    
  1313.   else                                                                          
  1314.     SI2AFSD_1861_D("COMBINE_FILES.TOTAL_LINE_COUNT",STANDARD.COMBINE_FILES.     
  1315. TOTAL_LINE_COUNT);                                                              
  1316.   end if;                                                                       
  1317.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1318. when 25 =>                                                                      
  1319.   if SD_Runtime_Utilities.Command = SD_Runtime_Declarations.Set_Var then        
  1320.     SI2AFSD_1861_S(STANDARD.COMBINE_FILES.TOTAL_COMMENTS);                      
  1321.   else                                                                          
  1322.     SI2AFSD_1861_D("COMBINE_FILES.TOTAL_COMMENTS",STANDARD.COMBINE_FILES.       
  1323. TOTAL_COMMENTS);                                                                
  1324.   end if;                                                                       
  1325.   raise SD_Runtime_Utilities.Stop_Searching;                                    
  1326. when others =>                                                                  
  1327.   null;                                                                         
  1328. end case;                                                                       
  1329. SD_Runtime_Utilities.Error_Message("Variable not found");                       
  1330. exception                                                                       
  1331.   when Constraint_Error =>                                                      
  1332.     SD_Runtime_Utilities.Error_Message("Constraint error raised");              
  1333.   when others => null;                                                          
  1334. end;                                                                            
  1335. procedure SI2AFSD_1861_Local_Break is new SD_Local_Break(
  1336.   SD_Current_Compilation_Unit, 7,COMBINE_FILES_SI2AFSD_1861_F);
  1337.  
  1338. begin
  1339. SD_RTM.Entering_Unit(SD_CURRENT_COMPILATION_UNIT,  7);
  1340. SI2AFSD_1861_Local_Break( 89, 277);
  1341.   PUT_LINE("COMBINE_FILES : (or '@' and a file of file names, ? for help)"
  1342.     ); 
  1343. SI2AFSD_1861_Local_Break( 90, 279);
  1344.   loop
  1345. SI2AFSD_1861_Local_Break( 91, 280);
  1346.     PUT("Target file for combined text file <RETURN> =>"); 
  1347. SI2AFSD_1861_Local_Break( 92, 281);
  1348.     GET_LINE(TARGET_FILE_NAME, TARGET_FILE_NAME_LAST); 
  1349. SI2AFSD_1861_Local_Break( 93, 282);
  1350.     if TARGET_FILE_NAME_LAST = 1 and TARGET_FILE_NAME(1) = '?' then 
  1351. SI2AFSD_1861_Local_Break( 94, 284);
  1352.       for I in HELP'FIRST .. HELP'LAST loop
  1353. SI2AFSD_1861_Local_Break( 95, 285," I " & SI2AFSD_1861_M(I));
  1354.         PUT_LINE(HELP(I)); 
  1355.       end loop; 
  1356.     else 
  1357. SI2AFSD_1861_Local_Break( 96, 288);
  1358.       CREATE_TARGET_OR_RAISE_EXCEPTION : begin
  1359. SI2AFSD_1861_Local_Break( 97, 289);
  1360.         CREATE(TARGET_FILE, OUT_FILE, TARGET_FILE_NAME(1 .. 
  1361.           TARGET_FILE_NAME_LAST)); 
  1362.       exception
  1363.         when NAME_ERROR => 
  1364. SI2AFSD_1861_Local_Break( 98, 293);
  1365.           PUT("########  NAME_ERROR in creating file name " & 
  1366.             INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)); 
  1367. SI2AFSD_1861_Local_Break( 99, 295);
  1368.           NEW_LINE; 
  1369.         when STATUS_ERROR => 
  1370. SI2AFSD_1861_Local_Break( 100, 297);
  1371.           PUT("########  STATUS_ERROR in creating file name " & 
  1372.             INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)); 
  1373. SI2AFSD_1861_Local_Break( 101, 299);
  1374.           NEW_LINE; 
  1375.         when USE_ERROR => 
  1376. SI2AFSD_1861_Local_Break( 102, 301);
  1377.           PUT("########  USE_ERROR in creating file name " & 
  1378.             INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)); 
  1379. SI2AFSD_1861_Local_Break( 103, 303);
  1380.           NEW_LINE; 
  1381.       end CREATE_TARGET_OR_RAISE_EXCEPTION; 
  1382.     end if; 
  1383. SI2AFSD_1861_Local_Break( 104, 306);
  1384.     if IS_OPEN(TARGET_FILE) then 
  1385. SI2AFSD_1861_Local_Break( 105, 307);
  1386.       exit; 
  1387.     end if; 
  1388.   end loop; 
  1389. SI2AFSD_1861_Local_Break( 106, 310);
  1390.   PUT_LINE("Files to be combined:"); 
  1391. SI2AFSD_1861_Local_Break( 107, 311);
  1392.   loop
  1393. SI2AFSD_1861_Local_Break( 108, 312);
  1394.     GET_FILE_NAME(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST, HELP); 
  1395. SI2AFSD_1861_Local_Break( 109, 313);
  1396.     exit when INPUT_FILE_NAME_LAST = 0; 
  1397. SI2AFSD_1861_Local_Break( 110, 316);
  1398.     BASIC_FILE_NAME_FIRST := 1; 
  1399. SI2AFSD_1861_Local_Break( 111, 317);
  1400.     for I in 1 .. INPUT_FILE_NAME_LAST - 1 loop
  1401. SI2AFSD_1861_Local_Break( 112, 318," I " & SI2AFSD_1861_M(I));
  1402.       if INPUT_FILE_NAME(I) = DEFAULT_INPUT_PREFIX_TERMINATOR then 
  1403. SI2AFSD_1861_Local_Break( 113, 319," I " & SI2AFSD_1861_M(I));
  1404.         BASIC_FILE_NAME_FIRST := I + 1; 
  1405. SI2AFSD_1861_Local_Break( 114, 320," I " & SI2AFSD_1861_M(I));
  1406.         exit; 
  1407.       end if; 
  1408.     end loop; 
  1409. SI2AFSD_1861_Local_Break( 115, 323);
  1410.     BASIC_FILE_NAME_LAST := INPUT_FILE_NAME_LAST; 
  1411. SI2AFSD_1861_Local_Break( 116, 325);
  1412.     for I in reverse BASIC_FILE_NAME_FIRST .. INPUT_FILE_NAME_LAST loop
  1413. SI2AFSD_1861_Local_Break( 117, 326," I " & SI2AFSD_1861_M(I));
  1414.       if INPUT_FILE_NAME(I) = ';' then 
  1415. SI2AFSD_1861_Local_Break( 118, 327," I " & SI2AFSD_1861_M(I));
  1416.         BASIC_FILE_NAME_LAST := I - 1; 
  1417. SI2AFSD_1861_Local_Break( 119, 328," I " & SI2AFSD_1861_M(I));
  1418.         exit; 
  1419.       end if; 
  1420.     end loop; 
  1421. SI2AFSD_1861_Local_Break( 120, 334);
  1422.     if BASIC_FILE_NAME_LAST > DEFAULT_EXTENSION'LAST then 
  1423. SI2AFSD_1861_Local_Break( 121, 335);
  1424.       if INPUT_FILE_NAME(BASIC_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST .. 
  1425.         BASIC_FILE_NAME_LAST) = DEFAULT_EXTENSION then 
  1426. SI2AFSD_1861_Local_Break( 122, 337);
  1427.         BASIC_FILE_NAME_LAST := BASIC_FILE_NAME_LAST - DEFAULT_EXTENSION'
  1428.           LAST; 
  1429.       end if; 
  1430.     end if; 
  1431. SI2AFSD_1861_Local_Break( 123, 341);
  1432.     OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION(INPUT_FILE, INPUT_FILE_NAME, 
  1433.       INPUT_FILE_NAME_LAST); 
  1434. SI2AFSD_1861_Local_Break( 124, 343);
  1435.     if IS_OPEN(INPUT_FILE) then 
  1436. SI2AFSD_1861_Local_Break( 125, 344);
  1437.       PUT_LINE(INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)); 
  1438. SI2AFSD_1861_Local_Break( 126, 346);
  1439.       PUT(TARGET_FILE, PRE_FLAG); 
  1440. SI2AFSD_1861_Local_Break( 127, 347);
  1441.       NEW_LINE(TARGET_FILE); 
  1442. SI2AFSD_1861_Local_Break( 128, 348);
  1443.       PUT(TARGET_FILE, FILE_SEPARATION_FLAG); 
  1444. SI2AFSD_1861_Local_Break( 129, 349);
  1445.       PUT_LINE(TARGET_FILE, INPUT_FILE_NAME(BASIC_FILE_NAME_FIRST .. 
  1446.         BASIC_FILE_NAME_LAST)); 
  1447. SI2AFSD_1861_Local_Break( 130, 351);
  1448.       PUT(TARGET_FILE, POST_FLAG); 
  1449. SI2AFSD_1861_Local_Break( 131, 352);
  1450.       NEW_LINE(TARGET_FILE); 
  1451. SI2AFSD_1861_Local_Break( 132, 353);
  1452.       TRANSFER_FILE : 
  1453.       begin
  1454. SI2AFSD_1861_Local_Break( 133, 356);
  1455.         COPY_FILE_AND_COUNT; 
  1456.       exception
  1457.         when END_ERROR => 
  1458. SI2AFSD_1861_Local_Break( 134, 359);
  1459.           null; 
  1460.       end TRANSFER_FILE; 
  1461. SI2AFSD_1861_Local_Break( 135, 361);
  1462.       CLOSE(INPUT_FILE); 
  1463. SI2AFSD_1861_Local_Break( 136, 362);
  1464.       PUT("STATEMENTS = "); 
  1465. SI2AFSD_1861_Local_Break( 137, 363);
  1466.       PUT(STATEMENTS); 
  1467. SI2AFSD_1861_Local_Break( 138, 364);
  1468.       PUT("   LINE_COUNT = "); 
  1469. SI2AFSD_1861_Local_Break( 139, 365);
  1470.       PUT(LINE_COUNT); 
  1471. SI2AFSD_1861_Local_Break( 140, 366);
  1472.       PUT("   COMMENTS = "); 
  1473. SI2AFSD_1861_Local_Break( 141, 367);
  1474.       PUT(COMMENTS); 
  1475. SI2AFSD_1861_Local_Break( 142, 368);
  1476.       NEW_LINE; 
  1477. SI2AFSD_1861_Local_Break( 143, 369);
  1478.       NEW_LINE; 
  1479. SI2AFSD_1861_Local_Break( 144, 370);
  1480.       TOTAL_STATEMENTS := TOTAL_STATEMENTS + STATEMENTS; 
  1481. SI2AFSD_1861_Local_Break( 145, 371);
  1482.       TOTAL_LINE_COUNT := TOTAL_LINE_COUNT + LINE_COUNT; 
  1483. SI2AFSD_1861_Local_Break( 146, 372);
  1484.       TOTAL_COMMENTS := TOTAL_COMMENTS + COMMENTS; 
  1485.     end if; 
  1486.   end loop; 
  1487. SI2AFSD_1861_Local_Break( 147, 375);
  1488.   CLOSE(TARGET_FILE); 
  1489. SI2AFSD_1861_Local_Break( 148, 376);
  1490.   if (STATEMENTS = TOTAL_STATEMENTS) and (LINE_COUNT = TOTAL_LINE_COUNT)
  1491.     then 
  1492. SI2AFSD_1861_Local_Break( 149, 378);
  1493.     null; 
  1494.   else 
  1495. SI2AFSD_1861_Local_Break( 150, 380);
  1496.     NEW_LINE; 
  1497. SI2AFSD_1861_Local_Break( 151, 381);
  1498.     NEW_LINE; 
  1499. SI2AFSD_1861_Local_Break( 152, 382);
  1500.     PUT_LINE("TOTALS"); 
  1501. SI2AFSD_1861_Local_Break( 153, 383);
  1502.     NEW_LINE; 
  1503. SI2AFSD_1861_Local_Break( 154, 384);
  1504.     PUT("STATEMENTS = "); 
  1505. SI2AFSD_1861_Local_Break( 155, 385);
  1506.     PUT(TOTAL_STATEMENTS); 
  1507. SI2AFSD_1861_Local_Break( 156, 386);
  1508.     PUT("   LINE_COUNT = "); 
  1509. SI2AFSD_1861_Local_Break( 157, 387);
  1510.     PUT(TOTAL_LINE_COUNT); 
  1511. SI2AFSD_1861_Local_Break( 158, 388);
  1512.     PUT("   COMMENTS = "); 
  1513. SI2AFSD_1861_Local_Break( 159, 389);
  1514.     PUT(TOTAL_COMMENTS); 
  1515. SI2AFSD_1861_Local_Break( 160, 390);
  1516.     NEW_LINE; 
  1517. SI2AFSD_1861_Local_Break( 161, 391);
  1518.     NEW_LINE; 
  1519.   end if; 
  1520. SI2AFSD_1861_Local_Break( 162, 393);
  1521. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  7);
  1522. exception
  1523.   when others => 
  1524. begin
  1525. if SD_RTM'CALLABLE then 
  1526. SI2AFSD_1861_Local_Break( 163, 395);
  1527.     PUT_LINE("Unexpected exception raised in COMBINE"); 
  1528. SI2AFSD_1861_Local_Break( 164, 396);
  1529.     CLOSE(TARGET_FILE); 
  1530. SI2AFSD_1861_Local_Break( 165, 397);
  1531. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  7);
  1532. end if;
  1533. exception
  1534.   when others =>
  1535. SD_RTM.Exiting_Unit(SD_CURRENT_COMPILATION_UNIT,  7);
  1536. raise;
  1537. end;  end COMBINE_FILES; 
  1538. with SD_RUN_TIME_MONITOR; use SD_RUN_TIME_MONITOR;
  1539. with SD_TYPE_DEFINITIONS, STRING_PKG; use SD_TYPE_DEFINITIONS;
  1540. package body SD_COMBINE_FILES is
  1541. begin
  1542. SD_RTM.Unit_Information("COMBINE_FILES",  165, (
  1543.  1 => (STRING_PKG.CREATE("COMBINE_FILES.EAT_LEADING_BLANKS"),PROCEDURE_TYPE, 1, 
  1544. 0),
  1545.  2 => (STRING_PKG.CREATE("COMBINE_FILES.TERMINATE_NAME_AT_THE_BLANK"),
  1546. PROCEDURE_TYPE, 5, 0),
  1547.  3 => (STRING_PKG.CREATE("COMBINE_FILES.GET_FILE_NAME"),PROCEDURE_TYPE, 10, 0),
  1548.  4 => (STRING_PKG.CREATE("COMBINE_FILES." &
  1549. "OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION"),PROCEDURE_TYPE, 39, 0),
  1550.  5 => (STRING_PKG.CREATE("COMBINE_FILES.COPY_FILE_AND_COUNT.FETCH"),
  1551. PROCEDURE_TYPE, 45, 0),
  1552.  6 => (STRING_PKG.CREATE("COMBINE_FILES.COPY_FILE_AND_COUNT"),PROCEDURE_TYPE, 
  1553. 60, 0),
  1554.  7 => (STRING_PKG.CREATE("COMBINE_FILES"),PROCEDURE_TYPE, 89, 0)));
  1555. end;
  1556.  
  1557. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1558. --combinef.cat
  1559. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1560.                                                                                 
  1561.       with TEXT_IO;                                                             
  1562.       procedure COMBINE_FILES is                                                
  1563.         use TEXT_IO;                                                            
  1564.         package INT_IO is                                                       
  1565.           new INTEGER_IO(INTEGER);                                              
  1566.         use INT_IO;                                                             
  1567.         type HELP_TYPE is array(1 .. 20) of STRING(1 .. 70);                    
  1568.         HELP : HELP_TYPE := (                                                   
  1569.           "This procedure reads file names from STANDARD_INPUT and copies those 
  1570.           ,                                                                     
  1571.           "files onto another separated by two rows of commented colons and the 
  1572.           ,                                                                     
  1573.           "basic name of the file, so that they may be automatically separated  
  1574.           ,                                                                     
  1575.           "The file name may be preceded by a directory name which is stripped  
  1576.           ,                                                                     
  1577.           "to make the basic name, and the procedure will affix a default       
  1578.           ,                                                                     
  1579.           "extension to the input name if the input named file does not exist   
  1580.           ,                                                                     
  1581.           "The directory format and default extension are system dependent      
  1582.           ,                                                                     
  1583.           "                                                                     
  1584.           ,                                                                     
  1585.           "USAGE:                                                               
  1586.           ,                                                                     
  1587.           "A target file name is requested,                                     
  1588.           ,                                                                     
  1589.           "Target file for combined text file <RETURN> =>                       
  1590.           ,                                                                     
  1591.           "then the files to be combined together                               
  1592.           ,                                                                     
  1593.           "File to be appended =>DBA4:[WHITAKER]COMBINE                         
  1594.           ,                                                                     
  1595.           "A default extension will be added if required e.g. COMBINE.TXT;      
  1596.           ,                                                                     
  1597.           "or the files may be referenced in a file of files preceded by '@'    
  1598.           ,                                                                     
  1599.           "and copy that file preceded by the header                            
  1600.           ,                                                                     
  1601.           "--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1602.           ,                                                                     
  1603.           "--COMBINE                                                            
  1604.           ,                                                                     
  1605.           "--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1606.           ,                                                                     
  1607.           "                                                                     
  1608.           );                                                                    
  1609.                                                                                 
  1610.                                                                                 
  1611.        --  ############## S Y S T E M    D E P E N D E N C Y ################## 
  1612.         DEFAULT_INPUT_PREFIX_TERMINATOR : constant CHARACTER := ']';  --##      
  1613.         DEFAULT_EXTENSION : constant STRING := ".TXT";  --##                    
  1614.         --  Also see use of this and the removal of special characters      --##
  1615.         --  ####################################################################
  1616.         PRE_FLAG : constant STRING :=                                           
  1617.           "--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1618.           ;                                                                     
  1619.         FILE_SEPARATION_FLAG : constant STRING := "--";                         
  1620.         POST_FLAG : constant STRING :=                                          
  1621.           "--:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1622.           ;                                                                     
  1623.         MAXIMUM_NAME_SIZE : constant NATURAL := 140;                            
  1624.         MAXIMUM_LINE_SIZE : constant NATURAL := 250;                            
  1625.         TARGET_FILE : TEXT_IO.FILE_TYPE;                                        
  1626.         TARGET_FILE_NAME : STRING(1 .. MAXIMUM_NAME_SIZE) := (others => ' ');   
  1627.         TARGET_FILE_NAME_LAST : INTEGER := 0;                                   
  1628.         INPUT_FILE : TEXT_IO.FILE_TYPE;                                         
  1629.         INPUT_FILE_NAME : STRING(1 .. MAXIMUM_NAME_SIZE) := (others => ' ');    
  1630.         INPUT_FILE_NAME_LAST : INTEGER := 0;                                    
  1631.         FILE_OF_FILE_NAMES : TEXT_IO.FILE_TYPE;                                 
  1632.         BASIC_FILE_NAME_FIRST : INTEGER := 1;                                   
  1633.         BASIC_FILE_NAME_LAST : INTEGER := 0;                                    
  1634.         LINE : STRING(1 .. MAXIMUM_LINE_SIZE) := (others => ' ');               
  1635.         LINE_LAST : INTEGER := 0;                                               
  1636.         STATEMENTS : NATURAL := 0;                                              
  1637.         LINE_COUNT : NATURAL := 0;                                              
  1638.         COMMENTS : NATURAL := 0;                                                
  1639.         TOTAL_STATEMENTS : NATURAL := 0;                                        
  1640.         TOTAL_LINE_COUNT : NATURAL := 0;                                        
  1641.         TOTAL_COMMENTS : NATURAL := 0;                                          
  1642.                                                                                 
  1643.                                                                                 
  1644.         ------------------------------------------------------------------------
  1645.         procedure EAT_LEADING_BLANKS(NAME : in out STRING;                      
  1646.                                      LAST : in out NATURAL) is                  
  1647.         begin                                                                   
  1648. 1         while LAST >= 1 and NAME(1) = ' ' loop                                
  1649. 2           NAME(1 .. LAST - 1) := NAME(2 .. LAST);                             
  1650. 3           LAST := LAST - 1;                                                   
  1651.           end loop;                                                             
  1652. 4       end EAT_LEADING_BLANKS;                                                 
  1653.         procedure TERMINATE_NAME_AT_THE_BLANK(NAME : in out STRING;             
  1654.                                               LAST : in out NATURAL) is         
  1655.         begin                                                                   
  1656. 5         for I in 2 .. LAST loop                                               
  1657. 6           if NAME(I) = ' ' then                                               
  1658. 7             LAST := I - 1;                                                    
  1659. 8             exit;                                                             
  1660.             end if;                                                             
  1661.           end loop;                                                             
  1662. 9       end TERMINATE_NAME_AT_THE_BLANK;                                        
  1663.         procedure GET_FILE_NAME(INPUT_FILE_NAME : in out STRING;                
  1664.                                 INPUT_FILE_NAME_LAST : in out NATURAL;          
  1665.                                 HELP : in HELP_TYPE) is                         
  1666.         begin                                                                   
  1667. 10        PUT("File name =>");                                                  
  1668. 11        loop --  until a valid name, absorbing commments, file-of-files, '?'  
  1669. 12          if IS_OPEN(FILE_OF_FILE_NAMES) then  --  Check input file is used   
  1670. 13            if END_OF_FILE(FILE_OF_FILE_NAMES) then                           
  1671. 14              CLOSE(FILE_OF_FILE_NAMES);  --  Have come to the end of a       
  1672. 15              SET_INPUT(STANDARD_INPUT);  --  file-of-files and want to       
  1673.               end if;  --  return to keyboard input                             
  1674.             end if;                                                             
  1675. 16          GET_LINE(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST);                    
  1676. 17          EAT_LEADING_BLANKS(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST);          
  1677. 18          TERMINATE_NAME_AT_THE_BLANK(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST); 
  1678. 19          if INPUT_FILE_NAME_LAST = 1 and INPUT_FILE_NAME(1) = '?' then       
  1679.                                                            --  Query for help   
  1680. 20            for I in HELP'FIRST .. HELP'LAST loop                             
  1681. 21              PUT_LINE(HELP(I));                                              
  1682.               end loop;                                                         
  1683. 22            PUT("""");                                                        
  1684. 23            PUT(DEFAULT_EXTENSION);                                           
  1685. 24            PUT_LINE(""" is the current default extension");                  
  1686. 25            PUT("File name =>");                                              
  1687.             elsif INPUT_FILE_NAME_LAST >= 2 and INPUT_FILE_NAME(1 .. 2) = "--"  
  1688.               then  --  Skip comment lines                                      
  1689. 26            null;                                                             
  1690.             elsif INPUT_FILE_NAME_LAST >= 2 and INPUT_FILE_NAME(1) = '@' then   
  1691.                                                            --  File of file name
  1692. 27            TRY_FILE_OF_FILES : begin                                         
  1693. 28              OPEN(FILE_OF_FILE_NAMES, IN_FILE, INPUT_FILE_NAME(2 ..          
  1694.                   INPUT_FILE_NAME_LAST));                                       
  1695. 29              SET_INPUT(FILE_OF_FILE_NAMES);                                  
  1696.               exception                                                         
  1697.                 when NAME_ERROR =>                                              
  1698. 30                PUT(                                                          
  1699.                     "NAME_ERROR in name given for file-of-files, give full name"
  1700.                     );                                                          
  1701.               end TRY_FILE_OF_FILES;                                            
  1702. 31            NEW_LINE;                                                         
  1703. 32            PUT("File name =>");                                              
  1704.             elsif INPUT_FILE_NAME_LAST = 0 then  --  Use a blank line to        
  1705. 33            NEW_LINE;  --  quit the program                                   
  1706. 34            exit;                                                             
  1707.             else  --  Regular file name                                         
  1708. 35            exit;                                                             
  1709.             end if;                                                             
  1710.           end loop;                                                             
  1711. 36      exception                                                               
  1712.           when END_ERROR =>                                                     
  1713. 37          SET_INPUT(STANDARD_INPUT);                                          
  1714. 38        end GET_FILE_NAME;                                                    
  1715.         procedure OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION(INPUT_FILE : in out  
  1716.                                                              FILE_TYPE;         
  1717.                                                            INPUT_FILE_NAME : in 
  1718.                                                              out STRING;        
  1719.                                                            INPUT_FILE_NAME_LAST 
  1720.                                                              : in out NATURAL)  
  1721.           is                                                                    
  1722.         begin                                                                   
  1723. 39        OPEN(INPUT_FILE, IN_FILE, INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)) 
  1724.             ;                                                                   
  1725. 40      exception                                                               
  1726.           when NAME_ERROR =>                                                    
  1727. 41          INPUT_FILE_NAME_LAST := INPUT_FILE_NAME_LAST + DEFAULT_EXTENSION'   
  1728.               LAST;                                                             
  1729. 42          INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST) := INPUT_FILE_NAME(1 ..  
  1730.               INPUT_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST) & DEFAULT_EXTENSION
  1731.               ;                                                                 
  1732. 43          OPEN(INPUT_FILE, IN_FILE, INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST)
  1733.               );                                                                
  1734. 44        end OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION;                         
  1735.                                                                                 
  1736.       --------------------------------------------------------------------------
  1737.         procedure COPY_FILE_AND_COUNT is                                        
  1738.           NEXT_CHAR : NATURAL := 1;                                             
  1739.           C : CHARACTER := ' ';                                                 
  1740.           LEVEL : INTEGER := 0;                                                 
  1741.           procedure FETCH(CH : in out CHARACTER) is                             
  1742.           begin                                                                 
  1743. 45          if NEXT_CHAR > LINE_LAST then                                       
  1744. 46            loop                                                              
  1745. 47              TEXT_IO.GET_LINE(INPUT_FILE, LINE, LINE_LAST);                  
  1746.                 --  To take care of editors that fill out blocks with nulls     
  1747. 48              if END_OF_FILE(INPUT_FILE) and LINE_LAST = 0 then               
  1748. 49                raise END_ERROR;                                              
  1749.                 end if;                                                         
  1750. 50              TEXT_IO.PUT_LINE(TARGET_FILE, LINE(1 .. LINE_LAST));            
  1751. 51              if END_OF_PAGE(INPUT_FILE) then                                 
  1752. 52                SKIP_PAGE(INPUT_FILE);                                        
  1753. 53                NEW_PAGE(TARGET_FILE);                                        
  1754.                 end if;                                                         
  1755. 54              LINE_COUNT := LINE_COUNT + 1;                                   
  1756. 55              NEXT_CHAR := 1;                                                 
  1757. 56              exit when NEXT_CHAR <= LINE_LAST;                               
  1758.               end loop;                                                         
  1759.             end if;                                                             
  1760. 57          CH := LINE(NEXT_CHAR);                                              
  1761. 58          NEXT_CHAR := NEXT_CHAR + 1;                                         
  1762. 59        end FETCH;                                                            
  1763.         begin                                                                   
  1764. 60        STATEMENTS := 0;                                                      
  1765. 61        LINE_COUNT := 0;                                                      
  1766. 62        COMMENTS := 0;                                                        
  1767. 63        loop                                                                  
  1768. 64          FETCH(C);                                                           
  1769.             --  Check for comment on the line                                   
  1770. 65          if C = '-' then                                                     
  1771. 66            FETCH(C);                                                         
  1772.               --  Which is signaled by the '-' following a '-'                  
  1773. 67            if C = '-' then                                                   
  1774.               --  Then just skip the rest of the line and go to the next        
  1775. 68              NEXT_CHAR := LINE_LAST + 1;                                     
  1776. 69              COMMENTS := COMMENTS + 1;                                       
  1777.               end if;                                                           
  1778.             end if;                                                             
  1779.                                                                                 
  1780.             --  Check for one of the characters which introduce code constructs 
  1781.             --  like string or character literal or formal parameter list       
  1782.             --  within which a ';' does not terminate a "line of code"          
  1783. 70          if C = '(' or C = '"' or C = '%' or C = ''' then                    
  1784.                                                                                 
  1785.             --  Check for opening parentheses                                   
  1786.             --  Every ';' within is in a formal parameter list                  
  1787. 71            if C = '(' then                                                   
  1788.               --  Count the number of levels of parentheses                     
  1789. 72              LEVEL := LEVEL + 1;                                             
  1790.                 --  Read ahead until the whole construct is closed, LEVEL = 0   
  1791. 73              while LEVEL > 0 loop                                            
  1792. 74                FETCH(C);                                                     
  1793. 75                if C = '(' then                                               
  1794.                   --  Increase the level if another '(' is found                
  1795. 76                  LEVEL := LEVEL + 1;                                         
  1796.                   elsif C = ')' then                                            
  1797.                   --  Decrease the level if a ')' is found                      
  1798. 77                  LEVEL := LEVEL - 1;                                         
  1799.                   end if;                                                       
  1800.                 end loop;                                                       
  1801.                                                                                 
  1802.                 --  Now check for string brackets of either kind, " or %        
  1803.               elsif C = '"' or C = '%' then                                     
  1804.               --  Treat them in parallel, one must lead off                     
  1805. 78              if C = '"' then                                                 
  1806. 79                loop                                                          
  1807. 80                  FETCH(C);                                                   
  1808.                     --  Loop until the close comes                              
  1809.                     --  If there is a doubled character it just starts again    
  1810. 81                  exit when C = '"';                                          
  1811.                   end loop;                                                     
  1812.                   --  The '%' is handled exactly the same way as '"'            
  1813.                 elsif C = '%' then                                              
  1814. 82                loop                                                          
  1815. 83                  FETCH(C);                                                   
  1816. 84                  exit when C = '%';                                          
  1817.                   end loop;                                                     
  1818.                 end if;                                                         
  1819.                                                                                 
  1820.               --  Character literals are just three characters long including ' 
  1821.               elsif C = ''' then                                                
  1822. 85              FETCH(C);                                                       
  1823. 86              FETCH(C);                                                       
  1824.               end if;                                                           
  1825.                                                                                 
  1826.               --  Any ';' that can be found at this point after all exclusions  
  1827.               --  must be a valid "Ada statement" terminator                    
  1828.             elsif C = ';' then                                                  
  1829. 87            STATEMENTS := STATEMENTS + 1;                                     
  1830.             end if;                                                             
  1831.           end loop;                                                             
  1832. 88      end COPY_FILE_AND_COUNT;                                                
  1833.                                                                                 
  1834.       --------------------------------------------------------------------------
  1835.       begin                                                                     
  1836. 89      PUT_LINE("COMBINE_FILES : (or '@' and a file of file names, ? for help)"
  1837.           );                                                                    
  1838. 90      loop --  To create a target file                                        
  1839. 91        PUT("Target file for combined text file <RETURN> =>");                
  1840. 92        GET_LINE(TARGET_FILE_NAME, TARGET_FILE_NAME_LAST);                    
  1841. 93        if TARGET_FILE_NAME_LAST = 1 and TARGET_FILE_NAME(1) = '?' then       
  1842.                                                           --  Query for help    
  1843. 94          for I in HELP'FIRST .. HELP'LAST loop                               
  1844. 95            PUT_LINE(HELP(I));                                                
  1845.             end loop;                                                           
  1846.           else                                                                  
  1847. 96          CREATE_TARGET_OR_RAISE_EXCEPTION : begin                            
  1848. 97            CREATE(TARGET_FILE, OUT_FILE, TARGET_FILE_NAME(1 ..               
  1849.                 TARGET_FILE_NAME_LAST));                                        
  1850.             exception --  Checking for the prior existance of the file          
  1851.               when NAME_ERROR =>                                                
  1852. 98              PUT("########  NAME_ERROR in creating file name " &             
  1853.                   INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST));                  
  1854. 99              NEW_LINE;                                                       
  1855.               when STATUS_ERROR =>                                              
  1856. 100             PUT("########  STATUS_ERROR in creating file name " &           
  1857.                   INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST));                  
  1858. 101             NEW_LINE;                                                       
  1859.               when USE_ERROR =>                                                 
  1860. 102             PUT("########  USE_ERROR in creating file name " &              
  1861.                   INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST));                  
  1862. 103             NEW_LINE;                                                       
  1863.             end CREATE_TARGET_OR_RAISE_EXCEPTION;                               
  1864.           end if;                                                               
  1865. 104       if IS_OPEN(TARGET_FILE) then                                          
  1866. 105         exit;                                                               
  1867.           end if;                                                               
  1868.         end loop;                                                               
  1869. 106     PUT_LINE("Files to be combined:");                                      
  1870. 107     loop --  on the processing of the series of files                       
  1871. 108       GET_FILE_NAME(INPUT_FILE_NAME, INPUT_FILE_NAME_LAST, HELP);           
  1872. 109       exit when INPUT_FILE_NAME_LAST = 0;  --  Finished                     
  1873.                                                                                 
  1874.           --  Count off the prefix from the basic file name                     
  1875. 110       BASIC_FILE_NAME_FIRST := 1;                                           
  1876. 111       for I in 1 .. INPUT_FILE_NAME_LAST - 1 loop                           
  1877. 112         if INPUT_FILE_NAME(I) = DEFAULT_INPUT_PREFIX_TERMINATOR then        
  1878. 113           BASIC_FILE_NAME_FIRST := I + 1;                                   
  1879. 114           exit;                                                             
  1880.             end if;                                                             
  1881.           end loop;                                                             
  1882. 115       BASIC_FILE_NAME_LAST := INPUT_FILE_NAME_LAST;                         
  1883.           --  Count back to the last ';' over any version number (for VAX/VMS)  
  1884. 116       for I in reverse BASIC_FILE_NAME_FIRST .. INPUT_FILE_NAME_LAST loop   
  1885. 117         if INPUT_FILE_NAME(I) = ';' then                                    
  1886. 118           BASIC_FILE_NAME_LAST := I - 1;                                    
  1887. 119           exit;                                                             
  1888.             end if;                                                             
  1889.           end loop;                                                             
  1890.                                                                                 
  1891.           --  Check if the ending is the default extension, remove for basic nam
  1892.           --    if BASIC_FILE_NAME_LAST > DEFAULT_EXTENSION'LAST  and then      
  1893. 120       if BASIC_FILE_NAME_LAST > DEFAULT_EXTENSION'LAST then                 
  1894. 121         if INPUT_FILE_NAME(BASIC_FILE_NAME_LAST - DEFAULT_EXTENSION'LAST .. 
  1895.               BASIC_FILE_NAME_LAST) = DEFAULT_EXTENSION then                    
  1896. 122           BASIC_FILE_NAME_LAST := BASIC_FILE_NAME_LAST - DEFAULT_EXTENSION' 
  1897.                 LAST;                                                           
  1898.             end if;                                                             
  1899.           end if;                                                               
  1900. 123       OPEN_INPUT_FILE_NAME_MAYBE_ADD_EXTENSION(INPUT_FILE, INPUT_FILE_NAME, 
  1901.             INPUT_FILE_NAME_LAST);                                              
  1902. 124       if IS_OPEN(INPUT_FILE) then  --  If we were successful opening file   
  1903. 125         PUT_LINE(INPUT_FILE_NAME(1 .. INPUT_FILE_NAME_LAST));               
  1904.             --  Put out the interfile flags                                     
  1905. 126         PUT(TARGET_FILE, PRE_FLAG);                                         
  1906. 127         NEW_LINE(TARGET_FILE);                                              
  1907. 128         PUT(TARGET_FILE, FILE_SEPARATION_FLAG);                             
  1908. 129         PUT_LINE(TARGET_FILE, INPUT_FILE_NAME(BASIC_FILE_NAME_FIRST ..      
  1909.               BASIC_FILE_NAME_LAST));                                           
  1910. 130         PUT(TARGET_FILE, POST_FLAG);                                        
  1911. 131         NEW_LINE(TARGET_FILE);                                              
  1912. 132         TRANSFER_FILE :                                                     
  1913.             --  Assuming that it is a text file of reasonable lines             
  1914.             begin                                                               
  1915. 133           COPY_FILE_AND_COUNT;                                              
  1916.             exception                                                           
  1917.               when END_ERROR =>                                                 
  1918. 134             null;                                                           
  1919.             end TRANSFER_FILE;                                                  
  1920. 135         CLOSE(INPUT_FILE);                                                  
  1921. 136         PUT("STATEMENTS = ");                                               
  1922. 137         PUT(STATEMENTS);                                                    
  1923. 138         PUT("   LINE_COUNT = ");                                            
  1924. 139         PUT(LINE_COUNT);                                                    
  1925. 140         PUT("   COMMENTS = ");                                              
  1926. 141         PUT(COMMENTS);                                                      
  1927. 142         NEW_LINE;                                                           
  1928. 143         NEW_LINE;                                                           
  1929. 144         TOTAL_STATEMENTS := TOTAL_STATEMENTS + STATEMENTS;                  
  1930. 145         TOTAL_LINE_COUNT := TOTAL_LINE_COUNT + LINE_COUNT;                  
  1931. 146         TOTAL_COMMENTS := TOTAL_COMMENTS + COMMENTS;                        
  1932.           end if;                                                               
  1933.         end loop;                                                               
  1934. 147     CLOSE(TARGET_FILE);                                                     
  1935. 148     if (STATEMENTS = TOTAL_STATEMENTS) and (LINE_COUNT = TOTAL_LINE_COUNT)  
  1936.           then                                                                  
  1937. 149       null;                                                                 
  1938.         else                                                                    
  1939. 150       NEW_LINE;                                                             
  1940. 151       NEW_LINE;                                                             
  1941. 152       PUT_LINE("TOTALS");                                                   
  1942. 153       NEW_LINE;                                                             
  1943. 154       PUT("STATEMENTS = ");                                                 
  1944. 155       PUT(TOTAL_STATEMENTS);                                                
  1945. 156       PUT("   LINE_COUNT = ");                                              
  1946. 157       PUT(TOTAL_LINE_COUNT);                                                
  1947. 158       PUT("   COMMENTS = ");                                                
  1948. 159       PUT(TOTAL_COMMENTS);                                                  
  1949. 160       NEW_LINE;                                                             
  1950. 161       NEW_LINE;                                                             
  1951.         end if;                                                                 
  1952. 162   exception                                                                 
  1953.         when others =>                                                          
  1954. 163       PUT_LINE("Unexpected exception raised in COMBINE");                   
  1955. 164       CLOSE(TARGET_FILE);                                                   
  1956. 165     end COMBINE_FILES;                                                      
  1957. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1958. --pkgfiles.cat
  1959. --::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
  1960. COMBINE_FILES*COMBINEF*02/11/86*09:47:50*
  1961.