bison-patches
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

lib: introduce xpath_join


From: Akim Demaille
Subject: lib: introduce xpath_join
Date: Sat, 6 Oct 2018 15:45:54 +0200

This will be helpful in a forthcoming commit about api.location.file.

commit d13a7fdb0aea17ba9bb83f889a7adfb6c174277a
Author: Akim Demaille <address@hidden>
Date:   Sat Oct 6 12:18:52 2018 +0200

    lib: introduce xpath_join
    
    * lib/path-join.h, lib/path-join.c: New.
    * lib/local.mk: Adjust.
    * src/output.c: Use it.

diff --git a/lib/local.mk b/lib/local.mk
index c2c16238..9682d9ae 100644
--- a/lib/local.mk
+++ b/lib/local.mk
@@ -48,7 +48,9 @@ lib_libbison_a_SOURCES +=                       \
 # Non-gnulib sources in Bison's internal library.
 lib_libbison_a_SOURCES +=                       \
   lib/get-errno.h                               \
-  lib/get-errno.c
+  lib/get-errno.c                               \
+  lib/path-join.h                               \
+  lib/path-join.c
 
 # The Yacc compatibility library.
 if ENABLE_YACC
diff --git a/lib/path-join.c b/lib/path-join.c
new file mode 100644
index 00000000..73560b44
--- /dev/null
+++ b/lib/path-join.c
@@ -0,0 +1,37 @@
+/* Concatenate path components.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3 of the License, or any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Akim Demaille <address@hidden>.  */
+
+#include <config.h>
+
+/* Specification.  */
+#include "path-join.h"
+
+#include <concat-filename.h> /* xconcatenated_filename */
+#include <filename.h> /* IS_ABSOLUTE_PATH */
+#include <xalloc.h> /* xstrdup */
+
+char *
+xpath_join (const char *path1, const char *path2)
+{
+  if (!path2 || !*path2)
+    return xstrdup (path1);
+  else if (IS_ABSOLUTE_PATH (path2))
+    return xstrdup (path2);
+  else
+    return xconcatenated_filename (path1, path2, NULL);
+}
diff --git a/lib/path-join.h b/lib/path-join.h
new file mode 100644
index 00000000..baa472a9
--- /dev/null
+++ b/lib/path-join.h
@@ -0,0 +1,38 @@
+/* Concatenate path components.
+   Copyright (C) 2018 Free Software Foundation, Inc.
+
+   This program is free software: you can redistribute it and/or modify it
+   under the terms of the GNU General Public License as published by the
+   Free Software Foundation; either version 3 of the License, or any
+   later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
+
+/* Written by Akim Demaille <address@hidden>.  */
+
+#ifndef _PATH_JOIN_H
+# define _PATH_JOIN_H
+
+# ifdef __cplusplus
+extern "C" {
+# endif
+
+
+/* Concatenate two paths together.  PATH2 may be null, or empty, or
+   absolute: do what is right.  Return a freshly allocated
+   filename.  */
+char *
+xpath_join (const char *path1, const char *path2);
+
+
+# ifdef __cplusplus
+}
+# endif
+
+#endif /* _PATH_JOIN_H */
diff --git a/src/output.c b/src/output.c
index 57d4334e..ae5f2d6d 100644
--- a/src/output.c
+++ b/src/output.c
@@ -21,10 +21,10 @@
 #include <config.h>
 #include "system.h"
 
-#include <concat-filename.h>
 #include <configmake.h>
-#include <filename.h>
+#include <filename.h> /* IS_PATH_WITH_DIR */
 #include <get-errno.h>
+#include <path-join.h>
 #include <quotearg.h>
 #include <spawn-pipe.h>
 #include <timevar.h>
@@ -531,11 +531,11 @@ output_skeleton (void)
   /* Compute the names of the package data dir and skeleton files.  */
   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 *m4sugar = xpath_join (datadir, "m4sugar/m4sugar.m4");
+  char *m4bison = xpath_join (datadir, "bison.m4");
   char *skel = (IS_PATH_WITH_DIR (skeleton)
                 ? xstrdup (skeleton)
-                : xconcatenated_filename (datadir, skeleton, NULL));
+                : xpath_join (datadir, skeleton));
 
   /* Test whether m4sugar.m4 is readable, to check for proper
      installation.  A faulty installation can cause deadlock, so a




reply via email to

[Prev in Thread] Current Thread [Next in Thread]