Lang_GetCodes, Lang_GetCount, Lang_printfex and variable name#27
Lang_GetCodes, Lang_GetCount, Lang_printfex and variable name#27rismailov wants to merge 6 commits into
Conversation
ziggi
left a comment
There was a problem hiding this comment.
В функции Lang_GetCodes исправлена логика обработки регистра символов, добавлена валидация и оптимизировано использование памяти.
По изменениям в Lang_GetCodes ничего не понял. Что со старой логикой не так?
Из важного вижу только проверку на Lang_IsValid, а остальное стало хуже:
- Используется больше памяти.
- Добавился лишний вызов
_Lang_strcpy.
|
А, понял почему ты сделал через |
|
Мы можем избавиться от strlen, strcat, хранить актуальный индекс для result |
|
Ну да, strcat тут тоже не нужен |
|
ziggi
left a comment
There was a problem hiding this comment.
4. Lang_GetCount теперь вычисляет количество активных языков на лету - проходом по MAX_LANGS и проверкой Lang_IsValid
А зачем? Текущая реализация же оптимальнее.
| 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'; | ||
| } |
There was a problem hiding this comment.
- Операторы инкремента/декремента в этой библиотеке не используются.
- Не правильное расположение
{послеfor. - Нет смысла убирать инициализацию
iвовнутрь цикла. - Вместо
gLangInfo[lang][e_zlCode][i] != '\0'я бы предпочёл проверкуi < MAX_LANG_CODE. - Предупреждения из-за неправильно использованных тегов:
warning 213: tag mismatch: expected tag none ("_"), but found "Lang"
Параметр функции называется lang, и тут же объявляется статическая переменная с тем же именем lang. В Pawn это должно давать ошибку компиляции («symbol already defined»).
Сообщение об ошибке, выводимое при некорректном формате ссылки \v(VARIABLE), при этом не содержало имени переменной, из-за чего было трудно найти проблемную строку в больших языковых файлах.
В функции Lang_GetCodes исправлена логика обработки регистра символов, добавлена валидация и оптимизировано использование памяти.