readline_r.c 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. /* include readline */
  2. #include "unp.h"
  3. #include "readline_r.h"
  4. static ssize_t
  5. my_read_r(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_r(rptr, &c)) == 1) {
  41. *ptr++ = c;
  42. if (c == '\n')
  43. break;
  44. } else if (rc == 0) {
  45. if (n == 1)
  46. return(0); /* EOF, no data read */
  47. else
  48. break; /* EOF, some data was read */
  49. } else
  50. return(-1); /* error */
  51. }
  52. *ptr = 0;
  53. return(n);
  54. }
  55. /* end readline */
  56. ssize_t
  57. Readline_r(Rline *rptr)
  58. {
  59. ssize_t n;
  60. if ( (n = readline_r(rptr)) == -1)
  61. err_sys("readline_r error");
  62. return(n);
  63. }