From 0ab3b32255283242a51b75ef34a6338a742ce14c Mon Sep 17 00:00:00 2001 From: Baptiste Daroussin Date: Tue, 14 Aug 2012 17:13:28 +0200 Subject: [PATCH] avoid copying memory, do a single duplication --- dependency.c | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/dependency.c b/dependency.c index 26de462..806e505 100644 --- a/dependency.c +++ b/dependency.c @@ -37,15 +37,15 @@ typedef enum { #define DEBUG_PARSE 0 static inline pkg_dependency_t * -pkg_dependency_add(pkg_dependency_t *head, const char *package, const char *version, pkg_comparator_t compare) +pkg_dependency_add(pkg_dependency_t *head, const char *package, size_t package_sz, const char *version, size_t version_sz, pkg_comparator_t compare) { pkg_dependency_t *dep; dep = calloc(sizeof(pkg_dependency_t), 1); - dep->package = strdup(package); + dep->package = strndup(package, package_sz); - if (version != NULL) - dep->version = strdup(version); + if (version_sz != 0) + dep->version = strndup(version, version_sz); dep->compare = compare; @@ -105,12 +105,11 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) pkg_dependency_t *deplist = NULL; pkg_comparator_t compare = PKG_ANY; char buf[PKG_BUFSIZE]; - char package[PKG_BUFSIZE]; - char version[PKG_BUFSIZE]; + size_t package_sz, version_sz; char *start = buf; char *ptr = buf; char *vstart = NULL; -/* char *package = NULL, *version = NULL;*/ + char *package = NULL, *version = NULL; strlcpy(buf, depends, sizeof buf); strlcat(buf, " ", sizeof buf); @@ -157,8 +156,8 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) while (PKG_MODULE_SEPARATOR(*iter)) iter++; - strlcpy(package, iter, sizeof package); - package[ptr - iter] = '\0'; + package = iter; + package_sz = ptr - iter; #if DEBUG_PARSE fprintf(error_msgout, "Found package: %s\n", package); #endif @@ -167,7 +166,7 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) if (state == OUTSIDE_MODULE) { - deplist = pkg_dependency_add(deplist, package, NULL, compare); + deplist = pkg_dependency_add(deplist, package, package_sz, NULL, 0, compare); if (deplist_head == NULL) deplist_head = deplist; @@ -238,14 +237,14 @@ pkg_dependency_parse_str(pkg_dependency_t *deplist_head, const char *depends) case INSIDE_VERSION: if (PKG_MODULE_SEPARATOR(*ptr) || *(ptr + 1) == '\0') { - strlcpy(version, vstart, sizeof version); - version[ptr - vstart] = '\0'; + version = vstart; + version_sz = ptr - vstart; state = OUTSIDE_MODULE; #if DEBUG_PARSE fprintf(error_msgout, "Found version: %s\n", version); #endif - deplist = pkg_dependency_add(deplist, package, version, compare); + deplist = pkg_dependency_add(deplist, package, package_sz, version, version_sz, compare); if (deplist_head == NULL) deplist_head = deplist;