17dd7cddfSDavid du Colombier #include <u.h> 27dd7cddfSDavid du Colombier #include <libc.h> 37dd7cddfSDavid 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 329a747e4fSDavid du Colombier /* avoid pulling in ctype when using with drawterm etc. */ 339a747e4fSDavid du Colombier static int isspace(char c)349a747e4fSDavid du Colombierisspace(char c) 359a747e4fSDavid du Colombier { 369a747e4fSDavid du Colombier return c==' ' || c== '\t' || c=='\r' || c=='\n'; 379a747e4fSDavid du Colombier } 389a747e4fSDavid 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; 44*815ca008SDavid du Colombier int t, n, d; 457dd7cddfSDavid du Colombier 467dd7cddfSDavid du Colombier c = 0; 47*815ca008SDavid du Colombier d = 0; 487dd7cddfSDavid du Colombier p=s; 497dd7cddfSDavid du Colombier while(*p && isspace(*p)) 507dd7cddfSDavid du Colombier p++; 517dd7cddfSDavid du Colombier 527dd7cddfSDavid du Colombier while(*p && !isspace(*p)){ 537dd7cddfSDavid du Colombier if((q = strchr(channames, p[0])) == nil) 547dd7cddfSDavid du Colombier return 0; 557dd7cddfSDavid du Colombier t = q-channames; 567dd7cddfSDavid du Colombier if(p[1] < '0' || p[1] > '9') 577dd7cddfSDavid du Colombier return 0; 587dd7cddfSDavid du Colombier n = p[1]-'0'; 59*815ca008SDavid du Colombier d += n; 607dd7cddfSDavid du Colombier c = (c<<8) | __DC(t, n); 617dd7cddfSDavid du Colombier p += 2; 627dd7cddfSDavid du Colombier } 63*815ca008SDavid du Colombier if(d==0 || (d>8 && d%8) || (d<8 && 8%d)) 64*815ca008SDavid du Colombier return 0; 657dd7cddfSDavid du Colombier return c; 667dd7cddfSDavid du Colombier } 677dd7cddfSDavid du Colombier 687dd7cddfSDavid du Colombier int chantodepth(ulong c)697dd7cddfSDavid du Colombierchantodepth(ulong c) 707dd7cddfSDavid du Colombier { 717dd7cddfSDavid du Colombier int n; 727dd7cddfSDavid du Colombier 737dd7cddfSDavid du Colombier for(n=0; c; c>>=8){ 747dd7cddfSDavid du Colombier if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0) 757dd7cddfSDavid du Colombier return 0; 767dd7cddfSDavid du Colombier n += NBITS(c); 777dd7cddfSDavid du Colombier } 787dd7cddfSDavid du Colombier if(n==0 || (n>8 && n%8) || (n<8 && 8%n)) 797dd7cddfSDavid du Colombier return 0; 807dd7cddfSDavid du Colombier return n; 817dd7cddfSDavid du Colombier } 82