1*8ccd4a63SDavid du Colombier #include <u.h> 2*8ccd4a63SDavid du Colombier #include <libc.h> 3*8ccd4a63SDavid du Colombier #include <draw.h> 47dd7cddfSDavid du Colombier 57dd7cddfSDavid du Colombier static char channames[] = "rgbkamx"; 67dd7cddfSDavid du Colombier char* chantostr(char * buf,ulong cc)77dd7cddfSDavid du Colombierchantostr(char *buf, ulong cc) 87dd7cddfSDavid du Colombier { 97dd7cddfSDavid du Colombier ulong c, rc; 107dd7cddfSDavid du Colombier char *p; 117dd7cddfSDavid du Colombier 127dd7cddfSDavid du Colombier if(chantodepth(cc) == 0) 137dd7cddfSDavid du Colombier return nil; 147dd7cddfSDavid du Colombier 157dd7cddfSDavid du Colombier /* reverse the channel descriptor so we can easily generate the string in the right order */ 167dd7cddfSDavid du Colombier rc = 0; 177dd7cddfSDavid du Colombier for(c=cc; c; c>>=8){ 187dd7cddfSDavid du Colombier rc <<= 8; 197dd7cddfSDavid du Colombier rc |= c&0xFF; 207dd7cddfSDavid du Colombier } 217dd7cddfSDavid du Colombier 227dd7cddfSDavid du Colombier p = buf; 237dd7cddfSDavid du Colombier for(c=rc; c; c>>=8) { 247dd7cddfSDavid du Colombier *p++ = channames[TYPE(c)]; 257dd7cddfSDavid du Colombier *p++ = '0'+NBITS(c); 267dd7cddfSDavid du Colombier } 277dd7cddfSDavid du Colombier *p = 0; 287dd7cddfSDavid du Colombier 297dd7cddfSDavid du Colombier return buf; 307dd7cddfSDavid du Colombier } 317dd7cddfSDavid du Colombier 32*8ccd4a63SDavid du Colombier /* avoid pulling in ctype when using with drawterm etc. */ 33*8ccd4a63SDavid du Colombier static int xisspace(char c)34*8ccd4a63SDavid du Colombierxisspace(char c) 35*8ccd4a63SDavid du Colombier { 36*8ccd4a63SDavid du Colombier return c==' ' || c== '\t' || c=='\r' || c=='\n'; 37*8ccd4a63SDavid du Colombier } 38*8ccd4a63SDavid du Colombier 397dd7cddfSDavid du Colombier ulong strtochan(char * s)407dd7cddfSDavid du Colombierstrtochan(char *s) 417dd7cddfSDavid du Colombier { 427dd7cddfSDavid du Colombier char *p, *q; 437dd7cddfSDavid du Colombier ulong c; 447dd7cddfSDavid du Colombier int t, n; 457dd7cddfSDavid du Colombier 467dd7cddfSDavid du Colombier c = 0; 477dd7cddfSDavid du Colombier p=s; 48*8ccd4a63SDavid du Colombier while(*p && xisspace(*p)) 497dd7cddfSDavid du Colombier p++; 507dd7cddfSDavid du Colombier 51*8ccd4a63SDavid du Colombier while(*p && !xisspace(*p)){ 527dd7cddfSDavid du Colombier if((q = strchr(channames, p[0])) == nil) 537dd7cddfSDavid du Colombier return 0; 547dd7cddfSDavid du Colombier t = q-channames; 557dd7cddfSDavid du Colombier if(p[1] < '0' || p[1] > '9') 567dd7cddfSDavid du Colombier return 0; 577dd7cddfSDavid du Colombier n = p[1]-'0'; 587dd7cddfSDavid du Colombier c = (c<<8) | __DC(t, n); 597dd7cddfSDavid du Colombier p += 2; 607dd7cddfSDavid du Colombier } 617dd7cddfSDavid du Colombier return c; 627dd7cddfSDavid du Colombier } 637dd7cddfSDavid du Colombier 647dd7cddfSDavid du Colombier int chantodepth(ulong c)657dd7cddfSDavid du Colombierchantodepth(ulong c) 667dd7cddfSDavid du Colombier { 677dd7cddfSDavid du Colombier int n; 68*8ccd4a63SDavid du Colombier 697dd7cddfSDavid du Colombier for(n=0; c; c>>=8){ 707dd7cddfSDavid du Colombier if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0) 717dd7cddfSDavid du Colombier return 0; 727dd7cddfSDavid du Colombier n += NBITS(c); 737dd7cddfSDavid du Colombier } 74*8ccd4a63SDavid du Colombier if(n==0 || (n>8 && n%8) || (n<8 && 8%n)) 757dd7cddfSDavid du Colombier return 0; 767dd7cddfSDavid du Colombier return n; 777dd7cddfSDavid du Colombier } 78