Пример #1
0
QString EQStr::formatMessage(uint32_t formatid, 
			     const char* arguments, size_t argsLen) const
{
  QString* formatStringRes = m_messageStrings.find(formatid);

  QString tempStr;

    if (formatStringRes == NULL)
    {
	uint32_t arg_len;
	unsigned char *cp;
	tempStr.sprintf( "Unknown: %04x:", formatid);
	cp = (unsigned char *) arguments;
	while (cp < ((unsigned char *) &arguments[argsLen])) {
	    arg_len = (cp[0] << 0) | (cp[1] << 8) | (cp[2] << 16) | (cp[3] << 24);
	    cp += 4;
	    if (arg_len == 0)
		break;
	    tempStr += " ";
	    tempStr += QString::fromUtf8((const char *) cp, arg_len);
	    cp += arg_len;
	}
	return tempStr;
    }
    else
    {
	QValueVector<QString> argList;
	argList.reserve(5); // reserve space for 5 elements to handle most common sizes

	// 
	size_t totalArgsLen = 0;
	const char* curArg;
	while (totalArgsLen < argsLen)
	{
	    curArg = arguments + totalArgsLen;
	    // insert argument into the argument list
	    argList.push_back(QString::fromUtf8(curArg));
	    totalArgsLen += strlen(curArg) + 1;
	}

	bool ok;
	int curPos;
	size_t substArg;
	int substArgValue;
	QString* substFormatStringRes;
	QString substFormatString;

	////////////////////////////
	// replace template (%T) arguments in formatted string
	QString formatString = *formatStringRes;
	QRegExp rxt("%T(\\d{1,3})", true, false);

	// find first template substitution
	curPos = rxt.search(formatString, 0);

	while (curPos != -1)
	{
	    substFormatStringRes = NULL;
	    substArg = rxt.cap(1).toInt(&ok);
	    if (ok && (substArg <= argList.size()))
	    {
		substArgValue = argList[substArg-1].toInt(&ok);

		if (ok)
		    substFormatStringRes = m_messageStrings.find(substArgValue);
	    }

	    // replace template argument with subst string
	    if (substFormatStringRes != NULL)
		formatString.replace(curPos, rxt.matchedLength(), *substFormatStringRes);
	    else
		curPos += rxt.matchedLength(); // if no replacement string, skip over

	    // find next substitution
	    curPos = rxt.search(formatString, curPos);
	}

	////////////////////////////
	// now replace substitution arguments in formatted string
	// NOTE: not using QString::arg() because not all arguments are always used
	//       and it will do screwy stuff in this situation
	QRegExp rx("%(\\d{1,3})", true, false);

	// find first template substitution
	curPos = rx.search(formatString, 0);

	while (curPos != -1)
	{
	    substArg = rx.cap(1).toInt(&ok);

	    // replace substitution argument with argument from list
	    if (ok && (substArg <= argList.size()))
		formatString.replace(curPos, rx.matchedLength(), argList[substArg-1]);
	    else
		curPos += rx.matchedLength(); // if no such argument, skip over

	    // find next substitution
	    curPos = rx.search(formatString, curPos);
	}

	return formatString;
    }

}
Пример #2
0
QString EQStr::formatMessage(uint32_t formatid, const char* arguments, size_t argsLen) const
{
	QString tempStr;

	if (!m_messageStrings.contains(formatid))
	{
		tempStr.sprintf("Unknown: %04x: ", formatid);
		tempStr += QString::fromUtf8(arguments);

		size_t totalArgsLen = strlen(arguments) + 1;

		const char* curMsg;
		while (totalArgsLen < argsLen)
		{
			curMsg = arguments + totalArgsLen;
			tempStr += QString(", ") + QString::fromUtf8(curMsg);
			totalArgsLen += strlen(curMsg) + 1;
		}
	}
	else
	{
		QVector<QString> argList;
		argList.reserve(5); // reserve space for 5 elements to handle most common sizes

		size_t totalArgsLen = 0;
		while (totalArgsLen < argsLen)
		{
			const char* curArg = arguments + totalArgsLen;
			
			// insert argument into the argument list
			argList.push_back(QString::fromUtf8(curArg));
			totalArgsLen += strlen(curArg) + 1;
		}

		bool ok, ok2;
		int curPos;
		size_t substArg;
		int substArgValue;
		QString substFormatString;

		////////////////////////////
		// replace template (%T) arguments in formatted string
		QString formatString = m_messageStrings[formatid];
		QRegExp rxt("%T(\\d{1,3})", true, false);

		// find first template substitution
		curPos = rxt.search(formatString, 0);

		while (curPos != -1)
		{
			ok2 = false;
			substArg = rxt.cap(1).toInt(&ok);
			if (ok && (substArg <= argList.size()))
			{
				substArgValue = argList[substArg-1].toInt(&ok2);
			}

			// Find the message and replace, or skip over if not found.
			if (ok2 && m_messageStrings.contains(substArgValue))
				formatString.replace(curPos, rxt.matchedLength(), m_messageStrings[substArgValue]);
			else
				curPos += rxt.matchedLength();

			// find next substitution
			curPos = rxt.search(formatString, curPos);
		}

		////////////////////////////
		// now replace substitution arguments in formatted string
		// NOTE: not using QString::arg() because not all arguments are always used
		//       and it will do screwy stuff in this situation
		QRegExp rx("%(\\d{1,3})", true, false);

		// find first template substitution
		curPos = rx.search(formatString, 0);

		while (curPos != -1)
		{
			substArg = rx.cap(1).toInt(&ok);

			// replace substitution argument with argument from list
			if (ok && (substArg <= argList.size()))
				formatString.replace(curPos, rx.matchedLength(), argList[substArg-1]);
			else
				curPos += rx.matchedLength(); // if no such argument, skip over

			// find next substitution
			curPos = rx.search(formatString, curPos);
		}

		return formatString;
	}

	return tempStr;
}