00001
00016 #include <cstdarg>
00017 #include <cstring>
00018 #include <stdexcept>
00019 #include <dlrPortability/standardC.h>
00020
00021 namespace dlr {
00022
00023 namespace portability {
00024
00025 #if HAVE_SNPRINTF
00026 #else
00027
00028 int snprintf(char* targetPtr, size_t targetSize, const char* formatPtr,
00029 ...) {
00030 char workingBuffer[1024];
00031 va_list varArgsList;
00032 va_start(varArgsList, formatPtr);
00033
00034 const char* workingFormatPtr = formatPtr;
00035 char* workingTargetPtr = targetPtr;
00036 size_t spaceLeft = targetSize - 1;
00037
00038
00039 while(spaceLeft && (*workingFormatPtr != '\0')) {
00040 int intValue;
00041 double doubleValue;
00042 char* charPtrValue;
00043 size_t stringSize;
00044 if(*workingFormatPtr == '%') {
00045 ++workingFormatPtr;
00046 switch(*workingFormatPtr) {
00047 case '\0':
00048 break;
00049 case 'd':
00050 intValue = va_arg(varArgsList, int);
00051 sprintf(workingBuffer, "%d", intValue);
00052 std::strncpy(workingTargetPtr, workingBuffer, spaceLeft);
00053 stringSize = strlen(workingBuffer);
00054 workingTargetPtr +=
00055 (stringSize > spaceLeft) ? spaceLeft : stringSize;
00056 spaceLeft -= (stringSize > spaceLeft) ? spaceLeft : stringSize;
00057 ++workingFormatPtr;
00058 break;
00059 case 'f':
00060 doubleValue = va_arg(varArgsList, double);
00061 sprintf(workingBuffer, "%f", doubleValue);
00062 std::strncpy(workingTargetPtr, workingBuffer, spaceLeft);
00063 stringSize = strlen(workingBuffer);
00064 workingTargetPtr +=
00065 (stringSize > spaceLeft) ? spaceLeft : stringSize;
00066 spaceLeft -= (stringSize > spaceLeft) ? spaceLeft : stringSize;
00067 ++workingFormatPtr;
00068 break;
00069 case 's':
00070 charPtrValue = va_arg(varArgsList, char*);
00071 std::strncpy(workingTargetPtr, charPtrValue, spaceLeft);
00072 stringSize = strlen(charPtrValue);
00073 workingTargetPtr +=
00074 (stringSize > spaceLeft) ? spaceLeft : stringSize;
00075 spaceLeft -= (stringSize > spaceLeft) ? spaceLeft : stringSize;
00076 ++workingFormatPtr;
00077 break;
00078 default:
00079 va_end(varArgsList);
00080 std::sprintf(
00081 workingBuffer,
00082 "Exception(dlr::snprintf()): Format string %%%c not recognized.",
00083 *workingFormatPtr);
00084 throw std::invalid_argument(workingBuffer);
00085 }
00086 } else {
00087 *workingTargetPtr++ = *workingFormatPtr++;
00088 --spaceLeft;
00089 }
00090 }
00091 if(targetSize > 0) {
00092 *workingTargetPtr = '\0';
00093 }
00094 va_end(varArgsList);
00095 return static_cast<int>(workingTargetPtr - targetPtr);
00096 }
00097
00098 #endif
00099
00100 }
00101
00102 }