Index: ossp-pkg/var/TODO RCS File: /v/ossp/cvs/ossp-pkg/var/Attic/TODO,v rcsdiff -q -kk '-r1.17' '-r1.18' -u '/v/ossp/cvs/ossp-pkg/var/Attic/TODO,v' 2>/dev/null --- TODO 2002/02/28 11:40:46 1.17 +++ TODO 2002/02/28 11:54:25 1.18 @@ -15,8 +15,6 @@ empty strings for undefined variables. This is certainly intended this way, but has to be documented better? - o generate internals into context - o use internal context to carry information o document exception handling Index: ossp-pkg/var/var.c RCS File: /v/ossp/cvs/ossp-pkg/var/var.c,v rcsdiff -q -kk '-r1.65' '-r1.66' -u '/v/ossp/cvs/ossp-pkg/var/var.c,v' 2>/dev/null --- var.c 2002/02/28 11:08:58 1.65 +++ var.c 2002/02/28 11:54:25 1.66 @@ -58,9 +58,12 @@ #define VAR_RC(rv) (rv) #endif /* WITH_EX */ +typedef char char_class_t[256]; /* 256 == 2 ^ sizeof(unsigned char)*8 */ + /* the external context structure */ struct var_st { var_syntax_t syntax; + char_class_t syntax_nameclass; var_cb_value_t cb_value_fct; void *cb_value_ctx; }; @@ -201,8 +204,6 @@ /* Routines for the expansion of quoted-pair expressions. */ -typedef char char_class_t[256]; /* 256 == 2 ^ sizeof(unsigned char)*8 */ - static void expand_range(char a, char b, char_class_t class) { do { @@ -1955,38 +1956,15 @@ const char *input_buf, size_t input_len, char **result, size_t *result_len, var_cb_value_t lookup, void *lookup_context, - const var_syntax_t *config, int force_expand) + const var_syntax_t *config, char_class_t nameclass, int force_expand) { - char_class_t nameclass; var_rc_t rc; tokenbuf_t output; - /* Argument sanity checks */ - if (input_buf == NULL || input_len == 0 || - result == NULL || - lookup == NULL) - return VAR_RC(VAR_ERR_INVALID_ARGUMENT); - - /* Optionally use default configuration */ - if (config == NULL) - config = &var_syntax_default; - /* Set the result pointer to the begining of the input buffer so that it is correctly initialized in case we fail with an error. */ *result = (char *)input_buf; - /* Expand the class description for valid variable names. */ - if ((rc = expand_character_class(config->name_chars, nameclass)) != VAR_OK) - return VAR_RC(rc); - - /* Make sure that the specials defined in the configuration do not - appear in the character name class. */ - if (nameclass[(int)config->delim_init] || - nameclass[(int)config->delim_open] || - nameclass[(int)config->delim_close] || - nameclass[(int)config->escape]) - return VAR_RC(VAR_ERR_INVALID_CONFIGURATION); - /* Call the parser. */ tokenbuf_init(&output); rc = input(input_buf, input_buf + input_len, config, nameclass, @@ -2054,6 +2032,7 @@ ...) { va_list ap; + var_rc_t rc; if (var == NULL) return VAR_RC(VAR_ERR_INVALID_ARGUMENT); @@ -2071,9 +2050,14 @@ var->syntax.index_open = s->index_open; var->syntax.index_close = s->index_close; var->syntax.index_mark = s->index_mark; - if (var->syntax.name_chars != NULL) - free(var->syntax.name_chars); - var->syntax.name_chars = strdup(s->name_chars); + var->syntax.name_chars = NULL; /* unused internally */ + if ((rc = expand_character_class(s->name_chars, var->syntax_nameclass)) != VAR_OK) + return VAR_RC(rc); + if ( var->syntax_nameclass[(int)var->syntax.delim_init] + || var->syntax_nameclass[(int)var->syntax.delim_open] + || var->syntax_nameclass[(int)var->syntax.delim_close] + || var->syntax_nameclass[(int)var->syntax.escape]) + return VAR_RC(VAR_ERR_INVALID_CONFIGURATION); break; } case VAR_CONFIG_CB_VALUE: { @@ -2156,17 +2140,21 @@ var_rc_t var_expand( var_t *var, - const char *src, size_t srclen, - char **dst, size_t *dstlen, + const char *src_ptr, size_t src_len, + char **dst_ptr, size_t *dst_len, int force_expand) { /* var_expand_t ctx; */ var_rc_t rc; + /* argument sanity checks */ + if (var == NULL || src_ptr == NULL || src_len == 0 || dst_ptr == NULL) + return VAR_RC(VAR_ERR_INVALID_ARGUMENT); + /* ctx.force_expand = force_expand; */ - rc = internal_expand(src, srclen, dst, dstlen, + rc = internal_expand(src_ptr, src_len, dst_ptr, dst_len, var->cb_value_fct, var->cb_value_ctx, - &var->syntax, force_expand); + &var->syntax, var->syntax_nameclass, force_expand); return rc; }