Да, 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?:)
Если я захочу посмотреть любую дату между 1752 и 1918 годами (в связке с Российской историей), то получу некорректные данные.
А вообще не стоит относится к посту серьезно)
Как образом она может негативно повлиять сейчас в 2010
Ну представь, что у тебя пра-пра-прабабушка до революции заныкала пару миллионов (золотыми слитками) в швейцарском банке, там набежали проценты, а ты теперь наследник всего этого щастья. Приходишь, такой, в этот швейцарский банк, а тебе говорят: «Уважаемый господин, у нас с вами тут путаница в датах, поэтому мы вам ничего не отдадим :-p ».
что ты будешь делать, если человек захочет вывести календарь на английском языке, но с российской дато смены календаря? или на китайском языке — советский революционный календарь 1931-1940 годов?
А ты будешь использовать cal 3.5?)
Еще раз повторюсь — этот пост нельзя воспринимать серьезно. Я хотел просто указать на интересную особенность программы cal и ничего более.
А вообще не стоит относится к посту серьезно)
Еще раз повторюсь — этот пост нельзя воспринимать серьезно. Я хотел просто указать на интересную особенность программы cal и ничего более.