blob: 4bc84adc84e63941ba41d0f27ce3a66b2db9085c [file] [log] [blame]
Alexandre Lision8af73cb2013-12-10 14:11:20 -05001/*
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
35static struct spex * s_spex;
36static int n_spex, m_spex;
37
38extern void write_code P((struct spex *, int));
39
40char * 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
52struct 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
67char * 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
100int 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
133int main P0()
134{
135 read_spex();
136 write_code(s_spex, n_spex);
137
138 exit(0);
139}