From e7c6f726c8d18ff8803d9b3dc3a8443496002044 Mon Sep 17 00:00:00 2001 From: Chris Lattner Date: Thu, 13 Dec 2001 00:43:47 +0000 Subject: [PATCH] Implement sprintf git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@1445 91177308-0d34-0410-b5e6-96231b3b80d8 --- .../Interpreter/ExternalFunctions.cpp | 36 +++++++++++++------ 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp index 4af07ad5f83..a54a6f1ced0 100644 --- a/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp +++ b/lib/ExecutionEngine/Interpreter/ExternalFunctions.cpp @@ -283,10 +283,12 @@ GenericValue lle_X_srand(MethodType *M, const vector &Args) { return GenericValue(); } -// int printf(sbyte *, ...) - a very rough implementation to make output useful. -GenericValue lle_X_printf(MethodType *M, const vector &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 &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 &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 &Args) { default: cout << ""; 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 &Args) { + char Buffer[10000]; + vector 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; }