1 /*
2 * Copyright 1992 by Jutta Degener and Carsten Bormann, Technische
3 * Universitaet Berlin. See the accompanying file "COPYRIGHT" for
4 * details. THERE IS ABSOLUTELY NO WARRANTY FOR THIS SOFTWARE.
5 */
6
7 /*$Header: /tmp_amd/presto/export/kbs/jutta/src/gsm/RCS/taste.c,v 1.1 1992/10/28 00:28:39 jutta Exp $*/
8
9 #include <stdio.h>
10 #include <string.h>
11 #include <memory.h>
12
13 #include "config.h"
14
15 #ifdef HAS_STDLIB_H
16 # include <stdlib.h>
17 #else
18 #include "proto.h"
19 # ifdef HAS_MALLOC_H
20 # include <malloc.h>
21 # else
22 extern char * malloc P((char *)), * realloc P((char *,int));
23 # endif
24 extern int exit P((int));
25 #endif
26
27 #include "proto.h"
28
29 /*
30 * common code to sweet.c and bitter.c: read the name:#bits description.
31 */
32
33 #include "taste.h"
34
35 static struct spex * s_spex;
36 static int n_spex, m_spex;
37
38 extern void write_code P((struct spex *, int));
39
40 char * strsave P1((str), char * str) /* strdup() + errors */
41 {
42 int n = strlen(str) + 1;
43 char * s = malloc(n);
44 if (!s) {
45 fprintf(stderr, "Failed to malloc %d bytes, abort\n",
46 strlen(str) + 1);
47 exit(1);
48 }
49 return memcpy(s, str, n);
50 }
51
P0()52 struct spex * new_spex P0()
53 {
54 if (n_spex >= m_spex) {
55 m_spex += 500;
56 if (!(s_spex = (struct spex *)(n_spex
57 ? realloc((char *)s_spex, m_spex * sizeof(*s_spex))
58 : malloc( m_spex * sizeof(*s_spex))))) {
59 fprintf(stderr, "Failed to malloc %d bytes, abort\n",
60 m_spex * sizeof(*s_spex));
61 exit(1);
62 }
63 }
64 return s_spex + n_spex;
65 }
66
67 char * strtek P2((str, sep), char * str, char * sep) {
68
69 static char * S = (char *)0;
70 char * c, * base;
71
72 if (str) S = str;
73
74 if (!S || !*S) return (char *)0;
75
76 /* Skip delimiters.
77 */
78 while (*S) {
79 for (c = sep; *c && *c != *S; c++) ;
80 if (*c) *S++ = 0;
81 else break;
82 }
83
84 base = S;
85
86 /* Skip non-delimiters.
87 */
88 for (base = S; *S; S++) {
89
90 for (c = sep; *c; c++)
91 if (*c == *S) {
92 *S++ = 0;
93 return base;
94 }
95 }
96
97 return base == S ? (char *)0 : base;
98 }
99
P0()100 int read_spex P0()
101 {
102 char buf[200];
103 char * s, *t;
104 struct spex * sp = s_spex;
105
106 while (fgets(buf, sizeof buf, stdin)) {
107
108 char * nl;
109
110 if (nl = strchr(buf, '\n'))
111 *nl = '\0';
112
113 if (!*buf || *buf == ';') continue;
114 s = strtek(buf, " \t");
115 if (!s) {
116 fprintf(stderr, "? %s\n", buf);
117 continue;
118 }
119 sp = new_spex();
120 sp->var = strsave(s);
121 s = strtek((char*)0, " \t");
122 if (!s) {
123 fprintf(stderr, "varsize?\n");
124 continue;
125 }
126 sp->varsize = strtol(s, (char **)0, 0);
127 n_spex++;
128 }
129
130 return sp - s_spex;
131 }
132
P0()133 int main P0()
134 {
135 read_spex();
136 write_code(s_spex, n_spex);
137
138 exit(0);
139 }
140