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)