home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / INFO / TURBOPAS / EXPTABS.ZIP / EXPTABS.PAS
Encoding:
Pascal/Delphi Source File  |  1980-01-01  |  4.9 KB  |  157 lines

  1. PROGRAM exptabs;
  2. { expands tabs to spaces }
  3. { Author: Frank Eskridge    6/9/85 }
  4.  
  5.  
  6. TYPE
  7.     arglist_string = string[80];
  8. CONST
  9.     arglist_max = 20;
  10.     arglist_number : integer = -1;
  11. VAR
  12.    argvlist               : array[1..arglist_max] of ^arglist_string;
  13.    line,newline           : STRING[255];
  14.    x,i,y,z,num_spaces     : integer;
  15.    input_file,output_file : text;
  16.    ok                     : boolean;
  17.  
  18. FUNCTION argv ( num : integer ) : arglist_string;
  19.    VAR
  20.       argument : arglist_string absolute cseg:$80;
  21.       newparm,parmline : arglist_string;
  22.       i,j : INTEGER;
  23.       state : (leading_ws, non_quote, quoted, end_quote);
  24.       inchar : CHAR;
  25.  
  26.       PROCEDURE saveparm;
  27.          BEGIN
  28.             IF arglist_number < arglist_max THEN
  29.                BEGIN
  30.                   arglist_number := arglist_number+1;
  31.                   new(argvlist[arglist_number]);
  32.                   argvlist[arglist_number]^ := newparm;
  33.                   newparm := '';
  34.                END;
  35.          END;
  36.  
  37.    BEGIN {function argv}
  38.       IF arglist_number = -1 THEN
  39.          BEGIN
  40.             arglist_number := 0;
  41.             parmline := argument+' ';
  42.             state := leading_ws;
  43.             newparm := '';
  44.             FOR i := 1 to length(parmline) DO
  45.                BEGIN
  46.                   inchar := parmline[i];
  47.                   CASE state OF
  48.                      leading_ws:
  49.                         BEGIN
  50.                            IF inchar = '''' THEN state := quoted
  51.                            ELSE IF inchar <> ' ' THEN
  52.                               BEGIN
  53.                                  newparm := newparm+inchar;
  54.                                  state := non_quote;
  55.                               END;
  56.                         END;
  57.  
  58.                      non_quote:
  59.                         BEGIN
  60.                            IF inchar = ' ' THEN
  61.                               BEGIN
  62.                                  saveparm;
  63.                                  state := leading_ws;
  64.                               END
  65.                            ELSE newparm := newparm+inchar;
  66.                         END;
  67.  
  68.                      quoted:
  69.                         BEGIN
  70.                            IF inchar = '''' THEN state := end_quote
  71.                            ELSE newparm := newparm+inchar;
  72.                         END;
  73.  
  74.                      end_quote:
  75.                         BEGIN
  76.                            IF inchar = '''' THEN
  77.                               BEGIN
  78.                                  newparm := newparm+inchar;
  79.                                  state := quoted;
  80.                               END
  81.                            ELSE IF inchar <> ' ' THEN
  82.                               BEGIN
  83.                                  newparm := newparm+inchar;
  84.                                  state := non_quote;
  85.                               END
  86.                            ELSE
  87.                               BEGIN
  88.                                  saveparm;
  89.                                  state := leading_ws;
  90.                               END;
  91.                         END;
  92.                   END; {case}
  93.                END;
  94.          END;
  95.  
  96.          IF (num > 0) AND (num <= arglist_number) THEN
  97.             argv := argvlist[num]^
  98.          ELSE argv := '';
  99.    END; {function argv}
  100.  
  101.  
  102. FUNCTION argc:integer;
  103.   VAR
  104.      dummy : arglist_string;
  105.   BEGIN {function argc}
  106.      IF arglist_number = -1 THEN
  107.      BEGIN
  108.         dummy := argv(1); {force evaluation}
  109.         argc := arglist_number;
  110.      END
  111.      ELSE
  112.         argc := arglist_number;
  113.   END;
  114.  
  115. BEGIN
  116.    WRITELN;WRITELN;WRITELN;WRITELN;
  117.    IF argc < 2 THEN BEGIN
  118.       WRITELN('Expands tabs to spaces in text file.');
  119.       WRITELN;
  120.       WRITELN('Usage:');
  121.       WRITELN('    EXPTABS <input filename> <output filename> [<# spaces, default 8>]');
  122.       WRITELN('Examples:');
  123.       WRITELN('    EXPTABS OLD.TXT NEW.TXT ');
  124.       WRITELN('    EXPTABS OLD.TXT NEW.TXT 6');
  125.       HALT;
  126.    END;
  127.    ASSIGN(input_file,argv(1));
  128.    ASSIGN(output_file,argv(2));
  129.    {$I-}RESET(input_file){$I+};
  130.    ok := (IOResult=0);
  131.    IF NOT ok THEN BEGIN
  132.       WRITELN('ERROR--input file not found.');
  133.       HALT;
  134.    END;
  135.    REWRITE(output_file);
  136.    IF argc = 3 THEN
  137.       VAL(argv(3),num_spaces,z)
  138.    ELSE
  139.       num_spaces := 8;
  140.    WHILE NOT EOF(input_file) DO
  141.       BEGIN
  142.          READLN(input_file,line);
  143.          newline := '';
  144.          FOR x := 1 TO LENGTH(line) DO
  145.             BEGIN
  146.                IF line[x] = #9 THEN
  147.                   FOR y := 1 TO num_spaces DO
  148.                      newline :=  newline + ' '
  149.                ELSE
  150.                   newline := newline+line[x];
  151.             END;
  152.          newline := newline + #13+#10;
  153.          WRITE(output_file,newline);
  154.       END;
  155.    CLOSE(input_file);
  156.    CLOSE(output_file);
  157. END.