home *** CD-ROM | disk | FTP | other *** search
/ ftp.barnyard.co.uk / 2015.02.ftp.barnyard.co.uk.tar / ftp.barnyard.co.uk / cpm / walnut-creek-CDROM / ENTERPRS / CPM / UTILS / S / SMC21LIB.LZH / FGETS.C < prev    next >
Text File  |  2000-06-30  |  2KB  |  62 lines

  1.  
  2. #define NOCCARGC
  3. #include stdio.h
  4. #include clib.def
  5. /*
  6. ** Gets an entire string (including its newline
  7. ** terminator) or size-1 characters, whichever comes
  8. ** first.  The input is terminated by a null character.
  9. ** Entry: str = Pointer to the destination buffer.
  10. **        size = Size of the destination buffer.
  11. **        fd = File descriptor of pertinent file.
  12. ** Returns str on success, else NULL.
  13. */
  14. fgets(str, size, fd) char *str; int size, fd; {
  15.   return (_gets(str, size, fd, 1));
  16.   }
  17.  
  18. /*
  19. ** Gets an entire string fron stdin (excluding its newline
  20. ** terminator) or size - 1 characters, whichever comes 
  21. ** first.  The input is terminated by a null character.
  22. ** The user buffer must be large enough to hold the data.
  23. ** Entry: str = Pointer to destination buffer.
  24. ** Returns str on success, else NULL.
  25. */
  26. gets(str) char *str; {
  27.   return (_gets(str, 32767, stdin, 0));
  28.   }
  29.  
  30. _gets(str, size, fd, nl) char *str; int size, fd, nl; {
  31.   int backup;
  32.   char *next;
  33.   next = str;
  34.   while(--size > 0) {
  35.     switch (*next = fgetc(fd)) {
  36.       case EOF:   *next = NULL;
  37.                   if (next == str) return (NULL);
  38.                   return (str);
  39.       case '\n':  *(next + nl) = NULL;
  40.                   return (str);
  41.       case RUB:   if(next > str) backup = 1; else backup = 0;
  42.                   goto backout;
  43.       case WIPE:  backup = next - str;
  44.         backout:
  45.                   if(iscons(fd)) {
  46.                     fputs("\b \b\b \b", stderr);
  47.                     ++size;
  48.                     while(backup--) {
  49.                       fputs("\b \b", stderr);
  50.                       if(*--next < 32) fputs("\b \b", stderr);
  51.                       ++size;
  52.                       }
  53.                     continue:
  54.                     }
  55.         default: ++next;
  56.       }
  57.     }
  58.   *next = NULL;
  59.   return (str);
  60.   }
  61.  
  62.