attr.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <auth.h>
  4. int
  5. _attrfmt(Fmt *fmt)
  6. {
  7. char *b, buf[1024], *ebuf;
  8. Attr *a;
  9. ebuf = buf+sizeof buf;
  10. b = buf;
  11. strcpy(buf, " ");
  12. for(a=va_arg(fmt->args, Attr*); a; a=a->next){
  13. if(a->name == nil)
  14. continue;
  15. switch(a->type){
  16. case AttrQuery:
  17. b = seprint(b, ebuf, " %q?", a->name);
  18. break;
  19. case AttrNameval:
  20. b = seprint(b, ebuf, " %q=%q", a->name, a->val);
  21. break;
  22. case AttrDefault:
  23. b = seprint(b, ebuf, " %q:=%q", a->name, a->val);
  24. break;
  25. }
  26. }
  27. return fmtstrcpy(fmt, buf+1);
  28. }
  29. Attr*
  30. _copyattr(Attr *a)
  31. {
  32. Attr **la, *na;
  33. na = nil;
  34. la = &na;
  35. for(; a; a=a->next){
  36. *la = _mkattr(a->type, a->name, a->val, nil);
  37. setmalloctag(*la, getcallerpc(&a));
  38. la = &(*la)->next;
  39. }
  40. *la = nil;
  41. return na;
  42. }
  43. Attr*
  44. _delattr(Attr *a, char *name)
  45. {
  46. Attr *fa;
  47. Attr **la;
  48. for(la=&a; *la; ){
  49. if(strcmp((*la)->name, name) == 0){
  50. fa = *la;
  51. *la = (*la)->next;
  52. fa->next = nil;
  53. _freeattr(fa);
  54. }else
  55. la=&(*la)->next;
  56. }
  57. return a;
  58. }
  59. Attr*
  60. _findattr(Attr *a, char *n)
  61. {
  62. for(; a; a=a->next)
  63. if(strcmp(a->name, n) == 0 && a->type != AttrQuery)
  64. return a;
  65. return nil;
  66. }
  67. void
  68. _freeattr(Attr *a)
  69. {
  70. Attr *anext;
  71. for(; a; a=anext){
  72. anext = a->next;
  73. free(a->name);
  74. free(a->val);
  75. a->name = (void*)~0;
  76. a->val = (void*)~0;
  77. a->next = (void*)~0;
  78. free(a);
  79. }
  80. }
  81. Attr*
  82. _mkattr(int type, char *name, char *val, Attr *next)
  83. {
  84. Attr *a;
  85. a = malloc(sizeof(*a));
  86. if(a==nil)
  87. sysfatal("_mkattr malloc: %r");
  88. a->type = type;
  89. a->name = strdup(name);
  90. a->val = strdup(val);
  91. if(a->name==nil || a->val==nil)
  92. sysfatal("_mkattr malloc: %r");
  93. a->next = next;
  94. setmalloctag(a, getcallerpc(&type));
  95. return a;
  96. }
  97. static Attr*
  98. cleanattr(Attr *a)
  99. {
  100. Attr *fa;
  101. Attr **la;
  102. for(la=&a; *la; ){
  103. if((*la)->type==AttrQuery && _findattr(a, (*la)->name)){
  104. fa = *la;
  105. *la = (*la)->next;
  106. fa->next = nil;
  107. _freeattr(fa);
  108. }else
  109. la=&(*la)->next;
  110. }
  111. return a;
  112. }
  113. Attr*
  114. _parseattr(char *s)
  115. {
  116. char *p, *t, *tok[256];
  117. int i, ntok, type;
  118. Attr *a;
  119. s = strdup(s);
  120. if(s == nil)
  121. sysfatal("_parseattr strdup: %r");
  122. ntok = tokenize(s, tok, nelem(tok));
  123. a = nil;
  124. for(i=ntok-1; i>=0; i--){
  125. t = tok[i];
  126. if(p = strchr(t, '=')){
  127. *p++ = '\0';
  128. // if(p-2 >= t && p[-2] == ':'){
  129. // p[-2] = '\0';
  130. // type = AttrDefault;
  131. // }else
  132. type = AttrNameval;
  133. a = _mkattr(type, t, p, a);
  134. setmalloctag(a, getcallerpc(&s));
  135. }
  136. else if(t[strlen(t)-1] == '?'){
  137. t[strlen(t)-1] = '\0';
  138. a = _mkattr(AttrQuery, t, "", a);
  139. setmalloctag(a, getcallerpc(&s));
  140. }else{
  141. /* really a syntax error, but better to provide some indication */
  142. a = _mkattr(AttrNameval, t, "", a);
  143. setmalloctag(a, getcallerpc(&s));
  144. }
  145. }
  146. free(s);
  147. return cleanattr(a);
  148. }
  149. char*
  150. _strfindattr(Attr *a, char *n)
  151. {
  152. a = _findattr(a, n);
  153. if(a == nil)
  154. return nil;
  155. return a->val;
  156. }