convbio.c 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <ctype.h>
  5. #include "authcmdlib.h"
  6. void
  7. clrbio(Acctbio *a)
  8. {
  9. int i;
  10. if(a->user)
  11. free(a->user);
  12. if(a->name)
  13. free(a->name);
  14. if(a->dept)
  15. free(a->dept);
  16. for(i = 0; i < Nemail; i++)
  17. if(a->email[i])
  18. free(a->email[i]);
  19. memset(a, 0, sizeof(Acctbio));
  20. }
  21. int
  22. ordbio(Biobuf *b, Acctbio *a)
  23. {
  24. char *p, *cp, *next;
  25. int ne;
  26. clrbio(a);
  27. while(p = Brdline(b, '\n')){
  28. if(*p == '\n')
  29. continue;
  30. p[Blinelen(b)-1] = 0;
  31. /* get user */
  32. for(cp = p; *cp && *cp != ' ' && *cp != '\t'; cp++)
  33. ;
  34. a->user = malloc(cp - p + 1);
  35. strncpy(a->user, p, cp - p);
  36. a->user[cp - p] = 0;
  37. p = cp;
  38. /* get name */
  39. while(*p == ' ' || *p == '\t')
  40. p++;
  41. for(cp = p; *cp; cp++){
  42. if(isdigit(*cp) || *cp == '<'){
  43. while(cp > p && *(cp-1) != ' ' && *(cp-1) != '\t')
  44. cp--;
  45. break;
  46. }
  47. }
  48. next = cp;
  49. while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
  50. cp--;
  51. a->name = malloc(cp - p + 1);
  52. strncpy(a->name, p, cp - p);
  53. a->name[cp - p] = 0;
  54. p = next;
  55. /* get dept */
  56. for(cp = p; *cp; cp++){
  57. if(*cp == '<')
  58. break;
  59. }
  60. next = cp;
  61. while(cp > p && (*(cp-1) == ' ' || *(cp-1) == '\t'))
  62. cp--;
  63. a->dept = malloc(cp - p + 1);
  64. strncpy(a->dept, p, cp - p);
  65. a->dept[cp - p] = 0;
  66. p = next;
  67. /* get emails */
  68. ne = 0;
  69. for(cp = p; *cp && ne < Nemail;){
  70. if(*cp != '<'){
  71. cp++;
  72. continue;
  73. }
  74. p = ++cp;
  75. while(*cp && *cp != '>')
  76. cp++;
  77. if(cp == p)
  78. break;
  79. a->email[ne] = malloc(cp - p + 1);
  80. strncpy(a->email[ne], p, cp - p);
  81. a->email[ne][cp-p] = 0;
  82. ne++;
  83. }
  84. return 0;
  85. }
  86. return -1;
  87. }
  88. void
  89. nwrbio(Biobuf *b, Acctbio *a)
  90. {
  91. int i;
  92. if(a->postid == 0)
  93. a->postid = "";
  94. if(a->name == 0)
  95. a->name = "";
  96. if(a->dept == 0)
  97. a->dept = "";
  98. if(a->email[0] == 0)
  99. a->email[0] = strdup(a->user);
  100. Bprint(b, "%s|%s|%s|%s|%s", a->user, a->user, a->name, a->dept, a->email[0]);
  101. for(i = 1; i < Nemail; i++){
  102. if(a->email[i] == 0)
  103. break;
  104. Bprint(b, "|%s", a->email[i]);
  105. }
  106. Bprint(b, "\n");
  107. }
  108. void
  109. main(void)
  110. {
  111. Biobuf in, out;
  112. Acctbio a;
  113. Binit(&in, 0, OREAD);
  114. Binit(&out, 1, OWRITE);
  115. while(ordbio(&in, &a) == 0)
  116. nwrbio(&out, &a);
  117. Bterm(&in);
  118. Bterm(&out);
  119. }