/* ==================================================================== * The Kannel Software License, Version 1.0 * * Copyright (c) 2001-2005 Kannel Group * Copyright (c) 1998-2001 WapIT Ltd. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. The end-user documentation included with the redistribution, * if any, must include the following acknowledgment: * "This product includes software developed by the * Kannel Group (http://www.kannel.org/)." * Alternately, this acknowledgment may appear in the software itself, * if and wherever such third-party acknowledgments normally appear. * * 4. The names "Kannel" and "Kannel Group" must not be used to * endorse or promote products derived from this software without * prior written permission. For written permission, please * contact org@kannel.org. * * 5. Products derived from this software may not be called "Kannel", * nor may "Kannel" appear in their name, without prior written * permission of the Kannel Group. * * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE KANNEL GROUP OR ITS CONTRIBUTORS * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE * OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * ==================================================================== * * This software consists of voluntary contributions made by many * individuals on behalf of the Kannel Group. For more information on * the Kannel Group, please see . * * Portions of this software are based upon software originally written at * WapIT Ltd., Helsinki, Finland for the Kannel project. */ /* * * ws.h * * Author: Markku Rossi * * Copyright (c) 1999-2000 WAPIT OY LTD. * All rights reserved. * * Public header file for the WMLScript compiler library. * * The compiler is written for WMLScript version 1.1. * */ #ifndef WS_H #define WS_H #include "wsutf8.h" /********************* Creating and destroying compiler *****************/ /* A callback function of this type is called to output compiler's diagnostic, error, and warning messages. The argument `data' has `len' bytes of data that should be output somehow to user. The argument `context' is the user-specified context data for the callback function. */ typedef void (*WsIOProc)(const char *data, size_t len, void *context); /* A callback function of this type is called for each `use meta name' and `use meta http equiv' pragma, found from the current compilation unit. The arguments `property_name', `content', and `scheme' are the meta-body arguments of the pragma. They can be manipulated with the functions of the `wsutf8.h' module. The argument `scheme' can have the value NULL if the pragma did not specify it. The string arguments belong to the WMLScript compiler and you should not modify or free them. The argument `context' is the user-specified context data for the callback function. */ typedef void (*WsPragmaMetaProc)(const WsUtf8String *property_name, const WsUtf8String *content, const WsUtf8String *scheme, void *context); /* Parameters for a WMLScript copiler. */ struct WsCompilerParamsRec { /* Features. */ /* Store string constants in ISO-8859/1 (ISO latin1) format. The default format is UTF-8. This option makes a bit smaller byte-code files but it loses information for non-latin1 languages. */ unsigned int use_latin1_strings : 1; /* Warning flags. */ /* Warn if a standard library function is called with mismatching argument types. */ unsigned int warn_stdlib_type_mismatch : 1; /* Optimization flags. */ /* Do not perform constant folding. */ unsigned int no_opt_constant_folding : 1; /* Do not sort byte-code functions by their usage counts. */ unsigned int no_opt_sort_bc_functions : 1; /* Do not perform peephole optimization. */ unsigned int no_opt_peephole : 1; /* Do not optimize jumps to jump instructions to jump directly to the target label of the next instruction. */ unsigned int no_opt_jumps_to_jumps : 1; /* Do not optimize jumps to the next instruction. */ unsigned int no_opt_jumps_to_next_instruction : 1; /* Do not remove unreachable code. */ unsigned int no_opt_dead_code : 1; /* Do not remove useless conversions */ unsigned int no_opt_conv : 1; /* Perform expensive optimizations which require liveness analyzation of the local variables. */ unsigned int opt_analyze_variable_liveness : 1; /* Output flags. */ /* Print verbose progress messages. */ unsigned int verbose : 1; /* Print symbolic assembler to the stdout. */ unsigned int print_symbolic_assembler : 1; /* Disassemble the resulting byte-code instructions. */ unsigned int print_assembler : 1; /* Function pointers to receive standard output and error messages. If these are unset, the outputs are directed to the system's standard output and error streams. */ /* Standard output. */ WsIOProc stdout_cb; void *stdout_cb_context; /* Standard error. */ WsIOProc stderr_cb; void *stderr_cb_context; /* A callback function which is called for each `use meta name' pragma, found from the current compilation unit. */ WsPragmaMetaProc meta_name_cb; void *meta_name_cb_context; /* A callback function which is called for each `use meta http equiv' pragma, found from the current compilation unit. */ WsPragmaMetaProc meta_http_equiv_cb; void *meta_http_equiv_cb_context; }; typedef struct WsCompilerParamsRec WsCompilerParams; /* A compiler handle. */ typedef struct WsCompilerRec *WsCompilerPtr; /* Create a new WMLScript compiler. The argument `params' specifies initialization parameters for the compiler. If the argument `params' is NULL or any of its fiels have value 0 or NULL, the default values will be used for those parameters. The function takes a copy of the value of the `params' argument. You can free it after this call. The function returns NULL if the operation fails (out of memory). */ WsCompilerPtr ws_create(WsCompilerParams *params); /* Destroy the WMLScript compiler `compiler' and free all resources it has allocated. */ void ws_destroy(WsCompilerPtr compiler); /********************* Compiling WMLScript ******************************/ /* Returns codes for the compiler functions. */ typedef enum { /* Successful termination */ WS_OK, /* The compiler ran out of memory. */ WS_ERROR_OUT_OF_MEMORY, /* The input was not syntactically correct. */ WS_ERROR_SYNTAX, /* The input was not semantically correct. */ WS_ERROR_SEMANTIC, /* IO error. */ WS_ERROR_IO, /* A generic `catch-all' error code. This should not be used. More descriptive error messages should be generated instead. */ WS_ERROR } WsResult; /* Compile the WMLScript input file `input' with the compiler `compiler' and save the generated byte-code output to the file `output'. The argument `input_name' is the name of the input file `input'. It is used in error messages. The function returns a success code that describes the result of the compilation. The output file `output' is modified only if the result code is `WS_OK'. */ WsResult ws_compile_file(WsCompilerPtr compiler, const char *input_name, FILE *input, FILE *output); /* Compile the `input_len' bytes of WMLScript data in `input' with the compiler `compiler'. The data is assumed to be in the ISO-8859/1 (ISO latin1) format. The resulting byte-code is returned in `output_return' and its length is returned in `output_len_return'. The argument `input_name' is the name of the input data `input_data'. It is used in error messages. The function returns a success code that describes the result of the compilation. The output in `output_return' is valid only if the result code is `WS_OK'. The byte-code, returned in `output_return', must be freed with the ws_free_byte_code() function after it is not needed anymore. It is a fatal error to free it with any other function, like free(). */ WsResult ws_compile_data(WsCompilerPtr compiler, const char *input_name, const unsigned char *input, size_t input_len, unsigned char **output_return, size_t *output_len_return); /* Free the byte-code buffer `byte_code', returned by ws_compiler_data() function. The byte-code `byte_code' must not be used after this function has been called. */ void ws_free_byte_code(unsigned char *byte_code); /* Convert the result code `result' into human readable 7 bit ASCII string. */ const char *ws_result_to_string(WsResult result); #endif /* not WS_H */