From d13a7fdb0aea17ba9bb83f889a7adfb6c174277a Mon Sep 17 00:00:00 2001 From: Akim Demaille Date: Sat, 6 Oct 2018 12:18:52 +0200 Subject: [PATCH] lib: introduce xpath_join * lib/path-join.h, lib/path-join.c: New. * lib/local.mk: Adjust. * src/output.c: Use it. --- lib/local.mk | 4 +++- lib/path-join.c | 37 +++++++++++++++++++++++++++++++++++++ lib/path-join.h | 38 ++++++++++++++++++++++++++++++++++++++ src/output.c | 10 +++++----- 4 files changed, 83 insertions(+), 6 deletions(-) create mode 100644 lib/path-join.c create mode 100644 lib/path-join.h 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 . */ + +/* Written by Akim Demaille . */ + +#include + +/* Specification. */ +#include "path-join.h" + +#include /* xconcatenated_filename */ +#include /* IS_ABSOLUTE_PATH */ +#include /* 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 . */ + +/* Written by Akim Demaille . */ + +#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 #include "system.h" -#include #include -#include +#include /* IS_PATH_WITH_DIR */ #include +#include #include #include #include @@ -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