diff --git a/zlang.inc b/zlang.inc index 6e4e4df..c14d259 100644 --- a/zlang.inc +++ b/zlang.inc @@ -167,7 +167,6 @@ static gLangInfo[MAX_LANGS][e_ZLANG_INFO], gLangFiles[MAX_LANGS][MAX_LANG_FILES][MAX_LANG_FILENAME], gLangSlots[MAX_LANGS char], - gLangCount, Lang:gDefaultLang, Lang:gPlayerLang[MAX_PLAYERS]; @@ -278,8 +277,6 @@ static stock Lang_Load() if (_Lang_IsVarExists(LANG_SYSVAR_SLOT_STATUS, _:lang)) { status = _Lang_GetVarInt(LANG_SYSVAR_SLOT_STATUS, _:lang); _Lang_SetSlotStatus(lang, status); - - gLangCount += 1; } else { _Lang_SetSlotStatus(lang, LANG_SLOT_FREE); } @@ -324,7 +321,6 @@ stock Lang:Lang_Add(const code[], const name[]) Lang_SetName(lang, name); Lang_SetSlotStatus(lang, LANG_SLOT_BUSY); - gLangCount += 1; return lang; } @@ -342,7 +338,6 @@ stock Lang_Remove(Lang:lang) } Lang_SetSlotStatus(lang, LANG_SLOT_FREE); - gLangCount -= 1; return 1; } @@ -698,32 +693,33 @@ stock Lang_ReturnCode(Lang:lang) stock Lang_GetCodes(result[], const size = sizeof(result), const separator = '/', const bool:isuppercase = false) { - new - lang, - i, - length, - sep[2]; + static + Lang:lang, + pos; - result[0] = '\0'; - sep[0] = separator; + pos = 0; - for (lang = 0; lang < MAX_LANGS; lang += 1) { - strcat(result, gLangInfo[lang][e_zlCode], size); - strcat(result, sep, size); + for (lang = Lang:0; lang < Lang:MAX_LANGS; _:lang += 1) + { + if (!Lang_IsValid(Lang:lang)) { + continue; + } - for (i = (MAX_LANG_CODE + 1) * lang; i < (MAX_LANG_CODE + 1) * (lang + 1) - 1; i += 1) { - if (isuppercase) { - result[i] = toupper(result[i]); - } else { - result[i] = tolower(result[i]); - } - } - } + for (new i = 0; gLangInfo[lang][e_zlCode][i] != '\0' && pos < size - 1; i += 1) { + result[pos++] = isuppercase + ? toupper(gLangInfo[lang][e_zlCode][i]) + : tolower(gLangInfo[lang][e_zlCode][i]); + } - length = strlen(result); - if (length != 0) { - result[length - 1] = '\0'; - } + if (pos < size - 1) { + result[pos++] = separator; + } + } + + if (pos != 0) { + pos--; + } + result[pos] = '\0'; } stock Lang_ReturnCodes(const separator = '/', const bool:isuppercase = false) @@ -743,6 +739,14 @@ stock Lang_IsValid(Lang:lang) stock Lang_GetCount() { + new gLangCount; + + for (new Lang:lang; lang < Lang:MAX_LANGS; _:lang += 1) { + if (Lang_IsValid(lang)) { + gLangCount ++; + } + } + return gLangCount; } @@ -980,12 +984,9 @@ stock Lang_printf(const var[], lang_args<>) stock Lang_printfex(Lang:lang, const var[], lang_args<>) { static - Lang:lang, text[MAX_LANG_MFORMAT_STRING], success; - lang = Lang_GetDefaultLang(); - success = Lang_GetText(lang, var, text); if (numargs() > 2) { @@ -1417,12 +1418,6 @@ public zlang_SetCode(Lang:lang, const name[]) forward zlang_SetSlotStatus(Lang:lang, status); public zlang_SetSlotStatus(Lang:lang, status) { - if (_Lang_IsSlotHaveStatus(lang, LANG_SLOT_FREE) && (status & LANG_SLOT_BUSY)) { - gLangCount += 1; - } else if (_Lang_IsSlotHaveStatus(lang, LANG_SLOT_BUSY) && (status & LANG_SLOT_FREE)) { - gLangCount -= 1; - } - _Lang_SetSlotStatus(lang, status); } @@ -1646,7 +1641,7 @@ static stock _Lang_ProcessVars(Lang:lang, strings_with_vars) epos = strfind(varvalue, ")", true, spos); if (epos == -1) { next_iteration = false; - printf("Error: error with using language variables, example of usage: \\v(VARIABLE)"); + printf("Error: language variable (%s) is undefined", varname); break; } @@ -1683,7 +1678,8 @@ stock Lang_ProcessDynamicVars(Lang:lang, text[], const size = sizeof(text)) while ((spos = strfind(text, "\\v(", true)) != -1) { epos = strfind(text, ")", true, spos); if (epos == -1) { - printf("Error: error with using language variables, example of usage: \\v(VARIABLE)"); + strmid(vartmp, text, spos + 3, strlen(text)); + printf("Error: dynamic variable (%s) is undefined", vartmp); break; }