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
38 void Delmacro(int mx
) {
40 unsigned char buf
[MAXLINE
]; /* error message buffer */
41 int i
, j
; /* temporary indexes */
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
++) {
50 for (i
= mx
; i
< (Nmac
- 1); i
++) {
51 Macrotab
[i
] = Macrotab
[i
+1];
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
) {
63 * pointer to line containing fields p
64 * c = 1: make a copy of the field
66 unsigned char *fs
, *fe
, *s
;
72 while (*fe
== ' ' || *fe
== '\t')
75 while (*fe
&& *fe
!= ' ' && *fe
!= '\t')
82 if ((F
= (unsigned char *)malloc((size_t)(fe
- fs
+ 1)))
84 Error(FATAL
, LINE
, " Field out of string space",
86 (void) strncpy((char *)F
, (char *)fs
, (fe
- fs
));
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
108 int cmp
, hi
, low
, mid
;
111 c
[1] = (p
[1] == ' ' || p
[1] == '\t') ? '\0' : p
[1];
116 mid
= (low
+ hi
) / 2;
117 if ((cmp
= strncmp((char *)c
, (char *)Macrotab
[mid
].name
, 2))
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
]);
135 if (Nmac
>= MAXMACRO
)
136 Error(FATAL
, LINE
, " macro table full at ", (char *)c
);
140 for (hi
= Nmac
- 1; hi
>= mid
; hi
--)
141 Macrotab
[hi
+1] = Macrotab
[hi
];
144 Macrotab
[mid
].name
[0] = c
[0];
145 Macrotab
[mid
].name
[1] = c
[1];
149 Macrotab
[mid
].bx
= -1;
150 Macrotab
[mid
].ct
= 0;
154 void Free(unsigned char **p
) {
162 * Newstr(s) - allocate space for string
165 unsigned char *Newstr(unsigned char *s
) {
168 if ((ns
= (unsigned char *)malloc((size_t)(strlen((char *)s
) + 1)))
170 Error(FATAL
, LINE
, " Newstr out of malloc space at ", (char *)s
);
171 (void) strcpy((char *)ns
, (char *)s
);