chan.c - vx32 - Local 9vx git repository for patches.
 (HTM) git clone git://r-36.net/vx32
 (DIR) Log
 (DIR) Files
 (DIR) 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 }