
5 changed files with 127 additions and 129 deletions
@ -1,112 +0,0 @@ |
|||
#include "prefs.h" |
|||
#include <ctype.h> |
|||
|
|||
ORCA_FORCE_NO_INLINE |
|||
Conf_read_result conf_read_line(FILE* file, char* buf, Usz bufsize, |
|||
char** out_left, Usz* out_leftsize, |
|||
char** out_right, Usz* out_rightsize) { |
|||
Usz len, a0, a1, b0, b1; |
|||
char* s; |
|||
if (bufsize < 2) |
|||
goto insufficient_buffer; |
|||
#if SIZE_MAX > INT_MAX |
|||
if (bufsize > (Usz)INT_MAX) |
|||
exit(1); // he boot too big
|
|||
#endif |
|||
s = fgets(buf, (int)bufsize, file); |
|||
if (!s) { |
|||
if (feof(file)) |
|||
goto eof; |
|||
goto ioerror; |
|||
} |
|||
len = strlen(buf); |
|||
if (len == bufsize - 1 && buf[len - 1] != '\n' && !feof(file)) |
|||
goto insufficient_buffer; |
|||
a0 = 0; // start of left
|
|||
for (;;) { |
|||
if (a0 == len) |
|||
goto ignore; |
|||
char c = s[a0]; |
|||
if (c == ';' || c == '#') // comment line, ignore
|
|||
goto ignore; |
|||
if (c == '=') // '=' before any other char, bad
|
|||
goto ignore; |
|||
if (!isspace(c)) |
|||
break; |
|||
a0++; |
|||
} |
|||
a1 = a0; // end of left
|
|||
for (;;) { |
|||
a1++; |
|||
if (a1 == len) |
|||
goto ignore; |
|||
char c = s[a1]; |
|||
Usz x = a1; |
|||
while (isspace(c)) { |
|||
x++; |
|||
if (x == len) |
|||
goto ignore; |
|||
c = s[x]; |
|||
} |
|||
if (c == '=') { |
|||
b0 = x; |
|||
break; |
|||
} |
|||
a1 = x; |
|||
} |
|||
for (;;) { |
|||
b0++; |
|||
if (b0 == len) |
|||
goto ignore; |
|||
char c = s[b0]; |
|||
if (!isspace(c)) |
|||
break; |
|||
} |
|||
b1 = b0; // end of right
|
|||
for (;;) { |
|||
b1++; |
|||
if (b1 == len) |
|||
goto ok; |
|||
char c = s[b1]; |
|||
Usz x = b1; |
|||
while (isspace(c)) { |
|||
x++; |
|||
if (x == len) |
|||
goto ok; |
|||
c = s[x]; |
|||
} |
|||
b1 = x; |
|||
} |
|||
Conf_read_result err; |
|||
insufficient_buffer: |
|||
err = Conf_read_buffer_too_small; |
|||
goto fail; |
|||
eof: |
|||
err = Conf_read_eof; |
|||
goto fail; |
|||
ioerror: |
|||
err = Conf_read_io_error; |
|||
goto fail; |
|||
fail: |
|||
*out_left = NULL; |
|||
*out_leftsize = 0; |
|||
goto no_right; |
|||
ignore: |
|||
s[len - 1] = '\0'; |
|||
*out_left = s; |
|||
*out_leftsize = len; |
|||
err = Conf_read_irrelevant; |
|||
goto no_right; |
|||
no_right: |
|||
*out_right = NULL; |
|||
*out_rightsize = 0; |
|||
return err; |
|||
ok: |
|||
s[a1] = '\0'; |
|||
s[b1] = '\0'; |
|||
*out_left = s + a0; |
|||
*out_leftsize = a1 - a0; |
|||
*out_right = s + b0; |
|||
*out_rightsize = b1 - b0; |
|||
return Conf_read_left_and_right; |
|||
} |
@ -1,15 +0,0 @@ |
|||
#pragma once |
|||
#include "base.h" |
|||
#include <stdio.h> // FILE cannot be forward declared |
|||
|
|||
typedef enum { |
|||
Conf_read_left_and_right = 0, // left and right will be set
|
|||
Conf_read_irrelevant, // only left will be set
|
|||
Conf_read_buffer_too_small, // neither will be set
|
|||
Conf_read_eof, // "
|
|||
Conf_read_io_error, // "
|
|||
} Conf_read_result; |
|||
|
|||
Conf_read_result conf_read_line(FILE* file, char* buf, Usz bufsize, |
|||
char** out_left, Usz* out_leftlen, |
|||
char** out_right, Usz* out_rightlen); |
Loading…
Reference in new issue