utils.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312
  1. #include "stdinc.h"
  2. #include "dat.h"
  3. #include "fns.h"
  4. int
  5. nameEq(char *s, char *t)
  6. {
  7. return strncmp(s, t, ANameSize) == 0;
  8. }
  9. void
  10. nameCp(char *dst, char *src)
  11. {
  12. strncpy(dst, src, ANameSize - 1);
  13. dst[ANameSize - 1] = '\0';
  14. }
  15. int
  16. nameOk(char *name)
  17. {
  18. char *t;
  19. int c;
  20. if(name == nil)
  21. return 0;
  22. for(t = name; c = *t; t++)
  23. if(t - name >= ANameSize
  24. || c < ' ' || c >= 0x7f)
  25. return 0;
  26. return 1;
  27. }
  28. int
  29. strU32Int(char *s, u32int *r)
  30. {
  31. char *t;
  32. u32int n, nn, m;
  33. int c;
  34. m = TWID32 / 10;
  35. n = 0;
  36. for(t = s; ; t++){
  37. c = *t;
  38. if(c < '0' || c > '9')
  39. break;
  40. if(n > m)
  41. return 0;
  42. nn = n * 10 + c - '0';
  43. if(nn < n)
  44. return 0;
  45. n = nn;
  46. }
  47. *r = n;
  48. return s != t && *t == '\0';
  49. }
  50. int
  51. strU64Int(char *s, u64int *r)
  52. {
  53. char *t;
  54. u64int n, nn, m;
  55. int c;
  56. m = TWID64 / 10;
  57. n = 0;
  58. for(t = s; ; t++){
  59. c = *t;
  60. if(c < '0' || c > '9')
  61. break;
  62. if(n > m)
  63. return 0;
  64. nn = n * 10 + c - '0';
  65. if(nn < n)
  66. return 0;
  67. n = nn;
  68. }
  69. *r = n;
  70. return s != t && *t == '\0';
  71. }
  72. int
  73. vtTypeValid(int type)
  74. {
  75. return type > VtErrType && type < VtMaxType;
  76. }
  77. void
  78. fmtZBInit(Fmt *f, ZBlock *b)
  79. {
  80. f->runes = 0;
  81. f->start = b->data;
  82. f->to = f->start;
  83. f->stop = (char*)f->start + b->len;
  84. f->flush = nil;
  85. f->farg = nil;
  86. f->nfmt = 0;
  87. f->args = nil;
  88. }
  89. static char*
  90. logit(int severity, char *fmt, va_list args)
  91. {
  92. char *s;
  93. s = vsmprint(fmt, args);
  94. if(s == nil)
  95. return nil;
  96. if(severity != EOk){
  97. if(argv0 == nil)
  98. fprint(2, "%s: err %d: %s\n", argv0, severity, s);
  99. else
  100. fprint(2, "err %d: %s\n", severity, s);
  101. }
  102. return s;
  103. }
  104. void
  105. setErr(int severity, char *fmt, ...)
  106. {
  107. char *s;
  108. va_list args;
  109. va_start(args, fmt);
  110. s = logit(severity, fmt, args);
  111. va_end(args);
  112. if(s == nil)
  113. vtSetError("error setting error");
  114. else{
  115. vtSetError(s);
  116. free(s);
  117. }
  118. }
  119. void
  120. logErr(int severity, char *fmt, ...)
  121. {
  122. char *s;
  123. va_list args;
  124. va_start(args, fmt);
  125. s = logit(severity, fmt, args);
  126. va_end(args);
  127. free(s);
  128. }
  129. u32int
  130. now(void)
  131. {
  132. return time(nil);
  133. }
  134. void
  135. fatal(char *fmt, ...)
  136. {
  137. Fmt f;
  138. va_list arg;
  139. char buf[256];
  140. fmtfdinit(&f, 2, buf, sizeof buf);
  141. fmtprint(&f, "fatal %s error: ", argv0);
  142. va_start(arg, fmt);
  143. fmtvprint(&f, fmt, arg);
  144. va_end(arg);
  145. fmtprint(&f, "\n");
  146. fmtfdflush(&f);
  147. if(0)
  148. abort();
  149. exits(buf);
  150. }
  151. ZBlock *
  152. allocZBlock(u32int size, int zeroed)
  153. {
  154. ZBlock *b;
  155. static ZBlock z;
  156. b = malloc(sizeof(ZBlock) + size);
  157. if(b == nil){
  158. setErr(EOk, "out of memory");
  159. return nil;
  160. }
  161. *b = z;
  162. b->data = (u8int*)&b[1];
  163. b->len = size;
  164. if(zeroed)
  165. memset(b->data, 0, size);
  166. return b;
  167. }
  168. void
  169. freeZBlock(ZBlock *b)
  170. {
  171. free(b);
  172. }
  173. ZBlock*
  174. packet2ZBlock(Packet *p, u32int size)
  175. {
  176. ZBlock *b;
  177. if(p == nil)
  178. return nil;
  179. b = allocZBlock(size, 0);
  180. if(b == nil)
  181. return nil;
  182. b->len = size;
  183. if(!packetCopy(p, b->data, 0, size)){
  184. freeZBlock(b);
  185. return nil;
  186. }
  187. return b;
  188. }
  189. Packet*
  190. zblock2Packet(ZBlock *zb, u32int size)
  191. {
  192. Packet *p;
  193. if(zb == nil)
  194. return nil;
  195. p = packetAlloc();
  196. packetAppend(p, zb->data, size);
  197. return p;
  198. }
  199. void *
  200. emalloc(ulong n)
  201. {
  202. void *p;
  203. p = malloc(n);
  204. if(p == nil)
  205. fatal("out of memory");
  206. memset(p, 0xa5, n);
  207. return p;
  208. }
  209. void *
  210. ezmalloc(ulong n)
  211. {
  212. void *p;
  213. p = malloc(n);
  214. if(p == nil)
  215. fatal("out of memory");
  216. memset(p, 0, n);
  217. return p;
  218. }
  219. void *
  220. erealloc(void *p, ulong n)
  221. {
  222. p = realloc(p, n);
  223. if(p == nil)
  224. fatal("out of memory");
  225. return p;
  226. }
  227. char *
  228. estrdup(char *s)
  229. {
  230. char *t;
  231. int n;
  232. n = strlen(s) + 1;
  233. t = emalloc(n);
  234. memmove(t, s, n);
  235. return t;
  236. }
  237. /*
  238. ZBlock*
  239. readFile(char *name)
  240. {
  241. Part *p;
  242. ZBlock *b;
  243. p = initPart(name, 1);
  244. if(p == nil)
  245. return nil;
  246. b = allocZBlock(p->size, 0);
  247. if(b == nil){
  248. setErr(EOk, "can't alloc %s: %R", name);
  249. freePart(p);
  250. return nil;
  251. }
  252. if(!readPart(p, 0, b->data, p->size)){
  253. setErr(EOk, "can't read %s: %R", name);
  254. freePart(p);
  255. freeZBlock(b);
  256. return nil;
  257. }
  258. freePart(p);
  259. return b;
  260. }
  261. */
  262. /*
  263. * return floor(log2(v))
  264. */
  265. int
  266. u64log2(u64int v)
  267. {
  268. int i;
  269. for(i = 0; i < 64; i++)
  270. if((v >> i) <= 1)
  271. break;
  272. return i;
  273. }