Remove building with NOCRYPTO option
[minix.git] / minix / commands / cawf / macsup.c
blob845bd00d8c60703dc6b0b83321c9f8df96fa3317
1 /*
2 * macsup.c - macro processing support functions for cawf(1)
3 */
5 /*
6 * Copyright (c) 1991 Purdue University Research Foundation,
7 * West Lafayette, Indiana 47907. All rights reserved.
9 * Written by Victor A. Abell <abe@mace.cc.purdue.edu>, Purdue
10 * University Computing Center. Not derived from licensed software;
11 * derived from awf(1) by Henry Spencer of the University of Toronto.
13 * Permission is granted to anyone to use this software for any
14 * purpose on any computer system, and to alter it and redistribute
15 * it freely, subject to the following restrictions:
17 * 1. The author is not responsible for any consequences of use of
18 * this software, even if they arise from flaws in it.
20 * 2. The origin of this software must not be misrepresented, either
21 * by explicit claim or by omission. Credits must appear in the
22 * documentation.
24 * 3. Altered versions must be plainly marked as such, and must not
25 * be misrepresented as being the original software. Credits must
26 * appear in the documentation.
28 * 4. This notice may not be removed or altered.
31 #include "cawf.h"
35 * Delmacro(mx) - delete macro
38 void Delmacro(int mx) {
39 /* macro index mx */
40 unsigned char buf[MAXLINE]; /* error message buffer */
41 int i, j; /* temporary indexes */
43 if (mx >= Nmac) {
44 (void) sprintf((char *)buf, " bad Delmacro(%d) index", mx);
45 Error(FATAL, LINE, (char *)buf, NULL);
47 for (i = Macrotab[mx].bx, j = i + Macrotab[mx].ct; i < j; i++) {
48 Free(&Macrotxt[i]);
50 for (i = mx; i < (Nmac - 1); i++) {
51 Macrotab[i] = Macrotab[i+1];
53 Nmac--;
58 * Field(n, p, c) - skip to field n in p and optionally return a copy
61 unsigned char *Field(int n, unsigned char *p, int c) {
62 /* field number n
63 * pointer to line containing fields p
64 * c = 1: make a copy of the field
66 unsigned char *fs, *fe, *s;
68 if (c)
69 Free(&F);
70 fe = p;
71 while (n) {
72 while (*fe == ' ' || *fe == '\t')
73 fe++;
74 fs = fe;
75 while (*fe && *fe != ' ' && *fe != '\t')
76 fe++;
77 if (fs == fe)
78 return(NULL);
79 if (n == 1) {
80 if ( ! c)
81 return(fs);
82 if ((F = (unsigned char *)malloc((size_t)(fe - fs + 1)))
83 == NULL)
84 Error(FATAL, LINE, " Field out of string space",
85 NULL);
86 (void) strncpy((char *)F, (char *)fs, (fe - fs));
87 F[fe -fs] = '\0';
88 return(F);
90 n--;
92 return(NULL);
96 * Findmacro(p, e) - find macro and optionally enter it
98 * return = Macrotab[] index or -1 if not found
102 int Findmacro(unsigned char *p, int e) {
103 /* pointer to 2 character macro name p
104 * e = 0 = find, don't enter
105 * e = 1 = enter, don't find
107 unsigned char c[3];
108 int cmp, hi, low, mid;
110 c[0] = p[0];
111 c[1] = (p[1] == ' ' || p[1] == '\t') ? '\0' : p[1];
112 c[2] = '\0';
113 low = mid = 0;
114 hi = Nmac - 1;
115 while (low <= hi) {
116 mid = (low + hi) / 2;
117 if ((cmp = strncmp((char *)c, (char *)Macrotab[mid].name, 2))
118 < 0)
119 hi = mid - 1;
120 else if (cmp > 0)
121 low = mid + 1;
122 else {
123 if ( ! e)
124 return(mid);
125 Error(WARN, LINE, " duplicate macro ", (char *)c);
126 hi = Macrotab[mid].bx + Macrotab[mid].ct;
127 for (low = Macrotab[mid].bx; low < hi; low++) {
128 Free(&Macrotxt[low]);
130 goto new_macro;
133 if ( ! e)
134 return(-1);
135 if (Nmac >= MAXMACRO)
136 Error(FATAL, LINE, " macro table full at ", (char *)c);
137 if (Nmac) {
138 if (cmp > 0)
139 mid++;
140 for (hi = Nmac - 1; hi >= mid; hi--)
141 Macrotab[hi+1] = Macrotab[hi];
143 Nmac++;
144 Macrotab[mid].name[0] = c[0];
145 Macrotab[mid].name[1] = c[1];
147 new_macro:
149 Macrotab[mid].bx = -1;
150 Macrotab[mid].ct = 0;
151 return(mid);
154 void Free(unsigned char **p) {
155 if (*p != NULL) {
156 (void) free(*p);
157 *p = NULL;
162 * Newstr(s) - allocate space for string
165 unsigned char *Newstr(unsigned char *s) {
166 unsigned char *ns;
168 if ((ns = (unsigned char *)malloc((size_t)(strlen((char *)s) + 1)))
169 == NULL)
170 Error(FATAL, LINE, " Newstr out of malloc space at ", (char *)s);
171 (void) strcpy((char *)ns, (char *)s);
172 return(ns);