home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / vol_100 / 158_01 / qe10 < prev    next >
Text File  |  1987-10-12  |  3KB  |  144 lines

  1. /*  VERSION 0001    (DATE: 28.III.85)  (TIME: 9:54 am)                  */
  2. /*
  3.     e (qe) screen editor
  4.  
  5.     (C) G. Nigel Gilbert, MICROLOGY, 1981
  6.  
  7.     August-December 1981
  8.     Modified: To QE from e (ver 4.6a) by J.W. Haefner -- Oct 84-Mar 85
  9.  
  10.     FILE: qe10
  11.  
  12.     FUNCTIONS: fopen,fcreat,fflush,fclose,putc,getc,funlink,
  13.             frename,dskcheck,err1,err2,err3,err4
  14.  
  15.     PURPOSE: file buffer operations extracted and stripped from stdlib1,
  16.         with protection from bdos error crashes added
  17.  
  18. */
  19.  
  20. #include "qe.h"
  21.  
  22. int fopen(filename,iobuf)
  23. struct iobuffer *iobuf;
  24. char *filename;
  25. {
  26.     if (dskcheck(setjmp(dskerr)) || (iobuf -> _fd = open(filename,0))<0) return FAIL;
  27.     iobuf -> _nleft = 0;
  28.     return iobuf -> _fd;
  29. }
  30.  
  31. int fcreat(name,iobuf)
  32. char *name;
  33. struct iobuffer *iobuf;
  34. {
  35.     if (dskcheck(setjmp(dskerr)) || (iobuf -> _fd = creat(name)) < 0 ) return FAIL;
  36.     iobuf -> _nextp = iobuf -> _buff;
  37.     iobuf -> _nleft = (NSECTS * SECSIZ);
  38.     return iobuf -> _fd;
  39. }
  40.  
  41. int fflush(iobuf)    /*does NOT allow more writing*/
  42. struct iobuffer *iobuf;
  43. {
  44.     int i;
  45.  
  46.     if (iobuf -> _nleft == (NSECTS * SECSIZ)) return YES;
  47.  
  48.     i = NSECTS - iobuf->_nleft / SECSIZ;
  49.     if (dskcheck(setjmp(dskerr)) || write(iobuf -> _fd, iobuf -> _buff, i) != i) return FAIL;
  50.     return YES;
  51. }
  52.  
  53. int fclose(iobuf)
  54. struct iobuffer *iobuf;
  55. {
  56.     if (dskcheck(setjmp(dskerr))) return FAIL;
  57.     return close(iobuf -> _fd);
  58. }
  59.  
  60. putc(c,iobuf)    /*stripped down version of standard putc*/
  61. char c;
  62. struct iobuffer *iobuf;
  63. {
  64.     if (iobuf -> _nleft--) return *iobuf -> _nextp++ = c;
  65.     if (dskcheck(setjmp(dskerr)) || (write(iobuf -> _fd, iobuf -> _buff, NSECTS)) != NSECTS) return FAIL;
  66.     iobuf -> _nleft = (NSECTS * SECSIZ -1);
  67.     iobuf -> _nextp = iobuf -> _buff;
  68.     return *iobuf -> _nextp++ = c;
  69. }
  70.  
  71. int getc(iobuf)    /*the standard getc, trimmed for speed*/
  72. struct iobuffer  *iobuf;
  73. {
  74.     int nsecs;
  75.  
  76.     if (iobuf -> _nleft--) return *iobuf -> _nextp++;
  77.     if (dskcheck(setjmp(dskerr)) || (nsecs = read(iobuf -> _fd, iobuf -> _buff, NSECTS)) <= 0)
  78.         return iobuf -> _nleft++;
  79.     iobuf -> _nleft = nsecs * SECSIZ - 1;
  80.     iobuf -> _nextp = iobuf -> _buff;
  81.     return *iobuf->_nextp++;
  82. }
  83.  
  84. funlink(name)
  85. char *name;
  86. {
  87.     if (dskcheck(setjmp(dskerr))) return FAIL;
  88.     return unlink(name);
  89. }
  90.  
  91. frename(oldname,newname)
  92. char *oldname,*newname;
  93. {
  94.     if (dskcheck(setjmp(dskerr))) return FAIL;
  95.     return rename(oldname,newname);
  96. }
  97.  
  98. dskcheck(errtype)
  99. int errtype;
  100. {
  101.     switch(errtype) {
  102.     case 0: 
  103.         return 0;
  104.     case 1: 
  105.         error("Bad sector"); 
  106.         break;
  107.     case 2: 
  108.         error("Bad disk select"); 
  109.         break;
  110.     case 3: 
  111.         error("Disk is read only"); 
  112.         break;
  113.     case 4: 
  114.         error("File is read only"); 
  115.         break;
  116.         }
  117.     bdos(RESETDSK);
  118.     bdos(SELDSK,curdsk);
  119.     return FAIL;
  120. }
  121.  
  122. err1()
  123. {
  124.     longjmp(dskerr,1);
  125. }
  126.  
  127. err2()
  128. {
  129.     longjmp(dskerr,2);
  130. }
  131.  
  132.  
  133. err3()
  134. {
  135.     longjmp(dskerr,3);
  136. }
  137.  
  138. err4()
  139. {
  140.     longjmp(dskerr,4);
  141. }
  142. me)) < 0 ) return FAIL;
  143.     iobuf -> _nextp = iobuf -> _buff;
  144.