=== О программе === Программа было создана под впечатлением одноимённой программы dates.exe, которую я и прилагаю в этом пакете. Может, что-то и осталось общего, но в большей степени пришлось всё переписать. Вряд ли выйдут другие версии этой программы, т.к. эту программу я пишу исключительно для себя. Спасибо всем, кто оценит программу и/или выразит свои пожелания. === Алгоритм работы === При старте программы без ключа -hash (обычный запуск программы), она считывает содержимое файла dates.dat, который является двоичным представлением файла конфигурации (см. т.ж. ниже). При этом определяются события, которые должны наступить сегодня (в этом случае они выводятся), а т.ж. те события, которые должны были наступить за период с последнего запуска программы, но не наступили (через них перескочили). В последнем случае, если DebugLevel=2, то будет выдано предупреждение. Кроме этого проверяется, не изменился ли файл конфигурации (размер и дата-время), и в положительном случае, если DebugLevel=2, то выдаётся предупреждение. Автоматическое обновление не происходит, если только программа не скомпилена с ключом AUTO_REHASH. При старте программы с ключом -hash, программа перечитывает файл конфигурации и сохраняет его в двоичной форме в файл dates.dat (во первых, для ускорения доступа, во-вторых, для выявления "просроченных" событий). Файл конфигурации (.cfg) состоит из секций-описаний стилей и секций-реализаций. # Если встречается символ ; или #, то всё до конца этой строки считается # комментарием и пропускается. # Если строка заканчивается на \, то следующая сичитаетя продолжением этой. # Повторяющиеся разделители (пробелы и символы табуляции) между лексеммами # сворачиваются в один. # === Глобальные опции === # Syslog - facility для syslogd # Формат: # Syslog = ; (см /usr/include/syslog.h) # По умолчанию: # Syslog = ; пусто - не вести лог через syslog # Пример: # Syslog = DAEMON # === Описание стилей (секций) === # Формат: # [Style style_name], где style_name - инентификатор, за которым закрепляются # параметры стиля, которые включают в себя: # DebugLevel - уровень отладки. Выводить дополнительную информацию и # предупреждения в случае вероятных ошибок. # Формат: # DebugLevel = 0|1|2 # По умолчанию: # DebugLevel = 1 ; рекомендую не менять # Пример: # DebugLevel = 0 ; "тихий" режим # Примечание: # 1) см. т.ж. ключи -v и -vv # 2) Сообщеня выводятся в формате: # [Lx]: текст сообщения # где x - уровень отладки. В Linux уровни 0 и 1 соответствуют DEBUG, а 2 - WARN # для facility, указанной в Syslog. Если уровнь = 0, то логи не ведутся, # если же уровнь > 0 то, если задан Syslog или LogFile (см. чуть ниже), # то логи ведуться в него (или в оба сразу), иначе - на экран. # LogFile - файл для лога # Формат: # По умолчанию: # LogFile = ; пусто - не вести лог в файл # Пример: # LogFile = dates.log # Примечание: # 1) см. т.ж. ключ -l # 2) Таким образом опции DebugLevel и LogFile являются атрибутами стиля. # Последнее означает, что одни стили могут иметь выходом файл(ы), другие - экран, # третьи - вообще никуда ничего не выводят - глупо, но вдруг надо, для отладки(?). # TimeSeperators - разделители в определениях времени # DateSeperators - разделители в датах # Формат: # TimeSeperators = любые символы # DateSeperators = любые символы # По умолчанию: # DateSeperators = . # TimeSeperators = : # Пример: # DateSeperators = .-/\|+ # TimeSeperators = :, # Примечание: далее в качестве разделителей будут использоваться разделители # по умолчанию, # Какие-то элементы можно опускать, но сепараторы оставлять обязательно. # Если вы задаёте одну цифру, то по умолчанию считается по 1-ому шаблону # WarnBefore - предупредить за ... # Формат: # WarnBefore = [years].[months].[days] # WarnBefore = [weeks].[days] # WarnBefore = [hours]:[mins] # По умолчанию: # WarnBefore = .1 # Пример: # WarnBefore = .1.3 ; предупредить за 1 месяц и 3 дня # WarnBefore = 1.2. ; предупредить за 1 год и 2 месяца # WarnBefore = 1 ; предупредить за 1 год (то же самое WarnBefore = 1.. или WarnBefore = .12.) # WarnBefore = 1. ; предупредить за 1 неделю # WarnBefore = .2 ; предупредить за 2 дня (то же самое WarnBefore = ..2) # WarnBefore = 1.4 ; предупредить за 1 неделю и 4 дня (т.е. 11 дней) # WarnBefore = 1.5. ; предупредить за 1 год и 5 месяцев # Period - периодичность повторения события # Формат: # Period = [years].[months].[days] # Period = [weeks].[days] # Period = [hours]:[mins] # По умолчанию: # Period = 1 # Пример: # Period = 1 ; периодичность 1 год # Period = 1: ; периодичность 1 час # Period = 2.1 ; периодичность 2 недели и 1 день (т.е. 15 дней) # StartAfter - активизировать событие после ... относительно # Формат: # StartAfter = [years].[months].[days] # StartAfter = [weeks].[days] # StartAfter = [hours]:[mins] # По умолчанию: # StartAfter = 0 ; начать сейчас # Пример: # StartAfter = .1 ; начать завтра # StopAfter - остановить (не выводить) событие после ... относительно # Формат: # StopAfter = [years].[months].[days] # StopAfter = [weeks].[days] # StopAfter = [hours]:[mins] # По умолчанию: # StopAfter = 9999999 ; работать "вечно" # Пример: # StopAfter = 1 ; остановить через год # Relativity - определяет момент, относительно которого задаются StartAfter и StopAfter. # Формат: # Relativity = definition|hash ; относительно определения события или относительно обновления конфигурации. # По умолчанию: # Relativity = definition # Color - цвет букв # Формат: # Color = Black|White|Blue|... (полный список см. в dates.h) # Color = #RRGGBB # По умолчанию: # Color = White # Пример: # Color = blue # Background - цвет фона # Формат: # Background = Black|White|Blue|... (полный список см. в dates.h) # Background = #RRGGBB # По умолчанию: # Background = Black # Пример: # Background = #FFc904 # === Реализация секций === # Формат: # [style_name], где style_name - уже заданный стиль # Остальные строки вплоть до следующей смены стиля или задания нового # описывают сами события и имеют следующий формат: # [year].[month].[day].[week_of_month].[day_of_week] любая строка, которая может содержать макроподстановки: # $Y,$M,$W,$D - прошло лет, месяцев, недель, дней соотв. с момента описания события (для $Y должен быть задан [year], иначе вернёт "") # $y,$m,$d,$w - прошло лет, месяцев, недель, дней соотв. с момента последней активизации события (рассчитывается из Period с учётом пропущенных событий) # $$ - символ $ # \n\r\t - перевод строки, возврат каретки и символ табуляции # или # [week_of_month].[day_of_week] любая строка, которая может содержать макроподстановки: # $Y,$M,$W,$D,$y,$m,$d,$w. Значения см. выше. # или # [hour]:[min] любая строка, которая может содержать макроподстановки: # $H,$M,$S,$h,$m,$s. Значения аналогичны. # Примечание: # Существует естественное ограничение: если вы при описании стиля задали # периодичность в часах:минутах, то и события должны быть описаны в часах:минутах. # Иначе как вы себе представляете 1994.07.04+12:50? # Пример: 1953.07.05 День Рождения моей мамы. Ей исполняется $Y лет! 17:30 Глянуть Вести 1.2 Каждый вторник - гулять в парке! .apr..1.6 Первая суббота апреля - День ПВО!\nНе забудь поздравить командира!\ Макрос $Y не работает. # Примечание: # Только не противоречьте сами себе, создавая события, которые никогда не наступят: # .сен.24.1 - 24 сентября никогда не выпадает на 1-ую неделю сентября # По возможности программа отслеживает такие события и выдаёт предупреждения. # Описания одного и того же стиля может повторяться, при этом будет создан # новый стиль без имени, в который скопируются заданные значения из # стиля-отца, и обращение к стилю по имени будет задавать уже новый стиль. [year]: любое положительное число, задавать нужно полностью, со столетием (вы же не хотите перепутать День Рождения Ньютона с Днём Рождения вашей девушки?) [month]: 1-12|jan|feb|mar|may|apr|jun|jul|aug|sep|oct|nov|dec|янв|фев|мар|апр|май|июн|июл|авг|сен|окт|ноя|дек [day]: 1-31 [week_of_month]:1-4 [day_of_week]: 1-7|sun|mon|tue|wed|thu|fri|sat|пн|вт|ср|чт|пт|сб|вс [years],[months],[days],[weeks] любые положительные числа (нет ограничений на диаппазон, не путать с предыдущими!) Ключи: dates -hash ; перечитать файл конфигурации dates -d ; стать демоном, а не выходить после выполнения. dates -v ; равносильно DebugLevel = 1 для всех стилей dates -vv ; равносильно DebugLevel = 2 для всех стилей dates -l ; равносильно LogFile = для всех стилей dates -c ; вывести ключи, с которыми скомпилена программа (см. dates.h).