*nix мышлениеОшибка локализации в 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?:)
  • +7
  • 4ybaka
  • 17 января 2010, 11:14

Комментарии (9)

Не совсем понимаю, почему ошибка «грубая»? Как образом она может негативно повлиять сейчас в 2010 (ну и в будущем). Объясните, если не сложно.
Если я захочу посмотреть любую дату между 1752 и 1918 годами (в связке с Российской историей), то получу некорректные данные.
А вообще не стоит относится к посту серьезно)
Как образом она может негативно повлиять сейчас в 2010
Ну представь, что у тебя пра-пра-прабабушка до революции заныкала пару миллионов (золотыми слитками) в швейцарском банке, там набежали проценты, а ты теперь наследник всего этого щастья. Приходишь, такой, в этот швейцарский банк, а тебе говорят: «Уважаемый господин, у нас с вами тут путаница в датах, поэтому мы вам ничего не отдадим :-p ».
я скажу, это ugly hack
А чем мой код отличается от их?)
if (y == 1752 && m == 8) {      /* special case Sep. 1752 */
        line[0][p + 8] = '1';
        line[0][p + 11] = '2';
        first = 14;
        last = 16;
        index = 12;
    }
что ты будешь делать, если человек захочет вывести календарь на английском языке, но с российской дато смены календаря? или на китайском языке — советский революционный календарь 1931-1940 годов?
А ты будешь использовать cal 3.5?)
Еще раз повторюсь — этот пост нельзя воспринимать серьезно. Я хотел просто указать на интересную особенность программы cal и ничего более.
этот пост нельзя воспринимать серьезно
Я не согласен. Этот вопрос, я считаю, достаточно серьезный.
То есть у них нету настраиваемых календарей или настраиваемых дат смен календарей?
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.