home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol085 / trimcols.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  7.3 KB  |  338 lines

  1. PROGRAM trimline;
  2.  
  3. {$e+}
  4.  
  5.  {Program to read a file, trim the rightmost columns, }
  6.  {then trim trailing blanks, and then output into a }
  7.  {second file. }
  8.  
  9.  
  10. CONST
  11.    version = '1.0';
  12.    maxline = 255;    {longest line we can handle}
  13.  
  14. TYPE
  15.    byte = 0..255;
  16.    char12 = PACKED ARRAY [1..12] OF CHAR;
  17.  
  18.    STRING0 = STRING 0;
  19.    STRING255 = STRING 255;
  20.    line_string = STRING maxline;
  21.    
  22. VAR
  23.    status   :INTEGER;
  24.   
  25.    flag        :BOOLEAN;
  26.    trim_flag   :BOOLEAN;
  27.    list_flag   :BOOLEAN;
  28.    debug_flag  :BOOLEAN;
  29.  
  30.  
  31.    inf_name   :char12;
  32.    inf_file   :TEXT;  {input file variable}
  33.  
  34.    outf_name   :char12;
  35.    outf_file   :TEXT;  {output file variable}
  36.    rec_count, rec_thousands   :INTEGER;
  37.  
  38.  
  39.    this_line   :line_string;
  40.    
  41.    trunc_length   :INTEGER;   {truncate lines to this length}
  42.  
  43. {-----------------------------------------------------------}
  44. {-----------------------------------------------------------}
  45. {-----------------------------------------------------------}
  46.  
  47. FUNCTION LENGTH ( str: STRING255) :INTEGER;  EXTERNAL;
  48. FUNCTION INDEX  ( stra, strb :STRING255 ):INTEGER; EXTERNAL;
  49. PROCEDURE SETLENGTH (VAR str :STRING0; len :INTEGER); EXTERNAL;
  50.  
  51. {-----------------------------------------------------------}
  52.  
  53.  
  54. PROCEDURE trim_blanks  ( VAR this_line :line_string );
  55.  
  56.  {Trim trailing blanks }
  57.  
  58. VAR
  59.    col   :INTEGER;
  60.    flag   :BOOLEAN;
  61.  
  62. BEGIN{PROCEDURE}
  63.    col := LENGTH (this_line);
  64.    flag := FALSE;
  65.    WHILE (col>0) AND (NOT flag) DO BEGIN
  66.       IF this_line[col] = ' ' THEN BEGIN
  67.          col := col - 1;
  68.          END
  69.       ELSE BEGIN
  70.          flag := TRUE;
  71.       END{IF};
  72.    END{WHILE};
  73.  
  74.    SETLENGTH (this_line, col);
  75.  
  76.    IF debug_flag THEN BEGIN
  77.       col := LENGTH (this_line);
  78.       WRITELN ('%exit trim_blanks: length=', col:4);
  79.       WRITELN (this_line);
  80.    END{IF};
  81.  
  82. END{PROCEDURE};
  83.  
  84. {--------------------------------------------------------}
  85.  
  86. PROCEDURE truncate_line (VAR this_line :line_string);
  87.  
  88. VAR
  89.    len   :INTEGER;
  90.  
  91. BEGIN{PROCEDURE}
  92.    len := LENGTH (this_line);
  93.    IF len > trunc_length THEN BEGIN
  94.       SETLENGTH (this_line, trunc_length);
  95.    END{IF};
  96.  
  97.    IF debug_flag THEN BEGIN
  98.       len := LENGTH (this_line);
  99.       WRITELN ('%exit trunc_line: length=', len:4);
  100.       WRITELN (this_line);
  101.    END{IF};
  102.  
  103. END{PROCEDURE};
  104.  
  105.  
  106. {--------------------------------------------------------}
  107.  
  108.  
  109. FUNCTION upper_case (in_char :CHAR) :CHAR;
  110.  
  111. BEGIN
  112.    upper_case := in_char;
  113.    IF in_char IN ['a'..'z'] THEN BEGIN
  114.       upper_case := CHR( ORD(in_char) - 32 );
  115.    END{IF};
  116. END{FUNCTION};
  117.  
  118.  
  119. {--------------------------------------------------------}
  120.  
  121. FUNCTION ask_yes_or_no  :BOOLEAN;
  122.  
  123. VAR
  124.    flag   :BOOLEAN;
  125.    response   :CHAR;
  126. BEGIN{FUNCTION}
  127.    flag := FALSE;
  128.    WHILE NOT flag DO BEGIN
  129.       WRITE ('(Y or N)');
  130.       READLN(response);
  131.       response := upper_case (response);
  132.       IF (response='Y') OR (response='N') THEN BEGIN
  133.          flag := TRUE;
  134.          END
  135.       ELSE BEGIN
  136.          WRITELN('Try again. ');
  137.       END{IF};
  138.    END{WHILE};
  139.  
  140.    ask_yes_or_no :=  response='Y';
  141. END{FUNCTION};
  142.  
  143.  
  144. {--------------------------------------------------------}
  145.  
  146. FUNCTION get_open :INTEGER;
  147.  
  148. VAR
  149.    result   :INTEGER;
  150.  
  151. BEGIN{FUNCTION};
  152.    result := 0;
  153.  
  154.    WRITE ('Enter the input file name: ');
  155.    READLN (inf_name);
  156.  
  157.    RESET (inf_name, inf_file);
  158.  
  159.    IF EOF(inf_file) THEN result := -1;
  160.  
  161.    get_open := result;
  162. END{FUNCTION};
  163.  
  164.  
  165. {--------------------------------------------------------}
  166.  
  167. FUNCTION get_close  :INTEGER;
  168.  
  169. BEGIN{FUNCTION}
  170.    get_close := 0;
  171. END{FUNCTION};
  172.  
  173.  
  174. {--------------------------------------------------------}
  175.  
  176. FUNCTION get_line (VAR this_line :line_string) :INTEGER;
  177.  
  178. VAR
  179.    result   :INTEGER;
  180.    len    :INTEGER;
  181.  
  182. BEGIN{FUNCTION}
  183.    result := 0;
  184.  
  185.    IF EOF(inf_file) THEN BEGIN
  186.       result := -1;
  187.       SETLENGTH (this_line, 0);
  188.       END
  189.    ELSE BEGIN
  190.  
  191.       READLN (inf_file, this_line);
  192.  
  193.       IF debug_flag THEN BEGIN
  194.          len := LENGTH (this_line);
  195.          WRITELN ('Input line: status=', result:4, 
  196.                   '  length=', len:3);
  197.          WRITELN (this_line);
  198.       END{IF};
  199.    END{IF};
  200.  
  201.    get_line := result;
  202. END{FUNCTION};
  203.  
  204.  
  205. {--------------------------------------------------------}
  206.  
  207. FUNCTION put_open :INTEGER;
  208.  
  209. VAR
  210.    result   :INTEGER;
  211.  
  212. BEGIN{FUNCTION};
  213.    result := 0;
  214.  
  215.    WRITE ('Enter the output file name: ');
  216.    READLN (outf_name);
  217.  
  218.    REWRITE (outf_name, outf_file);
  219.  
  220.    rec_count := 0;
  221.    rec_thousands := 0;
  222.  
  223.    put_open := result;
  224. END{FUNCTION};
  225.  
  226.  
  227. {-----------------------------------------------------------}
  228.  
  229. FUNCTION put_close :INTEGER;
  230.  
  231. VAR
  232.    result   :INTEGER;
  233.  
  234. BEGIN{FUNCTION}
  235.    result := 0;
  236.  
  237.    WRITELN (rec_thousands:4, ',', rec_count:3,
  238.             ' output records in file ', outf_name );
  239.    
  240.    put_close := result;
  241. END{FUNCTION};
  242.  
  243.  
  244. {--------------------------------------------------------}
  245.  
  246. FUNCTION put_line (VAR this_line :line_string ) :INTEGER;
  247.  
  248. VAR
  249.    result   :INTEGER;
  250.    len      :INTEGER;
  251.  
  252. BEGIN{FUNCTION}
  253.    result := 0;
  254.  
  255.    IF list_flag and debug_flag THEN BEGIN
  256.       len := LENGTH (this_line);
  257.       WRITE (len:2, ' ');
  258.    END{IF};
  259.  
  260.    IF list_flag THEN WRITELN (this_line );
  261.    WRITELN (outf_file, this_line );
  262.  
  263.    rec_count := rec_count + 1;
  264.    IF rec_count >= 1000 THEN BEGIN
  265.       rec_thousands := rec_thousands + 1;
  266.       rec_count := 0;
  267.    END{IF};
  268.  
  269.    put_line := result;
  270. END{FUNCTION};
  271.  
  272.  
  273.  
  274. {-------------------------------------------------------}
  275. {-------------------------------------------------------}
  276. {-------------------------------------------------------}
  277.  
  278. BEGIN{PROGRAM}
  279.    WRITELN
  280.    ('Trim File Program  Version ', version);
  281.  
  282.    WRITELN ('This program reads an input file, trims the ');
  283.    WRITELN ('last N columns from the lines, then trims any');
  284.    WRITELN ('trailing blanks,');
  285.    WRITELN ('and writes lines into output file.');
  286.  
  287.    WRITE('Debugging on? ');
  288.    debug_flag := ask_yes_or_no;
  289.    IF debug_flag THEN WRITELN('Debug is on.');
  290.  
  291.    WRITE('List the lines as they are read? ');
  292.    list_flag := ask_yes_or_no;
  293.  
  294.    flag := FALSE;
  295.    WHILE NOT flag DO BEGIN
  296.       WRITE ('Enter column# to which we will truncate: ');
  297.       READLN (trunc_length);
  298.       IF (trunc_length < 1)  OR  (trunc_length > 255) THEN BEGIN
  299.          WRITELN ('*** Too small or too big.  Try again.');
  300.          END
  301.       ELSE BEGIN
  302.          WRITELN ('Lines longer than ', trunc_length:3,
  303.                    ' will be truncated.');
  304.          flag := TRUE;
  305.       END{IF};
  306.    END{WHILE};
  307.  
  308.    WRITE('Trim trailing blanks from output lines? ');
  309.    trim_flag := ask_yes_or_no;
  310.  
  311.    status := get_open;
  312.    IF status <> 0 THEN WRITELN ('Cannot open input file.');
  313.  
  314.    IF status=0 THEN BEGIN
  315.       status := put_open;
  316.       IF status <>0 THEN WRITELN ('Cannot open output file.');
  317.    END{IF};
  318.  
  319.    IF status=0 THEN BEGIN
  320.       WHILE status = 0  DO BEGIN
  321.          status := get_line (this_line);
  322.       
  323.          IF status = 0 THEN BEGIN
  324.             truncate_line (this_line);
  325.             IF trim_flag THEN trim_blanks (this_line);
  326.             status := put_line (this_line);
  327.          END{IF};
  328.       END{WHILE};
  329.    END{IF};
  330.  
  331.    status := get_close;
  332.    status := put_close;
  333.  
  334.    WRITELN('End of Trim');
  335.  
  336. END{PROGRAM}
  337. .
  338.