Annotation of coherent/g/usr/lib/ncurses/tget.c, revision 1.1.1.1

1.1       root        1: #include <stdio.h>
                      2: #include <ctype.h>
                      3: #include <string.h>
                      4: 
                      5: #define        bool    char
                      6: #define        TRUE    1
                      7: #define        FALSE   0
                      8: 
                      9: static char    buffer[1024];   /* 1024 = pulled from a hat */
                     10: 
                     11: /*
                     12:  * scan:
                     13:  *     scan for character in string, return position of character.
                     14:  *     similar to index/strchr, except that if char not found, returns
                     15:  *     pointer to null at end of string, instead of a null pointer.
                     16:  */
                     17: 
                     18: char *
                     19: scan (s, c)
                     20: register char  *s;
                     21: register char  c;
                     22: {
                     23:     while ((*s) && (*s != c))
                     24:        s++;
                     25:     return (s);
                     26: }
                     27: 
                     28: 
                     29: /* findcap:
                     30:  *     returns pointer to just after capname (trailing ':' for flags,
                     31:  *     '#' for nums, '=' for strs, '@' for disabled stuff) or to null
                     32:  *      after termcap if not found.
                     33:  */
                     34: 
                     35: char *
                     36: findcap (capname)
                     37: char   *capname;
                     38: {
                     39:     register char      *bptr = buffer;
                     40:     register bool      found = FALSE;
                     41:     char               cap[3];
                     42: 
                     43:     cap[2] = '\0';
                     44:     while ((!found) && (*bptr)) {
                     45:        bptr = scan (bptr, ':');
                     46:        if (*bptr) {
                     47:            cap[0] = *(bptr + 1);
                     48:            cap[1] = *(bptr + 2);
                     49:            if (strcmp (cap,capname) == 0) {
                     50:                found = TRUE;
                     51:                bptr += 3;      /* skip colon and capname */
                     52:            }
                     53:            else
                     54:                bptr++;         /* skip colon */
                     55:        }
                     56:     }
                     57:     return (bptr);
                     58: }
                     59: 
                     60: 
                     61: /*
                     62:  * tgetname:
                     63:  *     store name of termcap entry in name
                     64:  */
                     65: 
                     66: tgetname (name)
                     67: char   *name;
                     68: {
                     69:     char       *bptr;
                     70: 
                     71:     bptr = buffer;
                     72: 
                     73:     while ((*bptr) && (*bptr != ':'))
                     74:        *(name++) = *(bptr++);
                     75:     *(name) = '\0';
                     76: }
                     77: 
                     78: 
                     79: /*
                     80:  * tgetflag:
                     81:  *     return 1 if capname present, 0 otherwise, -1 if '@'ed.
                     82:  */
                     83: 
                     84: int
                     85: tgetflag (capname)
                     86: char   *capname;
                     87: {
                     88:     char       *c;
                     89: 
                     90:     c = findcap (capname);
                     91:     if (*c == '\0')
                     92:        return (0);
                     93:     else if (*c == '@')
                     94:        return (-1);
                     95:     else
                     96:        return (1);
                     97: }
                     98: 
                     99: 
                    100: /*
                    101:  * tgetnum:
                    102:  *     return value of capname, -1 if not present, -2 if '@'ed.
                    103:  */
                    104: 
                    105: int
                    106: tgetnum (capname)
                    107: char   *capname;
                    108: {
                    109:     char       *c;
                    110:     int                val;
                    111: 
                    112:     c = findcap (capname);
                    113:     if (*c == '@')
                    114:        return (-2);
                    115:     else if (*c != '\0') {
                    116:        c++;    /* skip '#' */
                    117:        val = 0;
                    118:        while (isdigit (*c)) {
                    119:            val = (val * 10) + (*c - '0');
                    120:            c++;
                    121:        }
                    122:        return (val);
                    123:     }
                    124:     else
                    125:        return (-1);
                    126: }
                    127: 
                    128: 
                    129: /*
                    130:  * tgetstr:
                    131:  *     store binary value of capname into value, store null if
                    132:  *     not present, store "@" if '@'ed.
                    133:  */
                    134: 
                    135: tgetstr (capname, value)
                    136: char           *capname;
                    137: register char  *value;
                    138: {
                    139:     register char      *c;
                    140: 
                    141:     c = findcap (capname);
                    142:     if (*c == '@')
                    143:        strcpy (value, "@");
                    144:     else if (*c != '\0') {
                    145:        c++;    /* skip '=' */
                    146:        while ((*c) && (*c != ':')) {
                    147:            if (*c == '^') {
                    148:                c++;
                    149:                if (islower (*c)) 
                    150:                    *(value++) = toupper(*(c++)) - '@'; /* ascii dependent */
                    151:                else
                    152:                    *(value++) = *(c++) - '@';  /* ascii dependent */
                    153:            }
                    154:            else if (*c == '\\') {
                    155:                c++;
                    156:                switch (*c) {
                    157:                    case 'E':
                    158:                        *(value++) = '\033';
                    159:                        c++;
                    160:                        break;
                    161:                    case 'n':
                    162:                        *(value++) = '\n';
                    163:                        c++;
                    164:                        break;
                    165:                    case 'r':
                    166:                        *(value++) = '\r';
                    167:                        c++;
                    168:                        break;
                    169:                    case 't':
                    170:                        *(value++) = '\t';
                    171:                        c++;
                    172:                        break;
                    173:                    case 'b':
                    174:                        *(value++) = '\b';
                    175:                        c++;
                    176:                        break;
                    177:                    case 'f':
                    178:                        *(value++) = '\f';
                    179:                        c++;
                    180:                        break;
                    181:                    default:
                    182:                        if (isdigit (*c)) {     /* octal value */
                    183:                            *value = '\0';
                    184:                            while (isdigit (*c)) {
                    185:                                *value = ((*value) * 8) + ((*c) - '0');
                    186:                                c++;
                    187:                            }
                    188:                            value++;
                    189:                        }
                    190:                        else
                    191:                            *(value++) = *(c++);
                    192:                        break;
                    193:                }
                    194:            }
                    195:            else
                    196:                *(value++) = *(c++);
                    197:        }
                    198:        *value = '\0';
                    199:     }
                    200:     else
                    201:        *value = '\0';
                    202: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.