readline3.c 1.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071
  1. /* include readline */
  2. #include "unp.h"
  3. #include "readline.h"
  4. static ssize_t
  5. my_read(Rline *rptr, char *ptr)
  6. {
  7. if (rptr->rl_cnt <= 0) {
  8. again:
  9. rptr->rl_cnt = read(rptr->read_fd, rptr->rl_buf, sizeof(rptr->rl_buf));
  10. if (rptr->rl_cnt < 0) {
  11. if (errno == EINTR)
  12. goto again;
  13. else
  14. return(-1);
  15. }
  16. else if (rptr->rl_cnt == 0)
  17. return(0);
  18. rptr->rl_bufptr = rptr->rl_buf;
  19. }
  20. rptr->rl_cnt--;
  21. *ptr = *rptr->rl_bufptr++ & 255;
  22. return(1);
  23. }
  24. void
  25. readline_rinit(int fd, void *ptr, size_t maxlen, Rline *rptr)
  26. {
  27. rptr->read_fd = fd; /* save caller's arguments */
  28. rptr->read_ptr = ptr;
  29. rptr->read_maxlen = maxlen;
  30. rptr->rl_cnt = 0; /* and init our counter & pointer */
  31. rptr->rl_bufptr = rptr->rl_buf;
  32. }
  33. ssize_t
  34. readline_r(Rline *rptr)
  35. {
  36. int n, rc;
  37. char c, *ptr;
  38. ptr = rptr->read_ptr;
  39. for (n = 1; n < rptr->read_maxlen; n++) {
  40. if ( (rc = my_read(rptr, &c)) == 1) {
  41. *ptr++ = c;
  42. if (c == '\n')
  43. break;
  44. } else if (rc == 0) {
  45. *ptr = 0;
  46. return(n - 1); /* EOF, n - 1 bytes were read */
  47. } else
  48. return(-1); /* error */
  49. }
  50. *ptr = 0;
  51. return(n);
  52. }
  53. /* end readline */
  54. ssize_t
  55. Readline(int fd, void *ptr, size_t maxlen)
  56. {
  57. ssize_t n;
  58. if ( (n = readline(fd, ptr, maxlen)) == -1)
  59. err_sys("readline error");
  60. return(n);
  61. }