Browse code

shared/optparser.c: make the parser even more tolerant to whitespace

git-svn: trunk@5011

Tomasz Kojm authored on 2009/04/03 01:38:10
Showing 2 changed files
... ...
@@ -1,3 +1,7 @@
1
+Thu Apr  2 18:36:58 CEST 2009 (tk)
2
+----------------------------------
3
+ * shared/optparser.c: make the parser even more tolerant to whitespace
4
+
1 5
 Thu Apr  2 04:09:06 CEST 2009 (acab)
2 6
 ------------------------------------
3 7
  * clamav-milter/clamfi.c: properly separate body from headers (bb#1531),
... ...
@@ -630,7 +630,7 @@ struct optstruct *optparse(const char *cfgfile, int argc, char **argv, int verbo
630 630
 	const char *name = NULL, *arg;
631 631
 	int i, err = 0, lc = 0, sc = 0, opt_index, line = 0, ret, numarg;
632 632
 	struct optstruct *opts = NULL, *opts_last = NULL, *opt;
633
-	char buff[512];
633
+	char buffer[512], *buff;
634 634
 	struct option longopts[MAXCMDOPTS];
635 635
 	char shortopts[MAXCMDOPTS];
636 636
 	regex_t regex;
... ...
@@ -705,9 +705,12 @@ struct optstruct *optparse(const char *cfgfile, int argc, char **argv, int verbo
705 705
     while(1) {
706 706
 
707 707
 	if(cfgfile) {
708
-	    if(!fgets(buff, sizeof(buff), fs))
708
+	    if(!fgets(buffer, sizeof(buffer), fs))
709 709
 		break;
710 710
 
711
+	    buff = buffer;
712
+	    for(i = 0; i < (int) strlen(buff) - 1 && (buff[i] == ' ' || buff[i] == '\t'); i++);
713
+	    buff += i;
711 714
 	    line++;
712 715
 	    if(strlen(buff) <= 2 || buff[0] == '#')
713 716
 		continue;
... ...
@@ -729,14 +732,14 @@ struct optstruct *optparse(const char *cfgfile, int argc, char **argv, int verbo
729 729
 	    *pt++ = 0;
730 730
 	    for(i = 0; i < (int) strlen(pt) - 1 && (pt[i] == ' ' || pt[i] == '\t'); i++);
731 731
 	    pt += i;
732
-	    if((i = strlen(pt)) && pt[i - 1] == '\n')
733
-		pt[i-- - 1] = 0;
732
+	    for(i = strlen(pt); i >= 1 && (pt[i - 1] == ' ' || pt[i - 1] == '\t' || pt[i - 1] == '\n'); i--);
734 733
 	    if(!i) {
735 734
 		if(verbose)
736 735
 		    fprintf(stderr, "ERROR: Missing argument for option at line %d\n", line);
737 736
 		err = 1;
738 737
 		break;
739 738
 	    }
739
+	    pt[i] = 0;
740 740
 	    arg = pt;
741 741
 	    if(*arg == '"') {
742 742
 		arg++; pt++;
... ...
@@ -754,15 +757,6 @@ struct optstruct *optparse(const char *cfgfile, int argc, char **argv, int verbo
754 754
 		    err = 1;
755 755
 		    break;
756 756
 		}
757
-	    } else {
758
-		for(i = strlen(pt); i >= 1 && (pt[i - 1] == ' ' || pt[i - 1] == '\t'); i--);
759
-		if(!i) {
760
-		    if(verbose)
761
-			fprintf(stderr, "ERROR: Missing argument for option at line %u\n", line);
762
-		    err = 1;
763
-		    break;
764
-		}
765
-		pt[i] = 0;
766 757
 	    }
767 758
 
768 759
 	} else {