* Switch to operation on pointers with PointerTy more consistently
* Fix misspeling
* Catch SIGFPE for traps
* info XXX now prints the raw contents of the GenericValue
* Switch to calloc instead of malloc (temporarily I hope) to bandaid Olden benchmarks
* Implement binary And & Or
* Convert expressions like this:
     PointerTy SrcPtr = getOperandValue(I->getPtrOperand(), SF).PointerVal;
  to:
    GenericValue SRC = getOperandValue(I->getPtrOperand(), SF);
    PointerTy SrcPtr = SRC.PointerVal;
  because the prior way confuses purify.
* Taint the initial values of the value planes
* Handling 'print bb4' in the interpreter without crashing
* Print nicer stack frames with concise return type
* printf doesn't suck nearly as badly as it used to


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1177 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
index 80bfb7c..8dd7c36 100644
--- a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
+++ b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
@@ -202,7 +202,7 @@
 GenericValue lle_X_malloc(MethodType *M, const vector<GenericValue> &Args) {
   assert(Args.size() == 1 && "Malloc expects one argument!");
   GenericValue GV;
-  GV.PointerVal = (uint64_t)malloc(Args[0].UIntVal);
+  GV.PointerVal = (PointerTy)malloc(Args[0].UIntVal);
   return GV;
 }
 
@@ -269,40 +269,45 @@
       break;
     }
     case '%': {                    // Handle format specifiers
-      bool isLong = false;
-      ++FmtStr;
-      if (*FmtStr == 'l') {
-        isLong = true;
-        FmtStr++;
+      char FmtBuf[100] = "", Buffer[1000] = "";
+      char *FB = FmtBuf;
+      *FB++ = *FmtStr++;
+      char Last = *FB++ = *FmtStr++;
+      unsigned HowLong = 0;
+      while (Last != 'c' && Last != 'd' && Last != 'i' && Last != 'u' &&
+             Last != 'o' && Last != 'x' && Last != 'X' && Last != 'e' &&
+             Last != 'E' && Last != 'g' && Last != 'G' && Last != 'f' &&
+             Last != 'p' && Last != 's' && Last != '%') {
+        if (Last == 'l' || Last == 'L') HowLong++;  // Keep track of l's
+        Last = *FB++ = *FmtStr++;
       }
-
-      if (*FmtStr == '%') 
-        cout << *FmtStr;                  // %%
-      else {
-        char Fmt[] = "%d", Buffer[1000] = "";
-        Fmt[1] = *FmtStr;
-
-        switch (*FmtStr) {
-        case 'c':
-          sprintf(Buffer, Fmt, Args[ArgNo++].SByteVal); break;
-        case 'd': case 'i':
-        case 'u': case 'o':
-        case 'x': case 'X':
-          sprintf(Buffer, Fmt, Args[ArgNo++].IntVal); break;
-        case 'e': case 'E': case 'g': case 'G': case 'f':
-          sprintf(Buffer, Fmt, Args[ArgNo++].DoubleVal); break;
-        case 'p':
-          sprintf(Buffer, Fmt, (void*)Args[ArgNo++].PointerVal); break;
-        case 's': cout << (char*)Args[ArgNo++].PointerVal; break;     // %s
-        default:  cout << "<unknown printf code '" << *FmtStr << "'!>";
-          ArgNo++; break;
-        }
-        cout << Buffer;
+      *FB = 0;
+      
+      switch (Last) {
+      case '%':
+        sprintf(Buffer, FmtBuf); break;
+      case 'c':
+        sprintf(Buffer, FmtBuf, Args[ArgNo++].SByteVal); break;
+      case 'd': case 'i':
+      case 'u': case 'o':
+      case 'x': case 'X':
+        if (HowLong == 2)
+          sprintf(Buffer, FmtBuf, Args[ArgNo++].ULongVal);
+        else
+          sprintf(Buffer, FmtBuf, Args[ArgNo++].IntVal); break;
+      case 'e': case 'E': case 'g': case 'G': case 'f':
+        sprintf(Buffer, FmtBuf, Args[ArgNo++].DoubleVal); break;
+      case 'p':
+        sprintf(Buffer, FmtBuf, (void*)Args[ArgNo++].PointerVal); break;
+      case 's': 
+        sprintf(Buffer, FmtBuf, (char*)Args[ArgNo++].PointerVal); break;
+      default:  cout << "<unknown printf code '" << *FmtStr << "'!>";
+        ArgNo++; break;
       }
-      ++FmtStr;
+      cout << Buffer;
+      }
       break;
     }
-    }
   }
 }