core/sm_stringutil.cpp
changeset 2042 4a2faafca477
parent 1965 63d5a5f6935f
child 2112 2a83a521287c
     1.1 --- a/core/sm_stringutil.cpp	Fri May 09 08:22:39 2008 +0000
     1.2 +++ b/core/sm_stringutil.cpp	Sat May 10 09:23:55 2008 +0000
     1.3 @@ -50,43 +50,6 @@
     1.4  		return 0; \
     1.5  	}
     1.6  
     1.7 -size_t CorePlayerTranslate(int client, char *buffer, size_t maxlength, const char *phrase, void **params)
     1.8 -{
     1.9 -	Translation pTrans;
    1.10 -	TransError err;
    1.11 -
    1.12 -	err = g_pCorePhrases->GetTranslation(phrase, g_Translator.GetClientLanguage(client), &pTrans);
    1.13 -	if (err != Trans_Okay)
    1.14 -	{
    1.15 -		err = g_pCorePhrases->GetTranslation(phrase, g_Translator.GetServerLanguage(), &pTrans);
    1.16 -		if (err != Trans_Okay && g_Translator.GetServerLanguage() != CORELANG_ENGLISH)
    1.17 -		{
    1.18 -			err = g_pCorePhrases->GetTranslation(phrase, CORELANG_ENGLISH, &pTrans);
    1.19 -		}
    1.20 -	}
    1.21 -
    1.22 -	if (err != Trans_Okay)
    1.23 -	{
    1.24 -		return UTIL_Format(buffer, maxlength, "%s", phrase);
    1.25 -	}
    1.26 -
    1.27 -	return g_Translator.Translate(buffer, maxlength, params, &pTrans);
    1.28 -}
    1.29 -
    1.30 -inline bool TryTranslation(CPlugin *pl, const char *key, unsigned int langid, unsigned int langcount, Translation *pTrans)
    1.31 -{
    1.32 -	TransError err = Trans_BadLanguage;
    1.33 -	CPhraseFile *phrfl;
    1.34 -
    1.35 -	for (size_t i=0; i<langcount && err!=Trans_Okay; i++)
    1.36 -	{
    1.37 -		phrfl = g_Translator.GetFileByIndex(pl->GetLangFileByIndex(i));
    1.38 -		err = phrfl->GetTranslation(key, langid, pTrans);
    1.39 -	}
    1.40 -
    1.41 -	return (err == Trans_Okay) ? true : false;
    1.42 -}
    1.43 -
    1.44  inline void ReorderTranslationParams(const Translation *pTrans, cell_t *params)
    1.45  {
    1.46  	cell_t new_params[MAX_TRANSLATE_PARAMS];
    1.47 @@ -110,11 +73,13 @@
    1.48  	*error = false;
    1.49  	Translation pTrans;
    1.50  	CPlugin *pl = (CPlugin *)g_PluginSys.FindPluginByContext(pCtx->GetContext());
    1.51 -	size_t langcount = pl->GetLangFileCount();
    1.52  	unsigned int max_params = 0;
    1.53 +	IPhraseCollection *pPhrases;
    1.54 +
    1.55 +	pPhrases = pl->GetPhrases();
    1.56  
    1.57  try_serverlang:
    1.58 -	if (target == LANG_SERVER)
    1.59 +	if (target == SOURCEMOD_SERVER_LANGUAGE)
    1.60  	{
    1.61  		langid = g_Translator.GetServerLanguage();
    1.62   	}
    1.63 @@ -128,16 +93,16 @@
    1.64  		goto error_out;
    1.65  	}
    1.66  
    1.67 -	if (!TryTranslation(pl, key, langid, langcount, &pTrans))
    1.68 +	if (pPhrases->FindTranslation(key, langid, &pTrans) != Trans_Okay)
    1.69  	{
    1.70 -		if (target != LANG_SERVER && langid != g_Translator.GetServerLanguage())
    1.71 +		if (target != SOURCEMOD_SERVER_LANGUAGE && langid != g_Translator.GetServerLanguage())
    1.72  		{
    1.73 -			target = LANG_SERVER;
    1.74 +			target = SOURCEMOD_SERVER_LANGUAGE;
    1.75  			goto try_serverlang;
    1.76  		}
    1.77 -		else if (langid != LANGUAGE_ENGLISH)
    1.78 +		else if (langid != SOURCEMOD_LANGUAGE_ENGLISH)
    1.79  		{
    1.80 -			if (!TryTranslation(pl, key, LANGUAGE_ENGLISH, langcount, &pTrans))
    1.81 +			if (!pPhrases->FindTranslation(key, SOURCEMOD_LANGUAGE_ENGLISH, &pTrans))
    1.82  			{
    1.83  				pCtx->ThrowNativeErrorEx(SP_ERROR_PARAM, "Language phrase \"%s\" not found", key);
    1.84  				goto error_out;
    1.85 @@ -575,11 +540,32 @@
    1.86  	*buf_p = buf;
    1.87  }
    1.88  
    1.89 -size_t gnprintf(char *buffer, size_t maxlen, const char *format, void **args)
    1.90 +bool gnprintf(char *buffer,
    1.91 +			  size_t maxlen,
    1.92 +			  const char *format,
    1.93 +			  IPhraseCollection *pPhrases,
    1.94 +			  void **params,
    1.95 +			  unsigned int numparams,
    1.96 +			  unsigned int &curparam,
    1.97 +			  size_t *pOutLength,
    1.98 +			  const char **pFailPhrase)
    1.99  {
   1.100  	if (!buffer || !maxlen)
   1.101  	{
   1.102 -		return 0;
   1.103 +		if (pOutLength != NULL)
   1.104 +		{
   1.105 +			*pOutLength = 0;
   1.106 +		}
   1.107 +		return true;
   1.108 +	}
   1.109 +
   1.110 +	if (numparams > MAX_TRANSLATE_PARAMS)
   1.111 +	{
   1.112 +		if (pFailPhrase != NULL)
   1.113 +		{
   1.114 +			*pFailPhrase = NULL;
   1.115 +		}
   1.116 +		return false;
   1.117  	}
   1.118  
   1.119  	int arg = 0;
   1.120 @@ -668,7 +654,16 @@
   1.121  				{
   1.122  					goto done;
   1.123  				}
   1.124 -				char *c = (char *)args[arg];
   1.125 +				if (curparam >= numparams)
   1.126 +				{
   1.127 +					if (pFailPhrase != NULL)
   1.128 +					{
   1.129 +						*pFailPhrase = NULL;
   1.130 +					}
   1.131 +					return false;
   1.132 +				}
   1.133 +				char *c = (char *)params[curparam];
   1.134 +				curparam++;
   1.135  				*buf_p++ = *c;
   1.136  				llen--;
   1.137  				arg++;
   1.138 @@ -676,7 +671,16 @@
   1.139  			}
   1.140  		case 'b':
   1.141  			{
   1.142 -				int *value = (int *)args[arg];
   1.143 +				if (curparam >= numparams)
   1.144 +				{
   1.145 +					if (pFailPhrase != NULL)
   1.146 +					{
   1.147 +						*pFailPhrase = NULL;
   1.148 +					}
   1.149 +					return false;
   1.150 +				}
   1.151 +				int *value = (int *)params[curparam];
   1.152 +				curparam++;
   1.153  				AddBinary(&buf_p, llen, *value, width, flags);
   1.154  				arg++;
   1.155  				break;
   1.156 @@ -684,35 +688,224 @@
   1.157  		case 'd':
   1.158  		case 'i':
   1.159  			{
   1.160 -				int *value = (int *)args[arg];
   1.161 +				if (curparam >= numparams)
   1.162 +				{
   1.163 +					if (pFailPhrase != NULL)
   1.164 +					{
   1.165 +						*pFailPhrase = NULL;
   1.166 +					}
   1.167 +					return false;
   1.168 +				}
   1.169 +				int *value = (int *)params[curparam];
   1.170 +				curparam++;
   1.171  				AddInt(&buf_p, llen, *value, width, flags);
   1.172  				arg++;
   1.173  				break;
   1.174  			}
   1.175  		case 'u':
   1.176  			{
   1.177 -				unsigned int *value = (unsigned int *)args[arg];
   1.178 +				if (curparam >= numparams)
   1.179 +				{
   1.180 +					if (pFailPhrase != NULL)
   1.181 +					{
   1.182 +						*pFailPhrase = NULL;
   1.183 +					}
   1.184 +					return false;
   1.185 +				}
   1.186 +				unsigned int *value = (unsigned int *)params[curparam];
   1.187 +				curparam++;
   1.188  				AddUInt(&buf_p, llen, *value, width, flags);
   1.189  				arg++;
   1.190  				break;
   1.191  			}
   1.192  		case 'f':
   1.193  			{
   1.194 -				float *value = (float *)args[arg];
   1.195 +				if (curparam >= numparams)
   1.196 +				{
   1.197 +					if (pFailPhrase != NULL)
   1.198 +					{
   1.199 +						*pFailPhrase = NULL;
   1.200 +					}
   1.201 +					return false;
   1.202 +				}
   1.203 +				float *value = (float *)params[curparam];
   1.204 +				curparam++;
   1.205  				AddFloat(&buf_p, llen, *value, width, prec, flags);
   1.206  				arg++;
   1.207  				break;
   1.208  			}
   1.209  		case 's':
   1.210  			{
   1.211 -				const char *str = (const char *)args[arg];
   1.212 +				if (curparam >= numparams)
   1.213 +				{
   1.214 +					if (pFailPhrase != NULL)
   1.215 +					{
   1.216 +						*pFailPhrase = NULL;
   1.217 +					}
   1.218 +					return false;
   1.219 +				}
   1.220 +				const char *str = (const char *)params[curparam];
   1.221 +				curparam++;
   1.222  				AddString(&buf_p, llen, str, width, prec);
   1.223  				arg++;
   1.224  				break;
   1.225  			}
   1.226 +		case 'T':
   1.227 +		case 't':
   1.228 +			{
   1.229 +				int target;
   1.230 +				const char *key;
   1.231 +				size_t out_length;
   1.232 +				Translation trans;
   1.233 +				unsigned int lang_id;
   1.234 +
   1.235 +				if (curparam >= numparams)
   1.236 +				{
   1.237 +					if (pFailPhrase != NULL)
   1.238 +					{
   1.239 +						*pFailPhrase = NULL;
   1.240 +					}
   1.241 +					return false;
   1.242 +				}
   1.243 +				key = (const char *)(params[curparam]);
   1.244 +				curparam++;
   1.245 +
   1.246 +				if (ch == 'T')
   1.247 +				{
   1.248 +					if (curparam >= numparams)
   1.249 +					{
   1.250 +						if (pFailPhrase != NULL)
   1.251 +						{
   1.252 +							*pFailPhrase = NULL;
   1.253 +						}
   1.254 +						return false;
   1.255 +					}
   1.256 +					target = *((int *)(params[curparam]));
   1.257 +					curparam++;
   1.258 +				}
   1.259 +				else
   1.260 +				{
   1.261 +					target = g_Translator.GetGlobalTarget();
   1.262 +				}
   1.263 +
   1.264 +try_again:
   1.265 +				if (target == SOURCEMOD_SERVER_LANGUAGE)
   1.266 +				{
   1.267 +					lang_id = g_Translator.GetServerLanguage();
   1.268 +				}
   1.269 +				else if (target >= 1 && target <= g_Players.GetMaxClients())
   1.270 +				{
   1.271 +					lang_id = g_Translator.GetClientLanguage(target);
   1.272 +				}
   1.273 +				else
   1.274 +				{
   1.275 +					lang_id = g_Translator.GetServerLanguage();
   1.276 +				}
   1.277 +
   1.278 +				if (pPhrases == NULL)
   1.279 +				{
   1.280 +					if (pFailPhrase != NULL)
   1.281 +					{
   1.282 +						*pFailPhrase = key;
   1.283 +					}
   1.284 +					return false;
   1.285 +				}
   1.286 +
   1.287 +				if (pPhrases->FindTranslation(key, lang_id, &trans) != Trans_Okay)
   1.288 +				{
   1.289 +					if (target != SOURCEMOD_SERVER_LANGUAGE && lang_id != g_Translator.GetServerLanguage())
   1.290 +					{
   1.291 +						target = SOURCEMOD_SERVER_LANGUAGE;
   1.292 +						goto try_again;
   1.293 +					}
   1.294 +					else if (lang_id != SOURCEMOD_LANGUAGE_ENGLISH)
   1.295 +					{
   1.296 +						if (pPhrases->FindTranslation(key, SOURCEMOD_LANGUAGE_ENGLISH, &trans) != Trans_Okay)
   1.297 +						{
   1.298 +							if (pFailPhrase != NULL)
   1.299 +							{
   1.300 +								*pFailPhrase = key;
   1.301 +							}
   1.302 +							return false;
   1.303 +						}
   1.304 +					}
   1.305 +					else
   1.306 +					{
   1.307 +						if (pFailPhrase != NULL)
   1.308 +						{
   1.309 +							*pFailPhrase = key;
   1.310 +						}
   1.311 +						return false;
   1.312 +					}
   1.313 +				}
   1.314 +
   1.315 +				if (trans.fmt_count)
   1.316 +				{
   1.317 +					unsigned int i;
   1.318 +					void *new_params[MAX_TRANSLATE_PARAMS];
   1.319 +
   1.320 +					if (curparam + trans.fmt_count > numparams)
   1.321 +					{
   1.322 +						if (pFailPhrase != NULL)
   1.323 +						{
   1.324 +							*pFailPhrase = NULL;
   1.325 +						}
   1.326 +						return false;
   1.327 +					}
   1.328 +
   1.329 +					/* Copy the array and re-order the stack */
   1.330 +					memcpy(new_params, params, sizeof(void *) * numparams);
   1.331 +					for (i = 0; i < trans.fmt_count; i++)
   1.332 +					{
   1.333 +						new_params[i] = const_cast<void *>(params[curparam + trans.fmt_order[i]]);
   1.334 +					}
   1.335 +
   1.336 +					if (!gnprintf(buf_p,
   1.337 +							llen,
   1.338 +							trans.szPhrase,
   1.339 +							pPhrases,
   1.340 +							new_params,
   1.341 +							numparams,
   1.342 +							curparam,
   1.343 +							&out_length,
   1.344 +							pFailPhrase))
   1.345 +					{
   1.346 +						return false;
   1.347 +					}
   1.348 +				}
   1.349 +				else
   1.350 +				{
   1.351 +					if (!gnprintf(buf_p,
   1.352 +						llen,
   1.353 +						trans.szPhrase,
   1.354 +						pPhrases,
   1.355 +						params,
   1.356 +						numparams,
   1.357 +						curparam,
   1.358 +						&out_length,
   1.359 +						pFailPhrase))
   1.360 +					{
   1.361 +						return false;
   1.362 +					}
   1.363 +				}
   1.364 +
   1.365 +				buf_p += out_length;
   1.366 +				llen -= out_length;
   1.367 +
   1.368 +				break;
   1.369 +			}
   1.370  		case 'X':
   1.371  			{
   1.372 -				unsigned int *value = (unsigned int *)args[arg];
   1.373 +				if (curparam >= numparams)
   1.374 +				{
   1.375 +					if (pFailPhrase != NULL)
   1.376 +					{
   1.377 +						*pFailPhrase = NULL;
   1.378 +					}
   1.379 +					return false;
   1.380 +				}
   1.381 +				unsigned int *value = (unsigned int *)params[curparam];
   1.382 +				curparam++;
   1.383  				flags |= UPPERDIGITS;
   1.384  				AddHex(&buf_p, llen, *value, width, flags);
   1.385  				arg++;
   1.386 @@ -720,7 +913,16 @@
   1.387  			}
   1.388  		case 'x':
   1.389  			{
   1.390 -				unsigned int *value = (unsigned int *)args[arg];
   1.391 +				if (curparam >= numparams)
   1.392 +				{
   1.393 +					if (pFailPhrase != NULL)
   1.394 +					{
   1.395 +						*pFailPhrase = NULL;
   1.396 +					}
   1.397 +					return false;
   1.398 +				}
   1.399 +				unsigned int *value = (unsigned int *)params[curparam];
   1.400 +				curparam++;
   1.401  				AddHex(&buf_p, llen, *value, width, flags);
   1.402  				arg++;
   1.403  				break;
   1.404 @@ -761,7 +963,12 @@
   1.405  done:
   1.406  	*buf_p = '\0';
   1.407  
   1.408 -	return (maxlen - llen - 1);
   1.409 +	if (pOutLength != NULL)
   1.410 +	{
   1.411 +		*pOutLength = (maxlen - llen - 1);
   1.412 +	}
   1.413 +
   1.414 +	return true;
   1.415  }
   1.416  
   1.417  size_t atcprintf(char *buffer, size_t maxlen, const char *format, IPluginContext *pCtx, const cell_t *params, int *param)