diff options
author | ache <ache@FreeBSD.org> | 1994-10-06 23:38:41 +0000 |
---|---|---|
committer | ache <ache@FreeBSD.org> | 1994-10-06 23:38:41 +0000 |
commit | b32637dd9bf4e7ee14b7c850eff0ebc0fe42076a (patch) | |
tree | 42730d0413bbd6de0453b7861f6e510473226e61 /lib/libmytinfo/gettcap.c | |
download | FreeBSD-src-b32637dd9bf4e7ee14b7c850eff0ebc0fe42076a.zip FreeBSD-src-b32637dd9bf4e7ee14b7c850eff0ebc0fe42076a.tar.gz |
Moved from ports + several enhacmenets
Diffstat (limited to 'lib/libmytinfo/gettcap.c')
-rw-r--r-- | lib/libmytinfo/gettcap.c | 273 |
1 files changed, 273 insertions, 0 deletions
diff --git a/lib/libmytinfo/gettcap.c b/lib/libmytinfo/gettcap.c new file mode 100644 index 0000000..c3acf08 --- /dev/null +++ b/lib/libmytinfo/gettcap.c @@ -0,0 +1,273 @@ +/* + * gettcap.c + * + * By Ross Ridge + * Public Domain + * 92/02/01 07:30:00 + * + */ + +#include "defs.h" +#include <term.h> + +#include <ctype.h> + +#ifdef USE_SCCS_IDS +static const char SCCSid[] = "@(#) mytinfo gettcap.c 3.2 92/02/01 public domain, By Ross Ridge"; +#endif + +int +_gettcap(sp, cur, path) +register char *sp; +TERMINAL *cur; +struct term_path *path; { + static char name[MAX_NAME]; + static char entry[MAX_LINE]; + register char *dp; + register TERMINAL *ct = cur; + int i, pad, fract, mul = 0, ind; + char c, flag; + + dp = entry; + while(*sp != ':' && *sp != '\0') + *dp++ = *sp++; + if (ct->name_all == NULL) { + *dp = '\0'; + if ((ct->name_all = _addstr(entry)) == NULL) + return 1; + while(dp > entry && *--dp != '|'); + ct->name_long = ct->name_all + (dp - entry) + 1; + } + + while(*sp != '\0') { + while(*sp == ':') + sp++; + while(isspace(*sp)) + sp++; + if (*sp == ':') + continue; + if (*sp == '\0') + break; + dp = name; + while (*sp != ':' && *sp != '#' && *sp != '=' && + !isspace(*sp) && *sp != '\0') + *dp++ = *sp++; + *dp = '\0'; +#ifdef DEBUG + printf(" %s", name); +#endif + switch(*sp) { + case '=': +#ifdef DEBUG + putchar('$'); +#endif + ind = _findstrcode(name); + if (ind != -1) + flag = _strflags[ind]; + else + flag = 'K'; + dp = entry; + fract = pad = 0; + sp++; + if (isdigit(*sp) && flag != 'K') { + pad = *sp++ - '0'; + while(isdigit(*sp)) + pad = pad * 10 + (*sp++ - '0'); + if (*sp == '.' && isdigit(sp[1])) { + sp++; + fract = (*sp++ - '0'); + } + if (*sp == '*') { + mul = 1; + sp++; + } else + mul = 0; + + } + while(*sp != '\0' && *sp != ':') { + switch(*sp) { + case '\\': + switch(*++sp) { + case 'e': + case 'E': *dp++ = '\033'; break; + case 'l': *dp++ = '\012'; break; + case 'n': *dp++ = '\n'; break; + case 'r': *dp++ = '\r'; break; + case 't': *dp++ = '\t'; break; + case 'b': *dp++ = '\b'; break; + case 'f': *dp++ = '\f'; break; + case 's': *dp++ = ' '; break; + + case '^': + case '\\': + case ',': + case ':': + *dp++ = *sp; + break; + + case '0': + if (!isdigit(*(sp + 1))) { + *dp++ = '\200'; + break; + } + ;/* FALLTHROUGH */ + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + c = *sp - '0'; + if (sp[1] >= '0' + && sp[1] <= '8') + c = c * 8 + + (*++sp - '0'); + if (sp[1] >= '0' + && sp[1] <= '8') + c = c * 8 + + (*++sp - '0'); + switch((char)c) { + case 0: + if (flag == 'K') + *dp++ = '\200'; + else { + *dp++ = '\\'; + *dp++ = '0'; + *dp++ = '0'; + *dp++ = '0'; + } + break; + case '$': + case '\'': + case '\\': + if (flag != 'K') + *dp++ = '\\'; + /* FALLTHROUGH */ + default: + if (flag == 'G' + && c == '%') + *dp++ = '\\'; + *dp++ = c; + break; + } + break; + default: + *dp++ = '\\'; + *dp++ = *sp; + break; + } + sp++; + break; + case '^': + if (*++sp >= 'A' && *sp <= '_') { + *dp++ = *sp++ - '@'; + } else if (*sp >= 'a' && *sp <= 'z') { + *dp++ = *sp++ - 'a' + 1; + } else if (*sp == '@') { + if (flag == 'K') + *dp++ = '\200'; + else { + *dp++ = '\\'; + *dp++ = '0'; + *dp++ = '0'; + *dp++ = '0'; + } + sp++; + } else + *dp++ = '^'; + break; + case '$': + if (flag != 'K') + *dp++ = '\\'; + /* FALLTHROUGH */ + default: + *dp++ = *sp++; + break; + } + } + if (pad != 0 || fract != 0) { + if (fract == 0) + sprintf(dp, "$<%d", pad); + else + sprintf(dp, "$<%d.%d", pad, fract); + dp += strlen(dp); + if (mul) + *dp++ = '*'; + *dp++ = '>'; + } + *dp++ = '\0'; + if(name[0] == 't' && name[1] == 'c' && name[2] == '\0'){ + if (_getother(entry, path, ct)) + return 1; + break; + } + if (ind == -1) + break; + if (ct->strs[ind] != (char *) -1) + break; + if ((ct->strs[ind] = _addstr(entry)) == NULL) + return 1; + break; + case '#': +#ifdef DEBUG + putchar('#'); +#endif + i = atoi(++sp); + while(*sp != '\0' && *sp++ != ':'); + ind = _findnumcode(name); + if (ind == -1) + break; + if (ct->nums[ind] != -2) + break; + ct->nums[ind] = i; + break; + default: + while(*sp != '\0' && *sp++ != ':'); + if (*(dp - 1) == '@') { +#ifdef DEBUG + putchar('@'); +#endif + *(dp - 1) = '\0'; + ind = _findboolcode(name); + if (ind != -1) { +#ifdef DEBUG + putchar('!'); +#endif + if (ct->bools[ind] == -1) + ct->bools[ind] = 0; + break; + } + ind = _findnumcode(name); + if (ind != -1) { +#ifdef DEBUG + putchar('#'); +#endif + if (ct->nums[ind] == -2) + ct->nums[ind] = -1; + break; + } + ind = _findstrcode(name); + if (ind != -1) { +#ifdef DEBUG + putchar('$'); +#endif + if (ct->strs[ind] == (char *) -1) + ct->strs[ind] = NULL; + break; + } + break; + } +#ifdef DEBUG + putchar('!'); +#endif + ind = _findboolcode(name); + if (ind == -1) + break; + if (ct->bools[ind] != -1) + break; + ct->bools[ind] = 1; + } + } + return 0; +} |