aboutsummaryrefslogtreecommitdiffstats
path: root/lib/Support/FileUtilities.cpp
diff options
context:
space:
mode:
authorLauro Ramos Venancio <lauro.venancio@gmail.com>2008-01-28 18:23:23 +0000
committerLauro Ramos Venancio <lauro.venancio@gmail.com>2008-01-28 18:23:23 +0000
commit599ddf9a7693a315a03fc77cf612eec53dee5f67 (patch)
treea2aa7277df63e6f280810fc0baa7be24e98f1525 /lib/Support/FileUtilities.cpp
parent349c72a35d0c586d081d01d97577fcf69bb75cca (diff)
downloadexternal_llvm-599ddf9a7693a315a03fc77cf612eec53dee5f67.zip
external_llvm-599ddf9a7693a315a03fc77cf612eec53dee5f67.tar.gz
external_llvm-599ddf9a7693a315a03fc77cf612eec53dee5f67.tar.bz2
Fix fpcmp infinite loop when comparing "29-266" with "29-268".
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46455 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Support/FileUtilities.cpp')
-rw-r--r--lib/Support/FileUtilities.cpp26
1 files changed, 21 insertions, 5 deletions
diff --git a/lib/Support/FileUtilities.cpp b/lib/Support/FileUtilities.cpp
index eff6fc9..30463e8 100644
--- a/lib/Support/FileUtilities.cpp
+++ b/lib/Support/FileUtilities.cpp
@@ -20,11 +20,15 @@
#include <cctype>
using namespace llvm;
-static bool isNumberChar(char C) {
+static bool isSignedChar(char C) {
+ if (C == '+' || C == '-')
+ return true;
+ else
+ return false;
+}
+
+static bool isExpoentChar(char C) {
switch (C) {
- case '0': case '1': case '2': case '3': case '4':
- case '5': case '6': case '7': case '8': case '9':
- case '.': case '+': case '-':
case 'D': // Strange exponential notation.
case 'd': // Strange exponential notation.
case 'e':
@@ -33,13 +37,25 @@ static bool isNumberChar(char C) {
}
}
+static bool isNumberChar(char C) {
+ switch (C) {
+ case '0': case '1': case '2': case '3': case '4':
+ case '5': case '6': case '7': case '8': case '9':
+ case '.': return true;
+ default: return isSignedChar(C) || isExpoentChar(C);
+ }
+}
+
static char *BackupNumber(char *Pos, char *FirstChar) {
// If we didn't stop in the middle of a number, don't backup.
if (!isNumberChar(*Pos)) return Pos;
// Otherwise, return to the start of the number.
- while (Pos > FirstChar && isNumberChar(Pos[-1]))
+ while (Pos > FirstChar && isNumberChar(Pos[-1])) {
--Pos;
+ if (Pos > FirstChar && isSignedChar(Pos[0]) && !isExpoentChar(Pos[-1]))
+ break;
+ }
return Pos;
}