1 /* 2 ** OSSP var - Variable Expansion 3 ** Copyright (c) 2001-2005 Ralf S. Engelschall <rse@engelschall.com> 4 ** Copyright (c) 2001-2005 The OSSP Project (http://www.ossp.org/) 5 ** Copyright (c) 2001-2005 Cable & Wireless (http://www.cw.com/) 6 ** 7 ** This file is part of OSSP var, a variable expansion 8 ** library which can be found at http://www.ossp.org/pkg/lib/var/. 9 ** 10 ** Permission to use, copy, modify, and distribute this software for 11 ** any purpose with or without fee is hereby granted, provided that 12 ** the above copyright notice and this permission notice appear in all 13 ** copies. 14 ** 15 ** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED 16 ** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF 17 ** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 18 ** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR 19 ** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 20 ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 21 ** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF 22 ** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 23 ** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 24 ** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 25 ** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 26 ** SUCH DAMAGE. 27 ** 28 ** var.h: library API 29 */ 30 31 #ifndef __VAR_H__ 32 #define __VAR_H__ 33 34 /* required system headers */ 35 #include <stdlib.h> 36 #include <stdarg.h> 37 38 /* minimum C++ support */ 39 #ifdef __cplusplus 40 #define DECLARATION_BEGIN extern "C" { 41 #define DECLARATION_END } 42 #else 43 #define DECLARATION_BEGIN 44 #define DECLARATION_END 45 #endif 46 47 DECLARATION_BEGIN 48 49 /* error codes */ 50 typedef enum { 51 VAR_ERR_CALLBACK = -64, 52 VAR_ERR_FORMATTING_FAILURE = -45, 53 VAR_ERR_UNDEFINED_OPERATION = -44, 54 VAR_ERR_MALFORMED_OPERATION_ARGUMENTS = -43, 55 VAR_ERR_INVALID_CHAR_IN_LOOP_LIMITS = -42, 56 VAR_ERR_UNTERMINATED_LOOP_CONSTRUCT = -41, 57 VAR_ERR_DIVISION_BY_ZERO_IN_INDEX = -40, 58 VAR_ERR_UNCLOSED_BRACKET_IN_INDEX = -39, 59 VAR_ERR_INCOMPLETE_INDEX_SPEC = -37, 60 VAR_ERR_INVALID_CHAR_IN_INDEX_SPEC = -36, 61 VAR_ERR_ARRAY_LOOKUPS_ARE_UNSUPPORTED = -35, 62 VAR_ERR_INCOMPLETE_QUOTED_PAIR = -34, 63 VAR_ERR_INVALID_ARGUMENT = -34, 64 VAR_ERR_SUBMATCH_OUT_OF_RANGE = -33, 65 VAR_ERR_UNKNOWN_QUOTED_PAIR_IN_REPLACE = -32, 66 VAR_ERR_EMPTY_PADDING_FILL_STRING = -31, 67 VAR_ERR_MISSING_PADDING_WIDTH = -30, 68 VAR_ERR_MALFORMATTED_PADDING = -29, 69 VAR_ERR_INCORRECT_TRANSPOSE_CLASS_SPEC = -28, 70 VAR_ERR_EMPTY_TRANSPOSE_CLASS = -27, 71 VAR_ERR_TRANSPOSE_CLASSES_MISMATCH = -26, 72 VAR_ERR_MALFORMATTED_TRANSPOSE = -25, 73 VAR_ERR_OFFSET_LOGIC = -24, 74 VAR_ERR_OFFSET_OUT_OF_BOUNDS = -23, 75 VAR_ERR_RANGE_OUT_OF_BOUNDS = -22, 76 VAR_ERR_INVALID_OFFSET_DELIMITER = -21, 77 VAR_ERR_MISSING_START_OFFSET = -20, 78 VAR_ERR_EMPTY_SEARCH_STRING = -19, 79 VAR_ERR_MISSING_PARAMETER_IN_COMMAND = -18, 80 VAR_ERR_INVALID_REGEX_IN_REPLACE = -17, 81 VAR_ERR_UNKNOWN_REPLACE_FLAG = -16, 82 VAR_ERR_MALFORMATTED_REPLACE = -15, 83 VAR_ERR_UNKNOWN_COMMAND_CHAR = -14, 84 VAR_ERR_INPUT_ISNT_TEXT_NOR_VARIABLE = -13, 85 VAR_ERR_UNDEFINED_VARIABLE = -12, 86 VAR_ERR_INCOMPLETE_VARIABLE_SPEC = -11, 87 VAR_ERR_OUT_OF_MEMORY = -10, 88 VAR_ERR_INVALID_CONFIGURATION = -9, 89 VAR_ERR_INCORRECT_CLASS_SPEC = -8, 90 VAR_ERR_INCOMPLETE_GROUPED_HEX = -7, 91 VAR_ERR_INCOMPLETE_OCTAL = -6, 92 VAR_ERR_INVALID_OCTAL = -5, 93 VAR_ERR_OCTAL_TOO_LARGE = -4, 94 VAR_ERR_INVALID_HEX = -3, 95 VAR_ERR_INCOMPLETE_HEX = -2, 96 VAR_ERR_INCOMPLETE_NAMED_CHARACTER = -1, 97 VAR_OK = 0 98 } var_rc_t; 99 100 /* opaque data type */ 101 struct var_st; 102 typedef struct var_st var_t; 103 104 /* var_config() modes */ 105 typedef enum { 106 VAR_CONFIG_SYNTAX, 107 VAR_CONFIG_CB_VALUE, 108 VAR_CONFIG_CB_OPERATION 109 } var_config_t; 110 111 /* VAR_CONFIG_SYNTAX type */ 112 typedef struct { 113 char escape; /* default: '\' */ 114 char delim_init; /* default: '$' */ 115 char delim_open; /* default: '{' */ 116 char delim_close; /* default: '}' */ 117 char index_open; /* default: '[' */ 118 char index_close; /* default: ']' */ 119 char index_mark; /* default: '#' */ 120 char *name_chars; /* default: "a-zA-Z0-9_" */ 121 } var_syntax_t; 122 123 /* VAR_CONFIG_CB_VALUE type */ 124 typedef var_rc_t (*var_cb_value_t)( 125 var_t *var, void *ctx, 126 const char *var_ptr, size_t var_len, int var_idx, 127 const char **val_ptr, size_t *val_len, size_t *val_size 128 ); 129 130 /* VAR_CONFIG_CB_OPERATION type */ 131 typedef var_rc_t (*var_cb_operation_t)( 132 var_t *var, void *ctx, 133 const char *op_ptr, size_t op_len, 134 const char *arg_ptr, size_t arg_len, 135 const char *val_ptr, size_t val_len, 136 const char **out_ptr, size_t *out_len, size_t *out_size 137 ); 138 139 /* library API identification */ 140 extern const char var_id[]; 141 142 /* library API functions */ 143 var_rc_t var_create (var_t **var); 144 var_rc_t var_destroy (var_t *var); 145 var_rc_t var_config (var_t *var, var_config_t mode, ...); 146 var_rc_t var_unescape (var_t *var, const char *src_ptr, size_t src_len, char *dst_ptr, size_t dst_len, int all); 147 var_rc_t var_expand (var_t *var, const char *src_ptr, size_t src_len, char **dst_ptr, size_t *dst_len, int force_expand); 148 var_rc_t var_formatv (var_t *var, char **dst_ptr, int force_expand, const char *fmt, va_list ap); 149 var_rc_t var_format (var_t *var, char **dst_ptr, int force_expand, const char *fmt, ...); 150 var_rc_t var_strerror (var_t *var, var_rc_t rc, char **str); 151 152 DECLARATION_END 153 154 #endif /* __VAR_H__ */ 155 156