rpm 5.2.1

- Main Page
- Related Pages
- Modules
- Data Structures
- Files

- File List
- Globals

rpmdb/rpmdpkg.c
Go to the documentation of this file.

    00001
    00004 #include "system.h"
    00005
    00006 #include <rpmiotypes.h>
    00007 #include <rpmtag.h>
    00008
    00009 #define _RPMEVR_INTERNAL
    00010 #include <rpmdpkg.h>
    00011
    00012 #include "debug.h"
    00013
    00014 /*@access EVR_t @*/
    00015
    00016 /*@unchecked@*/
    00017 int _rpmdpkg_debug = 0;
    00018
    00019 /* assume ascii */
    00020 static inline int dpkgEVRctype(char x)
    00021         /*@*/
    00022 {
    00023     int c = (int)x;
    00024     return (
    00025           x == '~' ? -1
    00026         : xisdigit(c) ? 0
    00027         : x == '\0' ? 0 \
    00028         : xisalpha(c) ? c
    00029         : c + 256
    00030     );
    00031 }
    00032
    00033 int dpkgEVRcmp(const char *a, const char *b)
    00034 {
    00035     if (a == NULL) a = "";
    00036     if (b == NULL) b = "";
    00037
    00038     while (*a || *b) {
    00039         int first_diff= 0;
    00040
    00041         while ( (*a && !xisdigit((int)*a)) || (*b && !xisdigit((int)*b)) ) {
    00042             int vc = dpkgEVRctype(*a);
    00043             int rc = dpkgEVRctype(*b);
    00044             if (vc != rc) return vc - rc;
    00045             a++; b++;
    00046         }
    00047
    00048         while (*a == '0') a++;
    00049         while (*b == '0') b++;
    00050         while (xisdigit((int)*a) && xisdigit((int)*b)) {
    00051             if (!first_diff) first_diff = (int)(*a - *b);
    00052             a++; b++;
    00053         }
    00054         if (xisdigit((int)*a)) return 1;
    00055         if (xisdigit((int)*b)) return -1;
    00056         if (first_diff) return first_diff;
    00057     }
    00058     return 0;
    00059 }
    00060
    00061 int dpkgEVRparse(const char * evrstr, EVR_t evr)
    00062 {
    00063     return rpmEVRparse(evrstr, evr);
    00064 }
    00065
    00066 int dpkgEVRcompare(const EVR_t a, const EVR_t b)
    00067 {
    00068     int r;
    00069
    00070     if (a->Elong > b->Elong) return 1;
    00071     if (a->Elong < b->Elong) return -1;
    00072     r = dpkgEVRcmp(a->F[RPMEVR_V], b->F[RPMEVR_V]);  if (r) return r;
    00073     return dpkgEVRcmp(a->F[RPMEVR_R], b->F[RPMEVR_R]);
    00074 }