uniq.c 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. typedef struct Who Who;
  5. struct Who
  6. {
  7. Who *next;
  8. char *line;
  9. char *name;
  10. };
  11. int cmp(void *arg1, void *arg2)
  12. {
  13. Who **a = arg1, **b = arg2;
  14. return strcmp((*a)->name, (*b)->name);
  15. }
  16. void
  17. main(int argc, char **argv)
  18. {
  19. int changed, i, n;
  20. Biobuf *b;
  21. char *p, *name;
  22. Who *first, *last, *w, *nw, **l;
  23. if(argc != 2){
  24. fprint(2, "usage: auth/uniq file\n");
  25. exits(0);
  26. }
  27. last = first = 0;
  28. b = Bopen(argv[1], OREAD);
  29. if(b == 0)
  30. exits(0);
  31. n = 0;
  32. changed = 0;
  33. while(p = Brdline(b, '\n')){
  34. p[Blinelen(b)-1] = 0;
  35. name = p;
  36. while(*p && *p != '|')
  37. p++;
  38. if(*p)
  39. *p++ = 0;
  40. for(nw = first; nw; nw = nw->next){
  41. if(strcmp(nw->name, name) == 0){
  42. free(nw->line);
  43. nw->line = strdup(p);
  44. changed = 1;
  45. break;
  46. }
  47. }
  48. if(nw)
  49. continue;
  50. w = malloc(sizeof(Who));
  51. if(w == 0){
  52. fprint(2, "auth/uniq: out of memory\n");
  53. exits(0);
  54. }
  55. memset(w, 0, sizeof(Who));
  56. w->name = strdup(name);
  57. w->line = strdup(p);
  58. if(first == 0)
  59. first = w;
  60. else
  61. last->next = w;
  62. last = w;
  63. n++;
  64. }
  65. Bterm(b);
  66. l = malloc(n*sizeof(Who*));
  67. for(i = 0, nw = first; nw; nw = nw->next, i++)
  68. l[i] = nw;
  69. qsort(l, n, sizeof(Who*), cmp);
  70. if(!changed)
  71. exits(0);
  72. b = Bopen(argv[1], OWRITE);
  73. if(b == 0){
  74. fprint(2, "auth/uniq: can't open %s\n", argv[1]);
  75. exits(0);
  76. }
  77. for(i = 0; i < n; i++)
  78. Bprint(b, "%s|%s\n", l[i]->name, l[i]->line);
  79. Bterm(b);
  80. }