From: Akim Demaille Date: Tue, 5 Jun 2012 15:26:55 +0000 (+0200) Subject: maint: use xconcat-filename. X-Git-Tag: v2.7.90~444 X-Git-Url: https://git.saurik.com/bison.git/commitdiff_plain/d9a7c07c5a522f770b0f28c82c91b8010cb7b95c?ds=inline;hp=-c maint: use xconcat-filename. * bootstrap.conf (gnulib_modules): Request it. * src/output.h, src/output.c (compute_pkgdatadir): Rename as... (pkgdatadir): this. Adjust dependencies. * src/output.c (output_skeleton): Reduce the scope of "in". Use xconcatenated_filename to simplify the construction of the qualified paths to m4sugar.m4, bison.m4, and the selected skeleton. There are a few minor differences: the new code uses strchr instead of mbschr (but this was not really justified), and the new code does not garantee a single slash even if $BISON_PKGDATADIR ends with several (which was considered more accurate). See the discussion at . --- d9a7c07c5a522f770b0f28c82c91b8010cb7b95c diff --git a/bootstrap.conf b/bootstrap.conf index c236ed97..c0140841 100644 --- a/bootstrap.conf +++ b/bootstrap.conf @@ -32,7 +32,11 @@ gnulib_modules=' spawn-pipe stdbool stpcpy strdup-posix strerror strtoul strverscmp unistd unistd-safer unlocked-io update-copyright unsetenv verify warnings - xalloc xalloc-die xmemdup0 xstrndup + xalloc + xalloc-die + xconcat-filename + xmemdup0 + xstrndup fprintf-posix printf-posix snprintf-posix sprintf-posix vsnprintf-posix vsprintf-posix diff --git a/lib/.gitignore b/lib/.gitignore index 5eec7430..0b3bcc91 100644 --- a/lib/.gitignore +++ b/lib/.gitignore @@ -268,3 +268,7 @@ /xmemdup0.c /xmemdup0.h /sys_types.in.h +/concat-filename.c +/concat-filename.h +/filename.h +/xconcat-filename.c diff --git a/src/getargs.c b/src/getargs.c index 8a3714e2..d7e1ad41 100644 --- a/src/getargs.c +++ b/src/getargs.c @@ -674,7 +674,7 @@ getargs (int argc, char *argv[]) exit (EXIT_SUCCESS); case PRINT_DATADIR_OPTION: - printf ("%s\n", compute_pkgdatadir ()); + printf ("%s\n", pkgdatadir ()); exit (EXIT_SUCCESS); case REPORT_FILE_OPTION: diff --git a/src/output.c b/src/output.c index cbe6d401..96c69da4 100644 --- a/src/output.c +++ b/src/output.c @@ -21,8 +21,10 @@ #include #include "system.h" +#include #include #include +#include #include #include #include @@ -568,48 +570,29 @@ muscles_output (FILE *out) static void output_skeleton (void) { - FILE *in; int filter_fd[2]; char const *argv[10]; pid_t pid; /* Compute the names of the package data dir and skeleton files. */ - char const m4sugar[] = "m4sugar/m4sugar.m4"; - char const m4bison[] = "bison.m4"; - char *full_m4sugar; - char *full_m4bison; - char *full_skeleton; - char const *p; - char const *m4 = (p = getenv ("M4")) ? p : M4; - char const *pkgdatadir = compute_pkgdatadir (); - size_t skeleton_size = strlen (skeleton) + 1; - size_t pkgdatadirlen = strlen (pkgdatadir); - while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/') - pkgdatadirlen--; - full_skeleton = xmalloc (pkgdatadirlen + 1 - + (skeleton_size < sizeof m4sugar - ? sizeof m4sugar : skeleton_size)); - strncpy (full_skeleton, pkgdatadir, pkgdatadirlen); - full_skeleton[pkgdatadirlen] = '/'; - strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar); - full_m4sugar = xstrdup (full_skeleton); - strcpy (full_skeleton + pkgdatadirlen + 1, m4bison); - full_m4bison = xstrdup (full_skeleton); - if (mbschr (skeleton, '/')) - strcpy (full_skeleton, skeleton); - else - strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); + char const *m4 = (m4 = getenv ("M4")) ? m4 : M4; + char const *datadir = pkgdatadir (); + char *m4sugar = xconcatenated_filename (datadir, "m4sugar/m4sugar.m4", NULL); + char *m4bison = xconcatenated_filename (datadir, "bison.m4", NULL); + char *skel = (IS_PATH_WITH_DIR (skeleton) + ? xstrdup (skeleton) + : xconcatenated_filename (datadir, skeleton, NULL)); /* Test whether m4sugar.m4 is readable, to check for proper installation. A faulty installation can cause deadlock, so a cheap sanity check is worthwhile. */ - xfclose (xfopen (full_m4sugar, "r")); + xfclose (xfopen (m4sugar, "r")); /* Create an m4 subprocess connected to us via two pipes. */ if (trace_flag & trace_tools) fprintf (stderr, "running: %s %s - %s %s\n", - m4, full_m4sugar, full_m4bison, full_skeleton); + m4, m4sugar, m4bison, skel); /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a position-dependent manner. Keep it as the first argument so that all @@ -635,13 +618,13 @@ output_skeleton (void) argv[i++] = M4_GNU_OPTION; argv[i++] = "-I"; - argv[i++] = pkgdatadir; + argv[i++] = datadir; if (trace_flag & trace_m4) argv[i++] = "-dV"; - argv[i++] = full_m4sugar; + argv[i++] = m4sugar; argv[i++] = "-"; - argv[i++] = full_m4bison; - argv[i++] = full_skeleton; + argv[i++] = m4bison; + argv[i++] = skel; argv[i++] = NULL; aver (i <= ARRAY_CARDINALITY (argv)); } @@ -649,9 +632,9 @@ output_skeleton (void) /* The ugly cast is because gnulib gets the const-ness wrong. */ pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true, true, filter_fd); - free (full_m4sugar); - free (full_m4bison); - free (full_skeleton); + free (m4sugar); + free (m4bison); + free (skel); if (trace_flag & trace_muscles) muscles_output (stderr); @@ -666,16 +649,18 @@ output_skeleton (void) /* Read and process m4's output. */ timevar_push (TV_M4); - in = fdopen (filter_fd[0], "r"); - if (! in) - error (EXIT_FAILURE, get_errno (), - "fdopen"); - scan_skel (in); - /* scan_skel should have read all of M4's output. Otherwise, when we - close the pipe, we risk letting M4 report a broken-pipe to the - Bison user. */ - aver (feof (in)); - xfclose (in); + { + FILE *in = fdopen (filter_fd[0], "r"); + if (! in) + error (EXIT_FAILURE, get_errno (), + "fdopen"); + scan_skel (in); + /* scan_skel should have read all of M4's output. Otherwise, when we + close the pipe, we risk letting M4 report a broken-pipe to the + Bison user. */ + aver (feof (in)); + xfclose (in); + } wait_subprocess (pid, "m4", false, false, true, true, NULL); timevar_pop (TV_M4); } @@ -725,7 +710,7 @@ prepare (void) /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs would never be expanded. Hopefully no one has M4-special characters in his Bison installation path. */ - MUSCLE_INSERT_STRING_RAW ("pkgdatadir", compute_pkgdatadir ()); + MUSCLE_INSERT_STRING_RAW ("pkgdatadir", pkgdatadir ()); } } @@ -754,8 +739,8 @@ output (void) } char const * -compute_pkgdatadir (void) +pkgdatadir (void) { - char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); - return pkgdatadir ? pkgdatadir : PKGDATADIR; + char const *cp = getenv ("BISON_PKGDATADIR"); + return cp ? cp : PKGDATADIR; } diff --git a/src/output.h b/src/output.h index 6c428d53..d4b100fe 100644 --- a/src/output.h +++ b/src/output.h @@ -23,6 +23,8 @@ /* Output the parsing tables and the parser code to FTABLE. */ void output (void); -char const *compute_pkgdatadir (void); + +/* Where our data files are installed. */ +char const *pkgdatadir (void); #endif /* !OUTPUT_H_ */