readline1.lc 2.0 KB

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