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