home *** CD-ROM | disk | FTP | other *** search
- /************************************************************************
- * *
- * Copyright (c) 1982, Fred Fish *
- * All Rights Reserved *
- * *
- * This software and/or documentation is released for public *
- * distribution for personal, non-commercial use only. *
- * Limited rights to use, modify, and redistribute are hereby *
- * granted for non-commercial purposes, provided that all *
- * copyright notices remain intact and all changes are clearly *
- * documented. The author makes no warranty of any kind with *
- * respect to this product and explicitly disclaims any implied *
- * warranties of merchantability or fitness for any particular *
- * purpose. *
- * *
- ************************************************************************
- */
-
- /* In order to reduce the size of this file drastically, the large
- * comments and pseudo code was removed as well as the padding stuff
- * which is not needed for OS/2. Size went from 28k down to 8k.
- */
-
- #include <stdlib.h>
- #include <ctype.h>
- #include <stdio.h>
- #include <string.h>
-
- static char *fgetlr(char *bp, int bpsize, FILE *fp);
- static FILE *find_file(char *bp);
- static gotcha(char *bp, char *name);
- static char *decode(char *bp, char **area);
- static char *do_esc(char *out, char *in);
- static void process(void);
-
- #define TRUE 1
- #define FALSE 0
- #define BUFSIZE 1024 /* Assumed size of external buffer */
-
- #define NO_FILE -1 /* Returned if can't open file */
- #define NO_ENTRY 0 /* Returned if can't find entry */
- #define SUCCESS 1 /* Returned if entry found ok */
- #define TRUNCATED 2 /* Returned if entry found but trunc */
-
- # ifdef DGK
- # define DEFAULT_ROOT "termcap.cnf" /* name without path component */
- FILE *fopenp();
- # endif
-
- # define DEFAULT_FILE "termcap.dat"
-
- char *_tcpbuf; /* Place to remember buffer pointer */
-
- # define index strchr
-
-
- static char *fgetlr(bp,bpsize,fp)
- char *bp;
- int bpsize;
- FILE *fp;
- {
- int numch;
- char *cp;
-
- if (fgets(bp,bpsize,fp) == NULL) {
- return(NULL);
- } else {
- numch = strlen(bp);
- cp = &bp[numch];
- if (*--cp == '\n') {
- if (numch > 1 && *--cp == '\\') {
- *cp++ = '\n';
- *cp = 0;
- fgetlr(cp,bpsize-numch+1,fp);
- }
- }
- return(bp);
- }
- }
-
-
- int tgetent(bp,name)
- char *bp; /* Pointer to buffer (1024 char min) */
- char *name; /* Pointer to terminal entry to find */
- {
- FILE *fp;
-
- *bp = 0;
- _tcpbuf = bp;
- if ((fp = find_file(bp)) == NULL) {
- if (*bp != 0) {
- return(SUCCESS);
- } else {
- return(NO_FILE);
- }
- } else {
- while (fgetlr(bp,BUFSIZE,fp)) {
- if (gotcha(bp,name)) {
- fclose(fp);
- if (bp[strlen(bp)-1] != '\n') {
- return(TRUNCATED);
- } else {
- return(SUCCESS);
- }
- }
- }
- return(NO_ENTRY);
- }
- }
-
-
- static FILE *find_file(bp)
- char *bp;
- {
- FILE *fp;
- char *cp, *ncp;
-
- if ((cp = getenv("TERMCAP")) != NULL) {
- if (*cp != 0) {
- if (*cp == '/' || *cp == '\\') {
- if ((fp = fopen(cp,"r")) != NULL) {
- return(fp);
- }
- } else {
- if ((ncp = getenv("TERM")) != NULL) {
- if (strcmp(cp,ncp) == 0) {
- strcpy(bp,cp);
- return((FILE *)NULL);
- }
- }
- }
- }
- }
- {
- char path[128];
-
- _searchenv(DEFAULT_FILE, "INIT", path);
- if ( path[0] == 0 )
- _searchenv(DEFAULT_FILE, "PATH", path);
- if ( path[0] == 0 )
- _searchenv(DEFAULT_FILE, "DPATH", path);
-
- return(fopen(path,"r"));
- }
- }
-
-
- static int gotcha(bp,name)
- char *bp;
- char *name;
- {
- char *np;
-
- if (*bp == '#') {
- return(FALSE);
- } else {
- np = name;
- while (*np == *bp && *np != 0) {np++; bp++;}
- if (*np == 0 && (*bp == 0 || *bp == '|' || *bp == ':')) {
- return(TRUE);
- } else {
- while (*bp != 0 && *bp != ':' && *bp != '|') {bp++;}
- if (*bp != '|') {
- return(FALSE);
- } else {
- return(gotcha(++bp,name));
- }
- }
- }
- }
-
-
- tgetflag(id)
- char *id;
- {
- char *bp;
-
- bp = _tcpbuf;
- while ((bp = index(bp,':')) != NULL) {
- bp++;
- if (*bp++ == id[0] && *bp != 0 && *bp++ == id[1]) {
- if (*bp == 0 || *bp++ == ':') {
- return(TRUE);
- } else {
- return(FALSE);
- }
- }
- }
- return(FALSE);
- }
-
-
- tgetnum(id)
- char *id;
- {
- int value, base;
- char *bp;
-
- bp = _tcpbuf;
- while ((bp = index(bp,':')) != NULL) {
- bp++;
- if (*bp++ == id[0] && *bp != 0 && *bp++ == id[1]) {
- if (*bp != 0 && *bp++ != '#') {
- return(-1);
- } else {
- value = 0;
- if (*bp == '0') {
- base = 8;
- } else {
- base = 10;
- }
- while (isdigit(*bp)) {
- value *= base;
- value += (*bp++ - '0');
- }
- return(value);
- }
- }
- }
- return(-1);
- }
-
-
- char *tgetstr(id,area)
- char *id;
- char **area;
- {
- char *bp;
- char *decode();
-
- bp = _tcpbuf;
- while ((bp = index(bp,':')) != NULL) {
- bp++;
- if (*bp++ == id[0] && *bp != 0 && *bp++ == id[1]) {
- if (*bp != 0 && *bp++ != '=') {
- return(NULL);
- } else {
- return(decode(bp,area));
- }
- }
- }
- return(NULL);
- }
-
-
- static char *decode(bp,area)
- char *bp;
- char **area;
- {
- char *cp, *bgn;
- char *do_esc();
-
- cp = *area;
- while (*bp != 0 && *bp != ':') {
- switch(*bp) {
- case '\\':
- bp = do_esc(cp++,++bp);
- break;
- case '^':
- *cp++ = (char) (*++bp & 037);
- bp++;
- break;
- default:
- *cp++ = *bp++;
- break;
- }
- }
- *cp++ = 0;
- bgn = *area;
- *area = cp;
- return(bgn);
- }
-
-
- static char *maplist = {
- "E\033b\bf\fn\nr\rt\t"
- };
-
- char *do_esc(out,in)
- char *out;
- char *in;
- {
- int count;
- char ch;
- char *cp;
-
- if (*in != 0) {
- if (isdigit(*in)) {
- ch = 0;
- for (count = 0; count < 3 && isdigit(*in); in++) {
- ch <<= 3;
- ch |= (*in - '0');
- }
- *out++ = ch;
- } else if ((cp = index(maplist,*in)) != NULL) {
- *out++ = *++cp;
- in++;
- } else {
- *out++ = *in++;
- }
- }
- return(in);
- }
-
-
- #define MAXARGS 2
-
- static char *in; /* Internal copy of input string pointer */
- static char *out; /* Pointer to output array */
- static int args[MAXARGS]; /* Maximum number of args to convert */
- static int pcount; /* Count of args processed */
- static char output[64]; /* Converted string */
-
- char *tgoto(cm,destcol,destline)
- char *cm;
- int destcol;
- int destline;
- {
- if (cm == NULL) {
- return("OOPS");
- } else {
- in = cm;
- out = output;
- args[0] = destline;
- args[1] = destcol;
- pcount = 0;
- while (*in != 0) {
- if (*in != '%') {
- *out++ = *in++;
- } else {
- process();
- }
- }
- *out++ = 0;
- return(output);
- }
- }
-
-
- static void process()
- {
- int temp;
-
- in++;
- switch(*in++) {
- case 'd':
- sprintf(out,"%d",args[pcount++]);
- out = &output[strlen(output)];
- break;
- case '2':
- sprintf(out,"%02d",args[pcount++]);
- out = &output[strlen(output)];
- break;
- case '3':
- sprintf(out,"%03d",args[pcount++]);
- out = &output[strlen(output)];
- break;
- case '.':
- *out++ = (char) args[pcount++];
- break;
- case '+':
- *out++ = (char) args[pcount++] + *in++;
- break;
- case '>':
- if (args[pcount] > (int) *in++) {
- args[pcount] += *in++;
- } else {
- in++;
- }
- break;
- case 'r':
- temp = args[pcount];
- args[pcount] = args[pcount+1];
- args[pcount+1] = temp;
- break;
- case 'i':
- args[pcount]++;
- args[pcount+1]++;
- break;
- case '%':
- *out++ = '%';
- break;
- }
- }
-
-
- void tputs(cp,affcnt,outc)
- char *cp;
- int affcnt;
- int (*outc)(int);
- {
- int ptime; /* Pad time in tenths of milliseconds */
-
- if (cp == NULL || *cp == 0) {
- return;
- } else {
- for (ptime = 0; isdigit(*cp); cp++) {
- ptime *= 10;
- ptime += (*cp - '0');
- }
- ptime *= 10;
- if (*cp == '.') {
- cp++;
- if (isdigit(*cp)) {
- ptime += (*cp++ - '0');
- }
- while (isdigit(*cp)) {cp++;}
- }
- if (*cp == '*') {
- ptime *= affcnt;
- cp++;
- }
- while (*cp != 0) {
- (*outc)(*cp++);
- }
- }
- }
-