home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol133 / editfeed.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  4.7 KB  |  197 lines

  1. (*********************************************************
  2. *
  3. *        Donated by Ray Penley, June 1980
  4. *
  5. ********************************************************)
  6.  
  7.  
  8. {*  PROGRAM TITLE:    EDIT A LINEAR FILE
  9. **
  10. **  WRITTEN BY:         W.M. Yarnall
  11. **  DATE WRITTEN:       May 1980
  12. **
  13. **  WRITTEN FOR:    S100 Microsystems
  14. **            May/June 1980
  15. **
  16. **  SUMMARY:
  17. **        See the article in S100....
  18. **
  19. **  MODIFICATION RECORD:
  20. **    25 May 1980    -Modified for Pascal/Z by Raymond E. Penley
  21. **            -All files made local to Procedures.
  22. **             This insures that each file will be closed.
  23. **
  24. **    1 FEB 1983    -CHANGED STRING LENGTH FROM 6 TO 20 IN RINDEX
  25. **            AND CINDEX
  26. **    4 FEB 83    -BREAK INTO MODULES AND REWORK FOR SPECIAL
  27. **            PURPOSE FEEDLOT PROGRAM.  buddenberg
  28. **
  29. **        ---NOTE---
  30. **
  31. ** The first logical record in Pascal/Z is No. 1, NOT record
  32. ** No. 0 as in PASCAL/M or UCSD PASCAL. This can be rectified
  33. ** very eaisly by adding a 'bias' to every record number.
  34. **        PASCAL/Z    bias = 1
  35. **        PASCAL/M    bias = 0
  36. **
  37. *}
  38. PROGRAM EDLINEAR(0);
  39. CONST
  40.   default = 80;       (* Default length for strings *)
  41.   FID_LENGTH = 14; (* MAXIMUM ALLOWED LENGTH FOR A FILE NAME *)
  42.   bias   =  1;       (* see comments above *)
  43.  
  44. TYPE
  45.   FREC = RECORD
  46.        CASE tag:integer of
  47.         0:  (NAME :STRING 20; N1, N2 :integer);
  48.         1:  (HEADER :STRING 64);
  49.         2:  (RNAME :STRING 20; RINDEX :integer; RHS :real);
  50.         4:  (CNAME :STRING 20; CINDEX :integer; OBJ :real);
  51.         6:  (R,S :integer; T :real);
  52.        99:  () {--end of file--}
  53.      END;
  54.  
  55.   FID        = STRING FID_LENGTH;
  56.   LINEAR    = FILE OF FREC;
  57.   STR0        = STRING 0;
  58.   STRING80  = STRING default;
  59.   STR255    = STRING 255;
  60.  
  61. VAR
  62.   OFIL,        (*---File Identifiers <FID>---*)
  63.   NFIL    : FID;
  64.   OBUFFER,       {buffer for OLD file}
  65.   NBUFFER       {buffer for NEW file}
  66.     : FREC;
  67.   editing,       {The state of editing the file}
  68.   valid,       {An answer must be valid to be accepted}
  69.   valid_build,       {All aspects of a "build" have been completed}
  70.   XEOF           {End_Of_File flag for a NON TEXT file}
  71.     : boolean;
  72.   bell,           {console bell}
  73.   Command       {Command answer}
  74.     : char;
  75.  
  76. PROCEDURE KEYIN(VAR X: char); EXTERNAL;
  77. (* Direct keyboard entry of a single char *)
  78.  
  79.     (*----Required for Pascal/Z functions----*)
  80. FUNCTION  LENGTH( X :STR255) :INTEGER; EXTERNAL;
  81. PROCEDURE SETLENGTH(VAR X :STR0; Y :INTEGER); EXTERNAL;
  82.  
  83. Function INREC (j:INTEGER): integer; EXTERNAL;
  84.  
  85. Function INRE: integer; external;
  86.  
  87. Procedure PRINT( This_one: FREC; Rcd: INTEGER);
  88. begin
  89.   writeln;
  90.   writeln(' REC', Rcd:4, ' TAG:', This_one.tag:5);
  91.   With This_one do
  92.     CASE TAG of
  93.     0:    begin
  94.         writeln(' NAME: ', name);
  95.         writeln(' No ROWS: ', N1);
  96.         writeln(' No COLS: ', N2)
  97.           end;
  98.     1:    begin
  99.         writeln(' HEADING:');
  100.         writeln(header)
  101.           end;
  102.     2:    begin
  103.         writeln(' ROW: ', RNAME);
  104.         writeln(' INDEX: ', RINDEX);
  105.         writeln(' RHS: ', RHS)
  106.           end;
  107.     4:    begin
  108.         writeln(' COL: ', CNAME);
  109.         writeln(' INDEX: ', CINDEX);
  110.         Writeln(' OBJ: ', OBJ)
  111.           end;
  112.     6:    Writeln(' ABAR[', R:3, ',', S:3, ']: ', T);
  113.     99:    Writeln(' --- End of File ---')
  114.     End{of With/CASE};
  115.   writeln
  116. End{of PRINT};
  117.  
  118. PROCEDURE GETID( VAR ID: FID; Message: STRING80 );
  119. {-Pascal/Z does not like file names that are
  120.   not space filled to user specified length-}
  121. CONST    SPACE = ' ';
  122. begin
  123.   SETLENGTH(ID,0);
  124.   writeln;
  125.   write(message);
  126.   READLN(ID);
  127.   While Length(ID) < FID_length Do APPEND(ID,SPACE)
  128. end;
  129.  
  130. Procedure BUILD; EXTERNAL;
  131.  
  132. Procedure LIST;
  133. LABEL    2 {File not found};
  134. VAR    REC : integer;
  135.     fa  : LINEAR; (*---File descriptor <FCB>---*)
  136. begin
  137.   GETID(OFIL,' List what File? ');
  138.   WRITELN;
  139.   RESET(OFIL, fa);     (*---RESET( <FID> , <FCB> )---*)
  140.   If EOF(fa) then
  141.     begin
  142.     writeln(bell,'File ',OFIL,'not found');
  143.     {exit}goto 2
  144.     end;
  145.   WRITELN;
  146.   WRITE(' Starting at what record? ');
  147.   READLN(REC);
  148.   writeln;
  149.   READ(fa:REC+BIAS, OBUFFER);
  150.   XEOF := (OBUFFER.TAG=99);
  151.   WHILE NOT XEOF do
  152.     begin
  153.       write( REC:5, ': ' );
  154.       With OBUFFER do begin
  155.     Write(TAG:3,' ');
  156.     CASE TAG of
  157.       0:    Writeln(Name:8, N1:7, N2:7);
  158.       1:    Writeln(HEADER);
  159.       2:    Writeln(RNAME:22, RINDEX:7, RHS:14:8);
  160.       4:    Writeln(CNAME:22, CINDEX:7, OBJ:14:8);
  161.       6:    Writeln('ROW', R:3, ' COL', S:3, T:14:8)
  162.       End{of Case}
  163.     End{With};
  164.       REC := REC + 1;
  165.       READ(fa:REC+BIAS,OBUFFER);
  166.       XEOF := (OBUFFER.TAG=99);
  167.     end{while};
  168. 2:    {file not found}
  169. End{of LIST};{ CLOSE(fa) }
  170.  
  171. Procedure MODIFY; external;
  172.  
  173. BEGIN (*---Main Program---*)
  174.   BELL := CHR(7);
  175.   editing := true;
  176.  
  177.   WHILE editing do
  178.     begin{ EDIT session }
  179.       REPEAT
  180.     valid := true;
  181.     writeln;
  182.     write(' EDIT: L(ist, B(uild, M(odify, Q(uit ');
  183.     KEYIN(Command);WRITELN(Command);
  184.         CASE Command of
  185.       'L','l':    LIST;
  186.       'B','b':    BUILD;
  187.       'M','m':    MODIFY;
  188.       'Q','q':    editing := false
  189.       ELSE:        begin
  190.              write(BELL);
  191.              valid := false
  192.              end
  193.         End{case}
  194.     UNTIL valid{command}
  195.     end{ EDIT session }
  196. End{---of Edit Linear---}.
  197.