standardC.cpp

Go to the documentation of this file.
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       // Stop if we've used up either the available space or the format string.
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 /* #if HAVE_SNPRINTF */
00099   
00100   } // namespace portability
00101 
00102 } // namespace dlr

Generated on Mon Jul 9 20:34:03 2007 for dlrLibs Utility Libraries by  doxygen 1.5.2