home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / mbug / mbug120.arc / PASCAL.LBR / APPEND.PZS / APPEND.PAS
Pascal/Delphi Source File  |  1979-12-31  |  3KB  |  74 lines

  1. {----------------------------------------------------------------------------}
  2. {APPEND.PAS    Append to textfiles in TURBO PASCAL     1985 October 25}
  3. {Utility routines for inclusion in applications programs, see APPEND.DOC}
  4.  
  5. type
  6.    fcbtyp=record           {CPM-80 v2.2 see pp 188,194 Zaks CPM Handbook}
  7.              drivecode:byte;
  8.              nameroot:array[1..8] of char;
  9.              nameext:array[1..3] of char;
  10.              extent:byte;
  11.              spare:integer;
  12.              reccount:byte;
  13.              diskmap:set of 0..127;
  14.              nextrec:byte;
  15.              randomrec:integer;
  16.           end;
  17.    fibtyp=record           {Z-80 TURBO see p 159 Turbo v2.0 manual}
  18.              flags,filekind,chbuf,bufpointer:byte;
  19.              numrecords,reclength,currentrec,spare:integer;
  20.              fcb:fcbtyp;
  21.              crap:byte;         {mystery!...required for alignment of buffer}
  22.              buffer:array[0..127] of byte; {could call this a string instead}
  23.           end;
  24.  
  25. var
  26.    infile:text;
  27.    fib:fibtyp absolute infile;
  28.    line:string[80];
  29.    j:byte;
  30.    fcbaddr,filesize:integer;
  31.  
  32. const                 
  33.    close=16;    {BDOS call arguments}
  34.    open=15;
  35.    {Flag bit values for TURBO File Interface Block see eg. v2.0 Manual p160 }
  36.    rena=1;    {read enable}
  37.    wena=2;    {write enable}
  38.    wflg=4;    {write semaphore..data available for writing buffer to disk}
  39.    rflg=8;    {read semaphore..buffer space available for reading  from disk}
  40. {----------------------------------------------------------------------------}
  41. procedure appendtext(var textfile:text); {sets up textfile for write access}
  42. var
  43.    fib:fibtyp absolute textfile;{textfile originally opened by RESET for read}
  44.    ch:char;
  45. begin
  46.  with fib do
  47.   begin
  48.    fcb.nextrec:=fcb.reccount-1;            {go direct to last record of file}
  49.    bufpointer:=0;                   {commence eof search at bottom of buffer}
  50.    repeat readln(textfile,ch); until eof(textfile);   {search buffer for eof}
  51.    bufpointer:=bufpointer-1;                        {step back over eof mark}
  52.    flags:=(flags or wena+wflg) and not(rena+rflg);      {set flags for write}
  53.    fcb.nextrec:=fcb.reccount-1;                    {set to reuse last record}
  54.   end; {with fib}
  55. end;  {appendtext}
  56.  
  57. procedure flushtext(var textfile:text);
  58.    {Fixes written text onto disk..TURBO's flush( ) doesnt work on text files}
  59. var
  60.    j,fcbaddr:integer;
  61.    fib:fibtyp absolute textfile;
  62. begin
  63.  with fib do
  64.   begin
  65. (*   for j:=bufpointer to 127  do write(textfile,' ');
  66.    writeln(textfile);      {new line for next entry}
  67. *)
  68.    fcbaddr:=addr(fcb);{bdos() doesnt seem to like addr() function as argument}
  69.    bdos(close,fcbaddr);                     {transfers buffer and fcb to disk}
  70.    flags:=(flags or wena+wflg) and not(rena+rflg);     {reset flags for write}
  71.   end;  {with fib}
  72. end;  {flushtext}
  73. {----------------------------------------------------------------------------}
  74.