diff options
Diffstat (limited to 'lib/libmytinfo/readcaps.c')
-rw-r--r-- | lib/libmytinfo/readcaps.c | 151 |
1 files changed, 151 insertions, 0 deletions
diff --git a/lib/libmytinfo/readcaps.c b/lib/libmytinfo/readcaps.c new file mode 100644 index 0000000..b78bdc1 --- /dev/null +++ b/lib/libmytinfo/readcaps.c @@ -0,0 +1,151 @@ +/* + * readcaps.c + * + * By Ross Ridge + * Public Domain + * 92/02/01 07:30:15 + * + * Read in the cap_list file + * + */ + +#define NOTLIB +#include "defs.h" + +#include <ctype.h> + +#ifdef USE_SCCS_IDS +static const char SCCSid[] = "@(#) mytinfo readcaps.c 3.2 92/02/01 public domain, By Ross Ridge"; +#endif + +#ifdef __GNUC__ +__inline__ +#endif +static int +skipline(f) +register FILE *f; { + register int c; + + do { + c = getc(f); + if (c == EOF) + return EOF; +#ifdef TEST + putchar(c); +#endif + } while (c != '\n'); + + return 0; +} + +#ifdef __GNUC__ +__inline__ +#endif +static int +getfield(f, s, len) +register FILE *f; +register char *s; +int len; { + register int c; + int i; +#ifdef TEST + char *start = s; +#endif + + do { + c = getc(f); + if (c == EOF) + return EOF; + } while (c != '\n' && isspace(c)); + if (c == '\n') + return 0; + + i = 0; + while(!isspace(c)) { + if (i++ < len) + *s++ = c; + c = getc(f); + if (c == EOF) + return EOF; + + } + *s = '\0'; +#ifdef TEST + printf(" %s", start); +#endif + return c; +} + +int +readcaps(f, buf, max) +FILE *f; +register struct caplist *buf; +int max; { + int type; + register int count; + int c; + static char dummy; + + count = 0; + type = getc(f); + while(type != EOF) { + if (type == '$' || type == '!' || type == '#') { + if (count >= max) + return count + 1; +#ifdef TEST + putchar(type); +#endif + buf[count].type = type; + + if (type == '$') { + c = getc(f); + if (c == EOF) + break; + if (c == 'G') + buf[count].flag = 'G'; + else if (c == 'K') + buf[count].flag = 'K'; + else + buf[count].flag = ' '; + } + + c = getfield(f, buf[count].var, MAX_VARNAME); + if (c == EOF || c == '\n' || c == 0) + return -1; + c = getfield(f, buf[count].tinfo, MAX_TINFONAME); + if (c == EOF || c == '\n' || c == 0) + return -1; + c = getfield(f, buf[count].tcap, MAX_TCAPNAME); + if (c == EOF || c == 0) + return -1; + if (c != '\n') + if (getfield(f, &dummy, 1) != 0) + return -1; + count++; +#ifdef TEST + putchar('\n'); +#endif + } else { +#ifdef TEST + putchar(type); +#endif + if (type != '\n' && skipline(f) == EOF) + return -1; + } + type = getc(f); + } + return count; +} + +#ifdef TEST +struct caplist list[1000]; + +int +main() { + int ret; + + ret = readcaps(stdin, list, 1000); + printf("ret = %d\n", ret); + return 0; +} +#endif |