|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.