On 08/08/2014 04:51 AM, Alan Coopersmith wrote:
Signed-off-by: Alan Coopersmith <[email protected]>

Hi,

Here it seems to me that strcmp() would be safe. While it changes the behaviour a bit, it seems more logical to only accept exact matches on the options (and not anything with random suffixes after the initial option name).

Moreover I got bored by the useless micro-optimisations of the option parser and removed them.

What do you think of the attached patch instead?

---
  xpr.c |   74 ++++++++++++++++++++++++++++++++---------------------------------
  1 file changed, 37 insertions(+), 37 deletions(-)

diff --git a/xpr.c b/xpr.c
index 07a8a30..30c7873 100644
--- a/xpr.c
+++ b/xpr.c
@@ -573,7 +573,7 @@ void parse_args(
        len = strlen(*argv);
        switch (argv[0][1]) {
        case 'a':               /* -append <filename> */
-           if (!bcmp(*argv, "-append", len)) {
+           if (!strncmp(*argv, "-append", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                output_filename = *argv;
@@ -585,9 +585,9 @@ void parse_args(
        case 'c':               /* -compact | -cutoff <intensity> */
            if (len <= 2 )
                unknown_arg(arg);
-           if (!bcmp(*argv, "-compact", len)) {
+           if (!strncmp(*argv, "-compact", len)) {
                *flags |= F_COMPACT;
-           } else if (!bcmp(*argv, "-cutoff", len)) {
+           } else if (!strncmp(*argv, "-cutoff", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *cutoff = min((atof(*argv) / 100.0 * 0xFFFF), 0xFFFF);
@@ -598,35 +598,35 @@ void parse_args(
        case 'd':       /* -density <num> | -device <dev> | -dump */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-dump", len)) {
+           if (!strncmp(*argv, "-dump", len)) {
                *flags |= F_DUMP;
            } else if (len <= 3) {
                unknown_arg(arg);
-           } else if (!bcmp(*argv, "-density", len)) {
+           } else if (!strncmp(*argv, "-density", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *density = atoi(*argv);
-           } else if (!bcmp(*argv, "-device", len)) {
+           } else if (!strncmp(*argv, "-device", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                len = strlen(*argv);
                if (len < 2)
                    unknown_arg(arg);
-               if (!bcmp(*argv, "ln03", len)) {
+               if (!strncmp(*argv, "ln03", len)) {
                    *device = LN03;
-               } else if (!bcmp(*argv, "la100", len)) {
+               } else if (!strncmp(*argv, "la100", len)) {
                    *device = LA100;
-               } else if (!bcmp(*argv, "ps", len)) {
+               } else if (!strncmp(*argv, "ps", len)) {
                    *device = PS;
-               } else if (!bcmp(*argv, "lw", len)) {
+               } else if (!strncmp(*argv, "lw", len)) {
                    *device = PS;
-               } else if (!bcmp(*argv, "pp", len)) {
+               } else if (!strncmp(*argv, "pp", len)) {
                    *device = PP;
-               } else if (!bcmp(*argv, "ljet", len)) {
+               } else if (!strncmp(*argv, "ljet", len)) {
                    *device = LJET;
-               } else if (!bcmp(*argv, "pjet", len)) {
+               } else if (!strncmp(*argv, "pjet", len)) {
                    *device = PJET;
-               } else if (!bcmp(*argv, "pjetxl", len)) {
+               } else if (!strncmp(*argv, "pjetxl", len)) {
                    *device = PJETXL;
                } else
                    invalid_arg_value(arg, argv[0]);
@@ -637,12 +637,12 @@ void parse_args(
        case 'g':               /* -gamma <float> | -gray <num> */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-gamma", len)) {
+           if (!strncmp(*argv, "-gamma", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *gamma = atof(*argv);
-           } else if (!bcmp(*argv, "-gray", len) ||
-               !bcmp(*argv, "-grey", len)) {
+           } else if (!strncmp(*argv, "-gray", len) ||
+               !strncmp(*argv, "-grey", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                switch (atoi(*argv)) {
@@ -666,11 +666,11 @@ void parse_args(
        case 'h':               /* -height <inches> | -header <string> */
            if (len <= 3)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-height", len)) {
+           if (!strncmp(*argv, "-height", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *height = (int)(300.0 * atof(*argv));
-           } else if (!bcmp(*argv, "-header", len)) {
+           } else if (!strncmp(*argv, "-header", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *header = *argv;
@@ -681,9 +681,9 @@ void parse_args(
        case 'l':               /* -landscape | -left <inches> */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-landscape", len)) {
+           if (!strncmp(*argv, "-landscape", len)) {
                *flags |= F_LANDSCAPE;
-           } else if (!bcmp(*argv, "-left", len)) {
+           } else if (!strncmp(*argv, "-left", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *left = (int)(300.0 * atof(*argv));
@@ -694,18 +694,18 @@ void parse_args(
        case 'n':               /* -nosixopt | -noff | -noposition */
            if (len <= 3)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-nosixopt", len)) {
+           if (!strncmp(*argv, "-nosixopt", len)) {
                *flags |= F_NOSIXOPT;
-           } else if (!bcmp(*argv, "-noff", len)) {
+           } else if (!strncmp(*argv, "-noff", len)) {
                *flags |= F_NOFF;
-           } else if (!bcmp(*argv, "-noposition", len)) {
+           } else if (!strncmp(*argv, "-noposition", len)) {
                *flags |= F_NPOSITION;
            } else
                unknown_arg(arg);
            break;

        case 'o':               /* -output <filename> */
-           if (!bcmp(*argv, "-output", len)) {
+           if (!strncmp(*argv, "-output", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                output_filename = *argv;
@@ -716,13 +716,13 @@ void parse_args(
        case 'p':               /* -portrait | -plane <n> */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-portrait", len)) {
+           if (!strncmp(*argv, "-portrait", len)) {
                *flags |= F_PORTRAIT;
-           } else if (!bcmp(*argv, "-plane", len)) {
+           } else if (!strncmp(*argv, "-plane", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *plane = atoi(*argv);
-           } else if (!bcmp(*argv, "-psfig", len)) {
+           } else if (!strncmp(*argv, "-psfig", len)) {
                *flags |= F_NPOSITION;
            } else
                unknown_arg(arg);
@@ -731,15 +731,15 @@ void parse_args(
        case 'r':               /* -render <type> | -report | -rv */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-rv", len)) {
+           if (!strncmp(*argv, "-rv", len)) {
                *flags |= F_INVERT;
            } else if (len <= 3) {
                unknown_arg(arg);
-           } else if (!bcmp(*argv, "-render", len)) {
+           } else if (!strncmp(*argv, "-render", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *render = atoi(*argv);
-           } else if (!bcmp(*argv, "-report", len)) {
+           } else if (!strncmp(*argv, "-report", len)) {
                *flags |= F_REPORT;
            } else
                unknown_arg(arg);
@@ -748,13 +748,13 @@ void parse_args(
        case 's':       /* -scale <scale> | -slide | -split <n-pages> */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-scale", len)) {
+           if (!strncmp(*argv, "-scale", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *scale = atoi(*argv);
-           } else if (!bcmp(*argv, "-slide", len)) {
+           } else if (!strncmp(*argv, "-slide", len)) {
                *flags |= F_SLIDE;
-           } else if (!bcmp(*argv, "-split", len)) {
+           } else if (!strncmp(*argv, "-split", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *split = atoi(*argv);
@@ -765,11 +765,11 @@ void parse_args(
        case 't':               /* -top <inches> | -trailer <string> */
            if (len <= 2)
                unknown_arg(arg);
-           if (!bcmp(*argv, "-top", len)) {
+           if (!strncmp(*argv, "-top", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *top = (int)(300.0 * atof(*argv));
-           } else if (!bcmp(*argv, "-trailer", len)) {
+           } else if (!strncmp(*argv, "-trailer", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *trailer = *argv;
@@ -786,7 +786,7 @@ void parse_args(
            break;

        case 'w':               /* -width <inches> */
-           if (!bcmp(*argv, "-width", len)) {
+           if (!strncmp(*argv, "-width", len)) {
                argc--; argv++;
                if (argc == 0) missing_arg(arg);
                *width = (int)(300.0 * atof(*argv));


>From e99d2f1c391fdaf62dd1979d115a316e984c8677 Mon Sep 17 00:00:00 2001
From: Matthieu Herrb <[email protected]>
Date: Fri, 8 Aug 2014 16:23:46 +0200
Subject: [PATCH] Use strcmp() to compare strings and simplify options parser.

Signed-off-by: Matthieu Herrb <[email protected]>
---
 xpr.c | 352 ++++++++++++++++++++++++------------------------------------------
 1 file changed, 125 insertions(+), 227 deletions(-)

diff --git a/xpr.c b/xpr.c
index 07a8a30..cbc39d6 100644
--- a/xpr.c
+++ b/xpr.c
@@ -543,7 +543,6 @@ void parse_args(
 {
     register char *output_filename;
     register int f;
-    register int len;
     register int pos;
 
     output_filename = NULL;
@@ -570,234 +569,133 @@ void parse_args(
 	    infilename = *argv;
 	    continue;
 	}
-	len = strlen(*argv);
-	switch (argv[0][1]) {
-	case 'a':		/* -append <filename> */
-	    if (!bcmp(*argv, "-append", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		output_filename = *argv;
-		*flags |= F_APPEND;
+	if (!strcmp(*argv, "-append")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    output_filename = *argv;
+	    *flags |= F_APPEND;
+	} else if (!strcmp(*argv, "-compact")) {
+	    *flags |= F_COMPACT;
+	} else if (!strcmp(*argv, "-cutoff")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *cutoff = min((atof(*argv) / 100.0 * 0xFFFF), 0xFFFF);
+	} else if (!strcmp(*argv, "-dump")) {
+	    *flags |= F_DUMP;
+	} else if (!strcmp(*argv, "-density")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *density = atoi(*argv);
+	} else if (!strcmp(*argv, "-device")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    if (!strcmp(*argv, "ln03")) {
+		*device = LN03;
+	    } else if (!strcmp(*argv, "la100")) {
+		*device = LA100;
+	    } else if (!strcmp(*argv, "ps")) {
+		*device = PS;
+	    } else if (!strcmp(*argv, "lw")) {
+		*device = PS;
+	    } else if (!strcmp(*argv, "pp")) {
+		*device = PP;
+	    } else if (!strcmp(*argv, "ljet")) {
+		*device = LJET;
+	    } else if (!strcmp(*argv, "pjet")) {
+		*device = PJET;
+	    } else if (!strcmp(*argv, "pjetxl")) {
+		*device = PJETXL;
 	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'c':		/* -compact | -cutoff <intensity> */
-	    if (len <= 2 )
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-compact", len)) {
-		*flags |= F_COMPACT;
-	    } else if (!bcmp(*argv, "-cutoff", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*cutoff = min((atof(*argv) / 100.0 * 0xFFFF), 0xFFFF);
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'd':	/* -density <num> | -device <dev> | -dump */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-dump", len)) {
-		*flags |= F_DUMP;
-	    } else if (len <= 3) {
-		unknown_arg(arg);
-	    } else if (!bcmp(*argv, "-density", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*density = atoi(*argv);
-	    } else if (!bcmp(*argv, "-device", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		len = strlen(*argv);
-		if (len < 2)
-		    unknown_arg(arg);
-		if (!bcmp(*argv, "ln03", len)) {
-		    *device = LN03;
-		} else if (!bcmp(*argv, "la100", len)) {
-		    *device = LA100;
-		} else if (!bcmp(*argv, "ps", len)) {
-		    *device = PS;
-		} else if (!bcmp(*argv, "lw", len)) {
-		    *device = PS;
-		} else if (!bcmp(*argv, "pp", len)) {
-		    *device = PP;
-		} else if (!bcmp(*argv, "ljet", len)) {
-		    *device = LJET;
-		} else if (!bcmp(*argv, "pjet", len)) {
-		    *device = PJET;
-		} else if (!bcmp(*argv, "pjetxl", len)) {
-		    *device = PJETXL;
-		} else
-		    invalid_arg_value(arg, argv[0]);
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'g':		/* -gamma <float> | -gray <num> */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-gamma", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*gamma = atof(*argv);
-	    } else if (!bcmp(*argv, "-gray", len) ||
-		!bcmp(*argv, "-grey", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		switch (atoi(*argv)) {
-		case 2:
-		    *gray = &gray2x2;
-		    break;
-		case 3:
-		    *gray = &gray3x3;
-		    break;
-		case 4:
-		    *gray = &gray4x4;
-		    break;
-		default:
-		    invalid_arg_value(arg, argv[0]);
-		}
-		*flags |= F_GRAY;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'h':		/* -height <inches> | -header <string> */
-	    if (len <= 3)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-height", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*height = (int)(300.0 * atof(*argv));
-	    } else if (!bcmp(*argv, "-header", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*header = *argv;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'l':		/* -landscape | -left <inches> */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-landscape", len)) {
-		*flags |= F_LANDSCAPE;
-	    } else if (!bcmp(*argv, "-left", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*left = (int)(300.0 * atof(*argv));
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'n':		/* -nosixopt | -noff | -noposition */
-	    if (len <= 3)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-nosixopt", len)) {
-		*flags |= F_NOSIXOPT;
-	    } else if (!bcmp(*argv, "-noff", len)) {
-		*flags |= F_NOFF;
-	    } else if (!bcmp(*argv, "-noposition", len)) {
-		*flags |= F_NPOSITION;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'o':		/* -output <filename> */
-	    if (!bcmp(*argv, "-output", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		output_filename = *argv;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'p':		/* -portrait | -plane <n> */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-portrait", len)) {
-		*flags |= F_PORTRAIT;
-	    } else if (!bcmp(*argv, "-plane", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*plane = atoi(*argv);
-	    } else if (!bcmp(*argv, "-psfig", len)) {
-		*flags |= F_NPOSITION;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'r':		/* -render <type> | -report | -rv */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-rv", len)) {
-		*flags |= F_INVERT;
-	    } else if (len <= 3) {
-		unknown_arg(arg);
-	    } else if (!bcmp(*argv, "-render", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*render = atoi(*argv);
-	    } else if (!bcmp(*argv, "-report", len)) {
-		*flags |= F_REPORT;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 's':	/* -scale <scale> | -slide | -split <n-pages> */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-scale", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*scale = atoi(*argv);
-	    } else if (!bcmp(*argv, "-slide", len)) {
-		*flags |= F_SLIDE;
-	    } else if (!bcmp(*argv, "-split", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*split = atoi(*argv);
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 't':		/* -top <inches> | -trailer <string> */
-	    if (len <= 2)
-		unknown_arg(arg);
-	    if (!bcmp(*argv, "-top", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*top = (int)(300.0 * atof(*argv));
-	    } else if (!bcmp(*argv, "-trailer", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*trailer = *argv;
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'v':		/* -version */
-	    if (strcmp(*argv, "-version") == 0) {
-		puts(PACKAGE_STRING);
-		exit(0);
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	case 'w':		/* -width <inches> */
-	    if (!bcmp(*argv, "-width", len)) {
-		argc--; argv++;
-		if (argc == 0) missing_arg(arg);
-		*width = (int)(300.0 * atof(*argv));
-	    } else
-		unknown_arg(arg);
-	    break;
-
-	default:
+		invalid_arg_value(arg, argv[0]);
+	} else if (!strcmp(*argv, "-gamma")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *gamma = atof(*argv);
+	} else if (!strcmp(*argv, "-gray") ||
+		   !strcmp(*argv, "-grey")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    switch (atoi(*argv)) {
+	      case 2:
+		*gray = &gray2x2;
+		break;
+	      case 3:
+		*gray = &gray3x3;
+		break;
+	      case 4:
+		*gray = &gray4x4;
+		break;
+	      default:
+		invalid_arg_value(arg, argv[0]);
+	    }
+	    *flags |= F_GRAY;
+	} else if (!strcmp(*argv, "-height")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *height = (int)(300.0 * atof(*argv));
+	} else if (!strcmp(*argv, "-header")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *header = *argv;
+	} else if (!strcmp(*argv, "-landscape")) {
+	    *flags |= F_LANDSCAPE;
+	} else if (!strcmp(*argv, "-left")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *left = (int)(300.0 * atof(*argv));
+	} else if (!strcmp(*argv, "-nosixopt")) {
+	    *flags |= F_NOSIXOPT;
+	} else if (!strcmp(*argv, "-noff")) {
+	    *flags |= F_NOFF;
+	} else if (!strcmp(*argv, "-noposition")) {
+	    *flags |= F_NPOSITION;
+	} else if (!strcmp(*argv, "-output")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    output_filename = *argv;
+	} else if (!strcmp(*argv, "-portrait")) {
+	    *flags |= F_PORTRAIT;
+	} else if (!strcmp(*argv, "-plane")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *plane = atoi(*argv);
+	} else if (!strcmp(*argv, "-psfig")) {
+	    *flags |= F_NPOSITION;
+	} else if (!strcmp(*argv, "-rv")) {
+	    *flags |= F_INVERT;
+	} else if (!strcmp(*argv, "-render")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *render = atoi(*argv);
+	} else if (!strcmp(*argv, "-report")) {
+	    *flags |= F_REPORT;
+	} else if (!strcmp(*argv, "-scale")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *scale = atoi(*argv);
+	} else if (!strcmp(*argv, "-slide")) {
+	    *flags |= F_SLIDE;
+	} else if (!strcmp(*argv, "-split")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *split = atoi(*argv);
+	} else if (!strcmp(*argv, "-top")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *top = (int)(300.0 * atof(*argv));
+	} else if (!strcmp(*argv, "-trailer")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *trailer = *argv;
+	} else if (strcmp(*argv, "-version") == 0) {
+	    puts(PACKAGE_STRING);
+	    exit(0);
+	} else if (!strcmp(*argv, "-width")) {
+	    argc--; argv++;
+	    if (argc == 0) missing_arg(arg);
+	    *width = (int)(300.0 * atof(*argv));
+	} else
 	    unknown_arg(arg);
-	    break;
-	}
     }
 
     if (infilename) {
-- 
1.9.3

_______________________________________________
[email protected]: X.Org development
Archives: http://lists.x.org/archives/xorg-devel
Info: http://lists.x.org/mailman/listinfo/xorg-devel

Reply via email to