chan.c (1237B)
1 #include "u.h" 2 #include "lib.h" 3 #include "draw.h" 4 5 static char channames[] = "rgbkamx"; 6 char* 7 chantostr(char *buf, ulong cc) 8 { 9 ulong c, rc; 10 char *p; 11 12 if(chantodepth(cc) == 0) 13 return nil; 14 15 /* reverse the channel descriptor so we can easily generate the string in the right order */ 16 rc = 0; 17 for(c=cc; c; c>>=8){ 18 rc <<= 8; 19 rc |= c&0xFF; 20 } 21 22 p = buf; 23 for(c=rc; c; c>>=8) { 24 *p++ = channames[TYPE(c)]; 25 *p++ = '0'+NBITS(c); 26 } 27 *p = 0; 28 29 return buf; 30 } 31 32 /* avoid pulling in ctype when using with drawterm etc. */ 33 static int 34 draw_isspace(char c) 35 { 36 return c==' ' || c== '\t' || c=='\r' || c=='\n'; 37 } 38 39 ulong 40 strtochan(char *s) 41 { 42 char *p, *q; 43 ulong c; 44 int t, n, d; 45 46 c = 0; 47 d = 0; 48 p=s; 49 while(*p && draw_isspace(*p)) 50 p++; 51 52 while(*p && !draw_isspace(*p)){ 53 if((q = strchr(channames, p[0])) == nil) 54 return 0; 55 t = q-channames; 56 if(p[1] < '0' || p[1] > '9') 57 return 0; 58 n = p[1]-'0'; 59 d += n; 60 c = (c<<8) | __DC(t, n); 61 p += 2; 62 } 63 if(d==0 || (d>8 && d%8) || (d<8 && 8%d)) 64 return 0; 65 return c; 66 } 67 68 int 69 chantodepth(ulong c) 70 { 71 int n; 72 73 for(n=0; c; c>>=8){ 74 if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0) 75 return 0; 76 n += NBITS(c); 77 } 78 if(n==0 || (n>8 && n%8) || (n<8 && 8%n)) 79 return 0; 80 return n; 81 }