Skip site navigation (1)Skip section navigation (2)
Date:      Wed, 20 Nov 2002 14:27:53 +1100
From:      Tim Robbins <tjr@FreeBSD.org>
To:        "Andrey A. Chernov" <ache@nagual.pp.ru>
Cc:        Ruslan Ermilov <ru@FreeBSD.org>, "David O'Brien" <obrien@FreeBSD.org>, current@FreeBSD.org
Subject:   Re: awk(1) is locale unaware (was: Re: buildworld breakage during "make depend" at usr.bin/kdump)
Message-ID:  <20021120142753.A11292@dilbert.robbins.dropbear.id.au>
In-Reply-To: <20021120013838.GB19233@nagual.pp.ru>; from ache@nagual.pp.ru on Wed, Nov 20, 2002 at 04:38:38AM %2B0300
References:  <20011101220836.A76061@nagual.pp.ru> <91693.1004642592@axl.seasidesoftware.co.za> <20011101114213.F79520@dragon.nuxi.com> <20011102044411.A81844@nagual.pp.ru> <20011101175808.A82798@dragon.nuxi.com> <20021119125202.GA37987@sunbay.com> <20021120013838.GB19233@nagual.pp.ru>

next in thread | previous in thread | raw e-mail | index | archive | help
On Wed, Nov 20, 2002 at 04:38:38AM +0300, Andrey A. Chernov wrote:

> On Tue, Nov 19, 2002 at 14:52:02 +0200, Ruslan Ermilov wrote:
> > It seems that this patch has never been committed.  This is a critical
> > bug that should be fixed before 5.0-RELEASE is out.
> 
> I agree. There is no locale yet and I never see that patch.

This patch seems to work, I used the logic from regcomp.c in libc.
Long lines make it ugly, but it was like that when I got here ;)


Tim


Index: src/usr.bin/awk/Makefile
===================================================================
RCS file: /x/freebsd/src/usr.bin/awk/Makefile,v
retrieving revision 1.9
diff -u -r1.9 Makefile
--- src/usr.bin/awk/Makefile	10 May 2002 20:36:21 -0000	1.9
+++ src/usr.bin/awk/Makefile	20 Nov 2002 03:13:50 -0000
@@ -6,7 +6,7 @@
 PROG=	nawk
 SRCS=	awkgram.y b.c lex.c lib.c main.c parse.c proctab.c run.c tran.c ytab.h
 
-CFLAGS+= -I. -I${AWKSRC}
+CFLAGS+= -I. -I${AWKSRC} -I${.CURDIR}/../../lib/libc/locale
 
 DPADD=	${LIBM}
 LDADD=	-lm
Index: src/contrib/one-true-awk/b.c
===================================================================
RCS file: /x/freebsd/src/contrib/one-true-awk/b.c,v
retrieving revision 1.1.1.2
diff -u -r1.1.1.2 b.c
--- src/contrib/one-true-awk/b.c	19 Feb 2002 09:35:24 -0000	1.1.1.2
+++ src/contrib/one-true-awk/b.c	20 Nov 2002 03:16:10 -0000
@@ -32,6 +32,7 @@
 #include <stdlib.h>
 #include "awk.h"
 #include "ytab.h"
+#include "collate.h"
 
 #define	HAT	(NCHARS-2)	/* matches ^ in regular expr */
 				/* NCHARS is 2**n */
@@ -284,7 +285,7 @@
 
 char *cclenter(char *argp)	/* add a character class */
 {
-	int i, c, c2;
+	int i, j, c, c2;
 	uschar *p = (uschar *) argp;
 	uschar *op, *bp;
 	static uschar *buf = 0;
@@ -308,12 +309,24 @@
 					i--;
 					continue;
 				}
-				while (c < c2) {
-					if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0))
-						FATAL("out of space for character class [%.10s...] 2", p);
-					*bp++ = ++c;
-					i++;
-				}
+				if (__collate_load_error) {
+					while (c < c2) {
+						if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0))
+							FATAL("out of space for character class [%.10s...] 2", p);
+						*bp++ = ++c;
+						i++;
+					}
+				} else {
+					for (j = CHAR_MIN; j <= CHAR_MAX; j++) {
+						if (!adjbuf((char **) &buf, &bufsz, bp-buf+2, 100, (char **) &bp, 0))
+							FATAL("out of space for character class [%.10s...] 2", p);
+						if (__collate_range_cmp(c, j) <= 0
+						    && __collate_range_cmp(j, c2) <= 0) {
+							*bp++ = j;
+							i++;
+						}
+					}
+                                }
 				continue;
 			}
 		}
Index: src/contrib/one-true-awk/main.c
===================================================================
RCS file: /x/freebsd/src/contrib/one-true-awk/main.c,v
retrieving revision 1.1.1.3
diff -u -r1.1.1.3 main.c
--- src/contrib/one-true-awk/main.c	16 Mar 2002 16:50:56 -0000	1.1.1.3
+++ src/contrib/one-true-awk/main.c	20 Nov 2002 03:03:38 -0000
@@ -27,6 +27,7 @@
 #define DEBUG
 #include <stdio.h>
 #include <ctype.h>
+#include <locale.h>
 #include <stdlib.h>
 #include <string.h>
 #include <signal.h>
@@ -55,6 +56,7 @@
 	char *fs = NULL;
 
 	cmdname = argv[0];
+	setlocale(LC_ALL, "");
 	if (argc == 1) {
 		fprintf(stderr, "Usage: %s [-f programfile | 'program'] [-Ffieldsep] [-v var=value] [files]\n", cmdname);
 		exit(1);
Index: src/contrib/one-true-awk/run.c
===================================================================
RCS file: /x/freebsd/src/contrib/one-true-awk/run.c,v
retrieving revision 1.1.1.2
diff -u -r1.1.1.2 run.c
--- src/contrib/one-true-awk/run.c	19 Feb 2002 09:35:25 -0000	1.1.1.2
+++ src/contrib/one-true-awk/run.c	20 Nov 2002 03:02:29 -0000
@@ -1504,11 +1504,11 @@
 		if (t == FTOUPPER) {
 			for (p = buf; *p; p++)
 				if (islower((uschar) *p))
-					*p = toupper(*p);
+					*p = toupper((uschar)*p);
 		} else {
 			for (p = buf; *p; p++)
 				if (isupper((uschar) *p))
-					*p = tolower(*p);
+					*p = tolower((uschar)*p);
 		}
 		tempfree(x);
 		x = gettemp();

To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-current" in the body of the message




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20021120142753.A11292>