1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* Copyright (c) 1988 AT&T */ 22 /* All Rights Reserved */ 23 24 25 /* 26 * Copyright (c) 1989, 2010, Oracle and/or its affiliates. All rights reserved. 27 */ 28 29 /* 30 * Copyright (c) 2011 Gary Mills 31 */ 32 33 #ifndef _M4_H 34 #define _M4_H 35 36 #include <ctype.h> 37 #include <stdio.h> 38 #include <stdlib.h> 39 #include <string.h> 40 #include <errno.h> 41 #include <locale.h> 42 #include <limits.h> 43 44 #include <wchar.h> 45 #include <wctype.h> 46 47 #define EOS ((wchar_t)0) 48 #define MAXSYM 5 49 #define PUSH 1 50 #define NOPUSH 0 51 #define OK 0 52 #define NOT_OK 1 53 54 /* Used in m4.c and m4ext.c */ 55 #define DEF_HSHSIZE 199 /* default hash table size (prime). */ 56 #define DEF_BUFSIZE 4096 /* default pushback & arg text buffers size */ 57 #define DEF_STKSIZE 100 /* default call stack size */ 58 #define DEF_TOKSIZE 512 /* default token buffer size */ 59 60 #define BUILTIN 0x40000000 61 #define INVALID_CHAR 0x80000000 62 #define builtin(x) ((x) | BUILTIN) 63 #define builtin_idx(x) ((x) & (wchar_t)~BUILTIN) 64 #define is_builtin(x) ((x) != WEOF && ((x) & BUILTIN)) 65 66 /* 67 * Since we have expanded char to wchar_t, large vaule(has BUILTIN set) 68 * can be given to the ctype macros. First check BUILTIN, and return 69 * FALSE if it was set. EOF/WEOF will be in this case. 70 */ 71 #define is_alpha(x) (!is_builtin(x) && \ 72 (wide ? iswalpha(x) : isalpha(x))) 73 #define is_alnum(x) (!is_builtin(x) && \ 74 (wide ? iswalnum(x) : isalnum(x))) 75 #define is_space(x) (!is_builtin(x) && \ 76 (wide ? iswspace(x) : isspace(x))) 77 #define is_digit(x) (!is_builtin(x) && iswascii(x) && isdigit(x)) 78 79 80 struct bs { 81 void (*bfunc)(wchar_t **, int); 82 wchar_t *bname; 83 }; 84 85 struct call { 86 wchar_t **argp; 87 int plev; 88 }; 89 90 struct nlist { 91 wchar_t *name; 92 wchar_t *def; 93 char tflag; 94 struct nlist *next; 95 }; 96 97 struct Wrap { 98 wchar_t *wrapstr; 99 struct Wrap *nxt; 100 }; 101 102 typedef struct { 103 unsigned char buffer[MB_LEN_MAX + 1]; 104 char nbytes; 105 } ibuf_t; 106 107 extern FILE *cf; 108 extern FILE *ifile[]; 109 extern FILE *ofile[]; 110 extern FILE *xfopen(char *, char *); 111 extern wchar_t **Ap; 112 extern wchar_t **argstk; 113 extern wchar_t *astklm; 114 extern void *xmalloc(size_t); 115 extern char *fname[]; 116 extern wchar_t *ibuf; 117 extern wchar_t *ibuflm; 118 extern wchar_t *ip; 119 extern wchar_t *ipflr; 120 extern wchar_t *ipstk[10]; 121 extern wchar_t *obuf; 122 extern wchar_t *obuflm; 123 extern wchar_t *op; 124 extern char *procnam; 125 extern char *tempfile; 126 extern wchar_t *token; 127 extern wchar_t *toklm; 128 extern wchar_t C; 129 extern wchar_t getchr(); 130 extern wchar_t lcom[]; 131 extern wchar_t lquote[]; 132 extern wchar_t nullstr[]; 133 extern wchar_t rcom[]; 134 extern wchar_t rquote[]; 135 extern int bufsize; 136 extern int fline[]; 137 extern int hshsize; 138 extern unsigned int hshval; 139 extern int ifx; 140 extern int nflag; 141 extern int ofx; 142 extern int sflag; 143 extern int stksize; 144 extern int sysrval; 145 extern int toksize; 146 extern int trace; 147 extern int exitstat; 148 extern long ctol(wchar_t *); 149 extern struct bs barray[]; 150 extern struct call *Cp; 151 extern struct call *callst; 152 extern struct nlist **hshtab; 153 extern void install(); 154 extern struct nlist *lookup(); 155 extern struct Wrap *wrapstart; 156 extern int wide; 157 extern ibuf_t ibuffer[]; 158 159 extern void setfname(char *); 160 extern void pbstr(wchar_t *); 161 extern void pbnum(long); 162 extern void pbnbr(long, int, int); 163 extern void undiv(int, int); 164 extern void delexit(int, int); 165 extern void error(char *); 166 extern int min(int, int); 167 extern void putbak(wchar_t); 168 extern void stkchr(wchar_t); 169 extern void errorf(char *, char *); 170 extern void error2(char *, int); 171 172 extern wchar_t *wstrdup(wchar_t *); 173 extern int wstoi(wchar_t *); 174 extern char *wstr2str(wchar_t *, int); 175 extern wchar_t *str2wstr(char *, int); 176 177 extern void dodef(wchar_t **, int); 178 extern void doundef(wchar_t **, int); 179 extern int undef(wchar_t *); 180 181 /* 182 * macros for performance reason. 183 */ 184 #define putbak(c) \ 185 if (ip < ibuflm) \ 186 *ip++ = (c); \ 187 else \ 188 error2(gettext("pushed back more than %d chars"), bufsize) 189 190 #define stkchr(c) \ 191 if (op < obuflm) \ 192 *op++ = (c); \ 193 else \ 194 error2(gettext("more than %d chars of argument text"), bufsize) 195 196 #endif /* _M4_H */ 197