[prelude-cvslog] r6462 - trunk/libprelude/src
noreply at prelude-ids.org
noreply at prelude-ids.org
Fri May 27 08:37:43 CEST 2005
Author: yoann
Date: 2005-05-27 08:37:42 +0200 (Fri, 27 May 2005)
New Revision: 6462
Modified:
trunk/libprelude/src/config-engine.c
Log:
Fix parsing of unquoted value. Always read last line even if not \n terminated.
Modified: trunk/libprelude/src/config-engine.c
===================================================================
--- trunk/libprelude/src/config-engine.c 2005-05-27 05:15:53 UTC (rev 6461)
+++ trunk/libprelude/src/config-engine.c 2005-05-27 06:37:42 UTC (rev 6462)
@@ -276,22 +276,31 @@
static int strip_value(char **out, const char *in, size_t tlen)
{
size_t slen, elen;
+ prelude_bool_t have_start_quote = FALSE;
+
+ in += slen = strspn(in, " \t");
+ if ( *in == '"' ) {
+ in++; slen++;
+ have_start_quote = TRUE;
+ }
- slen = strspn(in, " \"\t");
-
elen = tlen - slen;
- if ( ! elen ) {
- *out = strdup("");
- return (*out) ? 0 : prelude_error_from_errno(errno);
- }
+ if ( ! elen )
+ return 0;
- elen--;
- while ( in[elen] == ' ' || in[elen] == '\t' || in[elen] == '\"' ) {
+ while ( in[elen - 1] == ' ' || in[elen - 1] == '\t' )
elen--;
+
+ if ( have_start_quote && elen ) {
+ if ( in[elen - 1] == '"' )
+ elen--;
+ else {
+ in--;
+ elen++;
+ }
}
- *out = strndup(in + slen, elen + 1);
-
+ *out = strndup(in, elen);
return (*out) ? 0 : prelude_error_from_errno(errno);
}
@@ -317,7 +326,7 @@
if ( ! ptr )
return 0;
- return strip_value(value, ptr + 1, strlen(ptr + 1));
+ return strip_value(value, ptr + 1, strlen(ptr + 1));
}
@@ -325,7 +334,7 @@
{
int ret;
char *ptr;
-
+
buf += strspn(buf, "\n [");
ptr = strchr(buf, ']');
@@ -368,7 +377,7 @@
if ( ! is_section(cfg->content[i]) )
continue;
- ret = parse_section_buffer(cfg->content[i], &entry, &value);
+ ret = parse_section_buffer(cfg->content[i], &entry, &value);
if ( ret < 0 )
continue;
@@ -718,20 +727,18 @@
{
char *ptr;
- if ( ! *line )
- free_val(section);
-
- if ( ! cfg->content || *line >= cfg->elements )
- return -1;
-
free_val(entry);
free_val(value);
free_val(section);
+
+ if ( ! cfg->content || *line >= cfg->elements )
+ return -1;
- for ( (*line)++ ; *line < cfg->elements; (*line)++ ) {
+ while ( *line < cfg->elements ) {
- ptr = cfg->content[*line - 1];
+ ptr = cfg->content[*line];
ptr += strspn(ptr, " \t");
+ (*line)++;
if ( ! *ptr || is_line_commented(ptr) )
continue;
More information about the Prelude-cvslog
mailing list