diff src/lex.l @ 3220:3deb1105fbc1

[project @ 1998-11-19 00:06:30 by jwe]
author jwe
date Thu, 19 Nov 1998 00:06:34 +0000
parents e8a7163701be
children 041ea33fbbf4
line wrap: on
line diff
--- a/src/lex.l	Fri Nov 13 03:44:36 1998 +0000
+++ b/src/lex.l	Thu Nov 19 00:06:34 1998 +0000
@@ -201,7 +201,7 @@
 NOT	((\~)|(\!))
 IDENT	([_a-zA-Z][_a-zA-Z0-9]*)
 EXPON	([DdEe][+-]?{D}+)
-NUMBER	(({D}+\.?{D}*{EXPON}?)|(\.{D}+{EXPON}?))
+NUMBER	(({D}+\.?{D}*{EXPON}?)|(\.{D}+{EXPON}?)|(0[xX][0-9a-fA-F]+))
 %%
 
 %{
@@ -1383,6 +1383,12 @@
   return retval;
 }
 
+static inline bool
+looks_like_hex (const char *s, int len)
+{
+  return (len > 2 && s[0] == '0' && (s[1] == 'x' || s[1] == 'X'));
+}
+
 static void
 handle_number (char *yytext)
 {
@@ -1393,8 +1399,17 @@
   if (idx)
     *idx = 'e';
 
-  double value;
-  int nread = sscanf (tmp, "%lf", &value);
+  double value = 0.0;
+  int nread = 0;
+
+  if (looks_like_hex (tmp, strlen (tmp)))
+    {
+      unsigned long ival;
+      nread = sscanf (tmp, "%lx", &ival);
+      value = static_cast<double> (ival);
+    }
+  else
+    nread = sscanf (tmp, "%lf", &value);
 
   delete [] tmp;