123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139 |
- /*
- * 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);
- }
|