Annotation of embedaddon/libpdel/tmpl/tmpl_internal.h, revision 1.1

1.1     ! misho       1: 
        !             2: /*
        !             3:  * Copyright (c) 2001-2002 Packet Design, LLC.
        !             4:  * All rights reserved.
        !             5:  * 
        !             6:  * Subject to the following obligations and disclaimer of warranty,
        !             7:  * use and redistribution of this software, in source or object code
        !             8:  * forms, with or without modifications are expressly permitted by
        !             9:  * Packet Design; provided, however, that:
        !            10:  * 
        !            11:  *    (i)  Any and all reproductions of the source or object code
        !            12:  *         must include the copyright notice above and the following
        !            13:  *         disclaimer of warranties; and
        !            14:  *    (ii) No rights are granted, in any manner or form, to use
        !            15:  *         Packet Design trademarks, including the mark "PACKET DESIGN"
        !            16:  *         on advertising, endorsements, or otherwise except as such
        !            17:  *         appears in the above copyright notice or in the software.
        !            18:  * 
        !            19:  * THIS SOFTWARE IS BEING PROVIDED BY PACKET DESIGN "AS IS", AND
        !            20:  * TO THE MAXIMUM EXTENT PERMITTED BY LAW, PACKET DESIGN MAKES NO
        !            21:  * REPRESENTATIONS OR WARRANTIES, EXPRESS OR IMPLIED, REGARDING
        !            22:  * THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY AND ALL IMPLIED
        !            23:  * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE,
        !            24:  * OR NON-INFRINGEMENT.  PACKET DESIGN DOES NOT WARRANT, GUARANTEE,
        !            25:  * OR MAKE ANY REPRESENTATIONS REGARDING THE USE OF, OR THE RESULTS
        !            26:  * OF THE USE OF THIS SOFTWARE IN TERMS OF ITS CORRECTNESS, ACCURACY,
        !            27:  * RELIABILITY OR OTHERWISE.  IN NO EVENT SHALL PACKET DESIGN BE
        !            28:  * LIABLE FOR ANY DAMAGES RESULTING FROM OR ARISING OUT OF ANY USE
        !            29:  * OF THIS SOFTWARE, INCLUDING WITHOUT LIMITATION, ANY DIRECT,
        !            30:  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, PUNITIVE, OR CONSEQUENTIAL
        !            31:  * DAMAGES, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, LOSS OF
        !            32:  * USE, DATA OR PROFITS, HOWEVER CAUSED AND UNDER ANY THEORY OF
        !            33:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
        !            34:  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF
        !            35:  * THE USE OF THIS SOFTWARE, EVEN IF PACKET DESIGN IS ADVISED OF
        !            36:  * THE POSSIBILITY OF SUCH DAMAGE.
        !            37:  *
        !            38:  * Author: Archie Cobbs <archie@freebsd.org>
        !            39:  */
        !            40: 
        !            41: #include <sys/types.h>
        !            42: #include <sys/stat.h>
        !            43: #include <sys/mman.h>
        !            44: 
        !            45: #include <stdio.h>
        !            46: #include <stdlib.h>
        !            47: #include <stdarg.h>
        !            48: #include <string.h>
        !            49: #include <assert.h>
        !            50: #include <limits.h>
        !            51: #include <fcntl.h>
        !            52: #include <ctype.h>
        !            53: #include <errno.h>
        !            54: #include <paths.h>
        !            55: #include <unistd.h>
        !            56: #include <pthread.h>
        !            57: 
        !            58: #include "structs/structs.h"
        !            59: #include "structs/type/array.h"
        !            60: 
        !            61: #include "tmpl/tmpl.h"
        !            62: #include "io/string_fp.h"
        !            63: #include "util/typed_mem.h"
        !            64: #include "util/string_quote.h"
        !            65: 
        !            66: #ifndef TMPL_DEBUG
        !            67: #define TMPL_DEBUG     0
        !            68: #endif
        !            69: #if TMPL_DEBUG != 0 && defined(__GNUC__)
        !            70: #define DBG(fmt, args...)       \
        !            71:        do { fprintf(stderr, fmt , ## args); } while(0)
        !            72: #else
        !            73: #define DBG(fmt, args...)       do { } while (0)
        !            74: #endif
        !            75: 
        !            76: /* How much nesting is too much */
        !            77: #define INFINITE_LOOP          128
        !            78: 
        !            79: /* Function types */
        !            80: enum func_type {
        !            81:        TY_NORMAL,
        !            82:        TY_LOOP,
        !            83:        TY_ENDLOOP,
        !            84:        TY_WHILE,
        !            85:        TY_ENDWHILE,
        !            86:        TY_IF,
        !            87:        TY_ELIF,
        !            88:        TY_ELSE,
        !            89:        TY_ENDIF,
        !            90:        TY_DEFINE,
        !            91:        TY_ENDDEF,
        !            92:        TY_BREAK,
        !            93:        TY_CONTINUE,
        !            94:        TY_RETURN
        !            95: };
        !            96: 
        !            97: /* Return values from _tmpl_execute_elems() */
        !            98: enum exec_rtn {
        !            99:        RTN_NORMAL,
        !           100:        RTN_BREAK,
        !           101:        RTN_CONTINUE,
        !           102:        RTN_RETURN
        !           103: };
        !           104: 
        !           105: /* Template element flags */
        !           106: #define TMPL_ELEM_NL_WHITE     0x0001                  /* text is nl+space */
        !           107: #define TMPL_ELEM_MMAP_TEXT    0x0002                  /* text is mmap()'d */
        !           108: 
        !           109: /* Function call */
        !           110: struct func_call {
        !           111:        enum func_type  type;                           /* type of function */
        !           112:        char            *funcname;                      /* name of function */
        !           113:        int             nargs;                          /* number of args */
        !           114:        struct func_arg *args;                          /* function arguments */
        !           115:        tmpl_handler_t  *handler;                       /* built-in: handler */
        !           116: };
        !           117: 
        !           118: /* Function argument */
        !           119: struct func_arg {
        !           120:        u_char          is_literal;                     /* literal vs. func */
        !           121:        union {
        !           122:            struct func_call    call;                   /* function call */
        !           123:            char                *literal;               /* literal string */
        !           124:        }               u;
        !           125: };
        !           126: 
        !           127: /* This represents one parsed chunk of the template */
        !           128: struct tmpl_elem {
        !           129: 
        !           130:        /* Lexical information */
        !           131:        char                    *text;          /* text, or NULL if function */
        !           132:        u_int                   len;            /* length of text */
        !           133:        u_int16_t               flags;          /* element flags */
        !           134: 
        !           135:        /* Semantic information */
        !           136:        struct func_call        call;           /* function and arguments */
        !           137:        union {
        !           138:            struct {
        !           139:                int                     endloop;/* endloop element */
        !           140:            }                   u_loop;         /* TY_LOOP */
        !           141:            struct {
        !           142:                int                     endwhile;/* endwhile element */
        !           143:            }                   u_while;        /* TY_WHILE */
        !           144:            struct {
        !           145:                int                     elsie;  /* else element, or -1 */
        !           146:                int                     endif;  /* endif element */
        !           147:            }                   u_if;           /* TY_IF */
        !           148:            struct {
        !           149:                int                     enddef; /* enddef element */
        !           150:            }                   u_define;       /* TY_DEFINE */
        !           151:        }               u;
        !           152: };
        !           153: 
        !           154: /* Run-time variables */
        !           155: struct exec_var {
        !           156:        char    *name;                          /* variable name */
        !           157:        char    *value;                         /* variable value */
        !           158: };
        !           159: 
        !           160: /* Run-time functions */
        !           161: struct exec_func {
        !           162:        char                    *name;          /* function name */
        !           163:        int                     num_elems;      /* number of elements */
        !           164:        struct tmpl_elem        *elems;         /* function elements */
        !           165:        void                    *eblock;        /* unified memory block */
        !           166: };
        !           167: 
        !           168: /* Looping info */
        !           169: struct loop_ctx {
        !           170:        u_int                   index;          /* current loop index */
        !           171:        struct loop_ctx         *outer;         /* enclosing loop info */
        !           172: };
        !           173: 
        !           174: /* Parsed template file */
        !           175: struct tmpl {
        !           176:        void                    *mmap_addr;     /* mmap() address, or NULL */
        !           177:        size_t                  mmap_len;       /* mmap() length */
        !           178:        int                     num_elems;      /* number of parsed elements */
        !           179:        struct tmpl_elem        *elems;         /* parsed template elements */
        !           180:        void                    *eblock;        /* unified memory block */
        !           181:        char                    *mtype;         /* memory type */
        !           182:        char                    mtype_buf[TYPED_MEM_TYPELEN];
        !           183: };
        !           184: 
        !           185: /* Template context */
        !           186: struct tmpl_ctx {
        !           187:        FILE                    *output;        /* current output */
        !           188:        FILE                    *orig_output;   /* original output */
        !           189:        int                     flags;          /* flags */
        !           190:        u_char                  close_output;   /* close 'output' when done */
        !           191:        int                     depth;          /* execution nesting level */
        !           192:        void                    *arg;           /* user function cookie */
        !           193:        tmpl_handler_t          *handler;       /* user function handler */
        !           194:        tmpl_errfmtr_t          *errfmtr;       /* user error formatter */
        !           195:        struct loop_ctx         *loop;          /* innermost loop, if any */
        !           196:        int                     num_vars;       /* number of variables */
        !           197:        struct exec_var         *vars;          /* runtime variables */
        !           198:        int                     num_funcs;      /* number of functions */
        !           199:        struct exec_func        *funcs;         /* runtime functions */
        !           200:        char                    *mtype;         /* memory type */
        !           201:        char                    mtype_buf[TYPED_MEM_TYPELEN];
        !           202: };
        !           203: 
        !           204: /*
        !           205:  * Functions
        !           206:  */
        !           207: 
        !           208: __BEGIN_DECLS
        !           209: 
        !           210: /* Parsing */
        !           211: extern int     _tmpl_parse(struct tmpl *tmpl, FILE *input, int *num_errors);
        !           212: 
        !           213: /* Variable and function handling */
        !           214: extern int     _tmpl_find_var(struct tmpl_ctx *ctx, const char *name);
        !           215: extern int     _tmpl_find_func(struct tmpl_ctx *ctx, const char *name);
        !           216: extern int     _tmpl_set_func(struct tmpl_ctx *ctx, const char *name,
        !           217:                        const struct tmpl_elem *elems, int count);
        !           218: 
        !           219: /* Memory management */
        !           220: extern void    _tmpl_compact_elems(const char *mtype,
        !           221:                        struct tmpl_elem *elems, int num_elems,
        !           222:                        char *mem, size_t *bsize);
        !           223: extern void    _tmpl_compact(const char *mtype, char *mem,
        !           224:                        void *ptrp, size_t len, size_t *bsize);
        !           225: extern void    _tmpl_free_func(struct tmpl_ctx *ctx, struct exec_func *func);
        !           226: extern void    _tmpl_free_elems(const char *mtype, void *eblock,
        !           227:                        struct tmpl_elem *elems, int num);
        !           228: extern void    _tmpl_free_call(const char *mtype, struct func_call *call);
        !           229: extern void    _tmpl_free_arg(const char *mtype, struct func_arg *arg);
        !           230: 
        !           231: /* Template execution */
        !           232: extern enum    exec_rtn _tmpl_execute_elems(struct tmpl_ctx *ctx,
        !           233:                        struct tmpl_elem *elems, int first_elem, int last_elem);
        !           234: extern char    *_tmpl_invoke(struct tmpl_ctx *ctx,
        !           235:                        char **errmsgp, const struct func_call *call);
        !           236: 
        !           237: /* Truth determination */
        !           238: extern int     _tmpl_true(const char *s);
        !           239: 
        !           240: #if TMPL_DEBUG
        !           241: /* Debugging */
        !           242: extern const   char *_tmpl_elemstr(const struct tmpl_elem *elem, int index);
        !           243: #endif
        !           244: 
        !           245: __END_DECLS
        !           246: 

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>