| /* |
| *------------------------------------------------------------------ |
| * node.h - definitions for an API generator |
| * |
| * Copyright (c) 2004-2009 Cisco and/or its affiliates. |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at: |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| *------------------------------------------------------------------ |
| */ |
| |
| #ifndef _node_h_ |
| #define _node_h_ |
| |
| /* |
| * Global prototypes |
| */ |
| |
| char *sxerox (const char *s); |
| |
| enum node_subclass { /* WARNING: indices must match the vft... */ |
| NODE_ILLEGAL=0, |
| NODE_U8, |
| NODE_U16, |
| NODE_U32, |
| NODE_U64, |
| NODE_I8, |
| NODE_I16, |
| NODE_I32, |
| NODE_I64, |
| NODE_F64, |
| NODE_PACKED, |
| NODE_DEFINE, |
| NODE_UNION, |
| NODE_SCALAR, |
| NODE_VECTOR, |
| NODE_COMPLEX, |
| NODE_NOVERSION, |
| NODE_UWORD, |
| NODE_N_TYPES, /* number of node types with VFT's */ |
| |
| /* pseudo-node(s) used in the lexer keyword table, but |
| NOT in need of a VFT... */ |
| NODE_TYPEONLY, |
| NODE_MANUAL_PRINT, |
| NODE_MANUAL_ENDIAN, |
| NODE_DONT_TRACE, |
| }; |
| |
| enum passid { |
| TYPEDEF_PASS=1, |
| UNION_DEF_PASS, |
| ENDIANFUN_PASS, |
| PRINTFUN_PASS, |
| PYTHON_PASS, |
| JSON_PASS, |
| }; |
| |
| extern void *make_node (enum node_subclass type); |
| |
| typedef struct node_ { |
| enum node_subclass type; |
| struct node_ *peer; |
| struct node_ *deeper; |
| int flags; |
| void *data[4]; |
| } node_t; |
| |
| /* To shut up gcc-4.2.x warnings */ |
| #define CDATA0 ((char *)(this->data[0])) |
| #define IDATA1 ((int)(uword)(this->data[1])) |
| #define CDATA2 ((char *)(this->data[2])) |
| #define CDATA3 ((char *)(this->data[3])) |
| |
| #define NODE_FLAG_MANUAL_PRINT (1<<0) |
| #define NODE_FLAG_MANUAL_ENDIAN (1<<1) |
| #define NODE_FLAG_TYPEONLY (1<<3) |
| #define NODE_FLAG_DONT_TRACE (1<<4) |
| |
| typedef struct node_vft_ { |
| void (*print)(struct node_ *); |
| void (*generate)(struct node_ *, enum passid id, FILE *ofp); |
| char *endian_converter; |
| } node_vft_t; |
| |
| #endif /* _node_h */ |