home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / LIBSRC.ZOO / libsrc / local / read.c < prev    next >
Text File  |  1992-03-24  |  2KB  |  102 lines

  1. #define INCL_DOSFILEMGR
  2. #define INCL_DOSERRORS
  3. #include <os2.h>
  4. #include <errno.h>
  5. #include <fcntl.h>
  6.  
  7. extern int __textio[20];
  8. extern char __textbuf[8096];
  9.  
  10. ULONG Dos32Read() asm ("Dos32Read");
  11.  
  12. int read (int fd, char *buf, int nbytes)
  13. {
  14.    ULONG rc;
  15.    ULONG BytesRead;
  16.  
  17.    if (__textio[fd] & O_BINARY)
  18.    {
  19.       rc = Dos32Read (fd, (void *)buf, nbytes, &BytesRead);
  20.  
  21.       if (rc && BytesRead == 0)
  22.       {
  23.          if (rc == ERROR_INVALID_HANDLE)
  24.          {
  25.             errno = EBADF;
  26.             return (-1);
  27.          }
  28.  
  29.          if (rc == ERROR_ACCESS_DENIED || rc == ERROR_LOCK_VIOLATION)
  30.          {
  31.             errno = EACCES;
  32.             return (-1);
  33.          }
  34.  
  35.          errno = EIO;
  36.          return (-1);
  37.       }
  38.  
  39.       return (BytesRead);
  40.    }
  41.    else
  42.    {
  43.       char *tbuf;
  44.       int bcount = nbytes;
  45.       register char c;
  46.       int leave_early = 0;
  47.  
  48.       while (bcount)
  49.       {
  50.          int thistime = bcount > 8096 ? 8096 : bcount;
  51.  
  52.          rc = Dos32Read (fd, (void *)__textbuf, thistime, &BytesRead);
  53.  
  54.          if (BytesRead == 0)
  55.             return (nbytes - bcount);
  56.  
  57.          if (rc)
  58.          {
  59.             if (rc == ERROR_INVALID_HANDLE)
  60.             {
  61.                errno = EBADF;
  62.                return (-1);
  63.             }
  64.  
  65.             if (rc == ERROR_ACCESS_DENIED || rc == ERROR_LOCK_VIOLATION)
  66.             {
  67.                errno = EACCES;
  68.                return (-1);
  69.             }
  70.  
  71.             errno = EIO;
  72.             return (-1);
  73.          }
  74.  
  75.          if (BytesRead < thistime) leave_early = 1;
  76.  
  77.          tbuf = (char *)__textbuf;
  78.  
  79.          for (thistime = BytesRead; 0 < thistime && 0 < bcount; --thistime)
  80.          {
  81.             c = *tbuf++;
  82.             if (c == 0x1a)
  83.                return (nbytes - bcount);
  84.  
  85.             if (c == '\r')
  86.             {
  87.             }
  88.             else
  89.             {
  90.                *buf++ = c;
  91.                --bcount;
  92.             }
  93.          }
  94.  
  95.          /* This is for device reads that don't have enough data ready */
  96.          if (leave_early) return (nbytes - bcount);
  97.       }
  98.       return (nbytes - bcount);
  99.    }
  100. }
  101.  
  102.