Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Replicate and fix long lines #181

Closed
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
26 changes: 22 additions & 4 deletions ini.c
Original file line number Diff line number Diff line change
Expand Up @@ -93,6 +93,19 @@ static char* ini_strncpy0(char* dest, const char* src, size_t size)
return dest;
}

#if !INI_ALLOW_REALLOC || INI_USE_STACK
/* Advance the stream. This is useful for the next line */
static void discard_remaining_line(void *stream, ini_reader reader){
char s[50];
size_t length;
do{
if (reader(s, sizeof(s), stream) == NULL)
break; // false positive
length=strlen(s);
} while(length == sizeof(s) - 1 && s[length-1] != '\n');
}
#endif

/* See documentation in header file. */
int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
void* user)
Expand All @@ -107,13 +120,13 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
#endif
#if INI_ALLOW_REALLOC && !INI_USE_STACK
char* new_line;
size_t offset;
#endif
char section[MAX_SECTION] = "";
#if INI_ALLOW_MULTILINE
char prev_name[MAX_NAME] = "";
#endif

size_t offset;
char* start;
char* end;
char* name;
Expand All @@ -136,9 +149,10 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,

/* Scan through stream line by line */
while (reader(line, (int)max_line, stream) != NULL) {
#if INI_ALLOW_REALLOC && !INI_USE_STACK
lineno++;
offset = strlen(line);
while (offset == max_line - 1 && line[offset - 1] != '\n') {
#if INI_ALLOW_REALLOC && !INI_USE_STACK
max_line *= 2;
if (max_line > INI_MAX_LINE)
max_line = INI_MAX_LINE;
Expand All @@ -153,10 +167,14 @@ int ini_parse_stream(ini_reader reader, void* stream, ini_handler handler,
if (max_line >= INI_MAX_LINE)
break;
offset += strlen(line + offset);
}
#else
if (!error)
error=lineno;
discard_remaining_line(stream, reader);
break;
#endif
}

lineno++;

start = line;
#if INI_ALLOW_BOM
Expand Down
83 changes: 11 additions & 72 deletions tests/baseline_multi_max_line.txt
Original file line number Diff line number Diff line change
@@ -1,72 +1,11 @@
no_file.ini: e=-1 user=0
... [section1]
... one=This is a test;
... two=1234;
... [ section 2 ]
... happy=4;
... sad=;
... [comment_test]
... test1=1;2;3;
... test2=2;3;4;this;
... test2=needs whitespace b;
... test;3=345;
... test4=4#5#6;
... test4=only starts a comm;
... test7=;
... test8=; not a comm;
... [colon_tests]
... Content-Type=text/;
... foo=bar;
... adams=42;
... funny1=with = equ;
... funny2=with : col;
... funny3=two = equa;
... funny4=two : colo;
normal.ini: e=2 user=101
... [section1]
... name1=value1;
... name2=value2;
bad_section.ini: e=3 user=102
bad_comment.ini: e=1 user=102
... [section]
... a=b;
... user=parse_error;
... c=d;
user_error.ini: e=3 user=104
... [section1]
... single1=abc;
... multi=this is a;
... multi=multi-line;
... single2=xyz;
... [section2]
... multi=a;
... multi=b;
... multi=c;
... [section3]
... single=ghi;
... multi=the quick;
... multi=brown fox;
... name=bob smith;
... name=comment line 1;
... name=comment line 2;
... foo=bar;
... foo=Hi World;
multi_line.ini: e=5 user=105
bad_multi.ini: e=1 user=105
... [bom_section]
... bom_name=bom_value;
... key“=value“;
bom.ini: e=0 user=107
... [section1]
... single1=abc;
... single2=xyz;
... single1=def;
... single2=qrs;
duplicate_sections.ini: e=0 user=108
... [section0]
... key0=val0;
... [section1]
... key1=val1;
no_value.ini: e=2 user=109
... name=value;
long_section.ini: e=2 user=110
... [width = 18]
... _123456789=1234567;
... [width = 19]
... _123456789=12345678;
... [width = 20]
... _123456789=12345678;
... [2 assigns]
... _123456789=12345678;
... [no trailing \n]
... _123456782=12345678;
long_line.ini: e=10 user=100
23 changes: 23 additions & 0 deletions tests/long_line.ini
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# These tests are
# only interesting
# when
# INI_MAX_LINE=20

[width = 18]
_123456789=1234567

[width = 19]
_123456789=12345678

[width = 20]
_123456789=123456789

[2 assigns]
_123456789=12345678name=value

[no trailing \n]
# trigger a false
# positive in the
# incomplete line
# detection
_123456782=12345678
14 changes: 0 additions & 14 deletions tests/meson.build
Original file line number Diff line number Diff line change
@@ -1,21 +1,7 @@
runtest = files(join_paths(meson.project_source_root(), 'tests', 'runtest.sh'))

tests = {
'multi': { 'args': [] },
'multi_max_line': { 'args': ['-DINI_MAX_LINE=20'] },
'single': { 'args': ['-DINI_ALLOW_MULTILINE=0'] },
'disallow_inline_comments': { 'args': ['-DINI_ALLOW_INLINE_COMMENTS=0'] },
'stop_on_first_error': { 'args': ['-DINI_STOP_ON_FIRST_ERROR=1'] },
'handler_lineno': { 'args': ['-DINI_HANDLER_LINENO=1'] },
'string': { 'src': 'unittest_string.c', 'args': ['-DINI_MAX_LINE=20'] },
'heap': { 'args': ['-DINI_USE_STACK=0'] },
'heap_max_line': { 'args': ['-DINI_USE_STACK=0', '-DINI_MAX_LINE=20', '-DINI_INITIAL_ALLOC=20'] },
'heap_realloc': { 'args': ['-DINI_USE_STACK=0', '-DINI_ALLOW_REALLOC=1', '-DINI_INITIAL_ALLOC=5'] },
'heap_realloc_max_line': { 'args': ['-DINI_USE_STACK=0', '-DINI_MAX_LINE=20', '-DINI_ALLOW_REALLOC=1', '-DINI_INITIAL_ALLOC=5'] },
'heap_string': { 'src': 'unittest_string.c', 'args': ['-DINI_USE_STACK=0', '-DINI_MAX_LINE=20', '-DINI_INITIAL_ALLOC=20'] },
'call_handler_on_new_section': { 'args': ['-DINI_CALL_HANDLER_ON_NEW_SECTION=1'] },
'allow_no_value': { 'args': ['-DINI_ALLOW_NO_VALUE=1'] },
'alloc': { 'src': 'unittest_alloc.c', 'args': ['-DINI_CUSTOM_ALLOCATOR=1', '-DINI_USE_STACK=0', '-DINI_ALLOW_REALLOC=1', '-DINI_INITIAL_ALLOC=12'] }
}

foreach name, properties : tests
Expand Down
12 changes: 1 addition & 11 deletions tests/unittest.c
Original file line number Diff line number Diff line change
Expand Up @@ -62,16 +62,6 @@ void parse(const char* fname) {

int main(void)
{
parse("no_file.ini");
parse("normal.ini");
parse("bad_section.ini");
parse("bad_comment.ini");
parse("user_error.ini");
parse("multi_line.ini");
parse("bad_multi.ini");
parse("bom.ini");
parse("duplicate_sections.ini");
parse("no_value.ini");
parse("long_section.ini");
parse("long_line.ini");
return 0;
}
56 changes: 0 additions & 56 deletions tests/unittest.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,62 +2,6 @@

CC="${CC:-gcc} -Wall"

$CC ../ini.c unittest.c -o unittest_multi
./unittest_multi > baseline_multi.txt
rm -f unittest_multi

$CC ../ini.c -DINI_MAX_LINE=20 unittest.c -o unittest_multi_max_line
./unittest_multi_max_line > baseline_multi_max_line.txt
rm -f unittest_multi_max_line

$CC ../ini.c -DINI_ALLOW_MULTILINE=0 unittest.c -o unittest_single
./unittest_single > baseline_single.txt
rm -f unittest_single

$CC ../ini.c -DINI_ALLOW_INLINE_COMMENTS=0 unittest.c -o unittest_disallow_inline_comments
./unittest_disallow_inline_comments > baseline_disallow_inline_comments.txt
rm -f unittest_disallow_inline_comments

$CC ../ini.c -DINI_STOP_ON_FIRST_ERROR=1 unittest.c -o unittest_stop_on_first_error
./unittest_stop_on_first_error > baseline_stop_on_first_error.txt
rm -f unittest_stop_on_first_error

$CC ../ini.c -DINI_HANDLER_LINENO=1 unittest.c -o unittest_handler_lineno
./unittest_handler_lineno > baseline_handler_lineno.txt
rm -f unittest_handler_lineno

$CC ../ini.c -DINI_MAX_LINE=20 unittest_string.c -o unittest_string
./unittest_string > baseline_string.txt
rm -f unittest_string

$CC ../ini.c -DINI_USE_STACK=0 unittest.c -o unittest_heap
./unittest_heap > baseline_heap.txt
rm -f unittest_heap

$CC ../ini.c -DINI_USE_STACK=0 -DINI_MAX_LINE=20 -DINI_INITIAL_ALLOC=20 unittest.c -o unittest_heap_max_line
./unittest_heap_max_line > baseline_heap_max_line.txt
rm -f unittest_heap_max_line

$CC ../ini.c -DINI_USE_STACK=0 -DINI_ALLOW_REALLOC=1 -DINI_INITIAL_ALLOC=5 unittest.c -o unittest_heap_realloc
./unittest_heap_realloc > baseline_heap_realloc.txt
rm -f unittest_heap_realloc

$CC ../ini.c -DINI_USE_STACK=0 -DINI_MAX_LINE=20 -DINI_ALLOW_REALLOC=1 -DINI_INITIAL_ALLOC=5 unittest.c -o unittest_heap_realloc_max_line
./unittest_heap_realloc_max_line > baseline_heap_realloc_max_line.txt
rm -f unittest_heap_realloc_max_line

$CC ../ini.c -DINI_USE_STACK=0 -DINI_MAX_LINE=20 -DINI_INITIAL_ALLOC=20 unittest_string.c -o unittest_heap_string
./unittest_heap_string > baseline_heap_string.txt
rm -f unittest_heap_string

$CC ../ini.c -DINI_CALL_HANDLER_ON_NEW_SECTION=1 unittest.c -o unittest_call_handler_on_new_section
./unittest_call_handler_on_new_section > baseline_call_handler_on_new_section.txt
rm -f unittest_call_handler_on_new_section

$CC ../ini.c -DINI_ALLOW_NO_VALUE=1 unittest.c -o unittest_allow_no_value
./unittest_allow_no_value > baseline_allow_no_value.txt
rm -f unittest_allow_no_value

$CC -DINI_CUSTOM_ALLOCATOR=1 -DINI_USE_STACK=0 -DINI_ALLOW_REALLOC=1 -DINI_INITIAL_ALLOC=12 ../ini.c unittest_alloc.c -o unittest_alloc
./unittest_alloc > baseline_alloc.txt
rm -f unittest_alloc
Loading