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