Author: ru
Date: Sun Jan 10 08:02:07 2010
New Revision: 201989
URL: http://svn.freebsd.org/changeset/base/201989

Log:
  Apply patches directly to sources.  Their effect is as follows:
  
  - Make one-true-awk respect locale's collating order in [a-z]
    bracket expressions, until a more complete fix (like handing
    BREs) is ready.
  
  - Don't require a space between -[fv] and its argument.

Deleted:
  head/usr.bin/awk/b.c.diff
  head/usr.bin/awk/main.c.diff
  head/usr.bin/awk/run.c.diff
Modified:
  head/contrib/one-true-awk/b.c
  head/contrib/one-true-awk/main.c
  head/contrib/one-true-awk/run.c
  head/usr.bin/awk/Makefile

Modified: head/contrib/one-true-awk/b.c
==============================================================================
--- head/contrib/one-true-awk/b.c       Sun Jan 10 07:18:35 2010        
(r201988)
+++ head/contrib/one-true-awk/b.c       Sun Jan 10 08:02:07 2010        
(r201989)
@@ -24,6 +24,9 @@ THIS SOFTWARE.
 
 /* lasciate ogne speranza, voi ch'intrate. */
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
 #define        DEBUG
 
 #include <ctype.h>
@@ -285,9 +288,21 @@ int quoted(char **pp)      /* pick up next th
        return c;
 }
 
+static int collate_range_cmp(int a, int b)
+{
+       static char s[2][2];
+
+       if ((uschar)a == (uschar)b)
+               return 0;
+       s[0][0] = a;
+       s[1][0] = b;
+       return (strcoll(s[0], s[1]));
+}
+
 char *cclenter(const char *argp)       /* add a character class */
 {
        int i, c, c2;
+       int j;
        uschar *p = (uschar *) argp;
        uschar *op, *bp;
        static uschar *buf = 0;
@@ -306,15 +321,18 @@ char *cclenter(const char *argp)  /* add 
                                c2 = *p++;
                                if (c2 == '\\')
                                        c2 = quoted((char **) &p);
-                               if (c > c2) {   /* empty; ignore */
+                               if (collate_range_cmp(c, c2) > 0) {
                                        bp--;
                                        i--;
                                        continue;
                                }
-                               while (c < c2) {
+                               for (j = 0; j < NCHARS; j++) {
+                                       if ((collate_range_cmp(c, j) > 0) ||
+                                           collate_range_cmp(j, c2) > 0)
+                                               continue;
                                        if (!adjbuf((char **) &buf, &bufsz, 
bp-buf+2, 100, (char **) &bp, "cclenter1"))
                                                FATAL("out of space for 
character class [%.10s...] 2", p);
-                                       *bp++ = ++c;
+                                       *bp++ = j;
                                        i++;
                                }
                                continue;

Modified: head/contrib/one-true-awk/main.c
==============================================================================
--- head/contrib/one-true-awk/main.c    Sun Jan 10 07:18:35 2010        
(r201988)
+++ head/contrib/one-true-awk/main.c    Sun Jan 10 08:02:07 2010        
(r201989)
@@ -22,7 +22,10 @@ ARISING OUT OF OR IN CONNECTION WITH THE
 THIS SOFTWARE.
 ****************************************************************/
 
-const char     *version = "version 20091126";
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+const char     *version = "version 20091126 (FreeBSD)";
 
 #define DEBUG
 #include <stdio.h>
@@ -58,6 +61,7 @@ int main(int argc, char *argv[])
        const char *fs = NULL;
 
        setlocale(LC_CTYPE, "");
+       setlocale(LC_COLLATE, "");
        setlocale(LC_NUMERIC, "C"); /* for parsing cmdline & prog */
        cmdname = argv[0];
        if (argc == 1) {
@@ -86,13 +90,18 @@ int main(int argc, char *argv[])
                                safe = 1;
                        break;
                case 'f':       /* next argument is program filename */
-                       argc--;
-                       argv++;
-                       if (argc <= 1)
-                               FATAL("no program filename");
-                       if (npfile >= MAX_PFILE - 1)
-                               FATAL("too many -f options"); 
-                       pfile[npfile++] = argv[1];
+                       if (argv[1][2] != 0) {  /* arg is -fsomething */
+                               if (npfile >= MAX_PFILE - 1)
+                                       FATAL("too many -f options"); 
+                               pfile[npfile++] = &argv[1][2];
+                       } else {                /* arg is -f something */
+                               argc--; argv++;
+                               if (argc <= 1)
+                                       FATAL("no program filename");
+                               if (npfile >= MAX_PFILE - 1)
+                                       FATAL("too many -f options"); 
+                               pfile[npfile++] = argv[1];
+                       }
                        break;
                case 'F':       /* set field separator */
                        if (argv[1][2] != 0) {  /* arg is -Fsomething */
@@ -111,8 +120,14 @@ int main(int argc, char *argv[])
                                WARNING("field separator FS is empty");
                        break;
                case 'v':       /* -v a=1 to be done NOW.  one -v for each */
-                       if (argv[1][2] == '\0' && --argc > 1 && 
isclvar((++argv)[1]))
-                               setclvar(argv[1]);
+                       if (argv[1][2] != 0) {  /* arg is -vsomething */
+                               if (argv[1][2] != 0)
+                                       setclvar(&argv[1][2]);
+                       } else {                /* arg is -v something */
+                               argc--; argv++;
+                               if (argc > 1 && isclvar(argv[1]))
+                                       setclvar(argv[1]);
+                       }
                        break;
                case 'd':
                        dbg = atoi(&argv[1][2]);

Modified: head/contrib/one-true-awk/run.c
==============================================================================
--- head/contrib/one-true-awk/run.c     Sun Jan 10 07:18:35 2010        
(r201988)
+++ head/contrib/one-true-awk/run.c     Sun Jan 10 08:02:07 2010        
(r201989)
@@ -22,6 +22,9 @@ ARISING OUT OF OR IN CONNECTION WITH THE
 THIS SOFTWARE.
 ****************************************************************/
 
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
 #define DEBUG
 #include <stdio.h>
 #include <ctype.h>
@@ -653,7 +656,7 @@ Cell *relop(Node **a, int n)        /* a[0 < a[
                j = x->fval - y->fval;
                i = j<0? -1: (j>0? 1: 0);
        } else {
-               i = strcmp(getsval(x), getsval(y));
+               i = strcoll(getsval(x), getsval(y));
        }
        tempfree(x);
        tempfree(y);

Modified: head/usr.bin/awk/Makefile
==============================================================================
--- head/usr.bin/awk/Makefile   Sun Jan 10 07:18:35 2010        (r201988)
+++ head/usr.bin/awk/Makefile   Sun Jan 10 08:02:07 2010        (r201989)
@@ -27,10 +27,4 @@ proctab.c: maketab
 build-tools: maketab
 maketab: ytab.h ${AWKSRC}/maketab.c
 
-.for f in b.c main.c run.c
-${f}: ${AWKSRC}/${f} ${.CURDIR}/${f}.diff
-       patch -s -b .orig -o ${.TARGET} < ${.CURDIR}/${f}.diff ${AWKSRC}/${f}
-CLEANFILES+= ${f}
-.endfor
-
 .include <bsd.prog.mk>
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to