воскресенье, 17 января 2010 г.

Linux : Ошибка локализации в cal

Да, cal с нами уже очень давно, однако я на днях нашел в нем достаточно грубую ошибку в локализации, которую и решил поправить.

Сразу оговорюсь, что программист на С из меня никакой, поэтому увидев исходники cal в util-linux-ng-2.16.2, я решил не мучить себя и потренироваться на кошках:) Нашел исходники cal 3.5, которые хоть в объеме больше в 2 с лишним раза, но мне показались куда проще.

И так, речь пойдет о давно минувших днях. А точнее о 18 веке. Именно тогда Великобритания перешла с юлианского календаря на григорианский. Поэтому если посмотреть (cal 9 1752) на сентябрь месяц 1752 года, то увидим:

Смутило меня здесь то, что Россия перешла на него совсем не тогда, а в феврале 1918 года (после 31 января следовало 14 февраля). Поэтому сразу стало интересно, что же выдаст cal на этот месяц. Как и ожидалось, ничего хорошего он не выдаст:

Поэтому решил исправить эту несправедливость. Получился такой вот патч:
686c686,694
< if (y == 1752 && m == 8) { /* special case Sep. 1752 */
---
> char* locale = getenv("LANG");
>
> if (strncmp(locale, "ru", 2) == 0 && y == 1918 && m == 1) { /* special case for Soviet Russia Feb. 1918 */
> first = 14;
> last = 16;
> index = 12;
> }
>
> else if (strncmp(locale, "en", 2) == 0 && y == 1752 && m == 8) { /* special case Sep. 1752 */
848a857,858
> char* locale = getenv("LANG");
>
850c860,862
< if (y > 1752-1 || (y == 1752-1 && m > 8))
---
> if (strncmp(locale, "en", 2) == 0 && (y > 1752-1 || (y == 1752-1 && m > 8))
> || strncmp(locale, "ru", 2) == 0 && (y > 1918-1 || (y == 1918-1 && m > 1))
> )
После приминения которого получаем то что хотели:

Может кто соберется таки исправить эту проблему в util-linux-ng?:)

Комментариев нет: