home *** CD-ROM | disk | FTP | other *** search
/ Programmer 7500 / MAX_PROGRAMMERS.iso / PASCAL / TURBO5.ZIP / FLIST.PAS next >
Encoding:
Pascal/Delphi Source File  |  1986-12-26  |  12.8 KB  |  467 lines

  1. PROGRAM FLIST (INPUT,OUTPUT,LISTFILE);
  2. {  ***************************************************************************
  3.    Read text file and list with print formatting -- Source is Turbo PASCAL
  4.    Published in the Public Domain for non-commercial use
  5.    by Todd Merriman, Future Communications - Atlanta, Georgia 1984.
  6.    ***************************************************************************
  7. }
  8. CONST
  9.    REV              = '1.2';
  10.    PAGELEN          = 66;
  11.    TOPMARG          = 2;
  12.    BOTMARG          = 2;
  13.    HEADMARG         = 2;
  14.    DEFLEFTMARG      = 0;
  15.    DEFRIGHTMARG     = 0;
  16.    PAPERWIDTH       = 80;
  17.    HEADING          = 'FLIST - by Future Communications';
  18.    TABSPACE         = 8;
  19.  
  20. LABEL
  21.    EXIT;
  22.  
  23. TYPE
  24.    STRING255        = STRING [255];
  25.  
  26. VAR
  27.    I                : INTEGER;
  28.    LISTFILE         : TEXT;
  29.    LISTNAME,HEADNAME: STRING [14];
  30.    PAGENO           : INTEGER;
  31.    LINENO           : INTEGER;
  32.    TEXTLINE         : STRING255;
  33.    TOP              : BOOLEAN;
  34.    DRIVE            : STRING [2];
  35.    FILL             : STRING [40];
  36.    ABORT            : BOOLEAN;
  37.    LEFTMARG         : INTEGER;
  38.    RIGHTMARG        : INTEGER;
  39.  
  40. {  ************************* DATE & TIME MODULE *****************************
  41.    < BEGIN >
  42. }
  43. TYPE
  44.    STRING8  = STRING [8];
  45.  
  46. FUNCTION DATE : STRING8;
  47. {  **************************************************************************
  48.    Read date from reserved memory location
  49.    **************************************************************************
  50. }
  51. VAR
  52.    TEMP     : ARRAY [0..2] OF BYTE ABSOLUTE $0010;
  53.    I        : BYTE;
  54.    STR      : STRING8;
  55.  
  56. BEGIN { DATE }
  57.  
  58.    STR      := '';
  59.    FOR I := 0 TO 2 DO
  60.    BEGIN
  61.       STR := STR + CHR (((TEMP [I] AND $F0) SHR 4) + $30);
  62.       STR := STR + CHR ((TEMP [I] AND $0F)+ $30);
  63.       IF I < 2 THEN STR := STR + '/';
  64.    END; { FOR }
  65.    DATE := STR;
  66.  
  67. END; { DATE }
  68.  
  69.  
  70. FUNCTION TIME : STRING8;
  71. {  **************************************************************************
  72.    Read time from reserved memory location
  73.    **************************************************************************
  74. }
  75. VAR
  76.    TEMP     : ARRAY [0..2] OF BYTE ABSOLUTE $0013;
  77.    I        : BYTE;
  78.    STR      : STRING8;
  79.  
  80. BEGIN { TIME }
  81.  
  82.    STR      := '';
  83.    FOR I := 0 TO 2 DO
  84.    BEGIN
  85.       STR := STR + CHR (((TEMP [I] AND $F0) SHR 4) + $30);
  86.       STR := STR + CHR ((TEMP [I] AND $0F) + $30);
  87.       IF I < 2 THEN STR := STR + ':';
  88.    END; { FOR }
  89.    TIME := STR;
  90.  
  91. END; { TIME }
  92.  
  93.  
  94. PROCEDURE CHECKDATIME (VAR GOOD : BOOLEAN);
  95. {  ***************************************************************************
  96.    See if valid date and time in memory
  97.    ***************************************************************************
  98. }
  99. VAR
  100.    CHECK,CODE    : INTEGER;
  101.  
  102. BEGIN { CHECKDATIME }
  103.    GOOD := TRUE;
  104.    VAL (COPY (DATE, 1, 2), CHECK, CODE);
  105.    IF (CHECK > 12) OR
  106.       (CHECK < 1) OR
  107.       (CODE > 0) THEN
  108.          GOOD := FALSE;
  109.    VAL (COPY (TIME, 1, 2), CHECK, CODE);
  110.    IF (CHECK > 23) OR
  111.       (CODE > 0) THEN
  112.          GOOD := FALSE;
  113. END; { CHECKDATIME }
  114.  
  115.  
  116. PROCEDURE CONVERT (VAR BIG : STRING8; VAR LITTLE : BYTE);
  117. {  ***************************************************************************
  118.    Convert a character string to BCD numbers
  119.    ***************************************************************************
  120. }
  121. BEGIN { CONVERT }
  122.    LITTLE := ((ORD (BIG [1]) - $30) SHL 4) OR (ORD (BIG [2]) - $30);
  123.    DELETE (BIG,1,2);
  124.    IF LENGTH (BIG) > 0 THEN DELETE (BIG,1,1);      { get the separator }
  125. END; { CONVERT }
  126.  
  127.  
  128. PROCEDURE SETDATE;
  129. {  ***************************************************************************
  130.    Prompt for date and set in memory
  131.    ***************************************************************************
  132. }
  133. CONST
  134.    DIGITS   : SET OF CHAR = ['0'..'9'];
  135.  
  136. VAR
  137.    TEMP     : ARRAY [0..2] OF BYTE ABSOLUTE $0010;
  138.    I        : BYTE;
  139.    STR      : STRING8;
  140.  
  141. BEGIN { SETDATE }
  142.    WRITE ('Enter date [MM/DD/YY] ');
  143.    READLN (STR);
  144.    IF LENGTH (STR) > 0 THEN
  145.    BEGIN
  146.       FOR I := 0 TO 2 DO
  147.       BEGIN
  148.          IF (STR [1] IN DIGITS) AND (NOT (STR [2] IN DIGITS)) THEN
  149.             STR := '0' + STR;          { insure leading zeros }
  150.          CONVERT (STR,TEMP [I]);
  151.       END; { FOR }
  152.    END; { IF }
  153. END; { SETDATE }
  154.  
  155.  
  156. PROCEDURE SETIME;
  157. {  ***************************************************************************
  158.    Prompt for time and set in memory
  159.    ***************************************************************************
  160. }
  161. CONST
  162.    DIGITS   : SET OF CHAR = ['0'..'9'];
  163.  
  164. VAR
  165.    TEMP     : ARRAY [0..2] OF BYTE ABSOLUTE $0013;
  166.    I        : BYTE;
  167.    STR      : STRING8;
  168.  
  169. BEGIN { SETIME }
  170.    WRITE ('Enter time [HH:MM] ');
  171.    READLN (STR);
  172.    IF LENGTH (STR) > 0 THEN
  173.    BEGIN
  174.       INSERT (':00',STR,LENGTH (STR)+1);             { add seconds }
  175.       FOR I := 0 TO 2 DO
  176.       BEGIN
  177.          IF (STR [1] IN DIGITS) AND (NOT (STR [2] IN DIGITS)) THEN
  178.             STR := '0' + STR;          { insure leading zeros }
  179.          CONVERT (STR,TEMP [I]);
  180.       END; { FOR }
  181.    END; { IF }
  182. END; { SETIME }
  183.  
  184. {  ************************* DATE & TIME MODULE *****************************
  185.    < END >
  186. }
  187. FUNCTION CMDLINE: STRING255;
  188. {  ***************************************************************************
  189.    Get command from command line
  190.    ***************************************************************************
  191. }
  192. CONST
  193.    BUF = $80;
  194.  
  195. VAR
  196.    I:INTEGER;
  197.    ST:STRING255;
  198.  
  199. BEGIN { CMDLINE }
  200.  
  201.    ST:='';
  202.    FOR I:= BUF+2 TO BUF + ORD (MEM [BUF]) DO
  203.    BEGIN
  204.       ST [0] := SUCC (ST [0]);
  205.       ST [ORD (ST [0])] := CHR (MEM [I]);
  206.    END;
  207.  
  208.    CMDLINE:=ST;
  209.  
  210. END; { CMDLINE }
  211.  
  212.  
  213. FUNCTION PARSE (VAR SOURCE:STRING255): STRING255;
  214. {  ***************************************************************************
  215.    Parse a string from the command line
  216.    ***************************************************************************
  217. }
  218. VAR
  219.    DEST: STRING255;
  220.    DELIMIT: SET OF CHAR;
  221.  
  222. BEGIN { PARSE }
  223.  
  224.    DELIMIT:=[' ',',','='];
  225.    DEST:='';
  226.    IF (LENGTH(SOURCE) <> 0) THEN
  227.    BEGIN
  228.       REPEAT
  229.          IF (SOURCE[1] IN DELIMIT) THEN DELETE(SOURCE,1,1);
  230.       UNTIL ((NOT(SOURCE[1] IN DELIMIT)) OR (LENGTH(SOURCE) = 0));
  231.       IF (LENGTH(SOURCE) <> 0) THEN
  232.       REPEAT
  233.          IF (NOT(SOURCE[1] IN DELIMIT)) THEN
  234.          BEGIN
  235.             DEST:= CONCAT(DEST,COPY(SOURCE,1,1));
  236.                DELETE(SOURCE,1,1);
  237.          END;
  238.       UNTIL ((SOURCE[1] IN DELIMIT) OR (LENGTH(SOURCE) = 0));
  239.    END;
  240.    PARSE:= DEST;
  241.  
  242. END; { PARSE }
  243.  
  244.  
  245. PROCEDURE MARGIN (NUM : BYTE);
  246. {  ***************************************************************************
  247.    Move NUM spaces from left margin
  248.    ***************************************************************************
  249. }
  250. VAR
  251.    I       : BYTE;
  252.  
  253. BEGIN { EMPTYLINE }
  254.    FOR I := 1 TO NUM DO WRITE (LST,' ');
  255. END; { EMPTYLINE }
  256.  
  257.  
  258. PROCEDURE EMPTYLINE;
  259. {  ***************************************************************************
  260.    Print a line with something in it for funky Anadex
  261.    ***************************************************************************
  262. }
  263. VAR
  264.    I                        : INTEGER;
  265.  
  266. BEGIN { EMPTYLINE }
  267.    MARGIN (LEFTMARG);
  268.    WRITE (LST,'.');
  269.    MARGIN (PAPERWIDTH - LEFTMARG - RIGHTMARG -2);
  270.    WRITELN (LST,'.');
  271. END; { EMPTYLINE }
  272.  
  273.  
  274. PROCEDURE PAGEHEAD;
  275. {  ***************************************************************************
  276.    Print heading for each page of listing
  277.    ***************************************************************************
  278. }
  279. VAR
  280.      I                        : INTEGER;
  281.  
  282. BEGIN { PAGEHEAD }
  283.  
  284.    WHILE (LINENO >= PAGELEN - BOTMARG) OR (TOP) DO
  285.    BEGIN
  286.       IF NOT TOP THEN WRITE(LST,^L);
  287.       TOP                      := FALSE;
  288.       LINENO                   := 1;
  289.       FOR I := 1 TO TOPMARG DO
  290.       BEGIN
  291.          EMPTYLINE;
  292.          LINENO              := LINENO + 1;
  293.       END; { FOR }
  294.  
  295.       MARGIN (LEFTMARG);
  296.       WRITELN (LST,HEADNAME,FILL,TIME,'  ',DATE,FILL,'Page ',PAGENO);
  297.       LINENO                   := LINENO + 1;
  298.  
  299.       FOR I := 1 TO HEADMARG DO
  300.       BEGIN
  301.          EMPTYLINE;
  302.          LINENO              := LINENO + 1;
  303.       END; { FOR }
  304.  
  305.       PAGENO                   := PAGENO + 1;
  306.  
  307.    END; { WHILE }
  308.  
  309. END; { PAGEHEAD }
  310.  
  311.  
  312. PROCEDURE SKIPHEAD;
  313. {  ***************************************************************************
  314.    Skip form feeds and headings
  315.    ***************************************************************************
  316. }
  317. BEGIN
  318.    REPEAT
  319.       IF KEYPRESSED THEN ABORT := TRUE;
  320.       READLN (LISTFILE,TEXTLINE);
  321.    UNTIL (LENGTH (TEXTLINE) > 0) OR (EOF (LISTFILE)) OR (ABORT);
  322.  
  323. END; { SKIPHEAD }
  324.  
  325.  
  326. PROCEDURE PRINTLINE;
  327. {  ***************************************************************************
  328.    Expand tabs and print line with truncation to margins
  329.    ***************************************************************************
  330. }
  331. VAR
  332.    TNUM,LNUM,I,J   : BYTE;
  333.  
  334. BEGIN
  335.    IF LENGTH (TEXTLINE) > 0 THEN
  336.    BEGIN
  337.       TNUM := 1;
  338.       LNUM := 1;
  339.       I    := 1;
  340.       WHILE  I <  PAPERWIDTH - LEFTMARG - RIGHTMARG DO
  341.       BEGIN
  342.          IF TEXTLINE [LNUM] = #9 THEN
  343.          BEGIN
  344.             FOR J := TNUM TO TABSPACE DO
  345.             BEGIN
  346.                I := I + 1;
  347.                WRITE (LST,' ');
  348.             END; { FOR }
  349.             TNUM := 1;
  350.             LNUM := LNUM + 1;
  351.          END
  352.          ELSE
  353.          BEGIN
  354.             WRITE (LST,TEXTLINE[LNUM]);
  355.             LNUM := LNUM + 1;
  356.             TNUM := TNUM + 1;
  357.             I    := I + 1;
  358.             IF TNUM > TABSPACE THEN TNUM := 1;
  359.             IF LNUM > LENGTH (TEXTLINE) THEN I := PAPERWIDTH;
  360.          END; { ELSE }
  361.       END; { WHILE }
  362.    END; { IF LENGTH }
  363.    WRITELN (LST);
  364. END; { PRINTLINE }
  365.  
  366.  
  367. {  ***************************************************************************
  368. }
  369. BEGIN { FLIST }
  370.  
  371.    PAGENO   := 1;
  372.    LINENO   := 1;
  373.    LEFTMARG := DEFLEFTMARG;
  374.    RIGHTMARG:= DEFRIGHTMARG;
  375.    TOP      := TRUE;
  376.    WRITELN ('---------- ',HEADING,' ----------');
  377.    WRITELN ('           Rev. ',REV);
  378.    WRITELN ('Text file listing with print formatting and tab expansion');
  379.    WRITELN;
  380.  
  381.    TEXTLINE := CMDLINE;
  382.    LISTNAME := PARSE (TEXTLINE);
  383.    IF LENGTH (LISTNAME) = 0 THEN
  384.    BEGIN
  385.       WRITELN ('Usage:  A>FLIST <filename.ext> [leftmargin] [rightmargin]');
  386.       ABORT := TRUE;
  387.       GOTO EXIT;
  388.    END; { IF }
  389.    DRIVE := '';
  390.    IF LENGTH (TEXTLINE) > 0 THEN
  391.    BEGIN
  392.       DRIVE := PARSE (TEXTLINE);
  393.       VAL (DRIVE,LEFTMARG,I);
  394.       IF I > 0 THEN LEFTMARG := DEFLEFTMARG;
  395.    END; { IF }
  396.    IF LENGTH (TEXTLINE) > 0 THEN
  397.    BEGIN
  398.       DRIVE := PARSE (TEXTLINE);
  399.       VAL (DRIVE,RIGHTMARG,I);
  400.       IF I > 0 THEN RIGHTMARG := DEFRIGHTMARG;
  401.    END; { IF }
  402.    ASSIGN (LISTFILE,LISTNAME);
  403.    {$I-}
  404.    RESET (LISTFILE);
  405.    {$I+}
  406.    IF IORESULT <> 0 THEN
  407.    BEGIN
  408.       WRITELN (#7,'? Error: ',LISTNAME,' does not exist');
  409.       ABORT := TRUE;
  410.       GOTO EXIT;
  411.    END;
  412.    CHECKDATIME (ABORT);
  413.    IF NOT ABORT THEN
  414.    BEGIN
  415.       SETDATE;
  416.       SETIME;
  417.    END; { IF NOT }
  418.    ABORT := FALSE;
  419.    IF (LEFTMARG = DEFLEFTMARG) AND (RIGHTMARG = DEFRIGHTMARG) THEN
  420.    BEGIN
  421.       WRITELN ('Left and right margins may follow filename on command line');
  422.       WRITELN ('Usage:  A>FLIST <filename.ext> [leftmargin] [rightmargin]');
  423.    END;
  424.    WRITELN (CON,'> File: ',LISTNAME);
  425.    WRITE (CON,'> Paper width= ',PAPERWIDTH);
  426.    WRITE (CON,'     Left margin= ',LEFTMARG);
  427.    WRITELN (CON,'     Right margin= ',RIGHTMARG);
  428.    WRITELN ('> Press any key to abort list');
  429.  
  430.    IF POS (':',LISTNAME) = 0 THEN
  431.    BEGIN
  432.       HEADNAME       := LISTNAME;
  433.       DRIVE          := '';
  434.    END { IF }
  435.    ELSE
  436.    BEGIN
  437.       HEADNAME       := COPY (LISTNAME,3,LENGTH (LISTNAME)-2);
  438.       DRIVE          := COPY(LISTNAME,1,2);
  439.    END; { ELSE }
  440.    FILL                     := ' ';
  441.    FOR I := 1 TO (PAPERWIDTH - LEFTMARG - RIGHTMARG - 42 +
  442.       12 - LENGTH (HEADNAME)) DIV 2 DO
  443.       FILL := FILL + '-';
  444.                                        { 42 spaces and characters in heading }
  445.    FILL := FILL + ' ';
  446.  
  447.    WHILE NOT (EOF(LISTFILE) OR ABORT) DO
  448.    BEGIN
  449.       IF KEYPRESSED THEN ABORT := TRUE;
  450.       PAGEHEAD;
  451.       TEXTLINE := '';
  452.       READLN (LISTFILE,TEXTLINE);
  453.       IF COPY (TEXTLINE,1,1) = #12 THEN SKIPHEAD;    { filter form-feeds }
  454.       MARGIN (LEFTMARG);                             { left margin }
  455.       PRINTLINE;
  456.       LINENO    := LINENO + 1;
  457.    END; { WHILE }
  458.  
  459.    EXIT:;
  460.    IF (PAGENO > 1) OR (LINENO > 1) THEN WRITE (LST,#12);
  461.    IF ABORT THEN WRITELN (#7,'> List Aborted')
  462.    ELSE WRITELN ('> Last page= ',PAGENO,'   Last line= ',LINENO);
  463.    WRITELN ('> End <');
  464.    CLOSE (LISTFILE);
  465.  
  466. END. { FLIST }
  467.