home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol133 / editfile.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  8.2 KB  |  354 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. **
  27. **        ---NOTE---
  28. **
  29. ** The first logical record in Pascal/Z is No. 1, NOT record
  30. ** No. 0 as in PASCAL/M or UCSD PASCAL. This can be rectified
  31. ** very eaisly by adding a 'bias' to every record number.
  32. **        PASCAL/Z    bias = 1
  33. **        PASCAL/M    bias = 0
  34. **
  35. *}
  36. PROGRAM EDLINEAR;
  37. CONST
  38.   default = 80;       (* Default length for strings *)
  39.   FID_LENGTH = 14; (* MAXIMUM ALLOWED LENGTH FOR A FILE NAME *)
  40.   bias   =  1;       (* see comments above *)
  41.  
  42. TYPE
  43.   FREC = RECORD
  44.        CASE tag:integer of
  45.         0:  (NAME :STRING 20; N1, N2 :integer);
  46.         1:  (HEADER :STRING 64);
  47.         2:  (RNAME :STRING 20; RINDEX :integer; RHS :real);
  48.         4:  (CNAME :STRING 20; CINDEX :integer; OBJ :real);
  49.         6:  (R,S :integer; T :real);
  50.        99:  () {--end of file--}
  51.      END;
  52.  
  53.   FID        = STRING FID_LENGTH;
  54.   LINEAR    = FILE OF FREC;
  55.   STR0        = STRING 0;
  56.   STRING80  = STRING default;
  57.   STR255    = STRING 255;
  58.  
  59. VAR
  60.   OFIL,        (*---File Identifiers <FID>---*)
  61.   NFIL    : FID;
  62.   OBUFFER,       {buffer for OLD file}
  63.   NBUFFER       {buffer for NEW file}
  64.     : FREC;
  65.   editing,       {The state of editing the file}
  66.   valid,       {An answer must be valid to be accepted}
  67.   valid_build,       {All aspects of a "build" have been completed}
  68.   XEOF           {End_Of_File flag for a NON TEXT file}
  69.     : boolean;
  70.   bell,           {console bell}
  71.   Command       {Command answer}
  72.     : char;
  73.  
  74. PROCEDURE KEYIN(VAR X: char); EXTERNAL;
  75. (* Direct keyboard entry of a single char *)
  76.  
  77.     (*----Required for Pascal/Z functions----*)
  78. FUNCTION  LENGTH( X :STR255) :INTEGER; EXTERNAL;
  79. PROCEDURE SETLENGTH(VAR X :STR0; Y :INTEGER); EXTERNAL;
  80.  
  81. Function INREC : integer;
  82. {
  83. GLOBAL
  84.     valid_build : boolean }
  85. LABEL    10;
  86. VAR    Alfa : STRING 20;
  87.     j :integer;
  88.     valid : boolean;
  89. begin
  90.   Write(' Enter TAG .......... ');
  91.   REPEAT
  92.     READLN(j);
  93.     valid := false;
  94.     IF j>99 then
  95.       begin
  96.     j := 200;
  97.     {exit} goto 10
  98.       end;
  99.     If  (j=0) or (j=1) or (j=2) or
  100.     (j=4) or (j=6) or (j=99) then
  101.       begin{If valid}
  102.         valid := true;
  103.     NBUFFER.tag := j ;
  104.     WITH NBUFFER DO
  105.       CASE TAG OF
  106.       0:    begin
  107.         SETLENGTH(NAME,0);
  108.         write(' Program Name........ ');
  109.         READLN(ALFA);
  110.         If Length(ALFA)>20 then SETLENGTH(ALFA,20);
  111.         APPEND(NAME,ALFA);
  112.         write(' No. ROWS............ ');
  113.         READLN(N1);
  114.         write(' No. Columns......... ');
  115.         READLN(N2)
  116.         end;
  117.       1:    begin
  118.         write(' Header.............. ');
  119.         READLN(header)
  120.         end;
  121.       2:    begin
  122.         write(' ROW Name............ ');
  123.         READLN(RNAME);
  124.         write(' ROW No. ............ ');
  125.         READLN(RINDEX);
  126.         write(' RHS ................ ');
  127.         READLN(RHS)
  128.         end;
  129.       4:    begin
  130.         write(' Column Name ........ ');
  131.         READLN(CNAME);
  132.         write(' Column No. ......... ');
  133.         READLN(CINDEX);
  134.         write(' OBJ ................ ');
  135.         READLN(OBJ)
  136.         end;
  137.       6:    begin
  138.         write(' ROW NO. ............ ');
  139.         READLN(R);
  140.         write(' Column No. ......... ');
  141.         READLN(S);
  142.         write(' ABAR[R,S] .......... ');
  143.         READLN(T)
  144.         end;
  145.       99:   valid_build := true
  146.       End{With/CASE}
  147.       end{If valid}
  148.     Else
  149.       Write('INVALID TAG, Reenter ---> ')
  150.   UNTIL valid{TAG};
  151. 10: INREC := j
  152. End{of INREC};
  153.  
  154. Procedure PRINT( This_one: FREC; Rcd: INTEGER);
  155. begin
  156.   writeln;
  157.   writeln(' REC', Rcd:4, ' TAG:', This_one.tag:5);
  158.   With This_one do
  159.     CASE TAG of
  160.     0:    begin
  161.         writeln(' NAME: ', name);
  162.         writeln(' No ROWS: ', N1);
  163.         writeln(' No COLS: ', N2)
  164.           end;
  165.     1:    begin
  166.         writeln(' HEADING:');
  167.         writeln(header)
  168.           end;
  169.     2:    begin
  170.         writeln(' ROW: ', RNAME);
  171.         writeln(' INDEX: ', RINDEX);
  172.         writeln(' RHS: ', RHS)
  173.           end;
  174.     4:    begin
  175.         writeln(' COL: ', CNAME);
  176.         writeln(' INDEX: ', CINDEX);
  177.         Writeln(' OBJ: ', OBJ)
  178.           end;
  179.     6:    Writeln(' ABAR[', R:3, ',', S:3, ']: ', T);
  180.     99:    Writeln(' --- End of File ---')
  181.     End{of With/CASE};
  182.   writeln
  183. End{of PRINT};
  184.  
  185. PROCEDURE GETID( VAR ID: FID; Message: STRING80 );
  186. {-Pascal/Z does not like file names that are
  187.   not space filled to user specified length-}
  188. CONST    SPACE = ' ';
  189. begin
  190.   SETLENGTH(ID,0);
  191.   writeln;
  192.   write(message);
  193.   READLN(ID);
  194.   While Length(ID) < FID_length Do APPEND(ID,SPACE)
  195. end;
  196.  
  197. Procedure BUILD;
  198. VAR    FX : LINEAR;
  199.      N : INTEGER;
  200. begin
  201.   GETID(NFIL,' Build what File? ');
  202.   REWRITE(NFIL, FX);      (*---REWRITE( <FID> , <FCB> )---*)
  203.   valid_build := false;
  204.   N := 0;
  205.   While (N < 100) DO
  206.     begin
  207.     N := INREC;
  208.     If (N<100) then
  209.        Write(FX, NBUFFER);
  210.     If (N=99) AND valid_build then{finished}
  211.       N:=200
  212.     Else
  213.       If (N>99) AND (not valid_build) then
  214.         begin
  215.         writeln('You MUST enter a TAG record of 99');
  216.         N := 0
  217.         end
  218.     end{while}
  219. End{of build};{ CLOSE(FX) }
  220.  
  221. Procedure LIST;
  222. LABEL    2 {File not found};
  223. VAR    REC : integer;
  224.     fa  : LINEAR; (*---File descriptor <FCB>---*)
  225. begin
  226.   GETID(OFIL,' List what File? ');
  227.   WRITELN;
  228.   RESET(OFIL, fa);     (*---RESET( <FID> , <FCB> )---*)
  229.   If EOF(fa) then
  230.     begin
  231.     writeln(bell,'File ',OFIL,'not found');
  232.     {exit}goto 2
  233.     end;
  234.   WRITELN;
  235.   WRITE(' Starting at what record? ');
  236.   READLN(REC);
  237.   writeln;
  238.   READ(fa:REC+BIAS, OBUFFER);
  239.   XEOF := (OBUFFER.TAG=99);
  240.   WHILE NOT XEOF do
  241.     begin
  242.       write( REC:5, ': ' );
  243.       With OBUFFER do begin
  244.     Write(TAG:3,' ');
  245.     CASE TAG of
  246.       0:    Writeln(Name:8, N1:7, N2:7);
  247.       1:    Writeln(HEADER);
  248.       2:    Writeln(RNAME:22, RINDEX:7, RHS:14:8);
  249.       4:    Writeln(CNAME:22, CINDEX:7, OBJ:14:8);
  250.       6:    Writeln('ROW', R:3, ' COL', S:3, T:14:8)
  251.       End{of Case}
  252.     End{With};
  253.       REC := REC + 1;
  254.       READ(fa:REC+BIAS,OBUFFER);
  255.       XEOF := (OBUFFER.TAG=99);
  256.     end{while};
  257. 2:    {file not found}
  258. End{of LIST};{ CLOSE(fa) }
  259.  
  260. Procedure MODIFY;
  261. LABEL    3 {File not found};
  262. VAR    OLDF,        (*---File descriptors <FCB>---*)
  263.     NEWF    : LINEAR;
  264.     REC, j : integer;
  265.     ans : char;
  266. begin
  267.   GETID(OFIL,' Modify what File? ');
  268.   RESET(OFIL, OLDF);     (*---RESET( <FID> , <FCB> )---*)
  269.   If EOF(OLDF) then
  270.     begin
  271.     writeln(bell,'File ',OFIL,'not found');
  272.     {exit}goto 3
  273.     end;
  274.   GETID(NFIL,' Name of New File? ');
  275.   {--------------------------------------------------------
  276.     WITH PASCAL/Z, THE ACT OF OPENING A NEW FILE
  277.     USING THE SAME <FCB> CLOSES THE PREVIOUS FILE
  278.     BEFORE OPENING THE NEW FILE.
  279.    --------------------------------------------------------}
  280.   REWRITE(NFIL,NEWF);     (*---REWRITE( <FID> , <FCB> )---*)
  281.   Write(' Starting at which Record? ');
  282.   READLN(J);
  283.   If J>0 then begin
  284.     {Copy previous records from the old file
  285.      starting at the first record up to but not
  286.      including the requested record.}
  287.       REC := 0;
  288.       REPEAT
  289.     READ(OLDF:REC+BIAS,OBUFFER); XEOF := (OBUFFER.TAG=99);
  290.     WRITE(NEWF, OBUFFER);
  291.     REC := REC + 1;
  292.       UNTIL XEOF OR (REC = J);
  293.     END;
  294.   REC := J;
  295.   READ(OLDF:REC+BIAS,OBUFFER);
  296.   XEOF := (OBUFFER.TAG=99);
  297.   While not XEOF do
  298.     begin
  299.     PRINT(OBUFFER,REC);
  300.     writeln(' Process this Record?');
  301.     REPEAT
  302.       valid := true;
  303.       write(' K(eep, C(hange, I(nsert, D(elete   >');
  304.       KEYIN(ANS);WRITELN(ANS);
  305.       CASE ans of
  306.     'K','k': begin
  307.          write(NEWF,OBUFFER);
  308.          REC := REC + 1
  309.          end;
  310.     'C','c': begin
  311.          If INREC<100 then write(NEWF, NBUFFER);
  312.          REC := REC + 1
  313.          end;
  314.     'D','d': REC := REC + 1;
  315.     'I','i': If INREC<100 then write(NEWF,NBUFFER);
  316.     ELSE:    begin
  317.          write(BELL);
  318.          valid := false
  319.          end
  320.       End{case};
  321.     UNTIL VALID{ANSWER};
  322.     READ(OLDF:REC+BIAS,OBUFFER);
  323.     XEOF := (OBUFFER.TAG=99);
  324.     End{while not XEOF};
  325. {---Write the End_Of_File record to the New file---}
  326.   Write(NEWF,OBUFFER);
  327. 3:    {file not found}
  328. End{of MODIFY};{CLOSE(OLDF);CLOSE(NEWF)}
  329.  
  330. BEGIN (*---Main Program---*)
  331.   BELL := CHR(7);
  332.   editing := true;
  333.  
  334.   WHILE editing do
  335.     begin{ EDIT session }
  336.       REPEAT
  337.     valid := true;
  338.     writeln;
  339.     write(' EDIT: L(ist, B(uild, M(odify, Q(uit ');
  340.     KEYIN(Command);WRITELN(Command);
  341.         CASE Command of
  342.       'L','l':    LIST;
  343.       'B','b':    BUILD;
  344.       'M','m':    MODIFY;
  345.       'Q','q':    editing := false
  346.       ELSE:        begin
  347.              write(BELL);
  348.              valid := false
  349.              end
  350.         End{case}
  351.     UNTIL valid{command}
  352.     end{ EDIT session }
  353. End{---of Edit Linear---}.
  354.