home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / program / 177 / pascal / fastread.inc < prev    next >
Encoding:
Text File  |  1987-09-15  |  24.4 KB  |  670 lines

  1.  
  2.  
  3. {*************************************************************}
  4. {*               Eric's FASTREAD Routines                    *}
  5. {*                                                           *}
  6. {*   Written by:                                             *}
  7. {*      Eric W. Wedaa                                        *}
  8. {*      4620 East 17th Street                                *}
  9. {*      Tucson AZ, 85711                                     *}
  10. {*                                                           *}
  11. {*   Copyrighted 1987 by Eric W. Wedaa                       *}
  12. {*                                                           *}
  13. {*      BIX: EWEDAA                                          *}
  14. {*      CIS: 76515,2274                                      *}
  15. {*                                                           *}
  16. {*   Release Date: August 27, 1987.                          *}
  17. {*                                                           *}
  18. {*************************************************************}
  19. {*                                                           *}
  20. {*   Written for OSS Pascal Version 1.14                     *}
  21. {*               GEM/TOS in ROM Version 1.00                 *}
  22. {*                                                           *}
  23. {*       Released in the Public Domain!                      *}
  24. {*                                                           *}
  25. {*************************************************************}
  26. {*                                                           *}
  27. {*   Design Tools included:                                  *}
  28. {*        Eric's Pascal Utilities,                           *}
  29. {*        Eric's Pascal Editor,                              *}
  30. {*        1st Word ver 1.03, by GST,                         *}
  31. {*        Alt, By Michtron,                                  *}
  32. {*        OSS Pascal, By O.S.S. and C.C.D.                   *}
  33. {*   and, Eric's Library Disk for OSS Pascal.                *}
  34. {*                                                           *}
  35. {*************************************************************}
  36.  
  37.  
  38. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  39. {++    The following files are needed to use these routines ++}
  40. {++       --Fastread.inc                                    ++}
  41. {++       --Fastread.con                                    ++}
  42. {++       --Fastread.typ                                    ++}
  43. {++       --Fastread.doc                                    ++}
  44. {++       --Read.Me                                         ++}
  45. {+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++}
  46.  
  47. {Copyright 1987 by Eric W. Wedaa}
  48.  
  49. {Don't forget to include the FASTREAD constants and types.    }
  50.  
  51.  
  52. {1111111111111111111111111111111111111111111111111111111111111}
  53. {1111  Gemdos File Create Command.    111111111111111111111111}
  54. {1111111111111111111111111111111111111111111111111111111111111}
  55.  
  56. FUNCTION f_create (VAR
  57.      a_file_name : path_chars ; {  File name in "C" format.   }
  58.      mode : INTEGER) {             Mode to open the file.     }
  59. : INTEGER ; {                     Error Number.               }
  60.  
  61. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  62.  
  63. {    For this application, mode is always set to 0 for writing}
  64. { the file only.                                              }
  65.  
  66. GEMDOS ($3C) ;
  67.  
  68. {1111111111111111111111111111111111111111111111111111111111111}
  69. {1111  Gemdos File Open Command.    11111111111111111111111111}
  70. {1111111111111111111111111111111111111111111111111111111111111}
  71.  
  72. FUNCTION f_open (VAR
  73.      a_file_name : path_chars ; {  File name in "C" format.   }
  74.      mode : INTEGER) {             Mode to open the file.     }
  75. : INTEGER ; {                     Error Number.              }
  76.  
  77. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  78.  
  79. {    For this application, mode is always set to 0 for reading}
  80. { the file only.                                              }
  81.  
  82. GEMDOS ($3d) ;
  83.  
  84. {1111111111111111111111111111111111111111111111111111111111111}
  85. {1111   Gemdos File Close Command.    111111111111111111111111}
  86. {1111111111111111111111111111111111111111111111111111111111111}
  87.  
  88. FUNCTION file_close (HANDLE : INTEGER) {File handle.          }
  89. : INTEGER ; {                        Error Number.            }
  90.  
  91. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  92.  
  93. GEMDOS ($3e) ;
  94.  
  95. {1111111111111111111111111111111111111111111111111111111111111}
  96. {1111   Gemdos File Read Command.    1111111111111111111111111}
  97. {1111111111111111111111111111111111111111111111111111111111111}
  98.  
  99. FUNCTION f_read (HANDLE : INTEGER ; {File Handle.             }
  100.      count : LONG_INTEGER ; {        Bytes to be read in.     }
  101.      VAR
  102.         buf : contents) {            Where to store the file. }
  103.    : LONG_INTEGER ;
  104.  
  105. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  106.  
  107. GEMDOS ($3f) ;
  108.  
  109. {1111111111111111111111111111111111111111111111111111111111111}
  110. {1111   Gemdos File Write Command.     11111111111111111111111}
  111. {1111111111111111111111111111111111111111111111111111111111111}
  112.  
  113. FUNCTION fast_write (HANDLE : INTEGER ; {File Handle.            }
  114.      count : LONG_INTEGER ; {        Bytes to be read in.     }
  115.      VAR
  116.         buf : contents) {            Where to store the file. }
  117.    : LONG_INTEGER ;
  118.  
  119. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  120.  
  121. GEMDOS ($40) ;
  122.  
  123. {1111111111111111111111111111111111111111111111111111111111111}
  124. {1111   Loads the buffer after reset and readln.  111111111111}
  125. {1111111111111111111111111111111111111111111111111111111111111}
  126.  
  127. PROCEDURE f_read_file (VAR
  128.      txt_buffer : buffer) ;
  129.  
  130. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!   }
  131.  
  132.  BEGIN ;
  133.    txt_buffer.buffer_len :=  f_read (txt_buffer.file_handle, 
  134.         contents_size, txt_buffer.buffer_contents) ;
  135.    txt_buffer.buffer_contents[ contents_size + 1 ] :=  CHR (1) ;
  136.    IF txt_buffer.buffer_len >=  0 
  137.       THEN 
  138.        BEGIN ; { No error occured.}
  139.          txt_buffer.eof_buffer :=  FALSE ;
  140.          txt_buffer.buffer_pos :=  1 ;
  141.          txt_buffer.no_error :=  TRUE ;
  142.          IF txt_buffer.buffer_len = contents_size 
  143.             THEN txt_buffer.last_buffer :=  FALSE 
  144.             ELSE 
  145.                BEGIN ; { Less than full buffer was loaded. }
  146.                   txt_buffer.last_buffer :=  TRUE ;
  147.                   IF txt_buffer.buffer_len = 0 
  148.                      THEN txt_buffer.eof_buffer :=  TRUE ;
  149.                END ;
  150.        END{ Of No error occured.}
  151.  
  152.       ELSE 
  153.          BEGIN ; {error occured.}
  154.             txt_buffer.buffer_pos :=  1 ;
  155.             txt_buffer.error_number :=  INT (txt_buffer.buffer_len) ;
  156.             txt_buffer.no_error :=  FALSE ;
  157.             txt_buffer.buffer_len :=  0 ;
  158.             txt_buffer.last_buffer :=  TRUE ;
  159.             txt_buffer.eof_buffer :=  TRUE ;
  160.          END ; {of error occured.  }
  161.  END ; {of procedure f_read_file. }
  162.  
  163. {1111111111111111111111111111111111111111111111111111111111111}
  164. {1111  writes and sets up the file here.   1111111111111111111}
  165. {1111111111111111111111111111111111111111111111111111111111111}
  166.  
  167. PROCEDURE f_write_file (VAR
  168.      a_buffer : buffer) ;
  169. VAR
  170.    bytes_written : LONG_INTEGER ;
  171.  
  172.  BEGIN ;
  173.    WITH a_buffer DO
  174.       BEGIN ;
  175. bytes_written :=  fast_write (file_handle, buffer_len, buffer_contents) ;
  176.          IF bytes_written < 0 
  177.             THEN 
  178.              BEGIN ; {Error occured. }
  179.                no_error :=  FALSE ;
  180.                error_number :=  INT (bytes_written) ;
  181.                buffer_pos :=  1 ;
  182.                buffer_len :=  0 ;
  183.              END{Of error occurred. }
  184.             ELSE 
  185.                BEGIN ; {No error. }
  186.                   no_error :=  TRUE ;
  187.                   error_number :=  0 ;
  188.                   buffer_pos :=  1 ;
  189.                   buffer_len :=  0 ;
  190.                END ; {Of no error. }
  191.  
  192.  
  193.       END ; {Of with A_Buffer do Begin. }
  194.  END ; {Of procedure F_Write_File. }
  195.  
  196. {1111111111111111111111111111111111111111111111111111111111111}
  197. {1111  Close the file here.   11111111111111111111111111111111}
  198. {1111111111111111111111111111111111111111111111111111111111111}
  199.  
  200. PROCEDURE f_close (VAR
  201.      txt_buffer : buffer) ;
  202.  
  203. {     This routine is allowed to be called by the programmer. }
  204.  
  205.  BEGIN ;
  206.    WITH txt_buffer DO
  207.       BEGIN ;
  208.          IF reading_file 
  209.             THEN 
  210.              BEGIN ;
  211.                buffer_pos :=  1 ;
  212.                buffer_len :=  0 ;
  213.                last_buffer :=  TRUE ;
  214.                eof_buffer :=  TRUE ;
  215.                error_number :=  file_close (file_handle) ;
  216.                IF (error_number < 0) 
  217.                   THEN no_error :=  FALSE 
  218.                   ELSE no_error :=  TRUE ;
  219.              END
  220.  
  221.             ELSE 
  222.                BEGIN ; {We're writing to this file. }
  223. buffer_pos :=  fast_write (file_handle, buffer_len, buffer_contents) ;
  224.                   IF buffer_pos <>  buffer_len 
  225.                      THEN 
  226.                       BEGIN ; {Errror occured}
  227.                         error_number :=  file_close (file_handle) ;
  228.                         error_number :=  INT (buffer_pos) ;
  229.                         no_error :=  FALSE ;
  230.                       END
  231.  
  232.                      ELSE 
  233.                         BEGIN ;
  234.                            last_buffer :=  TRUE ;
  235.                            eof_buffer :=  TRUE ;
  236.                            error_number :=  file_close (file_handle) ;
  237.                            IF (error_number < 0) 
  238.                               THEN no_error :=  FALSE 
  239.                               ELSE no_error :=  TRUE ;
  240.                         END ;
  241.                END ;
  242.       END ; {of with txt_Buffer do. }
  243.  END ; {of procedure F_Close);}
  244.  
  245.  
  246. {1111111111111111111111111111111111111111111111111111111111111}
  247. {1111  Checks for the End Of File.  11111111111111111111111111}
  248. {1111111111111111111111111111111111111111111111111111111111111}
  249.  
  250. FUNCTION f_eof (VAR
  251.      txt_buffer : buffer) 
  252. : BOOLEAN ;
  253.  
  254. {Returns True if EOF has been reached/else returns false. }
  255.  
  256.  
  257. {     This routine is allowed to be called by the programmer  }
  258.  
  259.  BEGIN ;
  260.    IF txt_buffer.eof_buffer 
  261.       THEN f_eof :=  TRUE 
  262.       ELSE f_eof :=  FALSE ;
  263.  END ; {Of function F_EOF.}
  264.  
  265.  
  266. {1111111111111111111111111111111111111111111111111111111111111}
  267. {1111  Checks to see if an error has occured.   11111111111111}
  268. {1111111111111111111111111111111111111111111111111111111111111}
  269.  
  270. FUNCTION f_error (VAR
  271.      txt_buffer : buffer) 
  272. : BOOLEAN ;
  273.  
  274. {     This routine is allowed to be called by the programmer. }
  275. {    Returns True if error occured, else returns false.       }
  276.  
  277.  BEGIN ;
  278.    IF txt_buffer.no_error 
  279.       THEN f_error :=  FALSE 
  280.       ELSE f_error :=  TRUE ;
  281.  END ; {Of function F_Error.}
  282.  
  283.  
  284. {1111111111111111111111111111111111111111111111111111111111111}
  285. {1111  Returns the error number if an error has occurred.  111}
  286. {1111111111111111111111111111111111111111111111111111111111111}
  287.  
  288. FUNCTION f_io_result (VAR
  289.      txt_buffer : buffer) 
  290. : INTEGER ; { Error number returned here.                       }
  291.  
  292. {     This routine is allowed to be called by the programmer. }
  293.  
  294.  BEGIN ;
  295.    IF NOT txt_buffer.no_error 
  296.       THEN f_io_result :=  txt_buffer.error_number 
  297.       ELSE f_io_result :=  0 ;
  298.  END ; {Of function F_error_number.}
  299.  
  300.  
  301. {1111111111111111111111111111111111111111111111111111111111111}
  302. {11111  Converts A_File_Name to Fast Read format.  11111111111}
  303. {1111111111111111111111111111111111111111111111111111111111111}
  304.  
  305. PROCEDURE make_path (VAR
  306.      a_file_name : STRING ;
  307.      VAR
  308.         f_file_name : path_chars) ;
  309. VAR
  310.    x, len : INTEGER ;
  311.  BEGIN ;
  312.    len :=  LENGTH (a_file_name) ;
  313.    FOR x :=  1 TO len DO
  314.       f_file_name[ x ] :=  a_file_name[ x ] ;
  315.    f_file_name[ len + 1 ] :=  CHR (0) ;
  316.  END ;
  317.  
  318.  
  319. {1111111111111111111111111111111111111111111111111111111111111}
  320. {11111  Resets the file for reading.  111111111111111111111111}
  321. {1111111111111111111111111111111111111111111111111111111111111}
  322.  
  323. PROCEDURE f_reset (VAR
  324.      txt_buffer : buffer ;
  325.      a_file_name : STRING ) ; {file name to be opened.        }
  326.  
  327. {     This routine is allowed to be called by the programmer. }
  328.  
  329. VAR
  330. {    Used to convert file_name to C format.                   }
  331.    f_file_name : path_chars ;
  332.  
  333.  BEGIN ;
  334.  
  335. {  Convert to "C" format. }
  336.    make_path (a_file_name, f_file_name) ;
  337.  
  338. {Set constants.}
  339.    txt_buffer.fast_return :=  CHR (13) ;
  340.    txt_buffer.fast_line_feed :=  CHR (10) ;
  341.  
  342.  
  343. { Open it.}
  344.    txt_buffer.file_handle :=  f_open (f_file_name, 0) ; {file name, mode of}
  345. {read.}
  346.    IF txt_buffer.file_handle >=  0 
  347.       THEN 
  348.        BEGIN ;
  349.          f_read_file (txt_buffer) ; {load the buffer.}
  350.          txt_buffer.reading_file :=  TRUE ;
  351.        END
  352.  
  353.       ELSE 
  354.          BEGIN ; {error occured in opening it.}
  355.             WITH txt_buffer DO
  356.                BEGIN ;
  357.                   buffer_pos :=  1 ;
  358.                   buffer_len :=  0 ;
  359.                   last_buffer :=  TRUE ;
  360.                   eof_buffer :=  TRUE ;
  361.                   error_number :=  HANDLE ;
  362.                   no_error :=  FALSE 
  363.                END ; {of with txt_Buffer do. }
  364.          END ; {of error occured in opening it. }
  365.  END ; {of procedure F_Reset. }
  366.  
  367.  
  368. {1111111111111111111111111111111111111111111111111111111111111}
  369. {11111  Sets up the file for writing.  11111111111111111111111}
  370. {1111111111111111111111111111111111111111111111111111111111111}
  371.  
  372. PROCEDURE f_rewrite (VAR
  373.      txt_buffer : buffer ;
  374.      a_file_name : STRING ) ; {file name to be opened.        }
  375.  
  376. {     This routine is allowed to be called by the programmer. }
  377.  
  378. VAR
  379. {    Used to convert file_name to C format.                   }
  380.    f_file_name : path_chars ;
  381.  
  382.  BEGIN ;
  383.  
  384. {  Convert to "C" format. }
  385.    make_path (a_file_name, f_file_name) ;
  386.  
  387. {Set constants.}
  388.    txt_buffer.fast_return :=  CHR (13) ;
  389.    txt_buffer.fast_line_feed :=  CHR (10) ;
  390.  
  391.  
  392. { Open it.}
  393.    txt_buffer.file_handle :=  f_create (f_file_name, 0) ; {file name, mode of}
  394. {   if txt_buffer.file_Handle>=0}
  395. { then Txt_Buffer.File_Handle :=  F_Open (F_File_Name, 1) ;}{file name, mode of}
  396. {read.}
  397.    IF txt_buffer.file_handle >=  0 
  398.       THEN 
  399.        BEGIN ;
  400.          WITH txt_buffer DO
  401.             BEGIN ;
  402.                buffer_pos :=  1 ;
  403.                buffer_len :=  0 ;
  404.                last_buffer :=  FALSE ;
  405.                eof_buffer :=  FALSE ;
  406.                error_number :=  0 ;
  407.                no_error :=  TRUE ;
  408.                reading_file :=  FALSE ;
  409.             END ; {of with txt_Buffer do. }
  410.        END
  411.  
  412.       ELSE 
  413.          BEGIN ; {error occured in opening it.}
  414.             WITH txt_buffer DO
  415.                BEGIN ;
  416.                   buffer_pos :=  1 ;
  417.                   buffer_len :=  0 ;
  418.                   last_buffer :=  TRUE ;
  419.                   eof_buffer :=  TRUE ;
  420.                   error_number :=  HANDLE ;
  421.                   no_error :=  FALSE 
  422.                END ; {of with txt_Buffer do. }
  423.          END ; {of error occured in opening it. }
  424.  END ; {of procedure F_Rewrite. }
  425.  
  426. {1111111111111111111111111111111111111111111111111111111111111}
  427. {1111111111111111111111111111111111111111111111111111111111111}
  428. {1111111111111111111111111111111111111111111111111111111111111}
  429.  
  430. PROCEDURE f_readln (VAR
  431.      a_buffer : buffer ;
  432.      VAR
  433.         txt_line : max_string) ; {Text line returned.   }
  434.  
  435. {     This routine is allowed to be called by the programmer. }
  436.  
  437. VAR
  438.    counter : INTEGER ; {the length of the line returned. }
  439.  
  440. {2222222222222222222222222222222222222222222222222222222222222}
  441. {2222222222222222222222222222222222222222222222222222222222222}
  442. {2222222222222222222222222222222222222222222222222222222222222}
  443.  
  444.    PROCEDURE f_read_it ;
  445.  
  446. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  447.  
  448.     BEGIN ;
  449.       WITH a_buffer DO
  450.          BEGIN ;
  451.             IF (NOT eof_buffer) 
  452.                THEN 
  453.                 BEGIN ; {           Load the string.                }
  454.                   WHILE (buffer_contents[ INT (buffer_pos) ] <>  fast_return) 
  455.                   AND (counter < string_size) 
  456.                   AND (buffer_pos <=  buffer_len ) DO
  457.                      BEGIN ;
  458.                         counter :=  counter + 1 ;
  459. txt_line[ counter ] :=  buffer_contents[ INT (buffer_pos) ] ;
  460.                         buffer_pos :=  buffer_pos + 1 ;
  461.                      END ;
  462.  
  463.                   IF (buffer_pos <=  buffer_len) 
  464.                      AND (buffer_contents[ INT (buffer_pos) ] = fast_return ) 
  465.                      THEN 
  466.                       BEGIN ; {   Normal end of line hit.          }
  467.                         txt_line[ 0 ] :=  CHR (counter) ;
  468.                         buffer_pos :=  buffer_pos + 2 ;
  469.                         IF (buffer_pos > buffer_len) 
  470.                            AND (NOT last_buffer) 
  471.                            THEN 
  472.                             BEGIN ; {Load the buffer again. }
  473.                               f_read_file (a_buffer) ;
  474.                               IF buffer_contents [ 1 ] = fast_line_feed 
  475.                                  THEN buffer_pos :=  2 
  476.                                  ELSE buffer_pos :=  1 ;
  477.                             END ; {of load the buffer again.}
  478.                       END{of buffer_pos = chr(12). }
  479.  
  480. {                  Is the string full?                            }
  481.                      ELSE IF (counter >=  string_size) 
  482.                         THEN txt_line[ 0 ] :=  CHR (counter) 
  483.  
  484.                         ELSE IF (buffer_pos > buffer_len) 
  485.                            AND (NOT last_buffer) 
  486.                            THEN 
  487.                             BEGIN ; {Have to load and read again. }
  488. {                         Load it here. }
  489.                               f_read_file (a_buffer) ; {load the buffer.}
  490. {                         Finish reading the line here.}
  491.                               IF no_error 
  492.                                  THEN f_read_it 
  493.                                  ELSE txt_line[ 0 ] :=  CHR (counter) ;
  494.                             END{ of have to load it again.}
  495.  
  496. {         Did we hit the last char in the file?             }
  497.                            ELSE IF (buffer_pos >=  buffer_len) 
  498.                               AND ( last_buffer) 
  499.                               THEN 
  500.                                BEGIN ; {set length to counter and eof to true. }
  501.                                  txt_line[ 0 ] :=  CHR (counter) ;
  502.                                  eof_buffer :=  TRUE ;
  503.                                END ;
  504.                 END ; {of not eof buffer.}
  505.          END ; {of with buffer do begin. }
  506.     END ; {of f_Read_it. }
  507.  
  508. {------------------------------------------------------------------}
  509.  BEGIN ;
  510.    txt_line[ 0 ] :=  CHR (0) ;
  511.    counter :=  0 ;
  512.    f_read_it ;
  513.  END ; {of f_readln. }
  514.  
  515. {1111111111111111111111111111111111111111111111111111111111111}
  516. {1111111111111111111111111111111111111111111111111111111111111}
  517. {1111111111111111111111111111111111111111111111111111111111111}
  518.  
  519. PROCEDURE f_writeln (VAR
  520.      a_buffer : buffer ;
  521.      VAR
  522.         txt_line : max_string) ; {Text line returned.   }
  523.  
  524. {     This routine is allowed to be called by the programmer. }
  525.  
  526. VAR
  527.    string_size, {       The size of the string.          }
  528.    counter : INTEGER ; {the length of the line returned. }
  529.  
  530. {2222222222222222222222222222222222222222222222222222222222222}
  531. {2222222222222222222222222222222222222222222222222222222222222}
  532. {2222222222222222222222222222222222222222222222222222222222222}
  533.  
  534.    PROCEDURE f_write_it ;
  535.  
  536. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  537.  
  538.     BEGIN ;
  539.       WITH a_buffer DO
  540.          BEGIN ;
  541.             WHILE (counter < string_size) 
  542.             AND (buffer_pos <=  contents_size ) DO
  543.                BEGIN ;
  544.                   counter :=  counter + 1 ;
  545.                   buffer_contents[ INT (buffer_pos) ] :=  txt_line[ counter ] ;
  546.                   buffer_pos :=  buffer_pos + 1 ;
  547.                END ;
  548.  
  549.             buffer_len :=  buffer_pos - 1 ;
  550.  
  551.             IF (buffer_pos <=  contents_size - 1) 
  552.                THEN 
  553.                 BEGIN ; {   Normal end of line hit.          }
  554.                   buffer_contents[ INT (buffer_pos) ] :=  fast_return ;
  555.                   buffer_pos :=  buffer_pos + 1 ;
  556.                   buffer_contents[ INT (buffer_pos) ] :=  fast_line_feed ;
  557.                   buffer_pos :=  buffer_pos + 1 ;
  558.                   buffer_len :=  buffer_len + 2 ;
  559.                   IF (buffer_len = contents_size) 
  560.                      THEN f_write_file (a_buffer) ;
  561.                 END{of buffer_pos  <=  Contents_Size. }
  562.  
  563.                ELSE IF (buffer_pos > contents_size) 
  564.                   THEN 
  565.                    BEGIN ; {Have to write it and finsh the line. }
  566. {                         Write it here. }
  567.                      f_write_file (a_buffer) ; {load the buffer.}
  568. {                         Finish writing the line here.}
  569.                      IF no_error 
  570.                         THEN f_write_it ;
  571.                    END
  572.  
  573.                   ELSE 
  574.                      BEGIN ;
  575. {The end of the line occurs at the buffer boudary.}
  576.                         IF buffer_pos = contents_size 
  577.                            THEN 
  578.                             BEGIN ;
  579. buffer_contents[ INT (buffer_pos) ] :=  fast_return ;
  580.                               buffer_len :=  buffer_len + 1 ;
  581.                               f_write_file (a_buffer) ;
  582. buffer_contents[ INT (buffer_pos) ] :=  fast_line_feed ;
  583.                               buffer_pos :=  buffer_pos + 1 ;
  584.                               buffer_len :=  buffer_len + 1 ;
  585.                             END
  586.  
  587.                            ELSE 
  588.                               BEGIN ; {Buffer_Pos > Contents_Size. }
  589.                                  f_write_file (a_buffer) ;
  590. buffer_contents[ INT (buffer_pos) ] :=  fast_return ;
  591.                                  buffer_pos :=  buffer_pos + 1 ;
  592. buffer_contents[ INT (buffer_pos) ] :=  fast_line_feed ;
  593.                                  buffer_pos :=  buffer_pos + 1 ;
  594.                                  buffer_len :=  buffer_len + 2 ;
  595.                               END ;
  596.                      END ; {The end of the line occurs at the buffer boudary.}
  597.  
  598.          END ; {of with A_Buffer do begin. }
  599.     END ; {of F_Write_It. }
  600.  
  601. {------------------------------------------------------------------}
  602.  BEGIN ;
  603.    string_size :=  LENGTH (txt_line) ;
  604.    counter :=  0 ;
  605.    f_write_it ;
  606.  END ; {of F_Writeln. }
  607.  
  608.  
  609. {1111111111111111111111111111111111111111111111111111111111111}
  610. {1111111111111111111111111111111111111111111111111111111111111}
  611. {1111111111111111111111111111111111111111111111111111111111111}
  612.  
  613. PROCEDURE f_write (VAR
  614.      a_buffer : buffer ;
  615.      VAR
  616.         txt_line : max_string) ; {Text line returned.   }
  617.  
  618. {     This routine is allowed to be called by the programmer. }
  619.  
  620. VAR
  621.    string_size, {       The size of the string.          }
  622.    counter : INTEGER ; {the length of the line returned. }
  623.  
  624. {2222222222222222222222222222222222222222222222222222222222222}
  625. {2222222222222222222222222222222222222222222222222222222222222}
  626. {2222222222222222222222222222222222222222222222222222222222222}
  627.  
  628.    PROCEDURE f_write_2it ;
  629.  
  630. {     This routine is NOT TO BE CALLED BY THE PROGRAMMER!!!        }
  631.  
  632.     BEGIN ;
  633.       WITH a_buffer DO
  634.          BEGIN ;
  635.             WHILE (counter < string_size) 
  636.             AND (buffer_pos <=  contents_size ) DO
  637.                BEGIN ;
  638.                   counter :=  counter + 1 ;
  639.                   buffer_contents[ INT (buffer_pos) ] :=  txt_line[ counter ] ;
  640.                   buffer_pos :=  buffer_pos + 1 ;
  641.                END ;
  642.  
  643.             buffer_len :=  buffer_pos - 1 ;
  644.  
  645.             IF (buffer_pos <=  contents_size ) 
  646.                THEN 
  647.                 BEGIN ; {   Normal end of line hit.          }
  648. {                   Don't do anything.}
  649.                 END
  650.  
  651.                ELSE IF (buffer_pos > contents_size) 
  652.                   THEN 
  653.                    BEGIN ; {Have to write it and finsh the line. }
  654. {                         Write it here. }
  655.                      f_write_file (a_buffer) ; {load the buffer.}
  656. {                         Finish writing the line here.}
  657.                      IF no_error 
  658.                         THEN f_write_2it ;
  659.                    END ;
  660.  
  661.          END ; {of with A_Buffer do begin. }
  662.     END ; {of F_Write_It. }
  663.  
  664. {------------------------------------------------------------------}
  665.  BEGIN ;
  666.    string_size :=  LENGTH (txt_line) ;
  667.    counter :=  0 ;
  668.    f_write_2it ;
  669.  END ; {of F_Write. }
  670.