readline1.c 771 B

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. /* include readline */
  2. #include "unp.h"
  3. /* PAINFULLY SLOW VERSION -- example only */
  4. ssize_t
  5. readline(int fd, void *vptr, size_t maxlen)
  6. {
  7. ssize_t n, rc;
  8. char c, *ptr;
  9. ptr = vptr;
  10. for (n = 1; n < maxlen; n++) {
  11. again:
  12. if ( (rc = read(fd, &c, 1)) == 1) {
  13. *ptr++ = c;
  14. if (c == '\n')
  15. break; /* newline is stored, like fgets() */
  16. } else if (rc == 0) {
  17. *ptr = 0;
  18. return(n - 1); /* EOF, n - 1 bytes were read */
  19. } else {
  20. if (errno == EINTR)
  21. goto again;
  22. return(-1); /* error, errno set by read() */
  23. }
  24. }
  25. *ptr = 0; /* null terminate like fgets() */
  26. return(n);
  27. }
  28. /* end readline */
  29. ssize_t
  30. Readline(int fd, void *ptr, size_t maxlen)
  31. {
  32. ssize_t n;
  33. if ( (n = readline(fd, ptr, maxlen)) < 0)
  34. err_sys("readline error");
  35. return(n);
  36. }