plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

chan.c (1025B)


      1 #include <u.h>
      2 #include <libc.h>
      3 #include <draw.h>
      4 
      5 static char channames[] = "rgbkamx";
      6 char*
      7 chantostr(char *buf, u32int cc)
      8 {
      9 	u32int 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 u32int
     33 strtochan(char *s)
     34 {
     35 	char *p, *q;
     36 	u32int c;
     37 	int t, n;
     38 
     39 	c = 0;
     40 	p=s;
     41 	while(*p && isspace((uchar)*p))
     42 		p++;
     43 
     44 	while(*p && !isspace((uchar)*p)){
     45 		if((q = strchr(channames, p[0])) == nil)
     46 			return 0;
     47 		t = q-channames;
     48 		if(p[1] < '0' || p[1] > '9')
     49 			return 0;
     50 		n = p[1]-'0';
     51 		c = (c<<8) | __DC(t, n);
     52 		p += 2;
     53 	}
     54 	return c;
     55 }
     56 
     57 int
     58 chantodepth(u32int c)
     59 {
     60 	int n;
     61 
     62 	for(n=0; c; c>>=8){
     63 		if(TYPE(c) >= NChan || NBITS(c) > 8 || NBITS(c) <= 0)
     64 			return 0;
     65 		n += NBITS(c);
     66 	}
     67 	if(n==0 || (n>8 && n%8) || (n<8 && 8%n))
     68 		return 0;
     69 	return n;
     70 }