readline.lc 4.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. /* include readline1 */
  2. #include "unpthread.h"## 1 ##src/threads/readline.c##
  3. static pthread_key_t rl_key;## 2 ##src/threads/readline.c##
  4. static pthread_once_t rl_once = PTHREAD_ONCE_INIT;## 3 ##src/threads/readline.c##
  5. static void## 4 ##src/threads/readline.c##
  6. readline_destructor(void *ptr)## 5 ##src/threads/readline.c##
  7. {## 6 ##src/threads/readline.c##
  8. free(ptr);## 7 ##src/threads/readline.c##
  9. }## 8 ##src/threads/readline.c##
  10. static void## 9 ##src/threads/readline.c##
  11. readline_once(void)## 10 ##src/threads/readline.c##
  12. {## 11 ##src/threads/readline.c##
  13. Pthread_key_create(&rl_key, readline_destructor);## 12 ##src/threads/readline.c##
  14. }## 13 ##src/threads/readline.c##
  15. typedef struct {## 14 ##src/threads/readline.c##
  16. int rl_cnt; /* initialize to 0 */## 15 ##src/threads/readline.c##
  17. char *rl_bufptr; /* initialize to rl_buf */## 16 ##src/threads/readline.c##
  18. char rl_buf[MAXLINE];## 17 ##src/threads/readline.c##
  19. } Rline;## 18 ##src/threads/readline.c##
  20. /* end readline1 */
  21. /* include readline2 */
  22. static ssize_t## 19 ##src/threads/readline.c##
  23. my_read(Rline *tsd, int fd, char *ptr)## 20 ##src/threads/readline.c##
  24. {## 21 ##src/threads/readline.c##
  25. if (tsd->rl_cnt <= 0) {## 22 ##src/threads/readline.c##
  26. again:## 23 ##src/threads/readline.c##
  27. if ((tsd->rl_cnt = read(fd, tsd->rl_buf, MAXLINE)) < 0) {## 24 ##src/threads/readline.c##
  28. if (errno == EINTR)## 25 ##src/threads/readline.c##
  29. goto again;## 26 ##src/threads/readline.c##
  30. return (-1);## 27 ##src/threads/readline.c##
  31. } else if (tsd->rl_cnt == 0)## 28 ##src/threads/readline.c##
  32. return (0);## 29 ##src/threads/readline.c##
  33. tsd->rl_bufptr = tsd->rl_buf;## 30 ##src/threads/readline.c##
  34. }## 31 ##src/threads/readline.c##
  35. tsd->rl_cnt--;## 32 ##src/threads/readline.c##
  36. *ptr = *tsd->rl_bufptr++;## 33 ##src/threads/readline.c##
  37. return (1);## 34 ##src/threads/readline.c##
  38. }## 35 ##src/threads/readline.c##
  39. ssize_t## 36 ##src/threads/readline.c##
  40. readline(int fd, void *vptr, size_t maxlen)## 37 ##src/threads/readline.c##
  41. {## 38 ##src/threads/readline.c##
  42. int n, rc;## 39 ##src/threads/readline.c##
  43. char c, *ptr;## 40 ##src/threads/readline.c##
  44. Rline *tsd;## 41 ##src/threads/readline.c##
  45. Pthread_once(&rl_once, readline_once);## 42 ##src/threads/readline.c##
  46. if ((tsd = pthread_getspecific(rl_key)) == NULL) {## 43 ##src/threads/readline.c##
  47. tsd = Calloc(1, sizeof(Rline)); /* init to 0 */## 44 ##src/threads/readline.c##
  48. Pthread_setspecific(rl_key, tsd);## 45 ##src/threads/readline.c##
  49. }## 46 ##src/threads/readline.c##
  50. ptr = vptr;## 47 ##src/threads/readline.c##
  51. for (n = 1; n < maxlen; n++) {## 48 ##src/threads/readline.c##
  52. if ((rc = my_read(tsd, fd, &c)) == 1) {## 49 ##src/threads/readline.c##
  53. *ptr++ = c;## 50 ##src/threads/readline.c##
  54. if (c == '\n')## 51 ##src/threads/readline.c##
  55. break;## 52 ##src/threads/readline.c##
  56. } else if (rc == 0) {## 53 ##src/threads/readline.c##
  57. if (n == 1)## 54 ##src/threads/readline.c##
  58. return (0); /* EOF, no data read */## 55 ##src/threads/readline.c##
  59. else## 56 ##src/threads/readline.c##
  60. break; /* EOF, some data was read */## 57 ##src/threads/readline.c##
  61. } else## 58 ##src/threads/readline.c##
  62. return (-1); /* error, errno set by read() */## 59 ##src/threads/readline.c##
  63. }## 60 ##src/threads/readline.c##
  64. *ptr = 0;## 61 ##src/threads/readline.c##
  65. return (n);## 62 ##src/threads/readline.c##
  66. }## 63 ##src/threads/readline.c##
  67. /* end readline2 */
  68. ssize_t## 64 ##src/threads/readline.c##
  69. Readline(int fd, void *ptr, size_t maxlen)## 65 ##src/threads/readline.c##
  70. {## 66 ##src/threads/readline.c##
  71. ssize_t n;## 67 ##src/threads/readline.c##
  72. if ((n = readline(fd, ptr, maxlen)) < 0)## 68 ##src/threads/readline.c##
  73. err_sys("readline error");## 69 ##src/threads/readline.c##
  74. return (n);## 70 ##src/threads/readline.c##
  75. }## 71 ##src/threads/readline.c##