home *** CD-ROM | disk | FTP | other *** search
/ QBasic & Borland Pascal & C / Delphi5.iso / C / Samples / CSAPE32.ARJ / SOURCE / CSSRC / TEDFILE.C < prev    next >
C/C++ Source or Header  |  1990-12-06  |  2KB  |  112 lines

  1. /*
  2.     tedfile.c    
  3.  
  4.     % ted_ReadFile, ted_WriteFile
  5.  
  6.     file read and write for text editting
  7.  
  8.     C-scape 3.2
  9.     Copyright (c) 1988 by Oakland Group, Inc.
  10.     ALL RIGHTS RESERVED.
  11.  
  12.     Revision History:
  13.     ---------------------
  14.      2/07/89 jmd    added cast to omalloc call
  15.      3/24/89 jmd    added sed_ macros
  16.  
  17.      2/21/90 jmd    took credit for fixing ted_ReadFile return value
  18.      3/28/90 jmd    ansi-fied
  19.      7/25/90 jdc    fixed return for memory out situations
  20.     10/12/90 jdc    added error checks
  21.     10/30/90 jdc    added break in read loop on SetTB failure
  22.     12/06/90 jdc    fixed read from 0 len file bug
  23. */
  24.  
  25. #include "ted.h"
  26.  
  27. #define _TED_BUFSIZE    1000
  28.  
  29. long ted_ReadFile(sed_type sed, FILE *fp)
  30. /*
  31.     fills the sed's textbuffer from fp.
  32.     returns: number of characters read or -1L if error
  33. */
  34. {
  35.     unsigned int size;
  36.     char *buf;
  37.     boolean ok = TRUE;
  38.  
  39.     buf = (char *) omalloc(CSA_TEDREADF, _TED_BUFSIZE);
  40.  
  41.     sed_ClearTB(sed);
  42.     rewind(fp);
  43.  
  44.     while ((size = fread(buf, 1, _TED_BUFSIZE, fp)) != 0) { 
  45.  
  46.         if ((ok = sed_SetTB(sed, buf, size)) == FALSE) {
  47.              break;
  48.         }
  49.     }
  50.  
  51.     /* get rid of the extra '\n' */
  52.     if (ted_GetSize(sed) > 1L && (sed_GetTextbuf(sed))->len == 1) {
  53.         menu_DelRowTB(sed_GetMenu(sed), tb_GetRow(sed_GetTextbuf(sed)), 0);
  54.     }
  55.  
  56.     sed_RewindTB(sed);
  57.     ofree(CSA_TEDREADF, buf);
  58.  
  59.     return((ferror(fp) != 0 || !ok) ? -1L : ted_GetSize(sed));
  60. }
  61.  
  62. long ted_WriteFile(sed_type sed, FILE *fp, int mode)
  63. /*
  64.     writes the sed's textbuffer to fp
  65.     returns: number of characters written or -1L if error
  66. */
  67. {
  68.     unsigned int ref, llen;
  69.     long clen = 0L, cursor = 0L;
  70.     bbc_type bbc;
  71.     bbpeek_struct bp;
  72.     int row, col, dlen;
  73.  
  74.     ted_GetPosition(sed, &row, &col);
  75.  
  76.     ref = ted_GetRefresh(sed);
  77.     ted_SetRefresh(sed, TED_NOREFRESH);
  78.  
  79.     rewind(fp);
  80.     sed_RewindTB(sed);
  81.  
  82.     bbc = (sed_GetTextbuf(sed))->bbc;
  83.  
  84.     do {
  85.         llen = ted_GetLineLen(sed);
  86.         bp.b = bbc->b;
  87.         bp.off = bp.b->off;
  88.         bp.len = (long)llen;
  89.         do {
  90.             dlen = bbpeek(&bp);
  91.             fwrite(bp.p, 1, dlen, fp);
  92.             bp.off += dlen;
  93.             bp.len -= (long)dlen;
  94.             
  95.         } while (bp.len > 0L);
  96.  
  97.         if (mode == TED_HARD && !ted_IsHardLine(sed)) {
  98.             fwrite("\n", 1, 1, fp);
  99.             clen++;
  100.         }
  101.         clen += llen;
  102.         cursor += (long)llen;
  103.  
  104.     } while (ted_GotoCursor(sed, cursor));
  105.  
  106.     ted_GotoPosition(sed, row, col);
  107.  
  108.     ted_SetRefresh(sed, ref);
  109.  
  110.     return((ferror(fp) != 0) ? -1L : clen);
  111. }
  112.