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