xref: /aosp_15_r20/external/libgsm/tls/taste.c (revision 8ec969cea971fe25ff2d3933a5a9f8504f8e86c9)
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