utils.c 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346
  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 int
  90. sFlush(Fmt *f)
  91. {
  92. char *s;
  93. int n;
  94. n = (int)f->farg;
  95. n += 256;
  96. f->farg = (void*)n;
  97. s = f->start;
  98. f->start = realloc(s, n);
  99. if(f->start == nil){
  100. f->start = s;
  101. return 0;
  102. }
  103. f->to = (char*)f->start + ((char*)f->to - s);
  104. f->stop = (char*)f->start + n - 1;
  105. return 1;
  106. }
  107. static char*
  108. logit(int severity, char *fmt, va_list args)
  109. {
  110. Fmt f;
  111. int n;
  112. f.runes = 0;
  113. n = 32;
  114. f.start = malloc(n);
  115. if(f.start == nil)
  116. return nil;
  117. f.to = f.start;
  118. f.stop = (char*)f.start + n - 1;
  119. f.flush = sFlush;
  120. f.farg = (void*)n;
  121. f.nfmt = 0;
  122. f.args = args;
  123. n = dofmt(&f, fmt);
  124. if(n < 0)
  125. return nil;
  126. *(char*)f.to = '\0';
  127. if(argv0 == nil)
  128. fprint(2, "%s: err %d: %s\n", argv0, severity, f.start);
  129. else
  130. fprint(2, "err %d: %s\n", severity, f.start);
  131. return f.start;
  132. }
  133. void
  134. setErr(int severity, char *fmt, ...)
  135. {
  136. char *s;
  137. va_list args;
  138. va_start(args, fmt);
  139. s = logit(severity, fmt, args);
  140. va_end(args);
  141. if(s == nil)
  142. vtSetError("error setting error");
  143. else{
  144. vtSetError(s);
  145. free(s);
  146. }
  147. }
  148. void
  149. logErr(int severity, char *fmt, ...)
  150. {
  151. char *s;
  152. va_list args;
  153. va_start(args, fmt);
  154. s = logit(severity, fmt, args);
  155. va_end(args);
  156. free(s);
  157. }
  158. u32int
  159. now(void)
  160. {
  161. return time(nil);
  162. }
  163. void
  164. fatal(char *fmt, ...)
  165. {
  166. Fmt f;
  167. char buf[256];
  168. f.runes = 0;
  169. f.start = buf;
  170. f.to = buf;
  171. f.stop = buf + sizeof(buf);
  172. f.flush = fmtfdflush;
  173. f.farg = (void*)2;
  174. f.nfmt = 0;
  175. fmtprint(&f, "fatal %s error:", argv0);
  176. va_start(f.args, fmt);
  177. dofmt(&f, fmt);
  178. va_end(f.args);
  179. fmtprint(&f, "\n");
  180. fmtfdflush(&f);
  181. if(0)
  182. abort();
  183. exits(buf);
  184. }
  185. ZBlock *
  186. allocZBlock(u32int size, int zeroed)
  187. {
  188. ZBlock *b;
  189. static ZBlock z;
  190. b = malloc(sizeof(ZBlock) + size);
  191. if(b == nil){
  192. setErr(EOk, "out of memory");
  193. return nil;
  194. }
  195. *b = z;
  196. b->data = (u8int*)&b[1];
  197. b->len = size;
  198. if(zeroed)
  199. memset(b->data, 0, size);
  200. return b;
  201. }
  202. void
  203. freeZBlock(ZBlock *b)
  204. {
  205. free(b);
  206. }
  207. ZBlock*
  208. packet2ZBlock(Packet *p, u32int size)
  209. {
  210. ZBlock *b;
  211. if(p == nil)
  212. return nil;
  213. b = allocZBlock(size, 0);
  214. if(b == nil)
  215. return nil;
  216. b->len = size;
  217. if(!packetCopy(p, b->data, 0, size)){
  218. freeZBlock(b);
  219. return nil;
  220. }
  221. return b;
  222. }
  223. Packet*
  224. zblock2Packet(ZBlock *zb, u32int size)
  225. {
  226. Packet *p;
  227. if(zb == nil)
  228. return nil;
  229. p = packetAlloc();
  230. packetAppend(p, zb->data, size);
  231. return p;
  232. }
  233. void *
  234. emalloc(ulong n)
  235. {
  236. void *p;
  237. p = malloc(n);
  238. if(p == nil)
  239. fatal("out of memory");
  240. memset(p, 0xa5, n);
  241. return p;
  242. }
  243. void *
  244. ezmalloc(ulong n)
  245. {
  246. void *p;
  247. p = malloc(n);
  248. if(p == nil)
  249. fatal("out of memory");
  250. memset(p, 0, n);
  251. return p;
  252. }
  253. void *
  254. erealloc(void *p, ulong n)
  255. {
  256. p = realloc(p, n);
  257. if(p == nil)
  258. fatal("out of memory");
  259. return p;
  260. }
  261. char *
  262. estrdup(char *s)
  263. {
  264. char *t;
  265. int n;
  266. n = strlen(s) + 1;
  267. t = emalloc(n);
  268. memmove(t, s, n);
  269. return t;
  270. }
  271. ZBlock*
  272. readFile(char *name)
  273. {
  274. Part *p;
  275. ZBlock *b;
  276. p = initPart(name, 1);
  277. if(p == nil)
  278. return nil;
  279. b = allocZBlock(p->size, 0);
  280. if(b == nil){
  281. setErr(EOk, "can't alloc %s: %R", name);
  282. freePart(p);
  283. return nil;
  284. }
  285. if(!readPart(p, 0, b->data, p->size)){
  286. setErr(EOk, "can't read %s: %R", name);
  287. freePart(p);
  288. freeZBlock(b);
  289. return nil;
  290. }
  291. freePart(p);
  292. return b;
  293. }
  294. /*
  295. * return floor(log2(v))
  296. */
  297. int
  298. u64log2(u64int v)
  299. {
  300. int i;
  301. for(i = 0; i < 64; i++)
  302. if((v >> i) <= 1)
  303. break;
  304. return i;
  305. }