summaryrefslogtreecommitdiffstats
path: root/llvm/lib
diff options
context:
space:
mode:
authorChris Lattner <sabre@nondot.org>2001-12-13 00:43:47 +0000
committerChris Lattner <sabre@nondot.org>2001-12-13 00:43:47 +0000
commit60a9a23abac014390b6f53c191c16b5aaa77cf96 (patch)
treea1ca98a3312b2f54247f01f2eb7aff8e94243c3b /llvm/lib
parent156344c890f3f8434cf7cfeb6651fd575633e7e9 (diff)
downloadbcm5719-llvm-60a9a23abac014390b6f53c191c16b5aaa77cf96.tar.gz
bcm5719-llvm-60a9a23abac014390b6f53c191c16b5aaa77cf96.zip
Implement sprintf
llvm-svn: 1445
Diffstat (limited to 'llvm/lib')
-rw-r--r--llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp36
1 files changed, 25 insertions, 11 deletions
diff --git a/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
index 4af07ad5f83..a54a6f1ced0 100644
--- a/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
+++ b/llvm/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp
@@ -283,10 +283,12 @@ GenericValue lle_X_srand(MethodType *M, const vector<GenericValue> &Args) {
return GenericValue();
}
-// int printf(sbyte *, ...) - a very rough implementation to make output useful.
-GenericValue lle_X_printf(MethodType *M, const vector<GenericValue> &Args) {
- const char *FmtStr = (const char *)Args[0].PointerVal;
- unsigned ArgNo = 1;
+// int sprintf(sbyte *, sbyte *, ...) - a very rough implementation to make
+// output useful.
+GenericValue lle_X_sprintf(MethodType *M, const vector<GenericValue> &Args) {
+ char *OutputBuffer = (char *)Args[0].PointerVal;
+ const char *FmtStr = (const char *)Args[1].PointerVal;
+ unsigned ArgNo = 2;
// printf should return # chars printed. This is completely incorrect, but
// close enough for now.
@@ -295,14 +297,11 @@ GenericValue lle_X_printf(MethodType *M, const vector<GenericValue> &Args) {
switch (*FmtStr) {
case 0: return GV; // Null terminator...
default: // Normal nonspecial character
- cout << *FmtStr++;
+ sprintf(OutputBuffer++, "%c", *FmtStr++);
break;
case '\\': { // Handle escape codes
- char Buffer[3];
- Buffer[0] = *FmtStr++;
- Buffer[1] = *FmtStr++;
- Buffer[2] = 0;
- cout << Buffer;
+ sprintf(OutputBuffer, "%c%c", *FmtStr, *(FmtStr+1));
+ FmtStr += 2; OutputBuffer += 2;
break;
}
case '%': { // Handle format specifiers
@@ -341,13 +340,27 @@ GenericValue lle_X_printf(MethodType *M, const vector<GenericValue> &Args) {
default: cout << "<unknown printf code '" << *FmtStr << "'!>";
ArgNo++; break;
}
- cout << Buffer;
+ strcpy(OutputBuffer, Buffer);
+ OutputBuffer += strlen(Buffer);
}
break;
}
}
}
+// int printf(sbyte *, ...) - a very rough implementation to make output useful.
+GenericValue lle_X_printf(MethodType *M, const vector<GenericValue> &Args) {
+ char Buffer[10000];
+ vector<GenericValue> NewArgs;
+ GenericValue GV; GV.PointerVal = (PointerTy)Buffer;
+ NewArgs.push_back(GV);
+ NewArgs.insert(NewArgs.end(), Args.begin(), Args.end());
+ GV = lle_X_sprintf(M, NewArgs);
+ cout << Buffer;
+ return GV;
+}
+
+
} // End extern "C"
@@ -384,4 +397,5 @@ void Interpreter::initializeExternalMethods() {
FuncNames["lle_X_lrand48"] = lle_X_lrand48;
FuncNames["lle_X_sqrt"] = lle_X_sqrt;
FuncNames["lle_X_printf"] = lle_X_printf;
+ FuncNames["lle_X_sprintf"] = lle_X_sprintf;
}
OpenPOWER on IntegriCloud