2 * macsup.c - macro processing support functions for cawf(1)
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
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.
35 * Delmacro(mx) - delete macro
39 int mx
; /* macro index */
41 unsigned char buf
[MAXLINE
]; /* error message buffer */
42 int i
, j
; /* temporary indexes */
45 (void) sprintf((char *)buf
, " bad Delmacro(%d) index", mx
);
46 Error(FATAL
, LINE
, (char *)buf
, NULL
);
48 for (i
= Macrotab
[mx
].bx
, j
= i
+ Macrotab
[mx
].ct
; i
< j
; i
++) {
51 for (i
= mx
; i
< (Nmac
- 1); i
++) {
52 Macrotab
[i
] = Macrotab
[i
+1];
59 * Field(n, p, c) - skip to field n in p and optionally return a copy
64 int n
; /* field number */
65 unsigned char *p
; /* pointer to line containing fields */
66 int c
; /* 1: make a copy of the field */
68 unsigned char *fs
, *fe
, *s
;
74 while (*fe
== ' ' || *fe
== '\t')
77 while (*fe
&& *fe
!= ' ' && *fe
!= '\t')
84 if ((F
= (unsigned char *)malloc((size_t)(fe
- fs
+ 1)))
86 Error(FATAL
, LINE
, " Field out of string space",
88 (void) strncpy((char *)F
, (char *)fs
, (fe
- fs
));
98 * Findmacro(p, e) - find macro and optionally enter it
100 * return = Macrotab[] index or -1 if not found
105 unsigned char *p
; /* pointer to 2 character macro name */
106 int e
; /* 0 = find, don't enter
107 * 1 = enter, don't find */
110 int cmp
, hi
, low
, mid
;
113 c
[1] = (p
[1] == ' ' || p
[1] == '\t') ? '\0' : p
[1];
118 mid
= (low
+ hi
) / 2;
119 if ((cmp
= strncmp((char *)c
, (char *)Macrotab
[mid
].name
, 2))
127 Error(WARN
, LINE
, " duplicate macro ", (char *)c
);
128 hi
= Macrotab
[mid
].bx
+ Macrotab
[mid
].ct
;
129 for (low
= Macrotab
[mid
].bx
; low
< hi
; low
++) {
130 Free(&Macrotxt
[low
]);
137 if (Nmac
>= MAXMACRO
)
138 Error(FATAL
, LINE
, " macro table full at ", (char *)c
);
142 for (hi
= Nmac
- 1; hi
>= mid
; hi
--)
143 Macrotab
[hi
+1] = Macrotab
[hi
];
146 Macrotab
[mid
].name
[0] = c
[0];
147 Macrotab
[mid
].name
[1] = c
[1];
151 Macrotab
[mid
].bx
= -1;
152 Macrotab
[mid
].ct
= 0;
167 * Newstr(s) - allocate space for string
176 if ((ns
= (unsigned char *)malloc((size_t)(strlen((char *)s
) + 1)))
178 Error(FATAL
, LINE
, " Newstr out of malloc space at ", (char *)s
);
179 (void) strcpy((char *)ns
, (char *)s
);