Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/netbsd-3]: src/usr.sbin/pkg_install/lib Pull up following revision(s) (r...



details:   https://anonhg.NetBSD.org/src/rev/2e844223f8dd
branches:  netbsd-3
changeset: 577452:2e844223f8dd
user:      tron <tron%NetBSD.org@localhost>
date:      Sun Nov 06 13:41:32 2005 +0000

description:
Pull up following revision(s) (requested by wiz in ticket #938):
        usr.sbin/pkg_install/lib/Makefile: revision 1.25
        usr.sbin/pkg_install/lib/dewey.c: revision 1.1
        usr.sbin/pkg_install/lib/dewey.h: revision 1.1
        usr.sbin/pkg_install/lib/str.c: revision 1.55
Split dewey compare functions into their own file dewey.c so they
can be used in a forthcoming Perl module.
Joint work with Thomas Klausner.

diffstat:

 usr.sbin/pkg_install/lib/Makefile |    5 +-
 usr.sbin/pkg_install/lib/dewey.c  |  282 ++++++++++++++++++++++++++++++++++++++
 usr.sbin/pkg_install/lib/dewey.h  |   19 ++
 usr.sbin/pkg_install/lib/str.c    |  281 +------------------------------------
 4 files changed, 312 insertions(+), 275 deletions(-)

diffs (truncated from 649 to 300 lines):

diff -r 10b5d6024614 -r 2e844223f8dd usr.sbin/pkg_install/lib/Makefile
--- a/usr.sbin/pkg_install/lib/Makefile Sun Nov 06 13:40:51 2005 +0000
+++ b/usr.sbin/pkg_install/lib/Makefile Sun Nov 06 13:41:32 2005 +0000
@@ -1,11 +1,12 @@
-# $NetBSD: Makefile,v 1.23.2.1 2005/11/06 13:40:51 tron Exp $
+# $NetBSD: Makefile,v 1.23.2.2 2005/11/06 13:41:32 tron Exp $
 # Original from FreeBSD, no rcs id.
 
 MKPRIVATELIB=  yes
 
 LIB=           install
 SRCS=          automatic.c file.c ftpio.c global.c lpkg.c pen.c \
-               pkgdb.c plist.c str.c version.c path.c fexec.c var.c
+               pkgdb.c plist.c str.c version.c path.c fexec.c var.c \
+               dewey.c
 
 version.o: version.h version.c
 
diff -r 10b5d6024614 -r 2e844223f8dd usr.sbin/pkg_install/lib/dewey.c
--- /dev/null   Thu Jan 01 00:00:00 1970 +0000
+++ b/usr.sbin/pkg_install/lib/dewey.c  Sun Nov 06 13:41:32 2005 +0000
@@ -0,0 +1,282 @@
+/*     $NetBSD: dewey.c,v 1.1.2.2 2005/11/06 13:41:32 tron Exp $       */
+
+/*
+ * FreeBSD install - a package for the installation and maintainance
+ * of non-core utilities.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * Jordan K. Hubbard
+ * 18 July 1993
+ *
+ * Miscellaneous string utilities.
+ *
+ */
+
+#include <assert.h>
+#include <ctype.h>
+#include <err.h>
+#include <fnmatch.h>
+#include <inttypes.h>
+#include <string.h>
+
+#include "defs.h"
+#include "dewey.h"
+
+#define PKG_PATTERN_MAX 1024
+typedef int (*matchfn) (const char *, void *);
+
+/* do not modify these values, or things will NOT work */
+enum {
+        Alpha = -3,
+        Beta = -2,
+        RC = -1,
+        Dot = 0,
+        Patch = 1
+};
+
+/* this struct defines a version number */
+typedef struct arr_t {
+       unsigned        c;              /* # of version numbers */
+       unsigned        size;           /* size of array */
+       int            *v;              /* array of decimal numbers */
+       int             netbsd;         /* any "nb" suffix */
+} arr_t;
+
+/* this struct describes a test */
+typedef struct test_t {
+       const char     *s;              /* string representation */
+       unsigned        len;            /* length of string */
+       int             t;              /* enumerated type of test */
+} test_t;
+
+
+/* the tests that are recognised. */
+ const test_t   tests[] = {
+        {      "<=",   2,      DEWEY_LE        },
+        {      "<",    1,      DEWEY_LT        },
+        {      ">=",   2,      DEWEY_GE        },
+        {      ">",    1,      DEWEY_GT        },
+        {      "==",   2,      DEWEY_EQ        },
+        {      "!=",   2,      DEWEY_NE        },
+        {      NULL,   0,      0       }
+};
+
+ const test_t  modifiers[] = {
+       {       "alpha",        5,      Alpha   },
+       {       "beta",         4,      Beta    },
+       {       "pre",          3,      RC      },
+       {       "rc",           2,      RC      },
+       {       "pl",           2,      Dot     },
+       {       "_",            1,      Dot     },
+       {       ".",            1,      Dot     },
+       {       NULL,           0,      0       }
+};
+
+
+
+/* locate the test in the tests array */
+int
+dewey_mktest(int *op, const char *test)
+{
+       const test_t *tp;
+
+       for (tp = tests ; tp->s ; tp++) {
+               if (strncasecmp(test, tp->s, tp->len) == 0) {
+                       *op = tp->t;
+                       return tp->len;
+               }
+       }
+       return -1;
+}
+
+/*
+ * make a component of a version number.
+ * '.' encodes as Dot which is '0'
+ * '_' encodes as 'patch level', or 'Dot', which is 0.
+ * 'pl' encodes as 'patch level', or 'Dot', which is 0.
+ * 'alpha' encodes as 'alpha version', or Alpha, which is -3.
+ * 'beta' encodes as 'beta version', or Beta, which is -2.
+ * 'rc' encodes as 'release candidate', or RC, which is -1.
+ * 'nb' encodes as 'netbsd version', which is used after all other tests
+ */
+static int
+mkcomponent(arr_t *ap, const char *num)
+{
+       static const char       alphas[] = "abcdefghijklmnopqrstuvwxyz";
+       const test_t           *modp;
+       int                 n;
+       const char             *cp;
+
+       if (*num == 0) {
+               return 0;
+       }
+       ALLOC(int, ap->v, ap->size, ap->c, 62, "mkver", exit(EXIT_FAILURE));
+       if (isdigit((unsigned char)*num)) {
+               for (cp = num, n = 0 ; isdigit((unsigned char)*num) ; num++) {
+                       n = (n * 10) + (*num - '0');
+               }
+               ap->v[ap->c++] = n;
+               return (int)(num - cp);
+       }
+       for (modp = modifiers ; modp->s ; modp++) {
+               if (strncasecmp(num, modp->s, modp->len) == 0) {
+                       ap->v[ap->c++] = modp->t;
+                       return modp->len;
+               }
+       }
+       if (strncasecmp(num, "nb", 2) == 0) {
+               for (cp = num, num += 2, n = 0 ; isdigit((unsigned char)*num) ; num++) {
+                       n = (n * 10) + (*num - '0');
+               }
+               ap->netbsd = n;
+               return (int)(num - cp);
+       }
+       if (isalpha((unsigned char)*num)) {
+               ap->v[ap->c++] = Dot;
+               cp = strchr(alphas, tolower((unsigned char)*num));
+               ALLOC(int, ap->v, ap->size, ap->c, 62, "mkver", exit(EXIT_FAILURE));
+               ap->v[ap->c++] = (int)(cp - alphas) + 1;
+               return 1;
+       }
+       return 1;
+}
+
+/* make a version number string into an array of comparable 64bit ints */
+static int
+mkversion(arr_t *ap, const char *num)
+{
+       (void) memset(ap, 0, sizeof(arr_t));
+       while (*num) {
+               num += mkcomponent(ap, num);
+       }
+       return 1;
+}
+
+#define DIGIT(v, c, n) (((n) < (c)) ? v[n] : 0)
+
+/* compare the result against the test we were expecting */
+static int
+result(int cmp, int tst)
+{
+       switch(tst) {
+       case DEWEY_LT:
+               return cmp < 0;
+       case DEWEY_LE:
+               return cmp <= 0;
+       case DEWEY_GT:
+               return cmp > 0;
+       case DEWEY_GE:
+               return cmp >= 0;
+       case DEWEY_EQ:
+               return cmp == 0;
+       case DEWEY_NE:
+               return cmp != 0;
+       default:
+               return 0;
+       }
+}
+
+/* do the test on the 2 vectors */
+static int
+vtest(arr_t *lhs, int tst, arr_t *rhs)
+{
+       int cmp;
+       int     c;
+       int     i;
+
+       for (i = 0, c = MAX(lhs->c, rhs->c) ; i < c ; i++) {
+               if ((cmp = DIGIT(lhs->v, lhs->c, i) - DIGIT(rhs->v, rhs->c, i)) != 0) {
+                       return result(cmp, tst);
+               }
+       }
+       return result(lhs->netbsd - rhs->netbsd, tst);
+}
+
+/*
+ * Compare two dewey decimal numbers
+ */
+int
+dewey_cmp(const char *lhs, int op, const char *rhs)
+{
+       arr_t   right;
+       arr_t   left;
+
+       (void) memset(&left, 0, sizeof(left));
+       if (!mkversion(&left, lhs)) {
+               return 0;
+       }
+       (void) memset(&right, 0, sizeof(right));
+       if (!mkversion(&right, rhs)) {
+               return 0;
+       }
+        return vtest(&left, op, &right);
+}
+
+/*
+ * Perform dewey match on "pkg" against "pattern".
+ * Return 1 on match, 0 otherwise
+ */
+int
+dewey_match(const char *pattern, const char *pkg)
+{
+       const char *version;
+       const char *sep, *sep2;
+       int op, op2;
+       int n;
+
+       /* compare names */
+       if ((version=strrchr(pkg, '-')) == NULL) {
+               return 0;
+       }
+       if ((sep = strpbrk(pattern, "<>")) == NULL)
+               errx(EXIT_FAILURE, "dewey_match: '<' or '>' expected in `%s'", pattern);
+       /* compare name lengths */
+       if ((sep-pattern != version-pkg) ||
+           strncmp(pkg, pattern, (size_t)(version-pkg)) != 0)
+               return 0;
+       version++;
+       
+       /* extract comparison operator */
+        if ((n = dewey_mktest(&op, sep)) < 0) {
+               return 0;
+        }
+       /* skip operator */
+       sep += n;
+
+       /* if greater than, look for less than */
+       sep2 = NULL;
+       if (op == DEWEY_GT || op == DEWEY_GE) {
+               if ((sep2 = strchr(sep, '<')) != NULL) {
+                       if ((n = dewey_mktest(&op2, sep2)) < 0) {
+                               return 0;
+                       }
+                       /* compare upper limit */
+                       if (!dewey_cmp(version, op2, sep2+n))
+                               return 0;
+               }
+       }
+
+       /* compare only pattern / lower limit */
+       if (sep2) {
+               char ver[PKG_PATTERN_MAX];
+
+               strlcpy(ver, sep, MIN(sizeof(ver), sep2-sep+1));
+               if (dewey_cmp(version, op, ver))
+                       return 1;
+       }
+       else {
+               if (dewey_cmp(version, op, sep))
+                       return 1;
+       }



Home | Main Index | Thread Index | Old Index