summaryrefslogtreecommitdiff
path: root/ragel/parsedata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'ragel/parsedata.cpp')
-rw-r--r--ragel/parsedata.cpp63
1 files changed, 42 insertions, 21 deletions
diff --git a/ragel/parsedata.cpp b/ragel/parsedata.cpp
index 8ce89db..d0bb361 100644
--- a/ragel/parsedata.cpp
+++ b/ragel/parsedata.cpp
@@ -122,29 +122,50 @@ Key makeFsmKeyHex( char *str, const InputLoc &loc, ParseData *pd )
Key makeFsmKeyDec( char *str, const InputLoc &loc, ParseData *pd )
{
- /* Convert the number to a decimal. First reset errno so we can check
- * for overflow or underflow. */
- errno = 0;
- long long minVal = keyOps->alphType->minVal;
- long long maxVal = keyOps->alphType->maxVal;
-
- long long ll = strtoll( str, 0, 10 );
-
- /* Check for underflow. */
- if ( ( errno == ERANGE && ll < 0 ) || ll < minVal) {
- error(loc) << "literal " << str << " underflows the alphabet type" << endl;
- ll = minVal;
+ if ( keyOps->alphType->isSigned ) {
+ /* Convert the number to a decimal. First reset errno so we can check
+ * for overflow or underflow. */
+ errno = 0;
+ long long minVal = keyOps->alphType->sMinVal;
+ long long maxVal = keyOps->alphType->sMaxVal;
+
+ long long ll = strtoll( str, 0, 10 );
+
+ /* Check for underflow. */
+ if ( ( errno == ERANGE && ll < 0 ) || ll < minVal) {
+ error(loc) << "literal " << str << " underflows the alphabet type" << endl;
+ ll = minVal;
+ }
+ /* Check for overflow. */
+ else if ( ( errno == ERANGE && ll > 0 ) || ll > maxVal ) {
+ error(loc) << "literal " << str << " overflows the alphabet type" << endl;
+ ll = maxVal;
+ }
+
+ return Key( (long)ll );
}
- /* Check for overflow. */
- else if ( ( errno == ERANGE && ll > 0 ) || ll > maxVal ) {
- error(loc) << "literal " << str << " overflows the alphabet type" << endl;
- ll = maxVal;
+ else {
+ /* Convert the number to a decimal. First reset errno so we can check
+ * for overflow or underflow. */
+ errno = 0;
+ unsigned long long minVal = keyOps->alphType->uMinVal;
+ unsigned long long maxVal = keyOps->alphType->uMaxVal;
+
+ unsigned long long ull = strtoull( str, 0, 10 );
+
+ /* Check for underflow. */
+ if ( ( errno == ERANGE && ull < 0 ) || ull < minVal) {
+ error(loc) << "literal " << str << " underflows the alphabet type" << endl;
+ ull = minVal;
+ }
+ /* Check for overflow. */
+ else if ( ( errno == ERANGE && ull > 0 ) || ull > maxVal ) {
+ error(loc) << "literal " << str << " overflows the alphabet type" << endl;
+ ull = maxVal;
+ }
+
+ return Key( (unsigned long)ull );
}
-
- if ( keyOps->alphType->isSigned )
- return Key( (long)ll );
- else
- return Key( (unsigned long)ll );
}
/* Make an fsm key in int format (what the fsm graph uses) from an alphabet