1100Smike_s /* 2100Smike_s * CDDL HEADER START 3100Smike_s * 4100Smike_s * The contents of this file are subject to the terms of the 54538Sdamico * Common Development and Distribution License (the "License"). 64538Sdamico * You may not use this file except in compliance with the License. 7100Smike_s * 8100Smike_s * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9100Smike_s * or http://www.opensolaris.org/os/licensing. 10100Smike_s * See the License for the specific language governing permissions 11100Smike_s * and limitations under the License. 12100Smike_s * 13100Smike_s * When distributing Covered Code, include this CDDL HEADER in each 14100Smike_s * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15100Smike_s * If applicable, add the following below this CDDL HEADER, with the 16100Smike_s * fields enclosed by brackets "[]" replaced with your own identifying 17100Smike_s * information: Portions Copyright [yyyy] [name of copyright owner] 18100Smike_s * 19100Smike_s * CDDL HEADER END 20100Smike_s */ 21100Smike_s /* 22*6951Sab196087 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23100Smike_s * Use is subject to license terms. 24100Smike_s */ 25100Smike_s 26100Smike_s /* Copyright (c) 1988 AT&T */ 27100Smike_s /* All Rights Reserved */ 28100Smike_s 29100Smike_s #ifndef _DEXTERN_H 30100Smike_s #define _DEXTERN_H 31100Smike_s 32100Smike_s #pragma ident "%Z%%M% %I% %E% SMI" 33100Smike_s 34100Smike_s #include <stdio.h> 35100Smike_s #include <inttypes.h> 36100Smike_s #include <ctype.h> 37100Smike_s #include <memory.h> 38100Smike_s #include <string.h> 39100Smike_s #include <malloc.h> 40100Smike_s #include <values.h> 41100Smike_s #include <widec.h> 42100Smike_s #include <unistd.h> 43100Smike_s #include <stdlib.h> 44100Smike_s #include <wctype.h> 45100Smike_s 46100Smike_s #ifdef __cplusplus 47100Smike_s extern "C" { 48100Smike_s #endif 49100Smike_s 50100Smike_s /* MANIFEST CONSTANT DEFINITIONS */ 51100Smike_s #if u3b || u3b15 || u3b2 || vax || uts || sparc 52100Smike_s #define WORD32 53100Smike_s #endif 54100Smike_s #include <libintl.h> 55100Smike_s 56100Smike_s /* base of nonterminal internal numbers */ 57100Smike_s 58100Smike_s #define NTBASE (10000000) 59100Smike_s 60100Smike_s /* internal codes for error and accept actions */ 61100Smike_s 62100Smike_s #define ERRCODE 8190 63100Smike_s #define ACCEPTCODE 8191 64100Smike_s 65100Smike_s /* sizes and limits */ 66100Smike_s 67100Smike_s #define ACTSIZE 4000 68100Smike_s #define MEMSIZE 2000 69100Smike_s #define PSTSIZE 1024 70100Smike_s #define NSTATES 1000 71100Smike_s #define NTERMS 127 72100Smike_s #define NPROD 300 73100Smike_s #define NNONTERM 600 74100Smike_s #define TEMPSIZE 800 75100Smike_s #define CNAMSZ 1000 76100Smike_s #define LSETSIZE 950 77100Smike_s #define WSETSIZE 850 78100Smike_s 79100Smike_s #define NAMESIZE 50 80100Smike_s #define NTYPES 1000 81100Smike_s 82100Smike_s #define NMBCHARSZ 100 83100Smike_s #define LKFACTOR 5 84100Smike_s 85100Smike_s #ifdef WORD32 86100Smike_s /* bit packing macros (may be machine dependent) */ 87100Smike_s #define BIT(a, i) ((a)[(i)>>5] & (1<<((i)&037))) 88100Smike_s #define SETBIT(a, i) ((a)[(i)>>5] |= (1<<((i)&037))) 89100Smike_s 90100Smike_s /* number of words needed to hold n+1 bits */ 91100Smike_s #define NWORDS(n) (((n)+32)/32) 92100Smike_s 93100Smike_s #else 94100Smike_s 95100Smike_s /* bit packing macros (may be machine dependent) */ 96100Smike_s #define BIT(a, i) ((a)[(i)>>4] & (1<<((i)&017))) 97100Smike_s #define SETBIT(a, i) ((a)[(i)>>4] |= (1<<((i)&017))) 98100Smike_s 99100Smike_s /* number of words needed to hold n+1 bits */ 100100Smike_s #define NWORDS(n) (((n)+16)/16) 101100Smike_s #endif 102100Smike_s 103100Smike_s /* 104100Smike_s * relationships which must hold: 105100Smike_s * TBITSET ints must hold NTERMS+1 bits... 106100Smike_s * WSETSIZE >= NNONTERM 107100Smike_s * LSETSIZE >= NNONTERM 108100Smike_s * TEMPSIZE >= NTERMS + NNONTERMs + 1 109100Smike_s * TEMPSIZE >= NSTATES 110100Smike_s */ 111100Smike_s 112100Smike_s /* associativities */ 113100Smike_s 114100Smike_s #define NOASC 0 /* no assoc. */ 115100Smike_s #define LASC 1 /* left assoc. */ 116100Smike_s #define RASC 2 /* right assoc. */ 117100Smike_s #define BASC 3 /* binary assoc. */ 118100Smike_s 119100Smike_s /* flags for state generation */ 120100Smike_s 121100Smike_s #define DONE 0 122100Smike_s #define MUSTDO 1 123100Smike_s #define MUSTLOOKAHEAD 2 124100Smike_s 125100Smike_s /* flags for a rule having an action, and being reduced */ 126100Smike_s 127100Smike_s #define ACTFLAG 04 128100Smike_s #define REDFLAG 010 129100Smike_s 130100Smike_s /* output parser flags */ 131100Smike_s #define YYFLAG1 (-10000000) 132100Smike_s 133100Smike_s /* macros for getting associativity and precedence levels */ 134100Smike_s 135100Smike_s #define ASSOC(i) ((i)&07) 136100Smike_s #define PLEVEL(i) (((i)>>4)&077) 137100Smike_s #define TYPE(i) ((i>>10)&077) 138100Smike_s 139100Smike_s /* macros for setting associativity and precedence levels */ 140100Smike_s 141100Smike_s #define SETASC(i, j) i |= j 142100Smike_s #define SETPLEV(i, j) i |= (j<<4) 143100Smike_s #define SETTYPE(i, j) i |= (j<<10) 144100Smike_s 145100Smike_s /* looping macros */ 146100Smike_s 147100Smike_s #define TLOOP(i) for (i = 1; i <= ntokens; ++i) 148100Smike_s #define NTLOOP(i) for (i = 0; i <= nnonter; ++i) 149100Smike_s #define PLOOP(s, i) for (i = s; i < nprod; ++i) 150100Smike_s #define SLOOP(i) for (i = 0; i < nstate; ++i) 151100Smike_s #define WSBUMP(x) ++x 152100Smike_s #define WSLOOP(s, j) for (j = s; j < &wsets[cwp]; ++j) 153100Smike_s #define ITMLOOP(i, p, q) q = pstate[i+1]; for (p = pstate[i]; p < q; ++p) 154100Smike_s #define SETLOOP(i) for (i = 0; i < tbitset; ++i) 155100Smike_s 156100Smike_s /* I/O descriptors */ 157100Smike_s 158100Smike_s extern FILE *finput; /* input file */ 159100Smike_s extern FILE *faction; /* file for saving actions */ 160100Smike_s extern FILE *fdefine; /* file for #defines */ 161100Smike_s extern FILE *ftable; /* y.tab.c file */ 162100Smike_s extern FILE *ftemp; /* tempfile to pass 2 */ 163100Smike_s extern FILE *fdebug; /* tempfile for two debugging info arrays */ 164100Smike_s extern FILE *foutput; /* y.output file */ 165100Smike_s 166100Smike_s /* structure declarations */ 167100Smike_s 168100Smike_s typedef struct looksets { 169100Smike_s int *lset; 170100Smike_s } LOOKSETS; 171100Smike_s 172100Smike_s typedef struct item { 173100Smike_s int *pitem; 174100Smike_s LOOKSETS *look; 175100Smike_s } ITEM; 176100Smike_s 177100Smike_s typedef struct toksymb { 178100Smike_s wchar_t *name; 179100Smike_s int value; 180100Smike_s } TOKSYMB; 181100Smike_s 182100Smike_s typedef struct mbclit { 183100Smike_s wchar_t character; 184100Smike_s int tvalue; /* token issued for the character */ 185100Smike_s } MBCLIT; 186100Smike_s 187100Smike_s typedef struct ntsymb { 188100Smike_s wchar_t *name; 189100Smike_s int tvalue; 190100Smike_s } NTSYMB; 191100Smike_s 192100Smike_s typedef struct wset { 193100Smike_s int *pitem; 194100Smike_s int flag; 195100Smike_s LOOKSETS ws; 196100Smike_s } WSET; 197100Smike_s 198100Smike_s /* token information */ 199100Smike_s 200100Smike_s extern int ntokens; /* number of tokens */ 201100Smike_s extern TOKSYMB *tokset; 202100Smike_s extern int ntoksz; 203100Smike_s 204100Smike_s /* 205100Smike_s * multibyte (c > 255) character literals are 206100Smike_s * handled as though they were tokens except 207100Smike_s * that it generates a separate mapping table. 208100Smike_s */ 209100Smike_s extern int nmbchars; /* number of mb literals */ 210100Smike_s extern MBCLIT *mbchars; 211100Smike_s extern int nmbcharsz; 212100Smike_s 213100Smike_s /* nonterminal information */ 214100Smike_s 215100Smike_s extern int nnonter; /* the number of nonterminals */ 216100Smike_s extern NTSYMB *nontrst; 217100Smike_s extern int nnontersz; 218100Smike_s 219100Smike_s /* grammar rule information */ 220100Smike_s 221100Smike_s extern int nprod; /* number of productions */ 222100Smike_s extern int **prdptr; /* pointers to descriptions of productions */ 223100Smike_s extern int *levprd; /* contains production levels to break conflicts */ 224100Smike_s extern wchar_t *had_act; /* set if reduction has associated action code */ 225100Smike_s 226100Smike_s /* state information */ 227100Smike_s 228100Smike_s extern int nstate; /* number of states */ 229100Smike_s extern ITEM **pstate; /* pointers to the descriptions of the states */ 230100Smike_s extern int *tystate; /* contains type information about the states */ 231100Smike_s extern int *defact; /* the default action of the state */ 232100Smike_s 233100Smike_s extern int size; 234100Smike_s 235100Smike_s /* lookahead set information */ 236100Smike_s 237100Smike_s extern int TBITSET; 238100Smike_s extern LOOKSETS *lkst; 239100Smike_s extern int nolook; /* flag to turn off lookahead computations */ 240100Smike_s 241100Smike_s /* working set information */ 242100Smike_s 243100Smike_s extern WSET *wsets; 244100Smike_s 245100Smike_s /* storage for productions */ 246100Smike_s 247100Smike_s extern int *mem0; 248100Smike_s extern int *mem; 249100Smike_s extern int *tracemem; 250100Smike_s extern int new_memsize; 251100Smike_s 252100Smike_s /* storage for action table */ 253100Smike_s 254100Smike_s extern int *amem; 255100Smike_s extern int *memp; /* next free action table position */ 256100Smike_s extern int *indgo; /* index to the stored goto table */ 257100Smike_s extern int new_actsize; 258100Smike_s 259100Smike_s /* temporary vector, indexable by states, terms, or ntokens */ 260100Smike_s 261100Smike_s extern int *temp1; 262100Smike_s extern int lineno; /* current line number */ 263100Smike_s 264100Smike_s /* statistics collection variables */ 265100Smike_s 266100Smike_s extern int zzgoent; 267100Smike_s extern int zzgobest; 268100Smike_s extern int zzacent; 269100Smike_s extern int zzexcp; 270100Smike_s extern int zzrrconf; 271100Smike_s extern int zzsrconf; 272100Smike_s 273100Smike_s /* define external functions */ 274100Smike_s 275100Smike_s extern void setup(int, char *[]); 276100Smike_s extern void closure(int); 277100Smike_s extern void output(void); 278100Smike_s extern void aryfil(int *, int, int); 279100Smike_s extern void error(char *, ...); 280100Smike_s extern void warning(int, char *, ...); 281100Smike_s extern void putitem(int *, LOOKSETS *); 282100Smike_s extern void go2out(void); 283100Smike_s extern void hideprod(void); 284100Smike_s extern void callopt(void); 285100Smike_s extern void warray(wchar_t *, int *, int); 286100Smike_s extern wchar_t *symnam(int); 287100Smike_s extern wchar_t *writem(int *); 288100Smike_s extern void exp_mem(int); 289100Smike_s extern void exp_act(int **); 290100Smike_s extern int apack(int *, int); 291100Smike_s extern int state(int); 292100Smike_s extern void fprintf3(FILE *, const char *, const wchar_t *, const char *, ...); 293100Smike_s extern void error3(const char *, const wchar_t *, const char *, ...); 294100Smike_s 295100Smike_s extern wchar_t *wscpy(wchar_t *, const wchar_t *); 296100Smike_s extern size_t wslen(const wchar_t *); 297100Smike_s extern int wscmp(const wchar_t *, const wchar_t *); 298100Smike_s 299100Smike_s 300100Smike_s /* yaccpar location */ 301100Smike_s 302100Smike_s extern char *parser; 303100Smike_s 304100Smike_s /* default settings for a number of macros */ 305100Smike_s 306100Smike_s /* name of yacc tempfiles */ 307100Smike_s 308100Smike_s #ifndef TEMPNAME 309100Smike_s #define TEMPNAME "yacc.tmp" 310100Smike_s #endif 311100Smike_s 312100Smike_s #ifndef ACTNAME 313100Smike_s #define ACTNAME "yacc.acts" 314100Smike_s #endif 315100Smike_s 316100Smike_s #ifndef DEBUGNAME 317100Smike_s #define DEBUGNAME "yacc.debug" 318100Smike_s #endif 319100Smike_s 320100Smike_s /* command to clobber tempfiles after use */ 321100Smike_s 322100Smike_s #ifndef ZAPFILE 323100Smike_s #define ZAPFILE(x) (void)unlink(x) 324100Smike_s #endif 325100Smike_s 326100Smike_s #ifndef PARSER 3274538Sdamico #define PARSER "/usr/share/lib/ccs/yaccpar" 328100Smike_s #endif 329100Smike_s 330*6951Sab196087 /* 331*6951Sab196087 * Lint is unable to properly handle formats with wide strings 332*6951Sab196087 * (e.g. %ws) and misdiagnoses them as being malformed. 333*6951Sab196087 * This macro is used to work around that, by substituting 334*6951Sab196087 * a pointer to a null string when compiled by lint. This 335*6951Sab196087 * trick works because lint is not able to evaluate the 336*6951Sab196087 * variable. 337*6951Sab196087 * 338*6951Sab196087 * When lint is able to handle %ws, it would be appropriate 339*6951Sab196087 * to come back through and remove the use of this macro. 340*6951Sab196087 */ 341*6951Sab196087 #if defined(__lint) 342*6951Sab196087 static const char *lint_ws_fmt = ""; 343*6951Sab196087 #define WSFMT(_fmt) lint_ws_fmt 344*6951Sab196087 #else 345*6951Sab196087 #define WSFMT(_fmt) _fmt 346*6951Sab196087 #endif 347*6951Sab196087 348100Smike_s #ifdef __cplusplus 349100Smike_s } 350100Smike_s #endif 351100Smike_s 352100Smike_s #endif /* _DEXTERN_H */ 353