xref: /plan9/sys/src/cmd/unix/drawterm/libdraw/chan.c (revision 8ccd4a6360d974db7bd7bbd4f37e7018419ea908)
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 Colombier chantostr(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 Colombier xisspace(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 Colombier strtochan(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 Colombier chantodepth(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