ossp-pkg/var/expand.c
#include "internal.h"
const var_config_t var_config_default =
{
'$', /* varinit */
'{', /* startdelim */
'}', /* enddelim */
'\\', /* escape */
"a-zA-Z0-9_" /* namechars */
};
var_rc_t var_expand(const char* input_buf, size_t input_len,
char** result, size_t* result_len,
var_cb_t lookup, void* lookup_context,
const var_config_t* config, int force_expand)
{
char nameclass[256];
var_rc_t rc;
tokenbuf output;
/* Assert everything is as we expect it. */
assert(input != NULL);
assert(result != NULL);
assert(result_len != NULL);
assert(lookup != NULL);
/* Expand the class description for valid variable names. */
if (config == NULL)
config = &var_config_default;
rc = expand_character_class(config->namechars, nameclass);
if (rc != VAR_OK)
return rc;
/* Make sure that the specials defined in the configuration do not
appear in the character name class. */
if (nameclass[(int)config->varinit] ||
nameclass[(int)config->startdelim] ||
nameclass[(int)config->enddelim] ||
nameclass[(int)config->escape])
return VAR_INVALID_CONFIGURATION;
/* Call the parser. */
output.begin = output.end = NULL;
output.buffer_size = 0;
rc = input(input_buf, input_buf + input_len, config, nameclass,
lookup, lookup_context, force_expand, &output);
if (rc != VAR_OK)
{
free_tokenbuf(&output);
return rc;
}
*result = (char*)output.begin;
*result_len = output.end - output.begin;
return VAR_OK;
}