|
4 | 4 | #include "common/parsing.h" |
5 | 5 |
|
6 | 6 | #include <stdlib.h> |
| 7 | +#include <ctype.h> |
7 | 8 | #include <string.h> |
8 | 9 | #include <dirent.h> |
9 | 10 | #include <sys/stat.h> |
@@ -453,58 +454,57 @@ static void parseOption(FFinstance* instance, FFdata* data, const char* key, con |
453 | 454 |
|
454 | 455 | static void parseConfigFile(FFinstance* instance, FFdata* data, FILE* file) |
455 | 456 | { |
456 | | - char* lineStart = NULL; |
| 457 | + char* line = NULL; |
457 | 458 | size_t len = 0; |
458 | 459 | ssize_t read; |
459 | 460 |
|
460 | | - FFstrbuf line; |
461 | | - ffStrbufInitA(&line, 256); //The default structure line needs this size |
462 | | - |
463 | | - while ((read = getline(&lineStart, &len, file)) != -1) |
| 461 | + while ((read = getline(&line, &len, file)) != -1) |
464 | 462 | { |
465 | | - ffStrbufSetS(&line, lineStart); |
466 | | - ffStrbufTrimRight(&line, '\n'); |
467 | | - ffStrbufTrim(&line, ' '); |
| 463 | + char* lineStart = line; |
| 464 | + char* lineEnd = line + read - 1; |
| 465 | + |
| 466 | + //Trim line left |
| 467 | + while(isspace(*lineStart)) |
| 468 | + ++lineStart; |
468 | 469 |
|
469 | | - if(line.length == 0 || line.chars[0] == '#') |
| 470 | + //Continue if line is empty or a comment |
| 471 | + if(*lineStart == '\0' || *lineStart == '#') |
470 | 472 | continue; |
471 | 473 |
|
472 | | - uint32_t firstSpace = ffStrbufFirstIndexC(&line, ' '); |
| 474 | + //Trim line right |
| 475 | + while(lineEnd > lineStart && isspace(*lineEnd)) |
| 476 | + --lineEnd; |
| 477 | + *(lineEnd + 1) = '\0'; |
| 478 | + |
| 479 | + char* valueStart = strchr(lineStart, ' '); |
473 | 480 |
|
474 | | - if(firstSpace >= line.length) |
| 481 | + //If the line has no white space, it is only a key |
| 482 | + if(valueStart == NULL) |
475 | 483 | { |
476 | | - parseOption(instance, data, line.chars, NULL); |
| 484 | + parseOption(instance, data, lineStart, NULL); |
477 | 485 | continue; |
478 | 486 | } |
479 | 487 |
|
480 | | - //Separate key and value by simply replacing the first space with a \0 |
481 | | - char* valueStart = &line.chars[firstSpace]; |
| 488 | + //separate the key from the value |
482 | 489 | *valueStart = '\0'; |
483 | 490 | ++valueStart; |
484 | 491 |
|
485 | | - //Trim whitespace at beginning of value |
486 | | - while(*valueStart == ' ') |
| 492 | + //Trim space of value left |
| 493 | + while(isspace(*valueStart)) |
487 | 494 | ++valueStart; |
488 | 495 |
|
489 | 496 | //If we want whitespace in values, we need to quote it. This is done to keep consistency with shell. |
490 | | - if(*valueStart == '"') |
| 497 | + if((*valueStart == '"' || *valueStart == '\'') && *valueStart == *lineEnd && lineEnd > valueStart) |
491 | 498 | { |
492 | | - char* last = line.chars + line.length - 1; |
493 | | - if(*last == '"') |
494 | | - { |
495 | | - ++valueStart; |
496 | | - *last = '\0'; |
497 | | - --line.length; |
498 | | - } |
| 499 | + ++valueStart; |
| 500 | + --lineEnd; |
499 | 501 | } |
500 | 502 |
|
501 | | - parseOption(instance, data, line.chars, valueStart); |
| 503 | + parseOption(instance, data, lineStart, valueStart); |
502 | 504 | } |
503 | 505 |
|
504 | | - ffStrbufDestroy(&line); |
505 | | - |
506 | | - if(lineStart != NULL) |
507 | | - free(lineStart); |
| 506 | + if(line != NULL) |
| 507 | + free(line); |
508 | 508 | } |
509 | 509 |
|
510 | 510 | static void optionParseConfigFile(FFinstance* instance, FFdata* data, const char* key, const char* value) |
@@ -1281,7 +1281,6 @@ static void parseArguments(FFinstance* instance, FFdata* data, int argc, const c |
1281 | 1281 | { |
1282 | 1282 | if(i == argc - 1 || ( |
1283 | 1283 | *argv[i + 1] == '-' && |
1284 | | - strcasecmp(argv[i], "--offsetx") != 0 && // --offsetx allows negative values |
1285 | 1284 | strcasecmp(argv[i], "--separator-string") != 0 // Separator string can start with a - |
1286 | 1285 | )) { |
1287 | 1286 | parseOption(instance, data, argv[i], NULL); |
|
0 commit comments