From 6bee5932a94c5d3ff0bad853daa4a0c0dbf05052 Mon Sep 17 00:00:00 2001 From: Tomas Mlcoch Date: Tue, 6 Nov 2012 09:45:14 +0100 Subject: [PATCH] Add cr_split_rpm_filename into the misc module --- src/misc.c | 87 ++++++++++++++++++++++++++++++++++++++++++++++++++++++-- src/misc.h | 11 +++++++ tests/testmisc.c | 45 +++++++++++++++++++++++++++++ 3 files changed, 140 insertions(+), 3 deletions(-) diff --git a/src/misc.c b/src/misc.c index 7d3dfb8..2eda679 100644 --- a/src/misc.c +++ b/src/misc.c @@ -817,15 +817,16 @@ cr_cmp_version_str(const char* str1, const char *str2) } int strcmp_res = g_strcmp0(ver1.suffix, ver2.suffix); + + g_free(ver1.suffix); + g_free(ver2.suffix); + if (strcmp_res > 0) { return 1; } else if (strcmp_res < 0) { return 2; } - g_free(ver1.suffix); - g_free(ver2.suffix); - return 0; } @@ -894,3 +895,83 @@ cr_slist_free_full(GSList *list, GDestroyNotify free_f) g_slist_free(list); } + +struct cr_NVREA * +cr_split_rpm_filename(const char *filename) +{ + struct cr_NVREA *res = NULL; + gchar *str, *copy; + size_t len; + int i; + + if (!filename) + return res; + + res = g_malloc0(sizeof(struct cr_NVREA)); + str = g_strdup(filename); + copy = str; + len = strlen(str); + + // Get rid off .rpm suffix + if (len >= 4 && !strcmp(str+(len-4), ".rpm")) { + len -= 4; + str[len] = '\0'; + } + + // Get arch + for (i = len-1; i >= 0; i--) + if (str[i] == '.') { + res->arch = g_strdup(str+i+1); + str[i] = '\0'; + len = i; + break; + } + + // Get release + for (i = len-1; i >= 0; i--) + if (str[i] == '-') { + res->release = g_strdup(str+i+1); + str[i] = '\0'; + len = i; + break; + } + + // Get version + for (i = len-1; i >= 0; i--) + if (str[i] == '-') { + res->version = g_strdup(str+i+1); + str[i] = '\0'; + len = i; + break; + } + + // Get epoch + for (i = 0; i < (int) len; i++) + if (str[i] == ':') { + str[i] = '\0'; + res->epoch = g_strdup(str); + str += i + 1; + break; + } + + // Get name + res->name = g_strdup(str); + g_free(copy); + + return res; +} + + +void +cr_nvrea_free(struct cr_NVREA *nvrea) +{ + if (!nvrea) + return; + + g_free(nvrea->name); + g_free(nvrea->version); + g_free(nvrea->release); + g_free(nvrea->epoch); + g_free(nvrea->arch); + g_free(nvrea); +} diff --git a/src/misc.h b/src/misc.h index d068362..8c4ff66 100644 --- a/src/misc.h +++ b/src/misc.h @@ -54,6 +54,14 @@ struct cr_EVR { char *release; /*!< release */ }; +struct cr_NVREA { + char *name; /*!< name */ + char *version; /*!< version */ + char *release; /*!< release */ + char *epoch; /*!< epoch */ + char *arch; /*!< arch */ +}; + /** \ingroup misc * Version representation * e.g. for openssl-devel-1.0.0i = version: 1, release: 0, patch: 0, suffix: i @@ -246,6 +254,9 @@ void cr_log_fn(const gchar *log_domain, */ void cr_slist_free_full(GSList *list, GDestroyNotify free_f); +struct cr_NVREA *cr_split_rpm_filename(const char *filename); +void cr_nvrea_free(struct cr_NVREA *); + #ifdef __cplusplus } #endif diff --git a/tests/testmisc.c b/tests/testmisc.c index 20735f5..64aaeab 100644 --- a/tests/testmisc.c +++ b/tests/testmisc.c @@ -640,6 +640,7 @@ static void test_cr_download_invalid_url(Copyfiletest *copyfiletest, gconstpoint cr_download(handle, INVALID_URL, copyfiletest->dst_file, &error); curl_easy_cleanup(handle); g_assert(error); + free(error); g_assert(!g_file_test(copyfiletest->dst_file, G_FILE_TEST_EXISTS)); } @@ -940,6 +941,49 @@ static void test_cr_cmp_version_str(void) g_assert_cmpint(ret, ==, 2); } +static void test_cr_split_rpm_filename(void) +{ + struct cr_NVREA *res; + + res = cr_split_rpm_filename(NULL); + g_assert(!res); + + res = cr_split_rpm_filename("foo-1.0-1.i386.rpm"); + g_assert(res); + g_assert_cmpstr(res->name, ==, "foo"); + g_assert_cmpstr(res->version, ==, "1.0"); + g_assert_cmpstr(res->release, ==, "1"); + g_assert(!res->epoch); + g_assert_cmpstr(res->arch, ==, "i386"); + cr_nvrea_free(res); + + res = cr_split_rpm_filename("1:bar-9-123a.ia64.rpm"); + g_assert(res); + g_assert_cmpstr(res->name, ==, "bar"); + g_assert_cmpstr(res->version, ==, "9"); + g_assert_cmpstr(res->release, ==, "123a"); + g_assert_cmpstr(res->epoch, ==, "1"); + g_assert_cmpstr(res->arch, ==, "ia64"); + cr_nvrea_free(res); + + res = cr_split_rpm_filename(":a--."); + g_assert(res); + g_assert_cmpstr(res->name, ==, "a"); + g_assert_cmpstr(res->version, ==, ""); + g_assert_cmpstr(res->release, ==, ""); + g_assert_cmpstr(res->epoch, ==, ""); + g_assert_cmpstr(res->arch, ==, ""); + cr_nvrea_free(res); + + res = cr_split_rpm_filename("b"); + g_assert(res); + g_assert_cmpstr(res->name, ==, "b"); + g_assert(!res->version); + g_assert(!res->release); + g_assert(!res->epoch); + g_assert(!res->arch); + cr_nvrea_free(res); +} int main(int argc, char *argv[]) @@ -968,6 +1012,7 @@ int main(int argc, char *argv[]) g_test_add_func("/misc/test_cr_remove_dir", test_cr_remove_dir); g_test_add_func("/misc/test_cr_str_to_version", test_cr_str_to_version); g_test_add_func("/misc/test_cr_cmp_version_str", test_cr_cmp_version_str); + g_test_add_func("/misc/test_cr_split_rpm_filename", test_cr_split_rpm_filename); return g_test_run(); } -- 2.7.4