Config-UCL
view release on metacpan or search on metacpan
libucl-0.8.1/src/ucl_parser.c view on Meta::CPAN
return false;
}
/**
* Handle macro data
* @param parser
* @param chunk
* @param marco
* @param macro_start
* @param macro_len
* @return
*/
static bool
ucl_parse_macro_value (struct ucl_parser *parser,
struct ucl_chunk *chunk, struct ucl_macro *macro,
unsigned char const **macro_start, size_t *macro_len)
{
const unsigned char *p, *c;
bool need_unescape = false, ucl_escape = false, var_expand = false;
p = chunk->pos;
switch (*p) {
case '"':
/* We have macro value encoded in quotes */
c = p;
ucl_chunk_skipc (chunk, p);
if (!ucl_lex_json_string (parser, chunk, &need_unescape, &ucl_escape, &var_expand)) {
return false;
}
*macro_start = c + 1;
*macro_len = chunk->pos - c - 2;
p = chunk->pos;
break;
case '{':
/* We got a multiline macro body */
ucl_chunk_skipc (chunk, p);
/* Skip spaces at the beginning */
while (p < chunk->end) {
if (ucl_test_character (*p, UCL_CHARACTER_WHITESPACE_UNSAFE)) {
ucl_chunk_skipc (chunk, p);
}
else {
break;
}
}
c = p;
while (p < chunk->end) {
if (*p == '}') {
break;
}
ucl_chunk_skipc (chunk, p);
}
*macro_start = c;
*macro_len = p - c;
ucl_chunk_skipc (chunk, p);
break;
default:
/* Macro is not enclosed in quotes or braces */
c = p;
while (p < chunk->end) {
if (ucl_lex_is_atom_end (*p)) {
break;
}
ucl_chunk_skipc (chunk, p);
}
*macro_start = c;
*macro_len = p - c;
break;
}
/* We are at the end of a macro */
/* Skip ';' and space characters and return to previous state */
while (p < chunk->end) {
if (!ucl_test_character (*p, UCL_CHARACTER_WHITESPACE_UNSAFE) && *p != ';') {
break;
}
ucl_chunk_skipc (chunk, p);
}
return true;
}
/**
* Parse macro arguments as UCL object
* @param parser parser structure
* @param chunk the current data chunk
* @return
*/
static ucl_object_t *
ucl_parse_macro_arguments (struct ucl_parser *parser,
struct ucl_chunk *chunk)
{
ucl_object_t *res = NULL;
struct ucl_parser *params_parser;
int obraces = 1, ebraces = 0, state = 0;
const unsigned char *p, *c;
size_t args_len = 0;
struct ucl_parser_saved_state saved;
saved.column = chunk->column;
saved.line = chunk->line;
saved.pos = chunk->pos;
saved.remain = chunk->remain;
p = chunk->pos;
if (*p != '(' || chunk->remain < 2) {
return NULL;
}
/* Set begin and start */
ucl_chunk_skipc (chunk, p);
c = p;
while ((p) < (chunk)->end) {
switch (state) {
case 0:
/* Parse symbols and check for '(', ')' and '"' */
if (*p == '(') {
obraces ++;
( run in 1.111 second using v1.01-cache-2.11-cpan-39bf76dae61 )