diff options
author | Per Øyvind Karlsen <peroyvind@mandriva.org> | 2009-08-06 04:11:20 +0000 |
---|---|---|
committer | Per Øyvind Karlsen <peroyvind@mandriva.org> | 2009-08-06 04:11:20 +0000 |
commit | fa0918fca26bbcbdaa9628c979c58b536b3edc71 (patch) | |
tree | 53a4729d550467bffa1183027da1cced1c8a87b2 | |
parent | 96006bae106a9e4d6466c335916d1ea0ae69754f (diff) | |
download | perl-URPM-fa0918fca26bbcbdaa9628c979c58b536b3edc71.tar perl-URPM-fa0918fca26bbcbdaa9628c979c58b536b3edc71.tar.gz perl-URPM-fa0918fca26bbcbdaa9628c979c58b536b3edc71.tar.bz2 perl-URPM-fa0918fca26bbcbdaa9628c979c58b536b3edc71.tar.xz perl-URPM-fa0918fca26bbcbdaa9628c979c58b536b3edc71.zip |
move some rpm5 compatibility functions into a separate header to keep source cleaner
-rw-r--r-- | URPM.xs | 122 | ||||
-rw-r--r-- | rpm5compat.h | 131 |
2 files changed, 132 insertions, 121 deletions
@@ -29,127 +29,7 @@ #undef Fstat #ifdef RPM_ORG -#include <pcreposix.h> -#include <rpm/rpmlib.h> -#include <rpm/rpmds.h> - -static inline void *_free(const void * p) { - if (p != NULL) free((void *)p); - return NULL; -} -typedef struct rpmSpec_s * Spec; - -typedef struct EVR_s { - const char * str; /*!< EVR storage */ - unsigned long Elong; /*!< E converted to integer. */ - rpmsenseFlags Flags; /*!< EVR comparison flags. */ - const char * F[5]; /*!< Parsed fields (\1=E, \2=V, \3=R, \4=D). */ -#define RPMEVR_E 1 -#define RPMEVR_V 2 -#define RPMEVR_R 3 -#define RPMEVR_D 4 -} * EVR_t; - -static EVR_t rpmEVRnew(uint32_t Flags, int initialize) { - EVR_t evr = calloc(1, sizeof(*evr)); - evr->Flags = Flags; - if (initialize) { - evr->F[RPMEVR_E] = "0"; - evr->F[RPMEVR_V] = ""; - evr->F[RPMEVR_R] = ""; - evr->F[RPMEVR_D] = ""; - } - return evr; -} - -static EVR_t rpmEVRfree(EVR_t evr) { - if (evr != NULL) { - evr->str = _free(evr->str); - memset(evr, 0, sizeof(*evr)); - evr = _free(evr); - } - return NULL; -} - -static struct regexp_s { - int initialized; - regex_t regexp; -} re = { .initialized = 0 }; - -static const char evr_tuple_match[] = "^(?:([^:-]+):)?([^:-]+)(?:-([^:-]+))?(?::([^:-]+))?$"; - -static int rpmEVRparse(const char * evrstr, EVR_t evr) { - int noffsets = 6 * 3; - int offsets[6 * 3]; - size_t nb; - int xx; - int i; - - if(re.initialized == 0) - xx = pcreposix_regcomp(&(re.regexp), evr_tuple_match, REG_EXTENDED | REG_NEWLINE), - re.initialized = 1; - - memset(evr, 0, sizeof(*evr)); - evr->str = strdup(evrstr); - nb = strlen(evr->str); - - memset(offsets, -1, sizeof(offsets)); - - xx = pcreposix_regexec(&(re.regexp), evr->str, - noffsets/3, (regmatch_t *)offsets, 0); - - for (i = 0; i < noffsets; i += 2) { - int ix; - - if (offsets[i] < 0) - continue; - - switch (i/2) { - default: - case 0: continue; break; - case 1: ix = RPMEVR_E; break; - case 2: ix = RPMEVR_V; break; - case 3: ix = RPMEVR_R; break; - case 4: ix = RPMEVR_D; break; - } - -assert(offsets[i ] >= 0 && offsets[i ] <= (int)nb); -assert(offsets[i+1] >= 0 && offsets[i+1] <= (int)nb); - { char * te = (char *) evr->str; - evr->F[ix] = te + offsets[i]; - te += offsets[i+1]; - *te = '\0'; - } - - } - - if (evr->F[RPMEVR_E] == NULL) evr->F[RPMEVR_E] = "0"; - - evr->Elong = strtoul(evr->F[RPMEVR_E], NULL, 10); - - return 0; -} - -static int rpmEVRcompare(const EVR_t a, const EVR_t b) { - const char * s; - int rc = 0; - - for (s = "EVRD"; *s != '\0'; s++) { - int ix; - switch ((int)*s) { - default: continue; break; - case 'E': ix = RPMEVR_E; break; - case 'V': ix = RPMEVR_V; break; - case 'R': ix = RPMEVR_R; break; - case 'D': ix = RPMEVR_D; break; - } - rc = rpmvercmp(a->F[ix] ? a->F[ix] : "", b->F[ix] ? b->F[ix] : ""); - if (rc) - break; - } - return rc; -} - +#include "rpm5compat.h" #else #include <rpm/rpm46compat.h> #endif diff --git a/rpm5compat.h b/rpm5compat.h new file mode 100644 index 0000000..e98d343 --- /dev/null +++ b/rpm5compat.h @@ -0,0 +1,131 @@ +/* + * Copyright © 2009 Per Øyvind Karlsen <peroyvind@mandriva.org> + * + * $Id: rpm5compat.h,v 1.0 2009/08/06 06:06:00 peroyvind Exp $ + */ + +#ifndef H_RPM5COMPAT +#define H_RPM5COMPAT 1 + +#include <pcreposix.h> +#include <rpm/rpmlib.h> +#include <rpm/rpmds.h> + +static inline void *_free(const void * p) { + if (p != NULL) free((void *)p); + return NULL; +} +typedef struct rpmSpec_s * Spec; + +typedef struct EVR_s { + const char * str; /*!< EVR storage */ + unsigned long Elong; /*!< E converted to integer. */ + rpmsenseFlags Flags; /*!< EVR comparison flags. */ + const char * F[5]; /*!< Parsed fields (\1=E, \2=V, \3=R, \4=D). */ +#define RPMEVR_E 1 +#define RPMEVR_V 2 +#define RPMEVR_R 3 +#define RPMEVR_D 4 +} * EVR_t; + +static EVR_t rpmEVRnew(uint32_t Flags, int initialize) { + EVR_t evr = calloc(1, sizeof(*evr)); + evr->Flags = Flags; + if (initialize) { + evr->F[RPMEVR_E] = "0"; + evr->F[RPMEVR_V] = ""; + evr->F[RPMEVR_R] = ""; + evr->F[RPMEVR_D] = ""; + } + return evr; +} + +static EVR_t rpmEVRfree(EVR_t evr) { + if (evr != NULL) { + evr->str = _free(evr->str); + memset(evr, 0, sizeof(*evr)); + evr = _free(evr); + } + return NULL; +} + +static struct regexp_s { + int initialized; + regex_t regexp; +} re = { .initialized = 0 }; + +static const char evr_tuple_match[] = "^(?:([^:-]+):)?([^:-]+)(?:-([^:-]+))?(?::([^:-]+))?$"; + +static int rpmEVRparse(const char * evrstr, EVR_t evr) { + int noffsets = 6 * 3; + int offsets[6 * 3]; + size_t nb; + int xx; + int i; + + if(re.initialized == 0) + xx = pcreposix_regcomp(&(re.regexp), evr_tuple_match, REG_EXTENDED | REG_NEWLINE), + re.initialized = 1; + + memset(evr, 0, sizeof(*evr)); + evr->str = strdup(evrstr); + nb = strlen(evr->str); + + memset(offsets, -1, sizeof(offsets)); + + xx = pcreposix_regexec(&(re.regexp), evr->str, + noffsets/3, (regmatch_t *)offsets, 0); + + for (i = 0; i < noffsets; i += 2) { + int ix; + + if (offsets[i] < 0) + continue; + + switch (i/2) { + default: + case 0: continue; break; + case 1: ix = RPMEVR_E; break; + case 2: ix = RPMEVR_V; break; + case 3: ix = RPMEVR_R; break; + case 4: ix = RPMEVR_D; break; + } + +assert(offsets[i ] >= 0 && offsets[i ] <= (int)nb); +assert(offsets[i+1] >= 0 && offsets[i+1] <= (int)nb); + { char * te = (char *) evr->str; + evr->F[ix] = te + offsets[i]; + te += offsets[i+1]; + *te = '\0'; + } + + } + + if (evr->F[RPMEVR_E] == NULL) evr->F[RPMEVR_E] = "0"; + + evr->Elong = strtoul(evr->F[RPMEVR_E], NULL, 10); + + return 0; +} + +static int rpmEVRcompare(const EVR_t a, const EVR_t b) { + const char * s; + int rc = 0; + + for (s = "EVRD"; *s != '\0'; s++) { + int ix; + switch ((int)*s) { + default: continue; break; + case 'E': ix = RPMEVR_E; break; + case 'V': ix = RPMEVR_V; break; + case 'R': ix = RPMEVR_R; break; + case 'D': ix = RPMEVR_D; break; + } + rc = rpmvercmp(a->F[ix] ? a->F[ix] : "", b->F[ix] ? b->F[ix] : ""); + if (rc) + break; + } + return rc; +} + +#endif /* H_RPM5COMPAT */ |