Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 27 Apr 2008 15:12:18 +0200
From:      Romain =?iso-8859-1?Q?Tarti=E8re?= <romain@blogreen.org>
To:        freebsd-hackers@freebsd.org, hackers@freebsd.org
Cc:        Romuald Conty <romuald.conty@free.fr>
Subject:   Re: indent(1) support for gcc(1) 0b prefix
Message-ID:  <20080427131218.GA27750@marvin.blogreen.org>
In-Reply-To: <20080427102053.GA7293@server.vk2pj.dyndns.org>
References:  <20080426213557.GA88577@marvin.blogreen.org> <200804270201.53271.max@love2party.net> <20080427102053.GA7293@server.vk2pj.dyndns.org>

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

--3lcZGd9BuhuYXNfi
Content-Type: multipart/mixed; boundary="ikeVEW9yuYc//A+q"
Content-Disposition: inline


--ikeVEW9yuYc//A+q
Content-Type: text/plain; charset=iso-8859-1
Content-Disposition: inline
Content-Transfer-Encoding: quoted-printable

On Sun, Apr 27, 2008 at 08:20:53PM +1000, Peter Jeremy wrote:
> By inserting whitespace, indent(1) is changing the syntax of the input
> and, IMHO, indent should not be doing that - its brief is to
> re-arrange whitespace to (hopefully) improve legibility, not make
> syntactic changes.
>=20
> I would support changing indent to bring its tokenisation more into
> line with the C preprocessor.
I share your point of view. I tweaked a bit more indent(1) so that it
tries to detect invalid numeric tokens, and in such circumstances output
a warning message and does NOT change the code.

Comments are welcomed.

Regards,
Romain

--=20
Romain Tarti=E8re <romain@blogreen.org>        http://romain.blogreen.org/
pgp: 8DAB A124 0DA4 7024 F82A  E748 D8E9 A33F FF56 FF43 (ID: 0xFF56FF43)
(plain text =3Dnon-HTML=3D PGP/GPG encrypted/signed e-mail much appreciated)

--ikeVEW9yuYc//A+q
Content-Type: text/x-diff; charset=us-ascii
Content-Disposition: attachment; filename="lexi.c.diff"
Content-Transfer-Encoding: quoted-printable

--- /usr/src/usr.bin/indent/lexi.c	2005-11-20 14:48:15.000000000 +0100
+++ lexi.c	2008-04-27 15:09:21.000000000 +0200
@@ -121,6 +121,10 @@
     1, 1, 1, 0, 3, 0, 3, 0
 };
=20
+enum base {
+	BASE_2, BASE_8, BASE_10, BASE_16
+};
+
 int
 lexi(void)
 {
@@ -158,16 +162,37 @@
 	    int         seendot =3D 0,
 	                seenexp =3D 0,
 			seensfx =3D 0;
-	    if (*buf_ptr =3D=3D '0' &&
-		    (buf_ptr[1] =3D=3D 'x' || buf_ptr[1] =3D=3D 'X')) {
-		*e_token++ =3D *buf_ptr++;
-		*e_token++ =3D *buf_ptr++;
-		while (isxdigit(*buf_ptr)) {
+	    enum base	in_base =3D BASE_10;
+
+	    if (*buf_ptr =3D=3D '0') {
+		if (buf_ptr[1] =3D=3D 'b' || buf_ptr[1] =3D=3D 'B')
+		    in_base =3D BASE_2;
+		else if (buf_ptr[1] =3D=3D 'x' || buf_ptr[1] =3D=3D 'X')
+		    in_base =3D BASE_16;
+		else
+		    in_base =3D BASE_8;
+	    }
+
+	    *e_token++ =3D *buf_ptr++;
+	    if (in_base =3D=3D BASE_2 || in_base =3D=3D BASE_16)
+		*e_token++ =3D *buf_ptr++;	/* Read the second character from
+						 * 0b... / 0x... expressions.
+						 */
+
+	    switch (in_base) {
+	    case BASE_2:
+		while (*buf_ptr =3D=3D '0' || *buf_ptr =3D=3D '1') {
 		    CHECK_SIZE_TOKEN;
 		    *e_token++ =3D *buf_ptr++;
 		}
-	    }
-	    else
+		break;
+	    case BASE_8:
+		while (*buf_ptr >=3D '0' && *buf_ptr <=3D '8') {
+		    CHECK_SIZE_TOKEN;
+		    *e_token++ =3D *buf_ptr++;
+		}
+		break;
+	    case BASE_10:
 		while (1) {
 		    if (*buf_ptr =3D=3D '.') {
 			if (seendot)
@@ -209,6 +234,29 @@
 		}
 		break;
 	    }
+
+	    	break;
+	    case BASE_16:
+		while (isxdigit(*buf_ptr)) {
+		    CHECK_SIZE_TOKEN;
+		    *e_token++ =3D *buf_ptr++;
+		}
+	    	break;
+	    }
+	    if (isalnum(*buf_ptr)) {
+		char *buf;
+		/* current token is malformed */
+		if (asprintf(&buf, "Ignoring invalid numeric "
+		    "expression '%s%c...'", s_token, *buf_ptr)) {
+		    diag2(0, buf);
+		    free(buf);
+		}
+		/* finish to eat the current token */
+		while (isalnum(*buf_ptr)) {
+		    CHECK_SIZE_TOKEN;
+		    *e_token++ =3D *buf_ptr++;
+		}
+	    }
 	}
 	else
 	    while (chartype[(int)*buf_ptr] =3D=3D alphanum || *buf_ptr =3D=3D BAC=
KSLASH) {

--ikeVEW9yuYc//A+q--

--3lcZGd9BuhuYXNfi
Content-Type: application/pgp-signature
Content-Disposition: inline

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

iEYEARECAAYFAkgUe7IACgkQ2OmjP/9W/0MhoACeK0qhAaMthPMw2aWzVvDpeihg
k7UAn3oC1vOUyVRKkzkmD275LZ5+ZXvb
=ka6I
-----END PGP SIGNATURE-----

--3lcZGd9BuhuYXNfi--



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