vx32

Local 9vx git repository for patches.
git clone git://r-36.net/vx32
Log | Files | Refs

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 }