void Array::Add(Object *pItem) { if (m_nCount == m_nItemSize) { if (m_nCount == 0) { m_nItemSize = 8; } else { m_nItemSize *= 2; } m_arrItems = (Object *)MemUtilsReallocArray(m_arrItems, m_nItemSize, sizeof(Object)); } m_arrItems[m_nCount] = *pItem; ++m_nCount; }
StringExt *StringExt::AppendFormatV(char *sFormat, va_list sArgList) { StringExtFormatArg uArg; int nIndex, nWidth, nPrecision; bool bReverseAlign, bZeroFill; StringExtFormatType eFormatType; char sBuffer[65]; int nLen; char *pCur, *pTemp, *sTemp; int nArgsLen = 0; int nArgsSize = 8; StringExtFormatArg *arrArgs = (StringExtFormatArg *)MemUtilsMallocArray( nArgsSize, sizeof(StringExtFormatArg)); pCur = sFormat; while ( *pCur ) { if ( *pCur == '{' ) { ++pCur; if ( *pCur == '{' ) { ++pCur; Append('{'); } else { // Разбираем форматированную строку if ( !(*pCur >= '0' && *pCur <= '9') ) break; nIndex = *pCur - '0'; for (++pCur; *pCur >= '0' && *pCur <= '9'; ++pCur ) nIndex = 10 * nIndex + (*pCur - '0'); if ( *pCur != ':' ) break; ++pCur; if ( *pCur == '-' ) { bReverseAlign = true; ++pCur; } else bReverseAlign = false; nWidth = 0; bZeroFill = *pCur == '0'; for (; *pCur >= '0' && *pCur <= '9'; ++pCur ) nWidth = 10 * nWidth + (*pCur - '0'); if ( *pCur == '.' ) { ++pCur; nPrecision = 0; for (; *pCur >= '0' && *pCur <= '9'; ++pCur ) { nPrecision = 10 * nPrecision + (*pCur - '0'); } } else { nPrecision = 0; } for ( eFormatType = (StringExtFormatType)0; c_arrsFormatStrings[ eFormatType ]; eFormatType = (StringExtFormatType)( eFormatType + 1 ) ) { if (!strncmp( pCur, c_arrsFormatStrings[ eFormatType ], strlen(c_arrsFormatStrings[ eFormatType ]))) { break; } } if ( !c_arrsFormatStrings[ eFormatType ] ) { break; } pCur += strlen( c_arrsFormatStrings[ eFormatType ] ); if (*pCur != '}') { break; } ++pCur; // fetch the argument if ( nIndex > nArgsLen ) { break; } if ( nIndex == nArgsLen ) { if ( nArgsLen == nArgsSize ) { nArgsSize *= 2; arrArgs = (StringExtFormatArg *)MemUtilsReallocArray( arrArgs, nArgsSize, sizeof(StringExtFormatArg)); } switch ( eFormatType ) { case fmtIntDecimal: case fmtIntHex: case fmtIntOctal: case fmtIntBinary: case fmtSpace: arrArgs[nArgsLen].iValue = va_arg( sArgList, int ); break; case fmtUIntDecimal: case fmtUIntHex: case fmtUIntOctal: case fmtUIntBinary: arrArgs[nArgsLen].uiValue = va_arg( sArgList, unsigned int ); break; case fmtLongDecimal: case fmtLongHex: case fmtLongOctal: case fmtLongBinary: arrArgs[nArgsLen].lValue = va_arg( sArgList, long ); break; case fmtULongDecimal: case fmtULongHex: case fmtULongOctal: case fmtULongBinary: arrArgs[nArgsLen].ulValue = va_arg( sArgList, unsigned long ); break; case fmtDouble: case fmtDoubleTrim: arrArgs[nArgsLen].fValue = va_arg( sArgList, double ); break; case fmtChar: arrArgs[nArgsLen].cValue = (char)va_arg( sArgList, int ); break; case fmtString: arrArgs[nArgsLen].sValue = va_arg( sArgList, char * ); break; case fmtStringExt: arrArgs[nArgsLen].seValue = va_arg(sArgList, StringExt *); break; } ++nArgsLen; } uArg = arrArgs[ nIndex ]; switch ( eFormatType ) { case fmtIntDecimal: FormatInt( uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen ); break; case fmtIntHex: FormatInt( uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen ); break; case fmtIntOctal: FormatInt( uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen ); break; case fmtIntBinary: FormatInt( uArg.iValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen ); break; case fmtUIntDecimal: FormatUInt( uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen ); break; case fmtUIntHex: FormatUInt( uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen ); break; case fmtUIntOctal: FormatUInt( uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen ); break; case fmtUIntBinary: FormatUInt( uArg.uiValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen ); break; case fmtLongDecimal: FormatInt( uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen ); break; case fmtLongHex: FormatInt( uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen ); break; case fmtLongOctal: FormatInt( uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen ); break; case fmtLongBinary: FormatInt( uArg.lValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen ); break; case fmtULongDecimal: FormatUInt( uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 10, &sTemp, &nLen ); break; case fmtULongHex: FormatUInt( uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 16, &sTemp, &nLen ); break; case fmtULongOctal: FormatUInt( uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 8, &sTemp, &nLen ); break; case fmtULongBinary: FormatUInt( uArg.ulValue, sBuffer, sizeof(sBuffer), bZeroFill, nWidth, 2, &sTemp, &nLen ); break; case fmtDouble: FormatDouble( uArg.fValue, sBuffer, sizeof(sBuffer), nPrecision, false, &sTemp, &nLen ); break; case fmtDoubleTrim: FormatDouble( uArg.fValue, sBuffer, sizeof(sBuffer), nPrecision, true, &sTemp, &nLen ); break; case fmtChar: sBuffer[0] = uArg.cValue; sTemp = sBuffer; nLen = 1; bReverseAlign = !bReverseAlign; break; case fmtString: sTemp = uArg.sValue; nLen = strlen( sTemp ); bReverseAlign = !bReverseAlign; break; case fmtStringExt: sTemp = uArg.seValue->GetBuffer(); nLen = uArg.seValue->GetLength(); bReverseAlign = !bReverseAlign; break; case fmtSpace: sTemp = sBuffer; nLen = 0; nWidth = uArg.iValue; break; } // Добавляем аргумент в нужном формате, с нужным прилеганием if ( !bReverseAlign && nLen < nWidth ) { for (int nCounter = nLen; nCounter < nWidth; ++nCounter ) Append(' '); } Append( sTemp, nLen); if ( bReverseAlign && nLen < nWidth ) { for (int nCounter = nLen; nCounter < nWidth; ++nCounter ) Append(' '); } } } else if ( *pCur == '}' )