1 /*
2  *  Copyright (c) 2001-2002 Ralf S. Engelschall <rse@engelschall.com>
3  *  Copyright (c) 2001-2002 The OSSP Project (http://www.ossp.org/)
4  *  Copyright (c) 2001-2002 Cable & Wireless Deutschland (http://www.cw.com/de/)
5  *
6  *  This file is part of OSSP var, a variable expansion
7  *  library which can be found at http://www.ossp.org/pkg/lib/var/.
8  *
9  *  Permission to use, copy, modify, and distribute this software for
10  *  any purpose with or without fee is hereby granted, provided that
11  *  the above copyright notice and this permission notice appear in all
12  *  copies.
13  *
14  *  For disclaimer see below.
15  */
16 /*
17  * Modified for use with BACULA by Kern Sibbald, June 2003
18  */
19 /**
20  * @file
21  * OSSP var - Variable Expansion
22  */
23 /* check-sources:disable-copyright-check */
24 
25 #ifndef BAREOS_LIB_VAR_H_
26 #define BAREOS_LIB_VAR_H_
27 
28 /* Error codes */
29 typedef enum
30 {
31   VAR_ERR_CALLBACK = -64,
32   VAR_ERR_FORMATTING_FAILURE = -45,
33   VAR_ERR_UNDEFINED_OPERATION = -44,
34   VAR_ERR_MALFORMED_OPERATION_ARGUMENTS = -43,
35   VAR_ERR_INVALID_CHAR_IN_LOOP_LIMITS = -42,
36   VAR_ERR_UNTERMINATED_LOOP_CONSTRUCT = -41,
37   VAR_ERR_DIVISION_BY_ZERO_IN_INDEX = -40,
38   VAR_ERR_UNCLOSED_BRACKET_IN_INDEX = -39,
39   VAR_ERR_INCOMPLETE_INDEX_SPEC = -37,
40   VAR_ERR_INVALID_CHAR_IN_INDEX_SPEC = -36,
41   VAR_ERR_ARRAY_LOOKUPS_ARE_UNSUPPORTED = -35,
42   VAR_ERR_INCOMPLETE_QUOTED_PAIR = -34,
43   VAR_ERR_INVALID_ARGUMENT = -34,
44   VAR_ERR_SUBMATCH_OUT_OF_RANGE = -33,
45   VAR_ERR_UNKNOWN_QUOTED_PAIR_IN_REPLACE = -32,
46   VAR_ERR_EMPTY_PADDING_FILL_STRING = -31,
47   VAR_ERR_MISSING_PADDING_WIDTH = -30,
48   VAR_ERR_MALFORMATTED_PADDING = -29,
49   VAR_ERR_INCORRECT_TRANSPOSE_CLASS_SPEC = -28,
50   VAR_ERR_EMPTY_TRANSPOSE_CLASS = -27,
51   VAR_ERR_TRANSPOSE_CLASSES_MISMATCH = -26,
52   VAR_ERR_MALFORMATTED_TRANSPOSE = -25,
53   VAR_ERR_OFFSET_LOGIC = -24,
54   VAR_ERR_OFFSET_OUT_OF_BOUNDS = -23,
55   VAR_ERR_RANGE_OUT_OF_BOUNDS = -22,
56   VAR_ERR_INVALID_OFFSET_DELIMITER = -21,
57   VAR_ERR_MISSING_START_OFFSET = -20,
58   VAR_ERR_EMPTY_SEARCH_STRING = -19,
59   VAR_ERR_MISSING_PARAMETER_IN_COMMAND = -18,
60   VAR_ERR_INVALID_REGEX_IN_REPLACE = -17,
61   VAR_ERR_UNKNOWN_REPLACE_FLAG = -16,
62   VAR_ERR_MALFORMATTED_REPLACE = -15,
63   VAR_ERR_UNKNOWN_COMMAND_CHAR = -14,
64   VAR_ERR_INPUT_ISNT_TEXT_NOR_VARIABLE = -13,
65   VAR_ERR_UNDEFINED_VARIABLE = -12,
66   VAR_ERR_INCOMPLETE_VARIABLE_SPEC = -11,
67   VAR_ERR_OUT_OF_MEMORY = -10,
68   VAR_ERR_INVALID_CONFIGURATION = -9,
69   VAR_ERR_INCORRECT_CLASS_SPEC = -8,
70   VAR_ERR_INCOMPLETE_GROUPED_HEX = -7,
71   VAR_ERR_INCOMPLETE_OCTAL = -6,
72   VAR_ERR_INVALID_OCTAL = -5,
73   VAR_ERR_OCTAL_TOO_LARGE = -4,
74   VAR_ERR_INVALID_HEX = -3,
75   VAR_ERR_INCOMPLETE_HEX = -2,
76   VAR_ERR_INCOMPLETE_NAMED_CHARACTER = -1,
77   VAR_OK = 0
78 } var_rc_t;
79 
80 struct var_st;
81 typedef struct var_st var_t;
82 
83 enum class var_config_t
84 {
85   VAR_CONFIG_SYNTAX,
86   VAR_CONFIG_CB_VALUE,
87   VAR_CONFIG_CB_OPERATION
88 };
89 
90 typedef struct {
91   char escape;            /* default: '\' */
92   char delim_init;        /* default: '$' */
93   char delim_open;        /* default: '{' */
94   char delim_close;       /* default: '}' */
95   char index_open;        /* default: '[' */
96   char index_close;       /* default: ']' */
97   char index_mark;        /* default: '#' */
98   const char* name_chars; /* default: "a-zA-Z0-9_" */
99 } var_syntax_t;
100 
101 typedef var_rc_t (*var_cb_value_t)(var_t* var,
102                                    void* ctx,
103                                    const char* var_ptr,
104                                    int var_len,
105                                    int var_inc,
106                                    int var_idx,
107                                    const char** val_ptr,
108                                    int* val_len,
109                                    int* val_size);
110 
111 typedef var_rc_t (*var_cb_operation_t)(var_t* var,
112                                        void* ctx,
113                                        const char* op_ptr,
114                                        int op_len,
115                                        const char* arg_ptr,
116                                        int arg_len,
117                                        const char* val_ptr,
118                                        int val_len,
119                                        const char** out_ptr,
120                                        int* out_len,
121                                        int* out_size);
122 
123 
124 var_rc_t var_create(var_t** var);
125 var_rc_t var_destroy(var_t* var);
126 var_rc_t var_config(var_t* var, var_config_t mode, ...);
127 var_rc_t var_unescape(var_t* var,
128                       const char* src_ptr,
129                       int src_len,
130                       char* dst_ptr,
131                       int dst_len,
132                       int all);
133 var_rc_t var_expand(var_t* var,
134                     const char* src_ptr,
135                     int src_len,
136                     char** dst_ptr,
137                     int* dst_len,
138                     int force_expand);
139 var_rc_t var_formatv(var_t* var,
140                      char** dst_ptr,
141                      int force_expand,
142                      const char* fmt,
143                      va_list ap);
144 var_rc_t var_format(var_t* var,
145                     char** dst_ptr,
146                     int force_expand,
147                     const char* fmt,
148                     ...);
149 const char* var_strerror(var_t* var, var_rc_t rc);
150 
151 #endif /* BAREOS_LIB_VAR_H_ */
152