All pastes #417868 Raw Edit

sprintf

public cpp v1 · immutable
#417868 ·published 2007-03-31 07:18 UTC
rendered paste body
#define Text_AddBin(%1,%2,%3,%4,%5) Text_AddNum(%1, %2, %3, %4, %5, 0b10)#define Text_AddInt(%1,%2,%3,%4,%5) Text_AddNum(%1, %2, %3, %4, %5,   10)#define Text_AddHex(%1,%2,%3,%4,%5) Text_AddNum(%1, %2, %3, %4, %5, 0x10)#define to_digit(%1)		((%1) - '0')//#define is_digit(%1)		(to_digit((%1)) <= 9 && to_digit((%1)) >= 0)is_digit(n) return ((n -= '0') <= 9 && n >= 0);#define LADJUST 1#define ZEROPAD 2Text_AddNum(output[], &maxlen, val, width, flags, base){	new		text[33],		digits,		signedVal = val,		pos;	switch (base)	{		case 0b10:		{			do			{				text[digits++] = '0' + (val % 0b10);				val >>>= 1;			}			while (val);		}		case   10:		{			if (val < 0) val = -val;			do			{				text[digits++] = '0' + (val %   10);				val /= 10;			}			while (val);			if (signedVal < 0)			{				if (flags & ZEROPAD) output[pos++] = '-';				else text[digits++] = '-';			}		}		case 0x10:		{			do			{				text[digits++] = '0' + (val % 0x10);				val >>>= 4;			}			while (val);		}	}	if(!(flags & LADJUST))	{		while (digits < width && maxlen)		{			output[pos++] = (flags & ZEROPAD) ? '0' : ' ';			width--;			maxlen--;		}	}	while (digits-- && maxlen)	{		output[pos++] = text[digits];		width--;		maxlen--;	}	if (flags & LADJUST)	{		while (width-- && maxlen)		{			output[pos++] = (flags & ZEROPAD) ? '0' : ' ';			maxlen--;		}	}	return pos;}Text_AddFloat(output[], &maxlen, Float:fval, width, prec){	new		text[32],		digits,		pos,		Float:signedVal = fval,		val;	if (fval < 0) fval = -fval;	digits = 0;	val = floatround(fval, floatround_floor);	do	{		text[digits++] = '0' + val % 10;		val /= 10;	}	while (val);	if (signedVal < 0.0) text[digits++] = '-';	while (digits < width && maxlen)	{		output[pos++] = ' ';		width--;		maxlen--;	}	while (digits-- && maxlen)	{		output[pos++] = text[digits];		maxlen--;	}	if (prec < 0) prec = 6;	digits = 0;	while (digits < prec)	{		fval -= val;		fval *= 10.0;		val = floatround(fval, floatround_floor);		text[digits++] = '0' + val % 10;	}	if (digits > 0 && maxlen)	{		output[pos++] = '.';		maxlen--;		for (prec = 0; maxlen && prec < digits; prec++)		{			output[pos++] = text[prec];			maxlen--;		}	}	return pos;}Text_AddString(output[], &maxlen, string[], width, prec){	new		size,		pos,		pos2;	if (!string[0])	{		prec = -1;	}	if (prec >= 0)	{		for (size = 0; size < prec; size++) 		{			if (string[size] == '\0') break;		}	}	else	{		while (string[size]) size++;	}	if (size > maxlen) size = maxlen;	maxlen -= size;	width -= size;	while (size--)	{		output[pos++] = string[pos2++];	}	while (width-- > 0 && maxlen)	{		output[pos++] = ' ';		maxlen--;	}	return pos;}/*Text_SendFormattedText(playerid, type, colorTime, identifier[], {Float,_}:...){	new		messageid;	if ((messageid = Text_FindTextPointers(identifier)) == TEXT_NO_POINTERS) return;	new		output[MAX_LANGUAGES][MAX_STRING]	for (new i = (playerid == INVALID_PLAYER_ID) ? (0) : (playerid); i < MAX_PLAYERS; i++)	{		if (IsPlayerConnected(i))		{			new				Language:playerLanguage = Text_GetPlayerLanguage(i);			if (output[playerLanguage][0]) goto display;			new				pos, // Input index				p, // Output index				arg = 4,				tempString[MAX_STRING],				ch,				llen = MAX_STRING;			tempString = Text_GetTextFromIndex(messageid, playerLanguage);			while (true)			{				while (llen-- && (ch = tempString[pos++]) != '\0' && ch != '%') output[playerLanguage][p++] = ch;				if (ch == '\0' || llen <= 0) goto done;				pos++;				new					argStrings[MAX_STRING],					flags,					width,					prec = -1,					sign = '\0',					n;				rflag:				ch = tempString[pos++];				reswitch:				switch (ch)				{					case '-':					{						flags |= LADJUST;						goto rflag;					}					case '.':					{						n = 0;						while (is_digit((ch = tempString[pos++]))) n = 10 * n + (ch - '0');						prec = n < 0 ? -1 : n;						goto reswitch;					}					case '0':					{						flags |= ZEROPAD;					}					case '1', '2', '3', '4', '5', '6', '7', '8', '9':					{						do						{							n = 10 * n + (ch - '0');						}						while (is_digit((ch = tempString[pos++])));						width = n;						goto reswitch;					}					case 'b':					{						p += Text_AddBin(output[playerLanguage][p], llen, getarg(arg++), width, flags);					}					case 'c':					{						output[playerLanguage][p++] = getarg(arg++);						if (!llen--) goto done; // Not in original code - possible overflow					}					case 'd', 'i':					{						p += Text_AddInt(output[playerLanguage][p], llen, getarg(arg++), width, flags);					}					case 'f':					{						p += Text_AddFloat(output[playerLanguage][p], llen, Float:getarg(arg++), width, prec);					}					case 's':					{						for (new i = 0; i < MAX_STRING; i++)						{							if (!(argStrings[i] = getarg(arg, i))) break;						}						p += Text_AddString(output[playerLanguage][p], llen, argStrings, width, prec);						arg++;					}					case 'h', 'x':					{						p += Text_AddHex(output[playerLanguage][p], llen, getarg(arg++), width, flags);					}					case '\0':					{						output[playerLanguage][p++] = '%';						if (!llen--) goto done;					}					default:					{						output[playerLanguage][p++] = ch;						if (!llen--) goto done;					}				}			}			done:			output[playerLanguage][p] = '\0';			display:			if (type & TEXT_TYPE_CLIENT)			{				SendClientMessage(i, colorTime, output[playerLanguage]);			}			else if (type & TEXT_TYPE_GAME)			{				GameTextForPlayer(i, output[playerLanguage], colorTime, type & ~(TEXT_TYPE_CLIENT | TEXT_TYPE_GAME));			}		}		if (playerid != INVALID_PLAYER_ID) break;	}}*/sprintf(tempString[], {Float,_}:...){	new		pos, // Input index		p, // Output index		arg = 1,		output[MAX_STRING],		ch,		llen = MAX_STRING,		bool:trueVar = true;	while (trueVar)	{		while (llen-- && (ch = tempString[pos++]) != '\0' && ch != '%') output[p++] = ch;		if (ch == '\0' || llen <= 0) goto done;		//pos++;		new			argStrings[MAX_STRING],			flags,			width,			prec = -1,			n;		rflag:		ch = tempString[pos++];		reswitch:		switch (ch)		{			case '-':			{				flags |= LADJUST;				goto rflag;			}			case '.':			{				n = 0;				while (is_digit((ch = tempString[pos++]))) n = 10 * n + (ch - '0');				prec = n < 0 ? -1 : n;				goto reswitch;			}			case '0':			{				flags |= ZEROPAD;			}			case '1', '2', '3', '4', '5', '6', '7', '8', '9':			{				do				{					n = 10 * n + (ch - '0');				}				while (is_digit((ch = tempString[pos++])));				width = n;				goto reswitch;			}			case 'b':			{				p += Text_AddBin(output[p], llen, getarg(arg++), width, flags);			}			case 'c':			{				output[p++] = getarg(arg++);				if (!llen--) goto done; // Not in original code - possible overflow			}			case 'd', 'i':			{				p += Text_AddInt(output[p], llen, getarg(arg++), width, flags);			}			case 'f':			{				p += Text_AddFloat(output[p], llen, Float:getarg(arg++), width, prec);			}			case 's':			{				for (new i = 0; i < MAX_STRING; i++)				{					if (!(argStrings[i] = getarg(arg, i))) break;				}				print(argStrings);				p += Text_AddString(output[p], llen, argStrings, width, prec);				arg++;			}			case 'h', 'x':			{				p += Text_AddHex(output[p], llen, getarg(arg++), width, flags);			}			case '\0':			{				output[p++] = '%';				if (!llen--) goto done;			}			default:			{				output[p++] = ch;				if (!llen--) goto done;			}		}	}	done:	output[p] = '\0';	return output;}