Home | History | Annotate | Download | only in tls
      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 
     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 
    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 
    133 int main P0()
    134 {
    135 	read_spex();
    136 	write_code(s_spex, n_spex);
    137 
    138 	exit(0);
    139 }
    140