1*368c31abSDavid du Colombier #include "stdinc.h" 2*368c31abSDavid du Colombier #include "dat.h" 3*368c31abSDavid du Colombier #include "fns.h" 4*368c31abSDavid du Colombier 5*368c31abSDavid du Colombier int 6*368c31abSDavid du Colombier namecmp(char *s, char *t) 7*368c31abSDavid du Colombier { 8*368c31abSDavid du Colombier return strncmp(s, t, ANameSize); 9*368c31abSDavid du Colombier } 10*368c31abSDavid du Colombier 11*368c31abSDavid du Colombier void 12*368c31abSDavid du Colombier namecp(char *dst, char *src) 13*368c31abSDavid du Colombier { 14*368c31abSDavid du Colombier strncpy(dst, src, ANameSize - 1); 15*368c31abSDavid du Colombier dst[ANameSize - 1] = '\0'; 16*368c31abSDavid du Colombier } 17*368c31abSDavid du Colombier 18*368c31abSDavid du Colombier int 19*368c31abSDavid du Colombier nameok(char *name) 20*368c31abSDavid du Colombier { 21*368c31abSDavid du Colombier char *t; 22*368c31abSDavid du Colombier int c; 23*368c31abSDavid du Colombier 24*368c31abSDavid du Colombier if(name == nil) 25*368c31abSDavid du Colombier return -1; 26*368c31abSDavid du Colombier for(t = name; c = *t; t++) 27*368c31abSDavid du Colombier if(t - name >= ANameSize 28*368c31abSDavid du Colombier || c < ' ' || c >= 0x7f) 29*368c31abSDavid du Colombier return -1; 30*368c31abSDavid du Colombier return 0; 31*368c31abSDavid du Colombier } 32*368c31abSDavid du Colombier 33*368c31abSDavid du Colombier int 34*368c31abSDavid du Colombier stru32int(char *s, u32int *r) 35*368c31abSDavid du Colombier { 36*368c31abSDavid du Colombier char *t; 37*368c31abSDavid du Colombier u32int n, nn, m; 38*368c31abSDavid du Colombier int c; 39*368c31abSDavid du Colombier 40*368c31abSDavid du Colombier m = TWID32 / 10; 41*368c31abSDavid du Colombier n = 0; 42*368c31abSDavid du Colombier for(t = s; ; t++){ 43*368c31abSDavid du Colombier c = *t; 44*368c31abSDavid du Colombier if(c < '0' || c > '9') 45*368c31abSDavid du Colombier break; 46*368c31abSDavid du Colombier if(n > m) 47*368c31abSDavid du Colombier return -1; 48*368c31abSDavid du Colombier nn = n * 10 + c - '0'; 49*368c31abSDavid du Colombier if(nn < n) 50*368c31abSDavid du Colombier return -1; 51*368c31abSDavid du Colombier n = nn; 52*368c31abSDavid du Colombier } 53*368c31abSDavid du Colombier *r = n; 54*368c31abSDavid du Colombier return s != t && *t == '\0'; 55*368c31abSDavid du Colombier } 56*368c31abSDavid du Colombier 57*368c31abSDavid du Colombier int 58*368c31abSDavid du Colombier stru64int(char *s, u64int *r) 59*368c31abSDavid du Colombier { 60*368c31abSDavid du Colombier char *t; 61*368c31abSDavid du Colombier u64int n, nn, m; 62*368c31abSDavid du Colombier int c; 63*368c31abSDavid du Colombier 64*368c31abSDavid du Colombier m = TWID64 / 10; 65*368c31abSDavid du Colombier n = 0; 66*368c31abSDavid du Colombier for(t = s; ; t++){ 67*368c31abSDavid du Colombier c = *t; 68*368c31abSDavid du Colombier if(c < '0' || c > '9') 69*368c31abSDavid du Colombier break; 70*368c31abSDavid du Colombier if(n > m) 71*368c31abSDavid du Colombier return -1; 72*368c31abSDavid du Colombier nn = n * 10 + c - '0'; 73*368c31abSDavid du Colombier if(nn < n) 74*368c31abSDavid du Colombier return -1; 75*368c31abSDavid du Colombier n = nn; 76*368c31abSDavid du Colombier } 77*368c31abSDavid du Colombier *r = n; 78*368c31abSDavid du Colombier return s != t && *t == '\0'; 79*368c31abSDavid du Colombier } 80*368c31abSDavid du Colombier 81*368c31abSDavid du Colombier int 82*368c31abSDavid du Colombier vttypevalid(int type) 83*368c31abSDavid du Colombier { 84*368c31abSDavid du Colombier return type < VtMaxType; 85*368c31abSDavid du Colombier } 86*368c31abSDavid du Colombier 87*368c31abSDavid du Colombier static char* 88*368c31abSDavid du Colombier logit(int severity, char *fmt, va_list args) 89*368c31abSDavid du Colombier { 90*368c31abSDavid du Colombier char *s; 91*368c31abSDavid du Colombier 92*368c31abSDavid du Colombier s = vsmprint(fmt, args); 93*368c31abSDavid du Colombier if(s == nil) 94*368c31abSDavid du Colombier return nil; 95*368c31abSDavid du Colombier if(severity != EOk){ 96*368c31abSDavid du Colombier if(argv0 == nil) 97*368c31abSDavid du Colombier fprint(2, "%T %s: err %d: %s\n", argv0, severity, s); 98*368c31abSDavid du Colombier else 99*368c31abSDavid du Colombier fprint(2, "%T err %d: %s\n", severity, s); 100*368c31abSDavid du Colombier } 101*368c31abSDavid du Colombier return s; 102*368c31abSDavid du Colombier } 103*368c31abSDavid du Colombier 104*368c31abSDavid du Colombier void 105*368c31abSDavid du Colombier seterr(int severity, char *fmt, ...) 106*368c31abSDavid du Colombier { 107*368c31abSDavid du Colombier char *s; 108*368c31abSDavid du Colombier va_list args; 109*368c31abSDavid du Colombier 110*368c31abSDavid du Colombier va_start(args, fmt); 111*368c31abSDavid du Colombier s = logit(severity, fmt, args); 112*368c31abSDavid du Colombier va_end(args); 113*368c31abSDavid du Colombier if(s == nil) 114*368c31abSDavid du Colombier werrstr("error setting error"); 115*368c31abSDavid du Colombier else{ 116*368c31abSDavid du Colombier werrstr("%s", s); 117*368c31abSDavid du Colombier free(s); 118*368c31abSDavid du Colombier } 119*368c31abSDavid du Colombier } 120*368c31abSDavid du Colombier 121*368c31abSDavid du Colombier void 122*368c31abSDavid du Colombier logerr(int severity, char *fmt, ...) 123*368c31abSDavid du Colombier { 124*368c31abSDavid du Colombier char *s; 125*368c31abSDavid du Colombier va_list args; 126*368c31abSDavid du Colombier 127*368c31abSDavid du Colombier va_start(args, fmt); 128*368c31abSDavid du Colombier s = logit(severity, fmt, args); 129*368c31abSDavid du Colombier va_end(args); 130*368c31abSDavid du Colombier free(s); 131*368c31abSDavid du Colombier } 132*368c31abSDavid du Colombier 133*368c31abSDavid du Colombier u32int 134*368c31abSDavid du Colombier now(void) 135*368c31abSDavid du Colombier { 136*368c31abSDavid du Colombier return time(nil); 137*368c31abSDavid du Colombier } 138*368c31abSDavid du Colombier 139*368c31abSDavid du Colombier int abortonmem = 1; 140*368c31abSDavid du Colombier 141*368c31abSDavid du Colombier void * 142*368c31abSDavid du Colombier emalloc(ulong n) 143*368c31abSDavid du Colombier { 144*368c31abSDavid du Colombier void *p; 145*368c31abSDavid du Colombier 146*368c31abSDavid du Colombier p = malloc(n); 147*368c31abSDavid du Colombier if(p == nil){ 148*368c31abSDavid du Colombier if(abortonmem) 149*368c31abSDavid du Colombier abort(); 150*368c31abSDavid du Colombier sysfatal("out of memory allocating %lud", n); 151*368c31abSDavid du Colombier } 152*368c31abSDavid du Colombier memset(p, 0xa5, n); 153*368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&n)); 154*368c31abSDavid du Colombier if(0)print("emalloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&n)); 155*368c31abSDavid du Colombier return p; 156*368c31abSDavid du Colombier } 157*368c31abSDavid du Colombier 158*368c31abSDavid du Colombier void * 159*368c31abSDavid du Colombier ezmalloc(ulong n) 160*368c31abSDavid du Colombier { 161*368c31abSDavid du Colombier void *p; 162*368c31abSDavid du Colombier 163*368c31abSDavid du Colombier p = malloc(n); 164*368c31abSDavid du Colombier if(p == nil){ 165*368c31abSDavid du Colombier if(abortonmem) 166*368c31abSDavid du Colombier abort(); 167*368c31abSDavid du Colombier sysfatal("out of memory allocating %lud", n); 168*368c31abSDavid du Colombier } 169*368c31abSDavid du Colombier memset(p, 0, n); 170*368c31abSDavid du Colombier setmalloctag(p, getcallerpc(&n)); 171*368c31abSDavid du Colombier if(0)print("ezmalloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&n)); 172*368c31abSDavid du Colombier return p; 173*368c31abSDavid du Colombier } 174*368c31abSDavid du Colombier 175*368c31abSDavid du Colombier void * 176*368c31abSDavid du Colombier erealloc(void *p, ulong n) 177*368c31abSDavid du Colombier { 178*368c31abSDavid du Colombier p = realloc(p, n); 179*368c31abSDavid du Colombier if(p == nil){ 180*368c31abSDavid du Colombier if(abortonmem) 181*368c31abSDavid du Colombier abort(); 182*368c31abSDavid du Colombier sysfatal("out of memory allocating %lud", n); 183*368c31abSDavid du Colombier } 184*368c31abSDavid du Colombier setrealloctag(p, getcallerpc(&p)); 185*368c31abSDavid du Colombier if(0)print("erealloc %p-%p by %lux\n", p, (char*)p+n, getcallerpc(&p)); 186*368c31abSDavid du Colombier return p; 187*368c31abSDavid du Colombier } 188*368c31abSDavid du Colombier 189*368c31abSDavid du Colombier char * 190*368c31abSDavid du Colombier estrdup(char *s) 191*368c31abSDavid du Colombier { 192*368c31abSDavid du Colombier char *t; 193*368c31abSDavid du Colombier int n; 194*368c31abSDavid du Colombier 195*368c31abSDavid du Colombier n = strlen(s) + 1; 196*368c31abSDavid du Colombier t = emalloc(n); 197*368c31abSDavid du Colombier memmove(t, s, n); 198*368c31abSDavid du Colombier setmalloctag(t, getcallerpc(&s)); 199*368c31abSDavid du Colombier if(0)print("estrdup %p-%p by %lux\n", t, (char*)t+n, getcallerpc(&s)); 200*368c31abSDavid du Colombier return t; 201*368c31abSDavid du Colombier } 202*368c31abSDavid du Colombier 203*368c31abSDavid du Colombier /* 204*368c31abSDavid du Colombier * return floor(log2(v)) 205*368c31abSDavid du Colombier */ 206*368c31abSDavid du Colombier int 207*368c31abSDavid du Colombier u64log2(u64int v) 208*368c31abSDavid du Colombier { 209*368c31abSDavid du Colombier int i; 210*368c31abSDavid du Colombier 211*368c31abSDavid du Colombier for(i = 0; i < 64; i++) 212*368c31abSDavid du Colombier if((v >> i) <= 1) 213*368c31abSDavid du Colombier break; 214*368c31abSDavid du Colombier return i; 215*368c31abSDavid du Colombier } 216*368c31abSDavid du Colombier 217*368c31abSDavid du Colombier int 218*368c31abSDavid du Colombier vtproc(void (*fn)(void*), void *arg) 219*368c31abSDavid du Colombier { 220*368c31abSDavid du Colombier proccreate(fn, arg, 256*1024); 221*368c31abSDavid du Colombier return 0; 222*368c31abSDavid du Colombier } 223*368c31abSDavid du Colombier 224*368c31abSDavid du Colombier int 225*368c31abSDavid du Colombier ientryfmt(Fmt *fmt) 226*368c31abSDavid du Colombier { 227*368c31abSDavid du Colombier IEntry *ie; 228*368c31abSDavid du Colombier 229*368c31abSDavid du Colombier ie = va_arg(fmt->args, IEntry*); 230*368c31abSDavid du Colombier return fmtprint(fmt, "%V %22lld %3d %5d %3d", 231*368c31abSDavid du Colombier ie->score, ie->ia.addr, ie->ia.type, ie->ia.size, ie->ia.blocks); 232*368c31abSDavid du Colombier } 233*368c31abSDavid du Colombier 234*368c31abSDavid du Colombier void 235*368c31abSDavid du Colombier ventifmtinstall(void) 236*368c31abSDavid du Colombier { 237*368c31abSDavid du Colombier fmtinstall('F', vtfcallfmt); 238*368c31abSDavid du Colombier fmtinstall('H', encodefmt); 239*368c31abSDavid du Colombier fmtinstall('I', ientryfmt); 240*368c31abSDavid du Colombier fmtinstall('T', vttimefmt); 241*368c31abSDavid du Colombier fmtinstall('V', vtscorefmt); 242*368c31abSDavid du Colombier } 243*368c31abSDavid du Colombier 244*368c31abSDavid du Colombier uint 245*368c31abSDavid du Colombier msec(void) 246*368c31abSDavid du Colombier { 247*368c31abSDavid du Colombier return nsec()/1000000; 248*368c31abSDavid du Colombier } 249*368c31abSDavid du Colombier 250*368c31abSDavid du Colombier uint 251*368c31abSDavid du Colombier countbits(uint n) 252*368c31abSDavid du Colombier { 253*368c31abSDavid du Colombier n = (n&0x55555555)+((n>>1)&0x55555555); 254*368c31abSDavid du Colombier n = (n&0x33333333)+((n>>2)&0x33333333); 255*368c31abSDavid du Colombier n = (n&0x0F0F0F0F)+((n>>4)&0x0F0F0F0F); 256*368c31abSDavid du Colombier n = (n&0x00FF00FF)+((n>>8)&0x00FF00FF); 257*368c31abSDavid du Colombier n = (n&0x0000FFFF)+((n>>16)&0x0000FFFF); 258*368c31abSDavid du Colombier return n; 259*368c31abSDavid du Colombier } 260