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.
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.
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]
22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved.
23 * Use is subject to license terms.
25 * tree.h -- public definitions for tree module
27 * the parse tree is made up of struct node's. the struct is
28 * a "variant record" with a type, the filename and line number
29 * related to the node, and then type-specific node data.
32 #ifndef _ESC_COMMON_TREE_H
33 #define _ESC_COMMON_TREE_H
35 #pragma ident "%Z%%M% %I% %E% SMI"
43 T_NOTHING
, /* used to keep going on error cases */
44 T_NAME
, /* identifiers, sometimes chained */
45 T_GLOBID
, /* globals (e.g. $a) */
46 T_EVENT
, /* class@path{expr} */
47 T_ENGINE
, /* upset threshold engine (e.g. SERD) */
48 T_ASRU
, /* ASRU declaration */
49 T_FRU
, /* FRU declaration */
50 T_TIMEVAL
, /* num w/time suffix (ns internally) */
51 T_NUM
, /* num (ull internally) */
52 T_QUOTE
, /* quoted string */
53 T_FUNC
, /* func(arglist) */
54 T_NVPAIR
, /* name=value pair in decl */
55 T_ASSIGN
, /* assignment statement */
56 T_CONDIF
, /* a and T_CONDELSE in (a ? b : c ) */
57 T_CONDELSE
, /* lists b and c in (a ? b : c ) */
58 T_NOT
, /* boolean ! operator */
59 T_AND
, /* boolean && operator */
60 T_OR
, /* boolean || operator */
61 T_EQ
, /* boolean == operator */
62 T_NE
, /* boolean != operator */
63 T_SUB
, /* integer - operator */
64 T_ADD
, /* integer + operator */
65 T_MUL
, /* integer * operator */
66 T_DIV
, /* integer / operator */
67 T_MOD
, /* integer % operator */
68 T_LT
, /* boolean < operator */
69 T_LE
, /* boolean <= operator */
70 T_GT
, /* boolean > operator */
71 T_GE
, /* boolean >= operator */
72 T_BITAND
, /* bitwise & operator */
73 T_BITOR
, /* bitwise | operator */
74 T_BITXOR
, /* bitwise ^ operator */
75 T_BITNOT
, /* bitwise ~ operator */
76 T_LSHIFT
, /* bitwise << operator */
77 T_RSHIFT
, /* bitwise >> operator */
78 T_ARROW
, /* lhs (N)->(K) rhs */
79 T_LIST
, /* comma-separated list */
80 T_FAULT
, /* fault declaration */
81 T_UPSET
, /* upset declaration */
82 T_DEFECT
, /* defect declaration */
83 T_ERROR
, /* error declaration */
84 T_EREPORT
, /* ereport declaration */
85 T_SERD
, /* SERD engine declaration */
86 T_STAT
, /* STAT engine declaration */
87 T_PROP
, /* prop statement */
88 T_MASK
, /* mask statement */
89 T_CONFIG
/* config statement */
93 * regardless of the type of node, filename and line number
94 * information from the original .esc file is tracked here.
100 * the variant part of a struct node...
105 * info kept for T_NAME, used in several ways:
107 * 1 for simple variable names.
110 * 2 for event class names, with component
111 * names chained together via the "next"
113 * example: fault.fan.broken
115 * 3 for component pathnames, with component
116 * names chained together via the "next"
117 * pointers and iterators or instance numbers
118 * attached via the "child" pointers.
119 * example: sysboard[0]/cpu[n]
121 * case 3 is the most interesting.
122 * - if child is set, there's an iterator
123 * - if child is a T_NAME, it is x[j] or x<j> and
124 * iterator type tells you vertical or horizontal
125 * - if child is a T_NUM, it is x[0] or x<0> or
126 * x0 and iterator type tells you which one
127 * - if cp pointer is set, then we recently
128 * matched it to a config cache entry and one
129 * can ignore child for now because it still
130 * represents the *pattern* you're matching.
131 * cp represents what you matched. ptree()
132 * knows that if cp is set, to print that number
133 * instead of following child.
135 * when T_NAME nodes are chained:
136 * the "last" pointer takes you to the end of the
137 * chain, but only the first component's last pointer
138 * is kept up to date. it is used to determine
139 * where to append newly-created T_NAME nodes (see
140 * tree_name_append()).
142 const char *s
; /* the name itself */
148 /* opaque pointer used during config matching */
152 * note nametype is also declared as a three bit enum
153 * in itree.h, so if this ever needs expanding that
154 * will need changing too.
172 unsigned childgen
:1; /* child was auto-generated */
177 * info kept for T_GLOBID
179 const char *s
; /* the name itself */
183 * info kept for T_TIMEVAL and T_NUM
185 * timevals are kept in nanoseconds.
187 unsigned long long ull
;
191 * info kept for T_QUOTE
193 const char *s
; /* the quoted string */
198 * info kept for T_FUNC
200 const char *s
; /* name of function */
201 struct node
*arglist
;
206 * info kept for T_PROP and T_MASK statements
207 * as well as declarations for:
218 struct node
*nvpairs
; /* for declarations */
219 struct lut
*lutp
; /* for declarations */
220 struct node
*next
; /* for Props & Masks lists */
221 struct node
*expr
; /* for if statements */
222 unsigned char flags
; /* see STMT_ flags below */
223 } stmt
; /* used for stmt */
227 * info kept for T_EVENT
229 struct node
*ename
; /* event class name */
230 struct node
*epname
; /* component path name */
231 struct node
*oldepname
; /* unwildcarded path name */
232 struct node
*ewname
; /* wildcarded portion */
233 struct node
*eexprlist
; /* constraint expression */
234 struct node
*declp
; /* event declaration */
239 * info kept for T_ARROW
241 struct node
*lhs
; /* left side of arrow */
242 struct node
*rhs
; /* right side of arrow */
243 struct node
*nnp
; /* N value */
244 struct node
*knp
; /* K value */
245 struct node
*prop
; /* arrow is part of this prop */
252 * info kept for everything else (T_ADD, T_LIST, etc.)
260 * Note to save memory the nodesize() function trims the end of this
261 * structure, so best not to add anything after this point
265 /* flags we keep with stmts */
266 #define STMT_REF 0x01 /* declared item is referenced */
267 #define STMT_CYMARK 0x02 /* declared item is marked for cycle check */
268 #define STMT_CYCLE 0x04 /* cycle detected and already reported */
270 #define TIMEVAL_EVENTUALLY (1000000000ULL*60*60*24*365*100) /* 100 years */
272 void tree_init(void);
273 void tree_fini(void);
274 struct node
*newnode(enum nodetype t
, const char *file
, int line
);
275 void tree_free(struct node
*root
);
276 struct node
*tree_root(struct node
*np
);
277 struct node
*tree_nothing(void);
278 struct node
*tree_expr(enum nodetype t
, struct node
*left
, struct node
*right
);
279 struct node
*tree_event(struct node
*ename
, struct node
*epname
,
280 struct node
*eexprlist
);
281 struct node
*tree_if(struct node
*expr
, struct node
*stmts
,
282 const char *file
, int line
);
283 struct node
*tree_name(const char *s
, enum itertype it
,
284 const char *file
, int line
);
285 struct node
*tree_iname(const char *s
, const char *file
, int line
);
286 struct node
*tree_globid(const char *s
, const char *file
, int line
);
287 struct node
*tree_name_append(struct node
*np1
, struct node
*np2
);
288 struct node
*tree_name_repairdash(struct node
*np1
, const char *s
);
289 struct node
*tree_name_repairdash2(const char *s
, struct node
*np1
);
290 struct node
*tree_name_iterator(struct node
*np1
, struct node
*np2
);
291 struct node
*tree_timeval(const char *s
, const char *suffix
,
292 const char *file
, int line
);
293 struct node
*tree_num(const char *s
, const char *file
, int line
);
294 struct node
*tree_quote(const char *s
, const char *file
, int line
);
295 struct node
*tree_func(const char *s
, struct node
*np
,
296 const char *file
, int line
);
297 struct node
*tree_pname(struct node
*np
);
298 struct node
*tree_arrow(struct node
*lhs
, struct node
*nnp
, struct node
*knp
,
300 struct lut
*tree_s2np_lut_add(struct lut
*root
, const char *s
, struct node
*np
);
301 struct node
*tree_s2np_lut_lookup(struct lut
*root
, const char *s
);
302 struct lut
*tree_name2np_lut_add(struct lut
*root
,
303 struct node
*namep
, struct node
*np
);
304 struct node
*tree_name2np_lut_lookup(struct lut
*root
, struct node
*namep
);
305 struct node
*tree_name2np_lut_lookup_name(struct lut
*root
, struct node
*namep
);
306 struct lut
*tree_event2np_lut_add(struct lut
*root
,
307 struct node
*enp
, struct node
*np
);
308 struct node
*tree_event2np_lut_lookup(struct lut
*root
, struct node
*enp
);
309 struct node
*tree_event2np_lut_lookup_event(struct lut
*root
,
311 struct node
*tree_decl(enum nodetype t
, struct node
*enp
, struct node
*nvpairs
,
312 const char *file
, int line
);
313 struct node
*tree_stmt(enum nodetype t
, struct node
*np
,
314 const char *file
, int line
);
316 int tree_namecmp(struct node
*np1
, struct node
*np2
);
317 int tree_eventcmp(struct node
*np1
, struct node
*np2
);
323 struct lut
*Ereports
;
324 struct lut
*Ereportenames
;
325 struct lut
*Ereportenames_discard
;
332 struct node
*Lastprops
;
334 struct node
*Lastmasks
;
335 struct node
*Problems
;
336 struct node
*Lastproblems
;
342 #endif /* _ESC_COMMON_TREE_H */