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>
