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