Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 21 Jan 2010 22:05:23 +0100
From:      Tobias Rehbein <tobias.rehbein@web.de>
To:        freebsd-current@freebsd.org
Subject:   [patch] Let indent(1) handle widecharacter literals correctly
Message-ID:  <20100121210523.GA1442@sushi.pseudo.local>

next in thread | raw e-mail | index | archive | help

--nmemrqcdn5VTmUEE
Content-Type: multipart/mixed; boundary="PmA2V3Z32TCmWXqI"
Content-Disposition: inline


--PmA2V3Z32TCmWXqI
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

Hi.

I am not subscribed to this list, so please answer me off-list or cc me.

I noticed that indent(1) handles widecharacter literals (e.g. L'c' or L"str=
ing")
incorrectly. indent(1)s parser treats the L-prefix and the quoted part as
seperate tokens. The result is:

        L'c'            ->      L 'c'
        L"string"       ->      L "string"

Of course this breaks any code using widecharacters. As I use indent(1) qui=
te
extensively I decided to fix this issue. As this is my first patch against =
the
FreeBSD user land feel free to comment!

Find attached:

        indent.diff: the patch

        wcsxfrm.old.c: the result of `indent wcsxfrm.c`; using the indent(1)
                version from the base system
       =20
        wcsxfrm.new.c: the result of `indent wcsxfrm.c`; using the patched
                indent(1)

Please note the diff between wcsxfrm.old.c and wcsxfrm.new.c:
       =20
=3D=3D=3D=3D=3D=3D=3D=3D diff -u wcsxfrm.old.c wcsxfrm.new.c =3D=3D=3D=3D=
=3D=3D=3D=3D
--- wcsxfrm.old.c	2010-01-21 18:49:04.000000000 +0100
+++ wcsxfrm.new.c	2010-01-21 18:49:48.000000000 +0100
@@ -49,9 +49,9 @@
        size_t		slen;
        char           *mbsrc, *s, *ss;
=20
-	if (*src =3D=3D L '\0') {
+	if (*src =3D=3D L'\0') {
                if (len !=3D 0)
-			*dest =3D L '\0';
+			*dest =3D L'\0';
                return (0);
        }
        if (__collate_load_error || MB_CUR_MAX > 1) {
@@ -61,7 +61,7 @@
                                wcscpy(dest, src);
                        else {
                                wcsncpy(dest, src, len - 1);
-				dest[len - 1] =3D L '\0';
+				dest[len - 1] =3D L'\0';
                        }
                }
                return (slen);
@@ -87,7 +87,7 @@
        free(ss);
        free(mbsrc);
        if (len !=3D 0)
-		*dest =3D L '\0';
+		*dest =3D L'\0';
=20
        return (slen);
 }
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D

Regards

--=20
Tobias Rehbein

PGP key:         4F2AE314
    server:      keys.gnupg.net
    fingerprint: ECDA F300 1B6E 9B87 8524  8663 E8B6 3138 4F2A E314

--PmA2V3Z32TCmWXqI
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="indent.diff"
Content-Transfer-Encoding: quoted-printable

diff -u /usr/src/usr.bin/indent/Makefile usr.bin/indent/Makefile
--- /usr/src/usr.bin/indent/Makefile	2010-01-20 23:59:33.000000000 +0100
+++ usr.bin/indent/Makefile	2010-01-21 19:01:13.000000000 +0100
@@ -3,4 +3,6 @@
 PROG=3D	indent
 SRCS=3D	indent.c io.c lexi.c parse.c pr_comment.c args.c
=20
+WARNS?=3D		6
+
 .include <bsd.prog.mk>
diff -u /usr/src/usr.bin/indent/lexi.c usr.bin/indent/lexi.c
--- /usr/src/usr.bin/indent/lexi.c	2010-01-20 23:59:33.000000000 +0100
+++ usr.bin/indent/lexi.c	2010-01-21 18:52:49.000000000 +0100
@@ -221,6 +221,13 @@
 			} else
 			    break;
 		}
+                if (*buf_ptr =3D=3D 'L' && (*(buf_ptr + 1) =3D=3D '\'' || =
*(buf_ptr + 1) =3D=3D '"' ) && (s_token =3D=3D e_token)) {
+                        /* widecharacter literal */
+                        *e_token++ =3D *buf_ptr++;        /* copy L */
+                        *e_token++ =3D *buf_ptr;          /* copy ' or " */
+                        qchar =3D *buf_ptr++;             /* set string de=
limeter */
+                        goto found_string;
+                }
 		CHECK_SIZE_TOKEN;
 		/* copy it over */
 		*e_token++ =3D *buf_ptr++;
@@ -361,6 +368,7 @@
     case '\'':			/* start of quoted character */
     case '"':			/* start of string */
 	qchar =3D *token;
+found_string:
 	if (troff) {
 	    e_token[-1] =3D '`';
 	    if (qchar =3D=3D '"')

--PmA2V3Z32TCmWXqI--

--nmemrqcdn5VTmUEE
Content-Type: application/pgp-signature
Content-Disposition: inline

-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.14 (FreeBSD)

iEYEARECAAYFAktYwZEACgkQ6LYxOE8q4xSYWgCeJKty9Ypk6BCr1V+54q+R0xo8
jNgAoIcvAger3Oc9rsna5A0RXdnKeFrc
=0vBN
-----END PGP SIGNATURE-----

--nmemrqcdn5VTmUEE--



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