diff --git a/lexor.lex b/lexor.lex index 53e6d6f61..bc7f936d1 100644 --- a/lexor.lex +++ b/lexor.lex @@ -19,7 +19,7 @@ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA */ #if !defined(WINNT) && !defined(macintosh) -#ident "$Id: lexor.lex,v 1.50 2000/10/14 16:48:59 steve Exp $" +#ident "$Id: lexor.lex,v 1.51 2000/10/22 22:27:59 steve Exp $" #endif //# define YYSTYPE lexval @@ -801,15 +801,20 @@ static verinum*make_dec_with_size(unsigned size, bool fixed, const char*ptr) ptr += 1; while (*ptr && ((*ptr == ' ') || (*ptr == '\t'))) ptr += 1; - - if ((strlen(ptr) * 4) > size) - cerr << yylloc.text << ":" << yylloc.first_line << - ": warning: Numeric decimal constant ``" << ptr << - "'' truncated to " << size << " bits." << endl; + + const char*digits = ptr; + + /* Convert the decimal number to a binary value, one digit at + a time. Watch out for overflow. */ unsigned long value = 0; for ( ; *ptr ; ptr += 1) if (isdigit(*ptr)) { + unsigned long tmp = value * 10 + (*ptr - '0'); + if (tmp < value) + cerr << yylloc.text << ":" << yylloc.first_line << + ": warning: Numeric decimal constant ``" + << digits << "'' is too large." << endl; value *= 10; value += *ptr - '0'; } else { @@ -824,6 +829,14 @@ static verinum*make_dec_with_size(unsigned size, bool fixed, const char*ptr) value /= 2; } + /* If we run out of bits to hold the value, but there are + still valueable bits in the number, print a warning. */ + + if (value != 0) + cerr << yylloc.text << ":" << yylloc.first_line << + ": warning: Numeric decimal constant ``" << digits << + "'' truncated to " << size << " bits." << endl; + verinum*out = new verinum(bits, size, fixed); out->has_sign(signed_flag); delete[]bits;