1 /* 2 ** OSSP var - Variable Expansion 3 ** Copyright (c) 2001-2002 Ralf S. Engelschall <rse@engelschall.com> 4 ** Copyright (c) 2001-2002 The OSSP Project (http://www.ossp.org/) 5 ** Copyright (c) 2001-2002 Cable & Wireless Deutschland (http://www.cw.com/de/) 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 ** For disclaimer see below. 16 */ 17 /* 18 * Modified for use with Bacula by Kern Sibbald, June 2003, Jan 2019 19 */ 20 21 22 23 #ifndef __VAR_H__ 24 #define __VAR_H__ 25 26 /* Error codes */ 27 typedef enum { 28 VAR_ERR_CALLBACK = -64, 29 VAR_ERR_FORMATTING_FAILURE = -45, 30 VAR_ERR_UNDEFINED_OPERATION = -44, 31 VAR_ERR_MALFORMED_OPERATION_ARGUMENTS = -43, 32 VAR_ERR_INVALID_CHAR_IN_LOOP_LIMITS = -42, 33 VAR_ERR_UNTERMINATED_LOOP_CONSTRUCT = -41, 34 VAR_ERR_DIVISION_BY_ZERO_IN_INDEX = -40, 35 VAR_ERR_UNCLOSED_BRACKET_IN_INDEX = -39, 36 VAR_ERR_INCOMPLETE_INDEX_SPEC = -37, 37 VAR_ERR_INVALID_CHAR_IN_INDEX_SPEC = -36, 38 VAR_ERR_ARRAY_LOOKUPS_ARE_UNSUPPORTED = -35, 39 VAR_ERR_INCOMPLETE_QUOTED_PAIR = -34, 40 VAR_ERR_INVALID_ARGUMENT = -34, 41 VAR_ERR_SUBMATCH_OUT_OF_RANGE = -33, 42 VAR_ERR_UNKNOWN_QUOTED_PAIR_IN_REPLACE = -32, 43 VAR_ERR_EMPTY_PADDING_FILL_STRING = -31, 44 VAR_ERR_MISSING_PADDING_WIDTH = -30, 45 VAR_ERR_MALFORMATTED_PADDING = -29, 46 VAR_ERR_INCORRECT_TRANSPOSE_CLASS_SPEC = -28, 47 VAR_ERR_EMPTY_TRANSPOSE_CLASS = -27, 48 VAR_ERR_TRANSPOSE_CLASSES_MISMATCH = -26, 49 VAR_ERR_MALFORMATTED_TRANSPOSE = -25, 50 VAR_ERR_OFFSET_LOGIC = -24, 51 VAR_ERR_OFFSET_OUT_OF_BOUNDS = -23, 52 VAR_ERR_RANGE_OUT_OF_BOUNDS = -22, 53 VAR_ERR_INVALID_OFFSET_DELIMITER = -21, 54 VAR_ERR_MISSING_START_OFFSET = -20, 55 VAR_ERR_EMPTY_SEARCH_STRING = -19, 56 VAR_ERR_MISSING_PARAMETER_IN_COMMAND = -18, 57 VAR_ERR_INVALID_REGEX_IN_REPLACE = -17, 58 VAR_ERR_UNKNOWN_REPLACE_FLAG = -16, 59 VAR_ERR_MALFORMATTED_REPLACE = -15, 60 VAR_ERR_UNKNOWN_COMMAND_CHAR = -14, 61 VAR_ERR_INPUT_ISNT_TEXT_NOR_VARIABLE = -13, 62 VAR_ERR_UNDEFINED_VARIABLE = -12, 63 VAR_ERR_INCOMPLETE_VARIABLE_SPEC = -11, 64 VAR_ERR_OUT_OF_MEMORY = -10, 65 VAR_ERR_INVALID_CONFIGURATION = -9, 66 VAR_ERR_INCORRECT_CLASS_SPEC = -8, 67 VAR_ERR_INCOMPLETE_GROUPED_HEX = -7, 68 VAR_ERR_INCOMPLETE_OCTAL = -6, 69 VAR_ERR_INVALID_OCTAL = -5, 70 VAR_ERR_OCTAL_TOO_LARGE = -4, 71 VAR_ERR_INVALID_HEX = -3, 72 VAR_ERR_INCOMPLETE_HEX = -2, 73 VAR_ERR_INCOMPLETE_NAMED_CHARACTER = -1, 74 VAR_OK = 0 75 } var_rc_t; 76 77 struct var_st; 78 typedef struct var_st var_t; 79 80 enum _var_config_t { 81 VAR_CONFIG_SYNTAX, 82 VAR_CONFIG_CB_VALUE, 83 VAR_CONFIG_CB_OPERATION 84 }; 85 /* Force var_config_t to int to avoid compiler default conversion warnings */ 86 typedef int var_config_t; 87 88 typedef struct { 89 char escape; /* default: '\' */ 90 char delim_init; /* default: '$' */ 91 char delim_open; /* default: '{' */ 92 char delim_close; /* default: '}' */ 93 char index_open; /* default: '[' */ 94 char index_close; /* default: ']' */ 95 char index_mark; /* default: '#' */ 96 const char *name_chars; /* default: "a-zA-Z0-9_" */ 97 } var_syntax_t; 98 99 typedef var_rc_t (*var_cb_value_t)( 100 var_t *var, void *ctx, 101 const char *var_ptr, int var_len, int var_inc, int var_idx, 102 const char **val_ptr, int *val_len, int *val_size 103 ); 104 105 typedef var_rc_t (*var_cb_operation_t)( 106 var_t *var, void *ctx, 107 const char *op_ptr, int op_len, 108 const char *arg_ptr, int arg_len, 109 const char *val_ptr, int val_len, 110 const char **out_ptr, int *out_len, int *out_size 111 ); 112 113 114 var_rc_t var_create (var_t **var); 115 var_rc_t var_destroy (var_t *var); 116 var_rc_t var_config (var_t *var, var_config_t mode, ...); 117 var_rc_t var_unescape (var_t *var, const char *src_ptr, int src_len, char *dst_ptr, int dst_len, int all); 118 var_rc_t var_expand (var_t *var, const char *src_ptr, int src_len, char **dst_ptr, int *dst_len, int force_expand); 119 var_rc_t var_formatv (var_t *var, char **dst_ptr, int force_expand, const char *fmt, va_list ap); 120 var_rc_t var_format (var_t *var, char **dst_ptr, int force_expand, const char *fmt, ...); 121 const char *var_strerror (var_t *var, var_rc_t rc); 122 123 #endif /* __VAR_H__ */ 124