home *** CD-ROM | disk | FTP | other *** search
/ Club Amiga de Montreal - CAM / CAM_CD_1.iso / files / 387b.lha / dice_v2.02 / lib / stdio / fgets.c < prev    next >
Encoding:
C/C++ Source or Header  |  1990-05-30  |  970 b   |  57 lines

  1.  
  2. /*
  3.  *  FGETS.C
  4.  *
  5.  *  (c)Copyright 1990, Matthew Dillon, All Rights Reserved
  6.  *
  7.  *  buf = fgets(buf, siz, fi)
  8.  */
  9.  
  10. #include <stdio.h>
  11.  
  12. char *
  13. fgets(buf, siz, fi)
  14. char *buf;
  15. int siz;
  16. FILE *fi;
  17. {
  18.     --siz;
  19.  
  20.     /*
  21.      *    do a quick-scan of already-buffered chars to boost efficiency.
  22.      *    Only handles best case.  Note that if RLeft is > 0 then __SIF_READ
  23.      *    must be set so we don't bother to check.
  24.      */
  25.  
  26.     if (fi && fi->sd_UC < 0 && fi->sd_RLeft > 0) {
  27.     char *ptr = fi->sd_RPtr;
  28.     int i = 0;
  29.  
  30.     for (i = 0; i < fi->sd_RLeft && i < siz && *ptr != '\n'; ++i)
  31.         buf[i] = *ptr++;
  32.     if (*ptr == '\n' && i < siz && i < fi->sd_RLeft) {
  33.         buf[i++] = *ptr;
  34.         fi->sd_RLeft -= i;
  35.         fi->sd_RPtr += i;
  36.         buf[i++] = 0;
  37.         return(buf);
  38.     }
  39.     }
  40.     if (fi) {
  41.     int cnt = 0;
  42.     int c;
  43.  
  44.     while ((c = getc(fi)) != EOF) {
  45.         *buf++ = c;
  46.         if (c != '\n' && cnt < siz) {
  47.         ++cnt;
  48.         continue;
  49.         }
  50.         *buf = 0;
  51.         return(buf);
  52.     }
  53.     }
  54.     return(NULL);
  55. }
  56.  
  57.