]> git.saurik.com Git - bison.git/commitdiff
avoid direct strncmp calls.
authorAkim Demaille <demaille@gostai.com>
Thu, 23 Feb 2012 19:14:42 +0000 (20:14 +0100)
committerAkim Demaille <demaille@gostai.com>
Fri, 9 Mar 2012 06:33:23 +0000 (07:33 +0100)
Before this change, bison would accept either .tab and _tab equivalently,
whatever the current platform.  Besides, it was not obeying everywhere
to the possible definition of TAB_EXT to something else than .tab.

For consistency, handle only TAB_EXT (".tab" on non DJGPP platforms).
Support for "_tab" is neither documented, nor tested.

* src/system.h (STRNCMP_LIT): New.
From Jim Meyering.
(STRPREFIX_LIT): New.
* src/files.c, src/getargs.c: Use it.

src/files.c
src/getargs.c
src/system.h

index ceb0489a61e41cd4c5341c2243e6b98aa52530cc..550e42ed49411c89250a4a766340c54afa643a05 100644 (file)
@@ -215,10 +215,9 @@ file_name_split (const char *file_name,
   if (*ext)
     {
       size_t baselen = *ext - *base;
   if (*ext)
     {
       size_t baselen = *ext - *base;
-      size_t dottablen = 4;
+      size_t dottablen = sizeof (TAB_EXT) - 1;
       if (dottablen < baselen
       if (dottablen < baselen
-          && (strncmp (*ext - dottablen, ".tab", dottablen) == 0
-              || strncmp (*ext - dottablen, "_tab", dottablen) == 0))
+          && STRPREFIX_LIT (TAB_EXT, *ext - dottablen))
         *tab = *ext - dottablen;
     }
 }
         *tab = *ext - dottablen;
     }
 }
index 5e04ab0fcbcad77653435790c0a7e75b47ae4eb1..06e6e972be3ee13f26970fadac923dec92534e94 100644 (file)
@@ -102,7 +102,7 @@ flags_argmatch (const char *option,
       args = strtok (args, ",");
       while (args)
         {
       args = strtok (args, ",");
       while (args)
         {
-          int no = strncmp (args, "no-", 3) == 0 ? 3 : 0;
+          int no = STRPREFIX_LIT ("no-", args) ? 3 : 0;
           int value = XARGMATCH (option, args + no, keys, values);
           if (value == 0)
             {
           int value = XARGMATCH (option, args + no, keys, values);
           if (value == 0)
             {
index 7aa2c9fa1c08a480603a38d88ac86bd6e12f7b92..f0a76ceb7eea1da964bcdec9de085c9f99ef50cd 100644 (file)
 #define STREQ(L, R)  (strcmp(L, R) == 0)
 #define STRNEQ(L, R) (!STREQ(L, R))
 
 #define STREQ(L, R)  (strcmp(L, R) == 0)
 #define STRNEQ(L, R) (!STREQ(L, R))
 
+/* Just like strncmp, but the second argument must be a literal string
+   and you don't specify the length.  */
+#define STRNCMP_LIT(S, Literal)                         \
+  strncmp (S, "" Literal "", sizeof (Literal) - 1)
+
+/* Whether Literal is a prefix of S.  */
+#define STRPREFIX_LIT(Literal, S)               \
+  (STRNCMP_LIT (S, Literal) == 0)
+
 #if HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif
 #if HAVE_SYS_TYPES_H
 # include <sys/types.h>
 #endif