| /* |
| * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische |
| * Universitaet Berlin. See the accompanying file "COPYRIGHT" for |
| * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE. |
| */ |
| |
| /*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/taste.c,v 1.1 1992/10/28 00:28:39 jutta Exp $*/ |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <memory.h> |
| |
| #include "config.h" |
| |
| #ifdef HAS_STDLIB_H |
| # include <stdlib.h> |
| #else |
| #include "proto.h" |
| # ifdef HAS_MALLOC_H |
| # include <malloc.h> |
| # else |
| extern char * malloc P((char *)), * realloc P((char *,int)); |
| # endif |
| extern int exit P((int)); |
| #endif |
| |
| #include "proto.h" |
| |
| /* |
| * common code to sweet.c and bitter.c: read the name:#bits description. |
| */ |
| |
| #include "taste.h" |
| |
| static struct spex * s_spex; |
| static int n_spex, m_spex; |
| |
| extern void write_code P((struct spex *, int)); |
| |
| char * strsave P1((str), char * str) /* strdup() + errors */ |
| { |
| int n = strlen(str) + 1; |
| char * s = malloc(n); |
| if (!s) { |
| fprintf(stderr, "Failed to malloc %d bytes, abort\n", |
| strlen(str) + 1); |
| exit(1); |
| } |
| return memcpy(s, str, n); |
| } |
| |
| struct spex * new_spex P0() |
| { |
| if (n_spex >= m_spex) { |
| m_spex += 500; |
| if (!(s_spex = (struct spex *)(n_spex |
| ? realloc((char *)s_spex, m_spex * sizeof(*s_spex)) |
| : malloc( m_spex * sizeof(*s_spex))))) { |
| fprintf(stderr, "Failed to malloc %d bytes, abort\n", |
| m_spex * sizeof(*s_spex)); |
| exit(1); |
| } |
| } |
| return s_spex + n_spex; |
| } |
| |
| char * strtek P2((str, sep), char * str, char * sep) { |
| |
| static char * S = (char *)0; |
| char * c, * base; |
| |
| if (str) S = str; |
| |
| if (!S || !*S) return (char *)0; |
| |
| /* Skip delimiters. |
| */ |
| while (*S) { |
| for (c = sep; *c && *c != *S; c++) ; |
| if (*c) *S++ = 0; |
| else break; |
| } |
| |
| base = S; |
| |
| /* Skip non-delimiters. |
| */ |
| for (base = S; *S; S++) { |
| |
| for (c = sep; *c; c++) |
| if (*c == *S) { |
| *S++ = 0; |
| return base; |
| } |
| } |
| |
| return base == S ? (char *)0 : base; |
| } |
| |
| int read_spex P0() |
| { |
| char buf[200]; |
| char * s, *t; |
| struct spex * sp = s_spex; |
| |
| while (fgets(buf, sizeof buf, stdin)) { |
| |
| char * nl; |
| |
| if (nl = strchr(buf, '\n')) |
| *nl = '\0'; |
| |
| if (!*buf || *buf == ';') continue; |
| s = strtek(buf, " \t"); |
| if (!s) { |
| fprintf(stderr, "? %s\n", buf); |
| continue; |
| } |
| sp = new_spex(); |
| sp->var = strsave(s); |
| s = strtek((char*)0, " \t"); |
| if (!s) { |
| fprintf(stderr, "varsize?\n"); |
| continue; |
| } |
| sp->varsize = strtol(s, (char **)0, 0); |
| n_spex++; |
| } |
| |
| return sp - s_spex; |
| } |
| |
| int main P0() |
| { |
| read_spex(); |
| write_code(s_spex, n_spex); |
| |
| exit(0); |
| } |