summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAllan McRae <allan@archlinux.org>2013-01-03 20:49:33 +1000
committerAllan McRae <allan@archlinux.org>2013-01-04 21:49:37 +1000
commit27d9c25ee2fd6a03fb1ec1afdfbe105048875bae (patch)
treec5f6739e5f72a153fb358b2702965c39352ef630
parent965e1de2174148a7a6c0860a7514d9bb1969bf03 (diff)
Split common utility functions for libalpm and pacman
There is duplicated code in the util.c files in the libalpm and pacman source code. Split this into a separate file so that it can be shared via a symlink. This prevents code divergence between the two code bases. Also, move mbasename and mdirname from pacman/util.c into util-common.c in preparation for the following patch that uses them to add an extension to pacsave files. Signed-off-by: Allan McRae <allan@archlinux.org>
-rw-r--r--Makefile.am2
-rw-r--r--configure.ac1
-rw-r--r--lib/libalpm/Makefile.am1
l---------lib/libalpm/util-common.c1
l---------lib/libalpm/util-common.h1
-rw-r--r--lib/libalpm/util.c33
-rw-r--r--lib/libalpm/util.h5
-rw-r--r--src/common/Makefile.am4
-rw-r--r--src/common/util-common.c109
-rw-r--r--src/common/util-common.h32
-rw-r--r--src/pacman/Makefile.am3
l---------src/pacman/util-common.c1
l---------src/pacman/util-common.h1
-rw-r--r--src/pacman/util.c50
-rw-r--r--src/pacman/util.h8
15 files changed, 157 insertions, 95 deletions
diff --git a/Makefile.am b/Makefile.am
index 0010a3eb..b05feb68 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -3,7 +3,7 @@ if WANT_DOC
SUBDIRS += doc
endif
-DIST_SUBDIRS = $(SUBDIRS) contrib
+DIST_SUBDIRS = $(SUBDIRS) contrib src/common
ACLOCAL_AMFLAGS = -I m4 --install
diff --git a/configure.ac b/configure.ac
index 6059fe5e..aa3305db 100644
--- a/configure.ac
+++ b/configure.ac
@@ -462,6 +462,7 @@ AC_CONFIG_FILES([
lib/libalpm/Makefile
lib/libalpm/po/Makefile.in
lib/libalpm/libalpm.pc
+src/common/Makefile
src/pacman/Makefile
src/pacman/po/Makefile.in
src/util/Makefile
diff --git a/lib/libalpm/Makefile.am b/lib/libalpm/Makefile.am
index c935e2db..5cf66b91 100644
--- a/lib/libalpm/Makefile.am
+++ b/lib/libalpm/Makefile.am
@@ -53,6 +53,7 @@ libalpm_la_SOURCES = \
sync.h sync.c \
trans.h trans.c \
util.h util.c \
+ util-common.h util-common.c \
version.c
if !HAVE_LIBSSL
diff --git a/lib/libalpm/util-common.c b/lib/libalpm/util-common.c
new file mode 120000
index 00000000..cf965176
--- /dev/null
+++ b/lib/libalpm/util-common.c
@@ -0,0 +1 @@
+../../src/common/util-common.c \ No newline at end of file
diff --git a/lib/libalpm/util-common.h b/lib/libalpm/util-common.h
new file mode 120000
index 00000000..988c2acc
--- /dev/null
+++ b/lib/libalpm/util-common.h
@@ -0,0 +1 @@
+../../src/common/util-common.h \ No newline at end of file
diff --git a/lib/libalpm/util.c b/lib/libalpm/util.c
index c33e32a3..f6e66321 100644
--- a/lib/libalpm/util.c
+++ b/lib/libalpm/util.c
@@ -1256,37 +1256,4 @@ void _alpm_alloc_fail(size_t size)
fprintf(stderr, "alloc failure: could not allocate %zd bytes\n", size);
}
-#ifndef HAVE_STRNDUP
-/* A quick and dirty implementation derived from glibc */
-/** Determines the length of a fixed-size string.
- * @param s string to be measured
- * @param max maximum number of characters to search for the string end
- * @return length of s or max, whichever is smaller
- */
-static size_t strnlen(const char *s, size_t max)
-{
- register const char *p;
- for(p = s; *p && max--; ++p);
- return (p - s);
-}
-
-/** Copies a string.
- * Returned string needs to be freed
- * @param s string to be copied
- * @param n maximum number of characters to copy
- * @return pointer to the new string on success, NULL on error
- */
-char *strndup(const char *s, size_t n)
-{
- size_t len = strnlen(s, n);
- char *new = (char *) malloc(len + 1);
-
- if(new == NULL)
- return NULL;
-
- new[len] = '\0';
- return (char *)memcpy(new, s, len);
-}
-#endif
-
/* vim: set ts=2 sw=2 noet: */
diff --git a/lib/libalpm/util.h b/lib/libalpm/util.h
index 734e0e5f..3a6b14af 100644
--- a/lib/libalpm/util.h
+++ b/lib/libalpm/util.h
@@ -28,6 +28,7 @@
#include "alpm.h"
#include "package.h" /* alpm_pkg_t */
#include "handle.h" /* alpm_handle_t */
+#include "util-common.h"
#include <stdio.h>
#include <string.h>
@@ -142,10 +143,6 @@ int _alpm_fnmatch(const void *pattern, const void *string);
char *strsep(char **, const char *);
#endif
-#ifndef HAVE_STRNDUP
-char *strndup(const char *s, size_t n);
-#endif
-
/* check exported library symbols with: nm -C -D <lib> */
#define SYMEXPORT __attribute__((visibility("default")))
#define SYMHIDDEN __attribute__((visibility("internal")))
diff --git a/src/common/Makefile.am b/src/common/Makefile.am
new file mode 100644
index 00000000..49503333
--- /dev/null
+++ b/src/common/Makefile.am
@@ -0,0 +1,4 @@
+EXTRA_DIST = \
+ util-common.h util-common.c
+
+# vim:set ts=2 sw=2 noet:
diff --git a/src/common/util-common.c b/src/common/util-common.c
new file mode 100644
index 00000000..e2b5939c
--- /dev/null
+++ b/src/common/util-common.c
@@ -0,0 +1,109 @@
+/*
+ * util-common.c
+ *
+ * Copyright (c) 2006-2012 Pacman Development Team <pacman-dev@archlinux.org>
+ *
+ * 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 2 of the License, or
+ * (at your option) 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 <http://www.gnu.org/licenses/>.
+ */
+
+#include <stdlib.h>
+#include <string.h>
+
+#include "util-common.h"
+
+
+/** Parse the basename of a program from a path.
+* @param path path to parse basename from
+*
+* @return everything following the final '/'
+*/
+const char *mbasename(const char *path)
+{
+ const char *last = strrchr(path, '/');
+ if(last) {
+ return last + 1;
+ }
+ return path;
+}
+
+/** Parse the dirname of a program from a path.
+* The path returned should be freed.
+* @param path path to parse dirname from
+*
+* @return everything preceding the final '/'
+*/
+char *mdirname(const char *path)
+{
+ char *ret, *last;
+
+ /* null or empty path */
+ if(path == NULL || path == '\0') {
+ return strdup(".");
+ }
+
+ if((ret = strdup(path)) == NULL) {
+ return NULL;
+ }
+
+ last = strrchr(ret, '/');
+
+ if(last != NULL) {
+ /* we found a '/', so terminate our string */
+ if(last == ret) {
+ /* return "/" for root */
+ last++;
+ }
+ *last = '\0';
+ return ret;
+ }
+
+ /* no slash found */
+ free(ret);
+ return strdup(".");
+}
+
+#ifndef HAVE_STRNDUP
+/* A quick and dirty implementation derived from glibc */
+/** Determines the length of a fixed-size string.
+ * @param s string to be measured
+ * @param max maximum number of characters to search for the string end
+ * @return length of s or max, whichever is smaller
+ */
+static size_t strnlen(const char *s, size_t max)
+{
+ register const char *p;
+ for(p = s; *p && max--; ++p);
+ return (p - s);
+}
+
+/** Copies a string.
+ * Returned string needs to be freed
+ * @param s string to be copied
+ * @param n maximum number of characters to copy
+ * @return pointer to the new string on success, NULL on error
+ */
+char *strndup(const char *s, size_t n)
+{
+ size_t len = strnlen(s, n);
+ char *new = (char *) malloc(len + 1);
+
+ if(new == NULL)
+ return NULL;
+
+ new[len] = '\0';
+ return (char *)memcpy(new, s, len);
+}
+#endif
+
+/* vim: set ts=2 sw=2 noet: */
diff --git a/src/common/util-common.h b/src/common/util-common.h
new file mode 100644
index 00000000..04d4e9d8
--- /dev/null
+++ b/src/common/util-common.h
@@ -0,0 +1,32 @@
+/*
+ * util-common.h
+ *
+ * Copyright (c) 2006-2013 Pacman Development Team <pacman-dev@archlinux.org>
+ *
+ * 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 2 of the License, or
+ * (at your option) 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 <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef _PM_UTIL_COMMON_H
+#define _PM_UTIL_COMMON_H
+
+const char *mbasename(const char *path);
+char *mdirname(const char *path);
+
+#ifndef HAVE_STRNDUP
+char *strndup(const char *s, size_t n);
+#endif
+
+#endif /* _PM_UTIL_COMMON_H */
+
+/* vim: set ts=2 sw=2 noet: */
diff --git a/src/pacman/Makefile.am b/src/pacman/Makefile.am
index 311f7c5b..ed515739 100644
--- a/src/pacman/Makefile.am
+++ b/src/pacman/Makefile.am
@@ -38,7 +38,8 @@ pacman_SOURCES = \
sync.c \
callback.h callback.c \
upgrade.c \
- util.h util.c
+ util.h util.c \
+ util-common.h util-common.c
LDADD = $(LTLIBINTL) $(top_builddir)/lib/libalpm/.libs/libalpm.la
diff --git a/src/pacman/util-common.c b/src/pacman/util-common.c
new file mode 120000
index 00000000..a2f6c508
--- /dev/null
+++ b/src/pacman/util-common.c
@@ -0,0 +1 @@
+../common/util-common.c \ No newline at end of file
diff --git a/src/pacman/util-common.h b/src/pacman/util-common.h
new file mode 120000
index 00000000..3f0b9826
--- /dev/null
+++ b/src/pacman/util-common.h
@@ -0,0 +1 @@
+../common/util-common.h \ No newline at end of file
diff --git a/src/pacman/util.c b/src/pacman/util.c
index 81eec67d..014be1fc 100644
--- a/src/pacman/util.c
+++ b/src/pacman/util.c
@@ -210,56 +210,6 @@ int rmrf(const char *path)
}
}
-/** Parse the basename of a program from a path.
-* @param path path to parse basename from
-*
-* @return everything following the final '/'
-*/
-const char *mbasename(const char *path)
-{
- const char *last = strrchr(path, '/');
- if(last) {
- return last + 1;
- }
- return path;
-}
-
-/** Parse the dirname of a program from a path.
-* The path returned should be freed.
-* @param path path to parse dirname from
-*
-* @return everything preceding the final '/'
-*/
-char *mdirname(const char *path)
-{
- char *ret, *last;
-
- /* null or empty path */
- if(path == NULL || path == '\0') {
- return strdup(".");
- }
-
- if((ret = strdup(path)) == NULL) {
- return NULL;
- }
-
- last = strrchr(ret, '/');
-
- if(last != NULL) {
- /* we found a '/', so terminate our string */
- if(last == ret) {
- /* return "/" for root */
- last++;
- }
- *last = '\0';
- return ret;
- }
-
- /* no slash found */
- free(ret);
- return strdup(".");
-}
-
/* output a string, but wrap words properly with a specified indentation
*/
void indentprint(const char *str, unsigned short indent, unsigned short cols)
diff --git a/src/pacman/util.h b/src/pacman/util.h
index 0c58a470..c38291a9 100644
--- a/src/pacman/util.h
+++ b/src/pacman/util.h
@@ -26,6 +26,8 @@
#include <alpm_list.h>
+#include "util-common.h"
+
#ifdef ENABLE_NLS
#include <libintl.h> /* here so it doesn't need to be included elsewhere */
/* define _() as shortcut for gettext() */
@@ -49,8 +51,6 @@ int needs_root(void);
int check_syncdbs(size_t need_repos, int check_valid);
unsigned short getcols(int fd);
int rmrf(const char *path);
-const char *mbasename(const char *path);
-char *mdirname(const char *path);
void indentprint(const char *str, unsigned short indent, unsigned short cols);
size_t strtrim(char *str);
char *strreplace(const char *str, const char *needle, const char *replace);
@@ -80,10 +80,6 @@ int pm_asprintf(char **string, const char *format, ...);
int pm_vfprintf(FILE *stream, alpm_loglevel_t level, const char *format, va_list args) __attribute__((format(printf,3,0)));
int pm_vasprintf(char **string, alpm_loglevel_t level, const char *format, va_list args) __attribute__((format(printf,3,0)));
-#ifndef HAVE_STRNDUP
-char *strndup(const char *s, size_t n);
-#endif
-
#endif /* _PM_UTIL_H */
/* vim: set ts=2 sw=2 noet: */