readline2.c 938 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /* include readline */
  2. #include "unp.h"
  3. static ssize_t
  4. my_read(int fd, char *ptr)
  5. {
  6. static int read_cnt = 0;
  7. static char *read_ptr;
  8. static char read_buf[MAXLINE];
  9. if (read_cnt <= 0) {
  10. if ( (read_cnt = read(fd, read_buf, sizeof(read_buf))) < 0)
  11. err_sys("read error");
  12. else if (read_cnt == 0)
  13. return(0);
  14. read_ptr = read_buf;
  15. }
  16. read_cnt--;
  17. *ptr = *read_ptr++ & 255;
  18. return(1);
  19. }
  20. ssize_t
  21. readline(int fd, void *vptr, size_t maxlen)
  22. {
  23. int n, rc;
  24. char c, *ptr;
  25. ptr = vptr;
  26. for (n = 1; n < maxlen; n++) {
  27. if ( (rc = my_read(fd, &c)) == 1) {
  28. *ptr++ = c;
  29. if (c == '\n')
  30. break;
  31. } else if (rc == 0) {
  32. *ptr = 0;
  33. return(n - 1); /* EOF, n - 1 bytes were read */
  34. } else
  35. return(-1); /* error */
  36. }
  37. *ptr = 0;
  38. return(n);
  39. }
  40. /* end readline */
  41. ssize_t
  42. Readline(int fd, void *ptr, size_t maxlen)
  43. {
  44. ssize_t n;
  45. if ( (n = readline(fd, ptr, maxlen)) == -1)
  46. err_sys("readline error");
  47. return(n);
  48. }