Compare commits

...

25 Commits

Author SHA1 Message Date
Dianne Skoll
a69a96529b Update WHATSNEW. 2025-05-26 10:49:41 -04:00
Dianne Skoll
f4e5cc63a6 Dedup 2025-05-25 14:56:37 -04:00
Dianne Skoll
136122b1db Fix a couple of minor problems found by "remind -du" 2025-05-25 14:54:49 -04:00
Dianne Skoll
4cc63b1548 Add some details about nuances of "u" debugging flag. 2025-05-25 13:38:21 -04:00
Dianne Skoll
9390b4335b Make another string translatable. 2025-05-24 23:35:16 -04:00
Dianne Skoll
1fcf11a816 Change the help text for the -d flag. 2025-05-24 23:20:45 -04:00
Dianne Skoll
c4107e6a6f Fix up Bevrijdingsdag 2025-05-24 23:19:13 -04:00
Dianne Skoll
ab03232341 Minor tweak 2025-05-24 23:15:51 -04:00
Dianne Skoll
51a65841cd Warn if a variable is UNSET without having been used (if -du is in effect) 2025-05-24 23:13:39 -04:00
Dianne Skoll
5035deaff1 Tweak warning wording; add tests. 2025-05-24 23:09:57 -04:00
Dianne Skoll
09caa8988a Add warning if we SET a variable that has already been set, but not used (if -du debug flag is set) 2025-05-24 23:06:50 -04:00
Dianne Skoll
9624b1045c Track filename and line number where variables are defined. 2025-05-24 22:58:28 -04:00
Dianne Skoll
102748397f Remove a couple of inappropriate "free" calls. 2025-05-24 22:58:16 -04:00
Dianne Skoll
f852f7e7e5 Refactor conversion of "-" to "-stdin-" 2025-05-24 22:55:02 -04:00
Dianne Skoll
8d88192483 Keep a hash table of filenames we've seen so we don't need to strdup the current filename all over the place. 2025-05-24 22:51:16 -04:00
Dianne Skoll
a6ca571fe5 Fix indentation. 2025-05-24 22:13:47 -04:00
Dianne Skoll
2af783a58d Use isany() in preference to || operator. 2025-05-24 10:36:03 -04:00
Dianne Skoll
af2daa7a87 Use "is_constant" attribute for Var to be consistent with UserFunc. 2025-05-24 10:10:44 -04:00
Dianne Skoll
c5bc459dd9 Add "-du" debugging flag to print a list of variables that were set but never used. 2025-05-23 16:55:10 -04:00
Dianne Skoll
edf26eaa14 Add more "const" debugging messages. 2025-05-23 13:38:38 -04:00
Dianne Skoll
7e5dc26ee5 *PROPERLY* disable RUN in eval. :) 2025-05-23 12:03:09 -04:00
Dianne Skoll
4c2b6031cd Disable shell() inside an eval("...") for safety.
Based on email from Tim Chase.
2025-05-23 11:48:06 -04:00
Dianne Skoll
af8c1630c3 Add more clarification. 2025-05-23 08:56:01 -04:00
Dianne Skoll
0ec43d570c Add "const" function, which is the inverse of "nonconst" 2025-05-23 08:47:12 -04:00
Dianne Skoll
1df8b12e71 Clarification. 2025-05-23 08:42:00 -04:00
55 changed files with 568 additions and 416 deletions

View File

@@ -164,7 +164,7 @@
(defconst remind-builtin-functions
(sort
(list "_" "abs" "access" "adawn" "adusk" "ampm" "ansicolor" "args" "asc"
"baseyr" "catch" "catcherr" "char" "choose" "coerce" "columns" "current" "date"
"baseyr" "catch" "catcherr" "char" "choose" "coerce" "columns" "const" "current" "date"
"datepart" "datetime" "dawn" "day" "daysinmon" "defined" "dosubst"
"dusk" "easterdate" "escape" "eval" "evaltrig" "filedate" "filedatetime"
"filedir" "filename" "getenv" "hebdate" "hebday" "hebmon" "hebyear"

View File

@@ -11,16 +11,24 @@ CHANGES TO REMIND
See the new remind(1) man page section "NON-CONSTANT EXPRESSIONS"
- MINOR NEW FEATURE: remind: add the "nonconst" built-in function (to
force an expression to be interpreted as non-constant) and the
"isconst" function to test if an expression is constant.
force an expression to be interpreted as non-constant), the "const"
function to force an expression to be interpreted as constant, and
the "isconst" function to test if an expression is constant.
- MINOR NEW FEATURE: remind: Add eval() built-in function that takes a
string argument and evaluates it as an expression.
string argument and evaluates it as an expression. For safety, the
"shell" function is disabled inside an eval().
- MINOR NEW FEATURE: remind: add the "u" debugging flag to warn you if
you set a variable that is not subsequently used.
- MINOR NEW FEATURE: remind: Add the trigbase() function and
corresponding $Tb system variable. See the remind(1) man page for
details.
- MINOR IMPROVEMENT: include/holidays: Update a bunch of files to use
isany(n, a, b, c) rather than (n == a || n == b || n == c)
- MINOR IMPROVEMENT: remind: Make $Tu a synonym for triguntil().
- MINOR IMPROVEMENT: remind: If coerce() fails, issue a more detailed
@@ -50,7 +58,7 @@ CHANGES TO REMIND
corresponding weekday number returned.
- MINOR IMPROVEMENT: remind: Make the expression parser optimize away
"- INT_CONSTANT" and "! INT_CONSTANT".
the unary "-" and "!" operators when followed by an integer constant.
- BUG FIX: tests: Don't use the obsolete "tail +2" syntax in test-rem.
Fix courtesy of Dick Marinus.

View File

@@ -28,7 +28,7 @@ if !defined("ansi_bold")
set ansi_underline2 char(27) + "[21m"
set ansi_overline char(27) + "[53m"
endif
preserve ansi_normal ansi_bold ansi_faint ansi_italic ansi_underline2 ansi_reverse ansi_strikeout ansi_underline2 ansi_overline
preserve ansi_normal ansi_bold ansi_faint ansi_italic ansi_underline ansi_reverse ansi_strikeout ansi_underline2 ansi_overline
endif
# Example: REM MSG I must [ansi_bold]emphasize[ansi_normal] \

View File

@@ -6,28 +6,28 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG Festat e Vitit të Ri
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Festat e Vitit të Ri (ditë pushimi e shtyrë)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Festat e Vitit të Ri (ditë pushimi e shtyrë)
OMIT 2 January MSG Festat e Vitit të Ri
REM 2 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 2))==0 || wkdaynum(date($Ty, 1, 2))==6] MSG Festat e Vitit të Ri (ditë pushimi e shtyrë)
REM 2 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 2)), 0, 6)] MSG Festat e Vitit të Ri (ditë pushimi e shtyrë)
OMIT 14 March MSG Dita e Verës
REM 14 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 14))==0 || wkdaynum(date($Ty, 3, 14))==6] MSG Dita e Verës (ditë pushimi e shtyrë)
REM 14 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 14)), 0, 6)] MSG Dita e Verës (ditë pushimi e shtyrë)
OMIT 22 March MSG Dita e Nevruzit
REM 22 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 22))==0 || wkdaynum(date($Ty, 3, 22))==6] MSG Dita e Nevruzit (ditë pushimi e shtyrë)
REM 31 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 31))==0 || wkdaynum(date($Ty, 3, 31))==6] MSG E diela e Pashkëve Katolike (ditë pushimi e shtyrë)
REM 22 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 22)), 0, 6)] MSG Dita e Nevruzit (ditë pushimi e shtyrë)
REM 31 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 31)), 0, 6)] MSG E diela e Pashkëve Katolike (ditë pushimi e shtyrë)
OMIT [easterdate($Uy)] MSG E diela e Pashkëve Katolike
OMIT [easterdate($Uy)] MSG E diela e Pashkëve Ortodokse
OMIT 1 May MSG Dita Ndërkombëtare e Punëtorëve
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Dita Ndërkombëtare e Punëtorëve (ditë pushimi e shtyrë)
REM 5 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 5))==0 || wkdaynum(date($Ty, 5, 5))==6] MSG E diela e Pashkëve Ortodokse (ditë pushimi e shtyrë)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Dita Ndërkombëtare e Punëtorëve (ditë pushimi e shtyrë)
REM 5 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 5)), 0, 6)] MSG E diela e Pashkëve Ortodokse (ditë pushimi e shtyrë)
OMIT 5 September MSG Dita e Shenjtërimit të Shenjt Terezës
REM 5 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 9, 5))==0 || wkdaynum(date($Ty, 9, 5))==6] MSG Dita e Shenjtërimit të Shenjt Terezës (ditë pushimi e shtyrë)
REM 5 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 9, 5)), 0, 6)] MSG Dita e Shenjtërimit të Shenjt Terezës (ditë pushimi e shtyrë)
OMIT 22 November MSG Dita e Alfabetit
REM 22 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 22))==0 || wkdaynum(date($Ty, 11, 22))==6] MSG Dita e Alfabetit (ditë pushimi e shtyrë)
REM 22 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 11, 22)), 0, 6)] MSG Dita e Alfabetit (ditë pushimi e shtyrë)
OMIT 28 November MSG Dita Flamurit dhe e Pavarësisë
REM 28 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 28))==0 || wkdaynum(date($Ty, 11, 28))==6] MSG Dita Flamurit dhe e Pavarësisë (ditë pushimi e shtyrë)
REM 28 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 11, 28)), 0, 6)] MSG Dita Flamurit dhe e Pavarësisë (ditë pushimi e shtyrë)
OMIT 29 November MSG Dita e Çlirimit
REM 29 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 29))==0 || wkdaynum(date($Ty, 11, 29))==6] MSG Dita e Çlirimit (ditë pushimi e shtyrë)
REM 29 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 11, 29)), 0, 6)] MSG Dita e Çlirimit (ditë pushimi e shtyrë)
OMIT 8 December MSG Dita Kombëtare e Rinisë
REM 8 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 8))==0 || wkdaynum(date($Ty, 12, 8))==6] MSG Dita Kombëtare e Rinisë (ditë pushimi e shtyrë)
REM 8 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 8)), 0, 6)] MSG Dita Kombëtare e Rinisë (ditë pushimi e shtyrë)
OMIT 25 December MSG Krishtlindjet
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Krishtlindjet (ditë pushimi e shtyrë)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Krishtlindjet (ditë pushimi e shtyrë)

View File

@@ -6,36 +6,36 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG Yeni il bayramı
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Yeni il bayramı (müşahidə olunur)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Yeni il bayramı (müşahidə olunur)
OMIT 2 January MSG Yeni il bayramı
REM 2 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 2))==0 || wkdaynum(date($Ty, 1, 2))==6] MSG Yeni il bayramı (müşahidə olunur)
REM 2 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 2)), 0, 6)] MSG Yeni il bayramı (müşahidə olunur)
OMIT 20 January MSG Ümumxalq hüzn günü
OMIT 8 March MSG Qadınlar günü
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 8))==0 || wkdaynum(date($Ty, 3, 8))==6] MSG Qadınlar günü (müşahidə olunur)
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 8)), 0, 6)] MSG Qadınlar günü (müşahidə olunur)
OMIT 20 March MSG Novruz bayramı
REM 20 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 20))==0 || wkdaynum(date($Ty, 3, 20))==6] MSG Novruz bayramı (müşahidə olunur)
REM 20 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 20)), 0, 6)] MSG Novruz bayramı (müşahidə olunur)
OMIT 21 March MSG Novruz bayramı
REM 21 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 21))==0 || wkdaynum(date($Ty, 3, 21))==6] MSG Novruz bayramı (müşahidə olunur)
REM 21 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 21)), 0, 6)] MSG Novruz bayramı (müşahidə olunur)
OMIT 22 March MSG Novruz bayramı
REM 22 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 22))==0 || wkdaynum(date($Ty, 3, 22))==6] MSG Novruz bayramı (müşahidə olunur)
REM 22 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 22)), 0, 6)] MSG Novruz bayramı (müşahidə olunur)
OMIT 23 March MSG Novruz bayramı
REM 23 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 23))==0 || wkdaynum(date($Ty, 3, 23))==6] MSG Novruz bayramı (müşahidə olunur)
REM 23 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 23)), 0, 6)] MSG Novruz bayramı (müşahidə olunur)
OMIT 24 March MSG Novruz bayramı
REM 24 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 24))==0 || wkdaynum(date($Ty, 3, 24))==6] MSG Novruz bayramı (müşahidə olunur)
REM 24 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 24)), 0, 6)] MSG Novruz bayramı (müşahidə olunur)
OMIT 9 May MSG Faşizm üzərində qələbə günü
REM 9 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 9))==0 || wkdaynum(date($Ty, 5, 9))==6] MSG Faşizm üzərində qələbə günü (müşahidə olunur)
REM 9 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 9)), 0, 6)] MSG Faşizm üzərində qələbə günü (müşahidə olunur)
OMIT 28 May MSG Müstəqillik Günü
REM 28 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 28))==0 || wkdaynum(date($Ty, 5, 28))==6] MSG Müstəqillik Günü (müşahidə olunur)
REM 28 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 28)), 0, 6)] MSG Müstəqillik Günü (müşahidə olunur)
OMIT 15 June MSG Azərbaycan xalqının milli qurtuluş günü
REM 15 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 15))==0 || wkdaynum(date($Ty, 6, 15))==6] MSG Azərbaycan xalqının milli qurtuluş günü (müşahidə olunur)
REM 15 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 6, 15)), 0, 6)] MSG Azərbaycan xalqının milli qurtuluş günü (müşahidə olunur)
OMIT 26 June MSG Azərbaycan Respublikasının Silahlı Qüvvələri günü
REM 26 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 26))==0 || wkdaynum(date($Ty, 6, 26))==6] MSG Azərbaycan Respublikasının Silahlı Qüvvələri günü (müşahidə olunur)
REM 26 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 6, 26)), 0, 6)] MSG Azərbaycan Respublikasının Silahlı Qüvvələri günü (müşahidə olunur)
OMIT 8 November MSG Zəfər Günü
REM 8 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 8))==0 || wkdaynum(date($Ty, 11, 8))==6] MSG Zəfər Günü (müşahidə olunur)
REM 8 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 11, 8)), 0, 6)] MSG Zəfər Günü (müşahidə olunur)
OMIT 9 November MSG Azərbaycan Respublikasının Dövlət bayrağı günü
REM 9 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 11, 9))==0 || wkdaynum(date($Ty, 11, 9))==6] MSG Azərbaycan Respublikasının Dövlət bayrağı günü (müşahidə olunur)
REM 9 November OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 11, 9)), 0, 6)] MSG Azərbaycan Respublikasının Dövlət bayrağı günü (müşahidə olunur)
OMIT 31 December MSG Dünya azərbaycanlılarının həmrəyliyi günü
REM 31 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 31))==0 || wkdaynum(date($Ty, 12, 31))==6] MSG Dünya azərbaycanlılarının həmrəyliyi günü (müşahidə olunur)
REM 31 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 31)), 0, 6)] MSG Dünya azərbaycanlılarının həmrəyliyi günü (müşahidə olunur)
# Optional holidays
REM 27 September MSG Anım Günü

View File

@@ -6,29 +6,29 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG Нова година
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Нова година (почивен ден)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Нова година (почивен ден)
OMIT 3 March MSG Ден на Освобождението на България от османско иго
REM 3 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 3))==0 || wkdaynum(date($Ty, 3, 3))==6] MSG Ден на Освобождението на България от османско иго (почивен ден)
REM 3 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 3)), 0, 6)] MSG Ден на Освобождението на България от османско иго (почивен ден)
OMIT [orthodoxeaster($Uy)-2] MSG Велики петък
OMIT [orthodoxeaster($Uy)-1] MSG Велика събота
OMIT [orthodoxeaster($Uy)] MSG Великден
OMIT [orthodoxeaster($Uy)+1] MSG Великден
OMIT 1 May MSG Ден на труда и на международната работническа солидарност
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Ден на труда и на международната работническа солидарност (почивен ден)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Ден на труда и на международната работническа солидарност (почивен ден)
OMIT 6 May MSG Гергьовден, Ден на храбростта и Българската армия
REM 6 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 6))==0 || wkdaynum(date($Ty, 5, 6))==6] MSG Гергьовден, Ден на храбростта и Българската армия (почивен ден)
REM 6 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 6)), 0, 6)] MSG Гергьовден, Ден на храбростта и Българската армия (почивен ден)
OMIT 24 May MSG Ден на светите братя Кирил и Методий, на българската азбука, просвета и култура и на славянската книжовност
REM 24 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 24))==0 || wkdaynum(date($Ty, 5, 24))==6] MSG Ден на светите братя Кирил и Методий, на българската азбука, просвета и култура и на славянската книжовност (почивен ден)
REM 24 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 24)), 0, 6)] MSG Ден на светите братя Кирил и Методий, на българската азбука, просвета и култура и на славянската книжовност (почивен ден)
OMIT 6 September MSG Ден на Съединението
REM 6 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 9, 6))==0 || wkdaynum(date($Ty, 9, 6))==6] MSG Ден на Съединението (почивен ден)
REM 6 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 9, 6)), 0, 6)] MSG Ден на Съединението (почивен ден)
OMIT 22 September MSG Ден на Независимостта на България
REM 22 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 9, 22))==0 || wkdaynum(date($Ty, 9, 22))==6] MSG Ден на Независимостта на България (почивен ден)
REM 22 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 9, 22)), 0, 6)] MSG Ден на Независимостта на България (почивен ден)
OMIT 24 December MSG Бъдни вечер
REM 24 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 24))==0 || wkdaynum(date($Ty, 12, 24))==6] MSG Бъдни вечер (почивен ден)
REM 24 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 24)), 0, 6)] MSG Бъдни вечер (почивен ден)
OMIT 25 December MSG Рождество Христово
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Рождество Христово (почивен ден)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Рождество Христово (почивен ден)
OMIT 26 December MSG Рождество Христово
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 26))==0 || wkdaynum(date($Ty, 12, 26))==6] MSG Рождество Христово (почивен ден)
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 26)), 0, 6)] MSG Рождество Христово (почивен ден)
# Optional holidays
REM 1 November MSG Ден на народните будители

View File

@@ -26,7 +26,7 @@ REM 29 June ADDOMIT SCANFROM -28 SATISFY [$Tw != 2 && $Tw != 3 && $Tw != 4 && $T
REM 2 July ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 29)) == 5] MSG San Pedro y San Pablo
OMIT 16 July MSG Virgen del Carmen
OMIT 15 August MSG Asunción de la Virgen
REM 17 September ADDOMIT SCANFROM -28 SATISFY [$Tw == 1 || $Tw == 5] MSG Fiestas Patrias
REM 17 September ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 1, 5)] MSG Fiestas Patrias
OMIT 18 September MSG Día de la Independencia
OMIT 19 September MSG Día de las Glorias del Ejército
REM 20 September ADDOMIT SCANFROM -28 SATISFY [$Tw == 5] MSG Fiestas Patrias

View File

@@ -6,16 +6,16 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG New Year's Day
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG New Year's Day (observed)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG New Year's Day (observed)
OMIT 11 February MSG Youth Day
REM 11 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 11))==0 || wkdaynum(date($Ty, 2, 11))==6] MSG Youth Day (observed)
REM 11 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 11)), 0, 6)] MSG Youth Day (observed)
OMIT [easterdate($Uy)-2] MSG Good Friday
OMIT 1 May MSG Labour Day
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Labour Day (observed)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Labour Day (observed)
OMIT 20 May MSG National Day
REM 20 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 20))==0 || wkdaynum(date($Ty, 5, 20))==6] MSG National Day (observed)
REM 20 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 20)), 0, 6)] MSG National Day (observed)
OMIT [easterdate($Uy)+39] MSG Ascension Day
OMIT 15 August MSG Assumption Day
REM 15 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 8, 15))==0 || wkdaynum(date($Ty, 8, 15))==6] MSG Assumption Day (observed)
REM 15 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 8, 15)), 0, 6)] MSG Assumption Day (observed)
OMIT 25 December MSG Christmas Day
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Christmas Day (observed)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Christmas Day (observed)

View File

@@ -17,7 +17,7 @@ REM [orthodoxeaster($Uy)+1] MSG ΔΕΥΤΕΡΑ ΤΟΥ ΠΑΣΧΑ
# minister decides moving that holiday. Here is a likely assumption of how this day might be moved.
# Uncomment following lines to enable.
set PM date($Uy,5,1)
# set PM date($Uy,5,1)
# IF PM>=orthodoxeaster($Uy)-7 && PM<=orthodoxeaster($Uy)+1
# IF PM<orthodoxeaster($Uy)-3
# REM orthodoxeaster($Uy) -8 MSG πιθανόν ΕΡΓΑΤΙΚΗ Πρωτομαγιά

View File

@@ -6,18 +6,18 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG The first day of January
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG The first day of January (observed)
REM 4 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4))==0 || wkdaynum(date($Ty, 4, 4))==6] MSG Ching Ming Festival (observed)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG The first day of January (observed)
REM 4 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 4)), 0, 6)] MSG Ching Ming Festival (observed)
OMIT 1 May MSG Labour Day
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Labour Day (observed)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Labour Day (observed)
OMIT 1 July MSG Hong Kong Special Administrative Region Establishment Day
REM 1 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 1))==0 || wkdaynum(date($Ty, 7, 1))==6] MSG Hong Kong Special Administrative Region Establishment Day (observed)
REM 1 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 7, 1)), 0, 6)] MSG Hong Kong Special Administrative Region Establishment Day (observed)
OMIT 1 October MSG National Day
REM 1 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 1))==0 || wkdaynum(date($Ty, 10, 1))==6] MSG National Day (observed)
REM 1 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 1)), 0, 6)] MSG National Day (observed)
OMIT 25 December MSG Christmas Day
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Christmas Day (observed)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Christmas Day (observed)
OMIT 26 December MSG The first weekday after Christmas Day
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 26))==0 || wkdaynum(date($Ty, 12, 26))==6] MSG The first weekday after Christmas Day (observed)
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 26)), 0, 6)] MSG The first weekday after Christmas Day (observed)
# Optional holidays
REM [easterdate($Uy)-2] MSG Good Friday

View File

@@ -6,7 +6,7 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG New Year's Day
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG New Year's Day (substitute day)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG New Year's Day (substitute day)
OMIT [easterdate($Uy)-2] MSG Good Friday
OMIT [easterdate($Uy)+1] MSG Easter Monday
REM First Monday in May ADDOMIT SCANFROM -28 MSG May Bank Holiday
@@ -14,6 +14,6 @@ REM 9 May ADDOMIT SCANFROM -28 SATISFY [$Tw != 0] MSG Liberation Day
REM Last Monday in May ADDOMIT SCANFROM -28 MSG Spring Bank Holiday
REM Last Monday in August ADDOMIT SCANFROM -28 MSG Summer Bank Holiday
OMIT 25 December MSG Christmas Day
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Christmas Day (substitute day)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Christmas Day (substitute day)
OMIT 26 December MSG Boxing Day
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 26))==0 || wkdaynum(date($Ty, 12, 26))==6] MSG Boxing Day (substitute day)
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 26)), 0, 6)] MSG Boxing Day (substitute day)

View File

@@ -6,29 +6,29 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG Жаңа жыл
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Жаңа жыл (қайта белгіленген демалыс)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Жаңа жыл (қайта белгіленген демалыс)
OMIT 2 January MSG Жаңа жыл
REM 2 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 2))==0 || wkdaynum(date($Ty, 1, 2))==6] MSG Жаңа жыл (қайта белгіленген демалыс)
REM 2 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 2)), 0, 6)] MSG Жаңа жыл (қайта белгіленген демалыс)
OMIT 7 January MSG Православиелік Рождество
OMIT 8 March MSG Халықаралық әйелдер күні
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 8))==0 || wkdaynum(date($Ty, 3, 8))==6] MSG Халықаралық әйелдер күні (қайта белгіленген демалыс)
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 8)), 0, 6)] MSG Халықаралық әйелдер күні (қайта белгіленген демалыс)
OMIT 21 March MSG Наурыз мейрамы
REM 21 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 21))==0 || wkdaynum(date($Ty, 3, 21))==6] MSG Наурыз мейрамы (қайта белгіленген демалыс)
REM 21 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 21)), 0, 6)] MSG Наурыз мейрамы (қайта белгіленген демалыс)
OMIT 22 March MSG Наурыз мейрамы
REM 22 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 22))==0 || wkdaynum(date($Ty, 3, 22))==6] MSG Наурыз мейрамы (қайта белгіленген демалыс)
REM 22 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 22)), 0, 6)] MSG Наурыз мейрамы (қайта белгіленген демалыс)
OMIT 23 March MSG Наурыз мейрамы
REM 23 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 23))==0 || wkdaynum(date($Ty, 3, 23))==6] MSG Наурыз мейрамы (қайта белгіленген демалыс)
REM 23 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 23)), 0, 6)] MSG Наурыз мейрамы (қайта белгіленген демалыс)
OMIT 1 May MSG Қазақстан халқының бірлігі мерекесі
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Қазақстан халқының бірлігі мерекесі (қайта белгіленген демалыс)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Қазақстан халқының бірлігі мерекесі (қайта белгіленген демалыс)
OMIT 7 May MSG Отан Қорғаушы күні
REM 7 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 7))==0 || wkdaynum(date($Ty, 5, 7))==6] MSG Отан Қорғаушы күні (қайта белгіленген демалыс)
REM 7 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 7)), 0, 6)] MSG Отан Қорғаушы күні (қайта белгіленген демалыс)
OMIT 9 May MSG Жеңіс күні
REM 9 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 9))==0 || wkdaynum(date($Ty, 5, 9))==6] MSG Жеңіс күні (қайта белгіленген демалыс)
REM 9 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 9)), 0, 6)] MSG Жеңіс күні (қайта белгіленген демалыс)
OMIT 6 July MSG Астана күні
REM 6 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 6))==0 || wkdaynum(date($Ty, 7, 6))==6] MSG Астана күні (қайта белгіленген демалыс)
REM 6 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 7, 6)), 0, 6)] MSG Астана күні (қайта белгіленген демалыс)
OMIT 30 August MSG Қазақстан Республикасының Конституциясы күні
REM 30 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 8, 30))==0 || wkdaynum(date($Ty, 8, 30))==6] MSG Қазақстан Республикасының Конституциясы күні (қайта белгіленген демалыс)
REM 30 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 8, 30)), 0, 6)] MSG Қазақстан Республикасының Конституциясы күні (қайта белгіленген демалыс)
OMIT 25 October MSG Республика күні
REM 25 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 25))==0 || wkdaynum(date($Ty, 10, 25))==6] MSG Республика күні (қайта белгіленген демалыс)
REM 25 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 25)), 0, 6)] MSG Республика күні (қайта белгіленген демалыс)
OMIT 16 December MSG Тəуелсіздік күні
REM 16 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 16))==0 || wkdaynum(date($Ty, 12, 16))==6] MSG Тəуелсіздік күні (қайта белгіленген демалыс)
REM 16 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 16)), 0, 6)] MSG Тəуелсіздік күні (қайта белгіленген демалыс)

View File

@@ -6,21 +6,21 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG ວັນປີໃໝ່ສາກົນ
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG ພັກຊົດເຊີຍວັນປີໃໝ່ສາກົນ
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG ພັກຊົດເຊີຍວັນປີໃໝ່ສາກົນ
OMIT 8 March MSG ວັນແມ່ຍິງສາກົນ
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 8))==0 || wkdaynum(date($Ty, 3, 8))==6] MSG ພັກຊົດເຊີຍວັນແມ່ຍິງສາກົນ
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 8)), 0, 6)] MSG ພັກຊົດເຊີຍວັນແມ່ຍິງສາກົນ
OMIT 13 April MSG ບຸນປີໃໝ່ລາວ
REM 13 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 13))==0 || wkdaynum(date($Ty, 4, 13))==6] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
REM 13 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 13)), 0, 6)] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
OMIT 14 April MSG ບຸນປີໃໝ່ລາວ
REM 14 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 14))==0 || wkdaynum(date($Ty, 4, 14))==6] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
REM 14 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 14)), 0, 6)] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
OMIT 15 April MSG ບຸນປີໃໝ່ລາວ
REM 15 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 15))==0 || wkdaynum(date($Ty, 4, 15))==6] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
REM 15 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 15)), 0, 6)] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
OMIT 16 April MSG ບຸນປີໃໝ່ລາວ
REM 16 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 16))==0 || wkdaynum(date($Ty, 4, 16))==6] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
REM 16 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 16)), 0, 6)] MSG ພັກຊົດເຊີຍບຸນປີໃໝ່ລາວ
OMIT 1 May MSG ວັນກຳມະກອນສາກົນ
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG ພັກຊົດເຊີຍວັນກຳມະກອນສາກົນ
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG ພັກຊົດເຊີຍວັນກຳມະກອນສາກົນ
OMIT 2 December MSG ວັນຊາດ
REM 2 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 2))==0 || wkdaynum(date($Ty, 12, 2))==6] MSG ພັກຊົດເຊີຍວັນຊາດ
REM 2 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 2)), 0, 6)] MSG ພັກຊົດເຊີຍວັນຊາດ
# Optional holidays
REM 20 January MSG ວັນສ້າງຕັ້ງກອງທັບປະຊາຊົນລາວ
@@ -37,7 +37,7 @@ REM 15 August MSG ວັນລັດຖະທໍາມະນູນແຫ່ງ
REM 23 August MSG ວັນຍຶດອຳນາດທົ່ວປະເທດ
REM 7 October MSG ວັນຄູແຫ່ງຊາດ
REM 7 October MSG ວັນສ້າງຕັ້ງທະນາຄານແຫ່ງ ສປປ ລາວ
REM 7 October OMIT SAT SUN AFTER SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 7))==0 || wkdaynum(date($Ty, 10, 7))==6] MSG ພັກຊົດເຊີຍວັນສ້າງຕັ້ງທະນາຄານແຫ່ງ ສປປ ລາວ
REM 7 October OMIT SAT SUN AFTER SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 7)), 0, 6)] MSG ພັກຊົດເຊີຍວັນສ້າງຕັ້ງທະນາຄານແຫ່ງ ສປປ ລາວ
REM 12 October MSG ວັນປະກາດເອກະລາດ
REM 13 December MSG ວັນຄ້າຍວັນເກີດ ທ່ານ ປະທານ ໄກສອນ ພົມວິຫານ
REM 27 December SCANFROM -28 SATISFY [$Tw >= 3 && $Tw <= 5] MSG ສາມວັນລັດຖະການສຸດທ້າຍຂອງທຸກໆປີ

View File

@@ -13,11 +13,11 @@
# [$SysInclude]/holidays/my/
OMIT 1 May MSG Hari Pekerja
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Cuti Hari Pekerja
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Cuti Hari Pekerja
REM First Monday in June ADDOMIT SCANFROM -28 MSG Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong
REM 3 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 3))==0 || wkdaynum(date($Ty, 6, 3))==6] MSG Cuti Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong
REM 3 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 6, 3)), 0, 6)] MSG Cuti Hari Keputeraan Rasmi Seri Paduka Baginda Yang di-Pertuan Agong
OMIT 31 August MSG Hari Kebangsaan
REM 31 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 8, 31))==0 || wkdaynum(date($Ty, 8, 31))==6] MSG Cuti Hari Kebangsaan
REM 31 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 8, 31)), 0, 6)] MSG Cuti Hari Kebangsaan
OMIT 16 September MSG Hari Malaysia
OMIT 25 December MSG Hari Krismas
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Cuti Hari Krismas
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Cuti Hari Krismas

View File

@@ -11,8 +11,8 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 20 February MSG Hari Pengisytiharan Tarikh Kemerdekaan
REM 20 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 20))==0 || wkdaynum(date($Ty, 2, 20))==6] MSG Cuti Hari Pengisytiharan Tarikh Kemerdekaan
REM 20 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 20)), 0, 6)] MSG Cuti Hari Pengisytiharan Tarikh Kemerdekaan
OMIT 24 August MSG Hari Jadi Yang di-Pertua Negeri Melaka
REM 24 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 8, 24))==0 || wkdaynum(date($Ty, 8, 24))==6] MSG Cuti Hari Jadi Yang di-Pertua Negeri Melaka
REM 24 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 8, 24)), 0, 6)] MSG Cuti Hari Jadi Yang di-Pertua Negeri Melaka

View File

@@ -11,6 +11,6 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 14 January MSG Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan
REM 14 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 14))==0 || wkdaynum(date($Ty, 1, 14))==6] MSG Cuti Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan
REM 14 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 14)), 0, 6)] MSG Cuti Hari Keputeraan Yang di-Pertuan Besar Negeri Sembilan

View File

@@ -11,7 +11,7 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 22 May MSG Hari Hol Sultan Pahang
OMIT 30 July MSG Hari Keputeraan Sultan Pahang
REM 30 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 30))==0 || wkdaynum(date($Ty, 7, 30))==6] MSG Cuti Hari Keputeraan Sultan Pahang
REM 30 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 7, 30)), 0, 6)] MSG Cuti Hari Keputeraan Sultan Pahang

View File

@@ -11,7 +11,7 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 7 July MSG Hari Ulang Tahun Perisytiharan Tapak Warisan Dunia
REM Second Saturday in July ADDOMIT SCANFROM -28 MSG Hari Jadi Yang di-Pertua Negeri Pulau Pinang
REM 13 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 13))==0 || wkdaynum(date($Ty, 7, 13))==6] MSG Cuti Hari Jadi Yang di-Pertua Negeri Pulau Pinang
REM 13 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 7, 13)), 0, 6)] MSG Cuti Hari Jadi Yang di-Pertua Negeri Pulau Pinang

View File

@@ -11,5 +11,5 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
REM First Friday in November ADDOMIT SCANFROM -28 MSG Hari Keputeraan Sultan Perak

View File

@@ -11,4 +11,4 @@
# also SYSINCLUDE holidays/my.rem
OMIT 17 May MSG Hari Ulang Tahun Keputeraan Raja Perlis
REM 17 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 17))==0 || wkdaynum(date($Ty, 5, 17))==6] MSG Cuti Hari Ulang Tahun Keputeraan Raja Perlis
REM 17 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 17)), 0, 6)] MSG Cuti Hari Ulang Tahun Keputeraan Raja Perlis

View File

@@ -11,6 +11,6 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 11 December MSG Hari Keputeraan Sultan Selangor
REM 11 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 11))==0 || wkdaynum(date($Ty, 12, 11))==6] MSG Cuti Hari Keputeraan Sultan Selangor
REM 11 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 11)), 0, 6)] MSG Cuti Hari Keputeraan Sultan Selangor

View File

@@ -11,6 +11,6 @@
# also SYSINCLUDE holidays/my.rem
OMIT 4 March MSG Hari Ulang Tahun Pertabalan Sultan Terengganu
REM 4 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 4))==0 || wkdaynum(date($Ty, 3, 4))==6] MSG Cuti Hari Ulang Tahun Pertabalan Sultan Terengganu
REM 4 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 4)), 0, 6)] MSG Cuti Hari Ulang Tahun Pertabalan Sultan Terengganu
OMIT 26 April MSG Hari Keputeraan Sultan Terengganu
REM 26 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 26))==0 || wkdaynum(date($Ty, 4, 26))==6] MSG Cuti Hari Keputeraan Sultan Terengganu
REM 26 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 26)), 0, 6)] MSG Cuti Hari Keputeraan Sultan Terengganu

View File

@@ -11,7 +11,7 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT [easterdate($Uy)-2] MSG Good Friday
OMIT 30 May MSG Pesta Kaamatan
OMIT 31 May MSG Pesta Kaamatan

View File

@@ -11,12 +11,12 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT [easterdate($Uy)-2] MSG Good Friday
OMIT 1 June MSG Perayaan Hari Gawai Dayak
REM 1 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 1))==0 || wkdaynum(date($Ty, 6, 1))==6] MSG Cuti Perayaan Hari Gawai Dayak
REM 1 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 6, 1)), 0, 6)] MSG Cuti Perayaan Hari Gawai Dayak
OMIT 2 June MSG Perayaan Hari Gawai Dayak
REM 2 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 2))==0 || wkdaynum(date($Ty, 6, 2))==6] MSG Cuti Perayaan Hari Gawai Dayak
REM 2 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 6, 2)), 0, 6)] MSG Cuti Perayaan Hari Gawai Dayak
OMIT 22 July MSG Hari Kemerdekaan Sarawak
REM 22 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 7, 22))==0 || wkdaynum(date($Ty, 7, 22))==6] MSG Cuti Hari Kemerdekaan Sarawak
REM 22 July OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 7, 22)), 0, 6)] MSG Cuti Hari Kemerdekaan Sarawak
REM Second Saturday in October ADDOMIT SCANFROM -28 MSG Hari Jadi Yang di-Pertua Negeri Sarawak

View File

@@ -11,6 +11,6 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 1 February MSG Hari Wilayah Persekutuan
REM 1 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 1))==0 || wkdaynum(date($Ty, 2, 1))==6] MSG Cuti Hari Wilayah Persekutuan
REM 1 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 1)), 0, 6)] MSG Cuti Hari Wilayah Persekutuan

View File

@@ -11,8 +11,8 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 1 February MSG Hari Wilayah Persekutuan
REM 1 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 1))==0 || wkdaynum(date($Ty, 2, 1))==6] MSG Cuti Hari Wilayah Persekutuan
REM 1 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 1)), 0, 6)] MSG Cuti Hari Wilayah Persekutuan
OMIT 30 May MSG Pesta Kaamatan
OMIT 31 May MSG Pesta Kaamatan

View File

@@ -11,6 +11,6 @@
# also SYSINCLUDE holidays/my.rem
OMIT 1 January MSG Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Cuti Tahun Baharu
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Cuti Tahun Baharu
OMIT 1 February MSG Hari Wilayah Persekutuan
REM 1 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 1))==0 || wkdaynum(date($Ty, 2, 1))==6] MSG Cuti Hari Wilayah Persekutuan
REM 1 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 1)), 0, 6)] MSG Cuti Hari Wilayah Persekutuan

View File

@@ -6,16 +6,16 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG New Year's Day
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG New Year's Day (observed)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG New Year's Day (observed)
OMIT [easterdate($Uy)-2] MSG Good Friday
OMIT [easterdate($Uy)+1] MSG Easter Monday
OMIT 1 May MSG Workers' Day
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Workers' Day (observed)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Workers' Day (observed)
OMIT 12 June MSG Democracy Day
REM 12 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 6, 12))==0 || wkdaynum(date($Ty, 6, 12))==6] MSG Democracy Day (observed)
REM 12 June OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 6, 12)), 0, 6)] MSG Democracy Day (observed)
OMIT 1 October MSG Independence Day
REM 1 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 1))==0 || wkdaynum(date($Ty, 10, 1))==6] MSG Independence Day (observed)
REM 1 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 1)), 0, 6)] MSG Independence Day (observed)
OMIT 25 December MSG Christmas Day
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Christmas Day (observed)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Christmas Day (observed)
OMIT 26 December MSG Boxing Day
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 26))==0 || wkdaynum(date($Ty, 12, 26))==6] MSG Boxing Day (observed)
REM 26 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 26)), 0, 6)] MSG Boxing Day (observed)

View File

@@ -20,7 +20,6 @@ OMIT 26 December MSG Tweede Kerstdag
# Optional holidays
REM [easterdate($Uy)-2] MSG Goede Vrijdag
# Bevrijdingsdag is a holiday every 5th year.
# Hence the two reminders below
REM 5 May SATISFY [$Ty % 5 != 0] MSG Bevrijdingsdag

View File

@@ -6,11 +6,11 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG New Year's Day
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG New Year's Day (observed)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG New Year's Day (observed)
OMIT [easterdate($Uy)-2] MSG Good Friday
OMIT 1 May MSG Labour Day
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Labour Day (observed)
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Labour Day (observed)
OMIT 9 August MSG National Day
REM 9 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 8, 9))==0 || wkdaynum(date($Ty, 8, 9))==6] MSG National Day (observed)
REM 9 August OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 8, 9)), 0, 6)] MSG National Day (observed)
OMIT 25 December MSG Christmas Day
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 25))==0 || wkdaynum(date($Ty, 12, 25))==6] MSG Christmas Day (observed)
REM 25 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 25)), 0, 6)] MSG Christmas Day (observed)

View File

@@ -15,7 +15,7 @@ OMIT 6 April MSG วันจักรี
REM 7 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 6)) == 0] MSG ชดเชยวันจักรี
REM 8 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 6)) == 6] MSG ชดเชยวันจักรี
OMIT 13 April MSG วันสงกรานต์
REM 13 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 13))==0 || wkdaynum(date($Ty, 4, 13))==6] MSG ชดเชยวันสงกรานต์
REM 13 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 13)), 0, 6)] MSG ชดเชยวันสงกรานต์
OMIT 14 April MSG วันสงกรานต์
OMIT 15 April MSG วันสงกรานต์
OMIT 1 May MSG วันแรงงานแห่งชาติ

View File

@@ -6,21 +6,21 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG 中華民國開國紀念日
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG 中華民國開國紀念日(慶祝)
REM 1 January OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG 中華民國開國紀念日(慶祝)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG 中華民國開國紀念日(慶祝)
REM 1 January OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG 中華民國開國紀念日(慶祝)
OMIT 28 February MSG 和平紀念日
REM 28 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 28))==0 || wkdaynum(date($Ty, 2, 28))==6] MSG 和平紀念日(慶祝)
REM 28 February OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 2, 28))==0 || wkdaynum(date($Ty, 2, 28))==6] MSG 和平紀念日(慶祝)
REM 28 February OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 28)), 0, 6)] MSG 和平紀念日(慶祝)
REM 28 February OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 2, 28)), 0, 6)] MSG 和平紀念日(慶祝)
REM 2 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 0] MSG 兒童節(慶祝)
REM 3 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 2] MSG 兒童節(慶祝)
REM 3 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 3] MSG 兒童節(慶祝)
REM 3 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 5] MSG 兒童節(慶祝)
REM 3 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 6] MSG 兒童節(慶祝)
OMIT 4 April MSG 兒童節
REM 4 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4))==0 || wkdaynum(date($Ty, 4, 4))==6] MSG 清明節(慶祝)
REM 4 April OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4))==0 || wkdaynum(date($Ty, 4, 4))==6] MSG 清明節(慶祝)
REM 4 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 4)), 0, 6)] MSG 清明節(慶祝)
REM 4 April OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 4)), 0, 6)] MSG 清明節(慶祝)
REM 5 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 1] MSG 兒童節(慶祝)
REM 5 April ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 4)) == 4] MSG 兒童節(慶祝)
OMIT 10 October MSG 中華民國國慶日
REM 10 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 10))==0 || wkdaynum(date($Ty, 10, 10))==6] MSG 中華民國國慶日(慶祝)
REM 10 October OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 10))==0 || wkdaynum(date($Ty, 10, 10))==6] MSG 中華民國國慶日(慶祝)
REM 10 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 10)), 0, 6)] MSG 中華民國國慶日(慶祝)
REM 10 October OMIT SAT SUN BEFORE ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 10)), 0, 6)] MSG 中華民國國慶日(慶祝)

View File

@@ -13,6 +13,6 @@
REM Fourth Monday in April ADDOMIT SCANFROM -28 MSG State Holiday
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG State Holiday
REM 23 December ADDOMIT SCANFROM -28 SATISFY [$TW == 4 || $Tw == 5] MSG Washington's Birthday
REM 24 December ADDOMIT SCANFROM -28 SATISFY [$Tw == 1 || $Tw == 2 || $Tw == 4] MSG Washington's Birthday
REM 26 December ADDOMIT SCANFROM -28 SATISFY [$Tw == 2 || $Tw == 5] MSG Washington's Birthday
REM 23 December ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 5, 4)] MSG Washington's Birthday
REM 24 December ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 1, 2, 4)] MSG Washington's Birthday
REM 26 December ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 2, 5)] MSG Washington's Birthday

View File

@@ -14,6 +14,6 @@ OMIT [easterdate($Uy)-2] MSG Good Friday
REM Tuesday 2 May ADDOMIT SCANFROM -28 MSG Primary Election Day
REM Second Monday in October ADDOMIT SCANFROM -28 MSG Columbus Day
REM Friday 23 November ADDOMIT SCANFROM -28 MSG Lincoln's Birthday
REM 23 December ADDOMIT SCANFROM -28 SATISFY [$TW == 4 || $Tw == 5] MSG Washington's Birthday
REM 24 December ADDOMIT SCANFROM -28 SATISFY [$Tw == 1 || $Tw == 2 || $Tw == 4] MSG Washington's Birthday
REM 26 December ADDOMIT SCANFROM -28 SATISFY [$Tw == 2 || $Tw == 5] MSG Washington's Birthday
REM 23 December ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 5, 4)] MSG Washington's Birthday
REM 24 December ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 1, 2, 4)] MSG Washington's Birthday
REM 26 December ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 2, 5)] MSG Washington's Birthday

View File

@@ -6,16 +6,16 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG Yangi yil
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Yangi yil (kochirilgan)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Yangi yil (kochirilgan)
OMIT 8 March MSG Xotin-qizlar kuni
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 8))==0 || wkdaynum(date($Ty, 3, 8))==6] MSG Xotin-qizlar kuni (kochirilgan)
REM 8 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 8)), 0, 6)] MSG Xotin-qizlar kuni (kochirilgan)
OMIT 21 March MSG Navroz bayrami
REM 21 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 3, 21))==0 || wkdaynum(date($Ty, 3, 21))==6] MSG Navroz bayrami (kochirilgan)
REM 21 March OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 3, 21)), 0, 6)] MSG Navroz bayrami (kochirilgan)
OMIT 9 May MSG Xotira va qadrlash kuni
REM 9 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 9))==0 || wkdaynum(date($Ty, 5, 9))==6] MSG Xotira va qadrlash kuni (kochirilgan)
REM 9 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 9)), 0, 6)] MSG Xotira va qadrlash kuni (kochirilgan)
OMIT 1 September MSG Mustaqillik kuni
REM 1 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 9, 1))==0 || wkdaynum(date($Ty, 9, 1))==6] MSG Mustaqillik kuni (kochirilgan)
REM 1 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 9, 1)), 0, 6)] MSG Mustaqillik kuni (kochirilgan)
OMIT 1 October MSG Oqituvchi va murabbiylar kuni
REM 1 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 10, 1))==0 || wkdaynum(date($Ty, 10, 1))==6] MSG Oqituvchi va murabbiylar kuni (kochirilgan)
REM 1 October OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 10, 1)), 0, 6)] MSG Oqituvchi va murabbiylar kuni (kochirilgan)
OMIT 8 December MSG Ozbekiston Respublikasi Konstitutsiyasi kuni
REM 8 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 12, 8))==0 || wkdaynum(date($Ty, 12, 8))==6] MSG Ozbekiston Respublikasi Konstitutsiyasi kuni (kochirilgan)
REM 8 December OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 12, 8)), 0, 6)] MSG Ozbekiston Respublikasi Konstitutsiyasi kuni (kochirilgan)

View File

@@ -6,12 +6,12 @@
# See important caveats in the README file in this directory.
OMIT 1 January MSG Tết Dương lịch
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 1, 1))==0 || wkdaynum(date($Ty, 1, 1))==6] MSG Tết Dương lịch (nghỉ bù)
REM 1 January OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 1, 1)), 0, 6)] MSG Tết Dương lịch (nghỉ bù)
OMIT 30 April MSG Ngày Chiến thắng
REM 30 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 4, 30))==0 || wkdaynum(date($Ty, 4, 30))==6] MSG Ngày Chiến thắng (nghỉ bù)
REM 30 April OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 4, 30)), 0, 6)] MSG Ngày Chiến thắng (nghỉ bù)
OMIT 1 May MSG Ngày Quốc tế Lao động
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 5, 1))==0 || wkdaynum(date($Ty, 5, 1))==6] MSG Ngày Quốc tế Lao động (nghỉ bù)
REM 1 September ADDOMIT SCANFROM -28 SATISFY [$Tw == 1 || $Tw == 2 || $Tw == 4 || $Tw == 5] MSG Quốc khánh
REM 1 May OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 5, 1)), 0, 6)] MSG Ngày Quốc tế Lao động (nghỉ bù)
REM 1 September ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 1, 2, 4, 5)] MSG Quốc khánh
OMIT 2 September MSG Quốc khánh
REM 2 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [wkdaynum(date($Ty, 9, 2))==0 || wkdaynum(date($Ty, 9, 2))==6] MSG Quốc khánh (nghỉ bù)
REM 3 September ADDOMIT SCANFROM -28 SATISFY [$Tw == 2 || $Tw == 5 || $Tw == 1] MSG Quốc khánh
REM 2 September OMIT SAT SUN AFTER ADDOMIT SCANFROM -28 SATISFY [isany(wkdaynum(date($Ty, 9, 2)), 0, 6)] MSG Quốc khánh (nghỉ bù)
REM 3 September ADDOMIT SCANFROM -28 SATISFY [isany($Tw, 2, 5, 1)] MSG Quốc khánh

View File

@@ -300,7 +300,7 @@ standard error stream) to the standard output stream.
.B \-d\fR\fIchars\fR
The \fB-d\fR option enables certain debugging modes. The \fIchars\fR
specify which modes to enable:
.RS 2
.RS
.TP
.B e
Echo all input lines
@@ -328,6 +328,26 @@ tree. This is unlikely to be useful unless you are working on
.B h
Dump hash-table statistics on exit.
.TP
.B u
When \fBRemind\fR exits, print a list of variables that were SET, but
not subsequently used.
.RS
.PP
Note that the \fBu\fR debugging flag may produce spurious warnings. For
example, this sequence of commands:
.PP
.nf
DEBUG +u
SET a 1
IFTRIG Wed
MSG a = [a]
ENDIF
.fi
.PP
will issue a warning about \fBa\fR being unused unless it is run on a
Wednesday.
.RE
.TP
.B n
Print debugging information about why \fBRemind\fR considers an expression
to be "non-constant"
@@ -3038,7 +3058,7 @@ Equivalent to \fBday(trigdate())\fR.
.B $Tm (read-only)
Equivalent to \fBmonnum(trigdate())\fR.
.TP
.B $Tu (read-only)
.B $Tu (read-only, DATE type)
Equivalent to \fBtriguntil()\fR.
.TP
.B $Tw (read-only)
@@ -3400,7 +3420,12 @@ characters occupy two columns. \fBcolumns(str)\fR takes all of that
into account. Note that if \fBRemind\fR was compiled without Unicode support,
\fBcolumns(str)\fR returns a type mismatch error.
.RE
.TP
.B const(x_arg)
Evaluates \fIarg\fR and returns it, but also ensures that the result
is marked "constant". Use with caution; incorrect use could result
in unwanted reminders being purged in Purge Mode. See also the section
"NON-CONSTANT EXPRESSIONS"
.TP
.B current()
Returns the current date and time as a DATETIME object. This may be the
@@ -3534,6 +3559,10 @@ The result will be "F is 12" because the reference to \fIx\fR inside the
\fBeval()\fR argument refers to the \fIglobal\fR variable \fIx\fR and
not the function argument.
.PP
Note that for safety, \fBRUN\fR is disabled during the evaluation of
\fBeval()\fR, which means you can't use the \fBshell()\fR function from
within an \fBeval()\fR.
.PP
.RE
.TP
.B evaltrig(s_trigger [,dq_start])
@@ -5335,7 +5364,7 @@ under program control. The format is:
.PP
\fBDEBUG\fR [+\fIflagson\fR] [\-\fIflagsoff\fR]
.PP
\fIFlagson\fR and \fIflagsoff\fR consist of strings of the characters "shextvlfqn"
\fIFlagson\fR and \fIflagsoff\fR consist of strings of the characters "shextvlfqnu"
that correspond to the debugging options discussed in the command-line
options section. If preceded with a "+", the corresponding group of
debugging options is switched on. Otherwise, they are switched off.
@@ -5810,7 +5839,13 @@ Here are some examples that should make things clear:
.PP
Note that within the \fBIF\fR...\fBENDIF\fR scope, any assignments
are non-constant because the code flow depends on today's date, which
could change in subsequent \fBRemind\fR runs.
could change in subsequent \fBRemind\fR runs. If you want to force
a variable to be treated as constant, no matter what, then use the following
just before you use the variable:
.PP
.nf
SET var const(var)
.fi
.PP
Variables initialized on the command-line with the \fB\-i\fR flag are
\fIalways\fR considered to be non-constant.

View File

@@ -55,7 +55,7 @@ typedef struct cal_entry {
DynamicBuffer tags;
char passthru[PASSTHRU_LEN+1];
int duration;
char *filename;
char const *filename;
int lineno;
int lineno_start;
Trigger trig;
@@ -1539,7 +1539,6 @@ static int WriteOneColLine(int col)
CalColumn[col] = e->next;
free(e->text);
free(e->raw_text);
free(e->filename);
if (e->wc_text) free(e->wc_text);
FreeTrigInfoChain(e->infos);
free(e);
@@ -1626,7 +1625,6 @@ static int WriteOneColLine(int col)
CalColumn[col] = e->next;
free(e->text);
free(e->raw_text);
free(e->filename);
if (e->wc_text) free(e->wc_text);
FreeTrigInfoChain(e->infos);
free(e);
@@ -1645,7 +1643,6 @@ static int WriteOneColLine(int col)
PrintLeft("", ColSpaces, ' ');
CalColumn[col] = e->next;
free(e->text);
free(e->filename);
#ifdef REM_USE_WCHAR
if (e->wc_text) free(e->wc_text);
#endif
@@ -1708,7 +1705,6 @@ static int WriteOneColLine(int col)
if (!*s && !e->next) {
CalColumn[col] = e->next;
free(e->text);
free(e->filename);
#ifdef REM_USE_WCHAR
if (e->wc_text) free(e->wc_text);
#endif
@@ -2317,17 +2313,7 @@ static int DoCalRem(ParsePtr p, int col)
FreeTrig(&trig);
e->duration = tim.duration;
e->priority = trig.priority;
e->filename = StrDup(FileName);
if(!e->filename) {
FreeTrigInfoChain(e->infos);
if (e->text) free(e->text);
if (e->raw_text) free(e->raw_text);
#ifdef REM_USE_WCHAR
if (e->wc_text) free(e->wc_text);
#endif
free(e);
return E_NO_MEM;
}
e->filename = GetCurrentFilename();
e->lineno = LineNo;
e->lineno_start = LineNoStart;
@@ -2673,7 +2659,6 @@ static void WriteSimpleEntries(int col, int dse)
free(e->text);
free(e->raw_text);
free(e->filename);
FreeTrigInfoChain(e->infos);
#ifdef REM_USE_WCHAR
if (e->wc_text) free(e->wc_text);

View File

@@ -1572,7 +1572,7 @@ int DoSatRemind(Trigger *trig, TimeTrig *tt, ParsePtr p)
int y, m, d;
FromDSE(LastTriggerDate, &y, &m, &d);
fprintf(ErrFp, "%s(%s): Trig(satisfied) = %s, %d %s, %d",
FileName, line_range(LineNoStart, LineNo),
GetCurrentFilename(), line_range(LineNoStart, LineNo),
get_day_name(LastTriggerDate % 7),
d,
get_month_name(m),

View File

@@ -425,7 +425,8 @@ get_var(expr_node *node, Value *ans, int *nonconst)
Eprint("%s: `%s'", GetErr(E_NOSUCH_VAR), str);
return E_NOSUCH_VAR;
}
if (v->nonconstant) {
v->used_since_set = 1;
if (!v->is_constant) {
nonconst_debug(*nonconst, tr("Global variable `%s' makes expression non-constant"), str);
*nonconst = 1;
}
@@ -568,6 +569,13 @@ eval_builtin(expr_node *node, Value *locals, Value *ans, int *nonconst)
/* All went well; copy the result destructively */
(*ans) = info.retval;
/* Special case of const cunction */
if (!strcmp(f->name, "const")) {
if (*nonconst) {
nonconst_debug(0, tr("Non-constant expression converted to constant by `const' built-in function"));
}
*nonconst = 0;
}
/* Don't allow retval to be destroyed! */
info.retval.type = ERR_TYPE;
}

View File

@@ -20,6 +20,7 @@
#include <errno.h>
#include <ctype.h>
#include <sys/stat.h>
#include <stddef.h>
#ifdef TM_IN_SYS_TIME
#include <sys/time.h>
@@ -85,10 +86,21 @@ typedef struct {
int ownedByMe;
} IncludeStruct;
typedef struct fn_entry {
struct hash_link link;
char const *fname;
} FilenameHashEntry;
/* A hash table to hold unique copies of all the filenames we process */
static hash_table FilenameHashTable;
static CachedFile *CachedFiles = (CachedFile *) NULL;
static CachedLine *CLine = (CachedLine *) NULL;
static DirectoryFilenameChain *CachedDirectoryChains = NULL;
/* Current filename */
static char const *FileName = NULL;
static FILE *fp;
static IncludeStruct IStack[INCLUDE_NEST];
@@ -102,6 +114,64 @@ static int CheckSafetyAux (struct stat *statbuf);
static int PopFile (void);
static int IncludeCmd(char const *);
static unsigned int FnHashFunc(void *x)
{
FilenameHashEntry *e = (FilenameHashEntry *) x;
return HashVal_preservecase(e->fname);
}
static int FnCompareFunc(void *a, void *b)
{
FilenameHashEntry *e1 = (FilenameHashEntry *) a;
FilenameHashEntry *e2 = (FilenameHashEntry *) b;
return strcmp(e1->fname, e2->fname);
}
void InitFiles(void)
{
if (hash_table_init(&FilenameHashTable, offsetof(FilenameHashEntry, link),
FnHashFunc, FnCompareFunc) < 0) {
fprintf(ErrFp, "Unable to initialize filename hash table: Out of memory. Exiting.\n");
exit(1);
}
}
void SetCurrentFilename(char const *fname)
{
FilenameHashEntry *e;
FilenameHashEntry candidate;
candidate.fname = fname;
e = (FilenameHashEntry *) hash_table_find(&FilenameHashTable, &candidate);
if (!e) {
e = NEW(FilenameHashEntry);
if (!e) {
fprintf(ErrFp, "Out of Memory!\n");
exit(1);
}
e->fname = strdup(fname);
if (!e->fname) {
fprintf(ErrFp, "Out of Memory!\n");
exit(1);
}
hash_table_insert(&FilenameHashTable, e);
}
FileName = e->fname;
}
char const *GetCurrentFilename(void)
{
if (FileName) {
if (!strcmp(FileName, "-")) {
return "-stdin-";
} else {
return FileName;
}
} else {
return "";
}
}
static void
got_a_fresh_line(void)
{
@@ -332,7 +402,7 @@ int OpenFile(char const *fname)
fprintf(ErrFp, "\n");
}
CLine = h->cache;
STRSET(FileName, fname);
SetCurrentFilename(fname);
LineNo = 0;
LineNoStart = 0;
if (!h->ownedByMe) {
@@ -387,7 +457,7 @@ int OpenFile(char const *fname)
}
}
}
STRSET(FileName, fname);
SetCurrentFilename(fname);
LineNo = 0;
LineNoStart = 0;
if (FileName) return OK; else return E_NO_MEM;
@@ -569,7 +639,7 @@ static int PopFile(void)
set_base_if_pointer(i->base_if_pointer);
CLine = i->CLine;
fp = NULL;
STRSET(FileName, i->filename);
SetCurrentFilename(i->filename);
if (!i->ownedByMe) {
RunDisabled |= RUN_NOTOWNER;
} else {
@@ -589,7 +659,6 @@ static int PopFile(void)
if (fp != stdin)
(void) fseek(fp, i->offset, 0); /* Trust that it works... */
}
free((char *) i->filename);
return OK;
}
@@ -894,15 +963,7 @@ static int IncludeCmd(char const *cmd)
}
fname = DBufValue(&buf);
if (FileName) {
i->filename = StrDup(FileName);
if (!i->filename) {
DBufFree(&buf);
return E_NO_MEM;
}
} else {
i->filename = NULL;
}
i->filename = FileName;
i->ownedByMe = 1;
i->LineNo = LineNo;
i->LineNoStart = LineNo;
@@ -927,7 +988,7 @@ static int IncludeCmd(char const *cmd)
fprintf(ErrFp, "\n");
}
CLine = h->cache;
STRSET(FileName, fname);
SetCurrentFilename(fname);
DBufFree(&buf);
LineNo = 0;
LineNoStart = 0;
@@ -979,7 +1040,7 @@ static int IncludeCmd(char const *cmd)
CLine = CachedFiles->cache;
LineNo = 0;
LineNoStart = 0;
STRSET(FileName, fname);
SetCurrentFilename(fname);
DBufFree(&buf);
return OK;
}
@@ -1008,12 +1069,7 @@ int IncludeFile(char const *fname)
if (IStackPtr >= INCLUDE_NEST) return E_NESTED_INCLUDE;
i = &IStack[IStackPtr];
if (FileName) {
i->filename = StrDup(FileName);
if (!i->filename) return E_NO_MEM;
} else {
i->filename = NULL;
}
i->filename = FileName;
i->LineNo = LineNo;
i->LineNoStart = LineNoStart;
i->base_if_pointer = get_base_if_pointer();

View File

@@ -258,6 +258,7 @@ BuiltinFunc Func[] = {
{ "choose", 2, NO_MAX, 1, NULL, FChoose }, /*NEW-STYLE*/
{ "coerce", 2, 2, 1, FCoerce, NULL },
{ "columns", 0, 1, 0, FColumns, NULL },
{ "const", 1, 1, 1, FNonconst, NULL },
{ "current", 0, 0, 0, FCurrent, NULL },
{ "date", 3, 3, 1, FDate, NULL },
{ "datepart", 1, 1, 1, FDatepart, NULL },
@@ -1709,6 +1710,7 @@ static int FValue(func_info *info)
DCOPYVAL(RetVal, ARG(1));
return OK;
} else {
v->used_since_set = 1;
return CopyValue(&RetVal, &v->v);
}
}
@@ -2285,7 +2287,7 @@ static int FIif(expr_node *node, Value *locals, Value *ans, int *nonconst)
/***************************************************************/
static int FFilename(func_info *info)
{
return RetStrVal(FileName, info);
return RetStrVal(GetCurrentFilename(), info);
}
/***************************************************************/
@@ -2303,7 +2305,7 @@ static int FFiledir(func_info *info)
DBufInit(&buf);
if (DBufPuts(&buf, FileName) != OK) return E_NO_MEM;
if (DBufPuts(&buf, GetCurrentFilename()) != OK) return E_NO_MEM;
if (DBufLen(&buf) == 0) {
DBufFree(&buf);
return RetStrVal(".", info);
@@ -2363,12 +2365,12 @@ static int FAccess(func_info *info)
static int FTypeof(func_info *info)
{
switch(ARG(0).type) {
case INT_TYPE: return RetStrVal("INT", info);
case DATE_TYPE: return RetStrVal("DATE", info);
case TIME_TYPE: return RetStrVal("TIME", info);
case STR_TYPE: return RetStrVal("STRING", info);
case INT_TYPE: return RetStrVal("INT", info);
case DATE_TYPE: return RetStrVal("DATE", info);
case TIME_TYPE: return RetStrVal("TIME", info);
case STR_TYPE: return RetStrVal("STRING", info);
case DATETIME_TYPE: return RetStrVal("DATETIME", info);
default: return RetStrVal("ERR", info);
default: return RetStrVal("ERR", info);
}
}
@@ -3992,6 +3994,7 @@ FEval(func_info *info)
{
expr_node *n;
int r;
int run_was_enabled = 0;
ASSERT_TYPE(0, STR_TYPE);
char const *e = ARGSTR(0);
@@ -4002,7 +4005,15 @@ FEval(func_info *info)
return r;
}
/* Disable shell() command in eval */
if (! (RunDisabled & RUN_IN_EVAL)) {
run_was_enabled = 1;
RunDisabled |= RUN_IN_EVAL;
}
r = evaluate_expr_node(n, NULL, &(info->retval), &(info->nonconst));
if (run_was_enabled) {
RunDisabled &= ~RUN_IN_EVAL;
}
free_expr_tree(n);
return r;
}

View File

@@ -113,7 +113,6 @@ EXTERN INIT( int SynthesizeTags, 0);
EXTERN INIT( int ScFormat, SC_AMPM);
EXTERN INIT( int MaxSatIter, 1000);
EXTERN INIT( int MaxStringLen, MAX_STR_LEN);
EXTERN INIT( char *FileName, NULL);
EXTERN INIT( int UseStdin, 0);
EXTERN INIT( int PurgeMode, 0);
EXTERN INIT( int PurgeIncludeDepth, 0);

View File

@@ -186,6 +186,7 @@ void InitRemind(int argc, char const *argv[])
InitUserFunctions();
InitTranslationTable();
InitFiles();
/* If stdout is a terminal, initialize $FormWidth to terminal width-8,
but clamp to [20, 500] */
@@ -644,6 +645,7 @@ void InitRemind(int argc, char const *argv[])
case 'f': case 'F': DebugFlag |= DB_TRACE_FILES; break;
case 'q': case 'Q': DebugFlag |= DB_TRANSLATE; break;
case 'n': case 'N': DebugFlag |= DB_NONCONST; break;
case 'u': case 'U': DebugFlag |= DB_UNUSED_VARS; break;
default:
fprintf(ErrFp, GetErr(M_BAD_DB_FLAG), *(arg-1));
fprintf(ErrFp, "\n");
@@ -836,7 +838,7 @@ void Usage(void)
fprintf(ErrFp, " -q Don't queue timed reminders\n");
fprintf(ErrFp, " -f Trigger timed reminders by staying in foreground\n");
fprintf(ErrFp, " -z[n] Enter daemon mode, waking every n (1) minutes.\n");
fprintf(ErrFp, " -d... Debug: e=echo x=expr-eval t=trig v=dumpvars l=showline f=tracefiles\n");
fprintf(ErrFp, " -d... Debug: See man page for details\n");
fprintf(ErrFp, " -e Divert messages normally sent to stderr to stdout\n");
fprintf(ErrFp, " -b[n] Time format for cal: 0=am/pm, 1=24hr, 2=none\n");
fprintf(ErrFp, " -x[n] Iteration limit for SATISFY clause (def=1000)\n");

View File

@@ -60,6 +60,9 @@ exitfunc(void)
/* Kill any execution-time-limiter process */
unlimit_execution_time();
if (DebugFlag & DB_UNUSED_VARS) {
DumpUnusedVars();
}
if (DebugFlag & DB_HASHSTATS) {
fflush(stdout);
fflush(ErrFp);
@@ -899,24 +902,17 @@ void Wprint(char const *fmt, ...)
{
va_list argptr;
char const *fname = GetCurrentFilename();
if (SuppressErrorOutputInCatch) {
return;
}
/* We can't use line_range because caller might have used it */
if (FileName) {
if (strcmp(FileName, "-")) {
if (LineNoStart == LineNo) {
(void) fprintf(ErrFp, "%s(%d): ", FileName, LineNo);
} else {
(void) fprintf(ErrFp, "%s(%d:%d): ", FileName, LineNoStart, LineNo);
}
if (fname) {
if (LineNoStart == LineNo) {
(void) fprintf(ErrFp, "%s(%d): ", fname, LineNo);
} else {
if (LineNoStart == LineNo) {
(void) fprintf(ErrFp, "-stdin-(%d): ", LineNo);
} else {
(void) fprintf(ErrFp, "-stdin-(%d:%d): ", LineNoStart, LineNo);
}
(void) fprintf(ErrFp, "%s(%d:%d): ", fname, LineNoStart, LineNo);
}
}
@@ -934,24 +930,23 @@ void Wprint(char const *fmt, ...)
void Eprint(char const *fmt, ...)
{
va_list argptr;
char const *fname;
if (SuppressErrorOutputInCatch) {
return;
}
/* Check if more than one error msg. from this line */
if (!FreshLine && !ShowAllErrors) return;
if (!FileName) {
char const *fname = GetCurrentFilename();
if (!fname) {
return;
}
if (strcmp(FileName, "-")) {
fname = FileName;
} else {
fname = "-stdin-";
if (LineNo < 1) {
/* Not yet processing a file */
return;
}
/* Check if more than one error msg. from this line */
if (!FreshLine && !ShowAllErrors) return;
if (FreshLine) {
/* We can't use line_range because caller might have used it */
if (LineNo == LineNoStart) {
@@ -1362,6 +1357,11 @@ int DoDebug(ParsePtr p)
if (val) DebugFlag |= DB_NONCONST;
else DebugFlag &= ~DB_NONCONST;
break;
case 'u':
case 'U':
if (val) DebugFlag |= DB_UNUSED_VARS;
else DebugFlag &= ~DB_UNUSED_VARS;
break;
default:
Wprint(GetErr(M_BAD_DB_FLAG), ch);
break;

View File

@@ -36,7 +36,7 @@ int NumFullOmits, NumPartialOmits;
/* The structure for saving and restoring OMIT contexts */
typedef struct omitcontext {
struct omitcontext *next;
char *filename;
char const *filename;
int lineno;
int numfull, numpart;
int *fullsave;
@@ -98,7 +98,6 @@ int DestroyOmitContexts(int print_unmatched)
num++;
if (c->fullsave) free(c->fullsave);
if (c->partsave) free(c->partsave);
if (c->filename) free(c->filename);
d = c->next;
free(c);
c = d;
@@ -122,14 +121,10 @@ int PushOmitContext(ParsePtr p)
context = NEW(OmitContext);
if (!context) return E_NO_MEM;
if (FileName) {
context->filename = StrDup(FileName);
if (GetCurrentFilename()) {
context->filename = GetCurrentFilename();
} else {
context->filename = StrDup("");
}
if (!context->filename) {
free(context);
return E_NO_MEM;
context->filename = "";
}
context->lineno = LineNo;
context->numfull = NumFullOmits;
@@ -137,13 +132,11 @@ int PushOmitContext(ParsePtr p)
context->weekdaysave = WeekdayOmits;
context->fullsave = malloc(NumFullOmits * sizeof(int));
if (NumFullOmits && !context->fullsave) {
free(context->filename);
free(context);
return E_NO_MEM;
}
context->partsave = malloc(NumPartialOmits * sizeof(int));
if (NumPartialOmits && !context->partsave) {
free(context->filename);
if (context->fullsave) {
free(context->fullsave);
}
@@ -172,6 +165,7 @@ int PopOmitContext(ParsePtr p)
{
OmitContext *c = SavedOmitContexts;
char const *fname = GetCurrentFilename();
if (!c) return E_POP_NO_PUSH;
NumFullOmits = c->numfull;
@@ -185,13 +179,12 @@ int PopOmitContext(ParsePtr p)
/* Remove the context from the stack */
SavedOmitContexts = c->next;
if (c->filename && FileName && strcmp(c->filename, FileName)) {
Wprint(tr("POP-OMIT-CONTEXT at %s:%d matches PUSH-OMIT-CONTEXT in different file: %s:%d"), FileName, LineNo, c->filename, c->lineno);
if (c->filename && fname && strcmp(c->filename, fname)) {
Wprint(tr("POP-OMIT-CONTEXT at %s:%d matches PUSH-OMIT-CONTEXT in different file: %s:%d"), fname, LineNo, c->filename, c->lineno);
}
/* Free memory used by the saved context */
if (c->partsave) free(c->partsave);
if (c->fullsave) free(c->fullsave);
if (c->filename) free(c->filename);
free(c);
return VerifyEoln(p);

View File

@@ -157,6 +157,7 @@ int DoSet (Parser *p);
int DoUnset (Parser *p);
int DoDump (ParsePtr p);
void DumpVarTable (int dump_constness);
void DumpUnusedVars(void);
void DestroyVars (int all);
int PreserveVar (char const *name);
int DoPreserve (Parser *p);
@@ -268,6 +269,7 @@ void InitDedupeTable(void);
void InitVars(void);
void InitUserFunctions(void);
void InitTranslationTable(void);
void InitFiles(void);
char const *GetTranslatedString(char const *orig);
int GetTranslatedStringTryingVariants(char const *orig, DynamicBuffer *out);
char const *GetErr(int r);
@@ -304,8 +306,5 @@ int should_ignore_line(void);
int in_constant_context(void);
void pop_excess_ifs(char const *fname);
void SetCurrentFilename(char const *fname);
char const *GetCurrentFilename(void);

View File

@@ -45,13 +45,6 @@ static void consume_inotify_events(int fd);
static int setup_inotify_watch(void);
#endif
/* A list of filenames associated with queued reminders */
typedef struct queuedfname {
struct queuedfname *next;
char const *fname;
} QueuedFilename;
/* List structure for holding queued reminders */
typedef struct queuedrem {
struct queuedrem *next;
@@ -72,7 +65,6 @@ typedef struct queuedrem {
/* Global variables */
static QueuedRem *QueueHead = NULL;
static QueuedFilename *Files = NULL;
static time_t FileModTime;
static struct stat StatBuf;
@@ -83,7 +75,6 @@ static int CalculateNextTimeUsingSched (QueuedRem *q);
static void ServerWait (struct timeval *sleep_tv);
static void reread (void);
static void PrintQueue(void);
static char const *QueueFilename(char const *fname);
static void chomp(DynamicBuffer *buf)
{
@@ -112,48 +103,6 @@ char const *SimpleTimeNoSpace(int tim)
return s;
}
/***************************************************************/
/* */
/* QueueFilename */
/* */
/* Add fname to the list of queued filenames if it's not */
/* already present. Either way, return a pointer to the */
/* filename. Returns NULL if out of memory */
/* */
/***************************************************************/
static QueuedFilename *last_file_found = NULL;
static char const *QueueFilename(char const *fname)
{
QueuedFilename *elem = Files;
/* Optimization: We are very likely in the same file as
before... */
if (last_file_found && !strcmp(fname, last_file_found->fname)) {
return last_file_found->fname;
}
/* No such luck; search the list */
while(elem) {
if (!strcmp(elem->fname, fname)) {
last_file_found = elem;
return elem->fname;
}
elem = elem->next;
}
/* Not found... queue it */
elem = NEW(QueuedFilename);
if (!elem) return NULL;
elem->fname = StrDup(fname);
if (!elem->fname) {
free(elem);
return NULL;
}
elem->next = Files;
Files = elem;
last_file_found = elem;
return elem->fname;
}
static void del_reminder(QueuedRem *qid)
{
QueuedRem *q = QueueHead;
@@ -217,13 +166,7 @@ int QueueReminder(ParsePtr p, Trigger *trig,
free(qelem);
return E_NO_MEM;
}
qelem->fname = QueueFilename(FileName);
if (!qelem->fname) {
free((void *) qelem->text);
free(qelem);
return E_NO_MEM;
}
qelem->fname = GetCurrentFilename();
qelem->lineno = LineNo;
qelem->lineno_start = LineNoStart;
NumQueued++;
@@ -327,12 +270,6 @@ void HandleQueuedReminders(void)
/* Turn off sorting -- otherwise, TriggerReminder has no effect! */
SortByDate = 0;
/* Free FileName if necessary */
if (FileName) {
free(FileName);
FileName = NULL;
}
/* We don't need to keep the dedupe table around */
ClearDedupeTable();
@@ -495,7 +432,7 @@ void HandleQueuedReminders(void)
/* Set up global variables so some functions like trigdate()
and trigtime() work correctly */
SaveAllTriggerInfo(&(q->t), &(q->tt), DSEToday, q->tt.ttime, 1);
FileName = (char *) q->fname;
SetCurrentFilename(q->fname);
DefaultColorR = q->red;
DefaultColorG = q->green;
DefaultColorB = q->blue;
@@ -516,7 +453,6 @@ void HandleQueuedReminders(void)
} else {
(void) TriggerReminder(&p, &tcopy, &q->tt, DSEToday, 1, NULL);
}
FileName = NULL;
if (IsServerMode() && !DaemonJSON && q->typ != RUN_TYPE) {
printf("NOTE endreminder\n");
}

View File

@@ -453,7 +453,7 @@ AdjustTriggerForDuration(int today, int r, Trigger *trig, TimeTrig *tim, int sav
if (DebugFlag & DB_PRTTRIG) {
FromDSE(r, &y, &m, &d);
fprintf(ErrFp, "%s(%s): Trig(adj) = %s, %d %s, %d",
FileName, line_range(LineNoStart, LineNo),
GetCurrentFilename(), line_range(LineNoStart, LineNo),
get_day_name(r % 7),
d,
get_month_name(m),
@@ -581,7 +581,7 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim,
trig->expired = 1;
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%s): %s\n",
FileName, line_range(LineNoStart, LineNo), GetErr(E_EXPIRED));
GetCurrentFilename(), line_range(LineNoStart, LineNo), GetErr(E_EXPIRED));
}
return -1;
}
@@ -604,7 +604,7 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim,
if (DebugFlag & DB_PRTTRIG) {
FromDSE(result, &y, &m, &d);
fprintf(ErrFp, "%s(%s): Trig = %s, %d %s, %d",
FileName, line_range(LineNoStart, LineNo),
GetCurrentFilename(), line_range(LineNoStart, LineNo),
get_day_name(result % 7),
d,
get_month_name(m),
@@ -631,7 +631,7 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim,
trig->expired = 1;
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%s): %s\n",
FileName, line_range(LineNoStart, LineNo), GetErr(E_EXPIRED));
GetCurrentFilename(), line_range(LineNoStart, LineNo), GetErr(E_EXPIRED));
}
if (save_in_globals) {
LastTriggerDate = result;
@@ -656,7 +656,7 @@ int ComputeTriggerNoAdjustDuration(int today, Trigger *trig, TimeTrig *tim,
trig->expired = 1;
if (DebugFlag & DB_PRTTRIG) {
fprintf(ErrFp, "%s(%s): %s\n",
FileName, line_range(LineNoStart, LineNo), GetErr(E_EXPIRED));
GetCurrentFilename(), line_range(LineNoStart, LineNo), GetErr(E_EXPIRED));
}
return -1;
}

View File

@@ -105,7 +105,10 @@ typedef struct var {
struct hash_link link;
char name[VAR_NAME_LEN+1];
char preserve;
char nonconstant;
char is_constant;
char used_since_set;
char const *filename;
int lineno;
Value v;
} Var;
@@ -218,6 +221,7 @@ typedef Parser *ParsePtr; /* Pointer to parser structure */
#define DB_HASHSTATS 0x080
#define DB_TRANSLATE 0x100
#define DB_NONCONST 0x200
#define DB_UNUSED_VARS 0x400
/* Enumeration of the tokens */
enum TokTypes
@@ -252,6 +256,7 @@ typedef struct {
#define RUN_CMDLINE 0x01
#define RUN_SCRIPT 0x02
#define RUN_NOTOWNER 0x04
#define RUN_IN_EVAL 0x08
/* Flags for the SimpleCalendar format */
#define SC_AMPM 0 /* Time shown as 3:00am, etc. */

View File

@@ -214,7 +214,7 @@ int DoFset(ParsePtr p)
file, do nothing */
existing = FindUserFunc(DBufValue(&buf));
if (existing) {
if (!strcmp(existing->filename, FileName) &&
if (!strcmp(existing->filename, GetCurrentFilename()) &&
strcmp(existing->filename, "[cmdline]") &&
existing->lineno == LineNo) {
DBufFree(&buf);
@@ -242,14 +242,10 @@ int DoFset(ParsePtr p)
DBufFree(&buf);
return E_NO_MEM;
}
if (FileName) {
func->filename = StrDup(FileName);
if (GetCurrentFilename()) {
func->filename = GetCurrentFilename();
} else {
func->filename = StrDup("[cmdline]");
}
if (!func->filename) {
free(func);
return E_NO_MEM;
func->filename = "[cmdline]";
}
func->lineno = LineNo;
func->lineno_start = LineNoStart;
@@ -393,9 +389,6 @@ static void DestroyUserFunc(UserFunc *f)
/* Free the function definition */
if (f->node) free_expr_tree(f->node);
/* Free the filename */
if (f->filename) free( (char *) f->filename);
/* Free arg names */
if (f->args) {
for (i=0; i<f->nargs; i++) {

View File

@@ -560,6 +560,8 @@ Var *FindVar(char const *str, int create)
v->v.type = INT_TYPE;
v->v.v.val = 0;
v->preserve = 0;
v->filename = "";
v->lineno = 0;
StrnCpy(v->name, str, VAR_NAME_LEN);
hash_table_insert(&VHashTbl, v);
@@ -579,6 +581,9 @@ int DeleteVar(char const *str)
v = FindVar(str, 0);
if (!v) return E_NOSUCH_VAR;
if ((DebugFlag & DB_UNUSED_VARS) && !v->used_since_set) {
Eprint(tr("`%s' UNSET without being used (previous SET: %s:%d)"), str, v->filename, v->lineno);
}
DestroyValue(v->v);
hash_table_delete(&VHashTbl, v);
return OK;
@@ -593,13 +598,26 @@ int DeleteVar(char const *str)
/***************************************************************/
int SetVar(char const *str, Value const *val, int nonconst_expr)
{
Var *v = FindVar(str, 1);
Var *v = NULL;
if (DebugFlag & DB_UNUSED_VARS) {
v = FindVar(str, 0);
if (v && !(v->used_since_set)) {
Eprint(tr("`%s' re-SET without being used (previous SET: %s:%d)"), str, v->filename, v->lineno);
}
}
if (!v) {
v = FindVar(str, 1);
}
if (!v) return E_NO_MEM; /* Only way FindVar can fail */
DestroyValue(v->v);
v->v = *val;
v->nonconstant = nonconst_expr;
v->is_constant = ! nonconst_expr;
v->used_since_set = 0;
v->filename = GetCurrentFilename();
v->lineno = LineNo;
return OK;
}
@@ -620,6 +638,7 @@ int GetVarValue(char const *str, Value *val)
Eprint("%s: `%s'", GetErr(E_NOSUCH_VAR), str);
return E_NOSUCH_VAR;
}
v->used_since_set = 1;
return CopyValue(val, &v->v);
}
@@ -651,8 +670,8 @@ int DoSet (Parser *p)
}
var = FindVar(DBufValue(&buf), 0);
if (var) {
nonconst_debug(var->nonconstant, tr("Potential variable assignment considered non-constant because of context"));
var->nonconstant = 1;
nonconst_debug(!var->is_constant, tr("Potential variable assignment considered non-constant because of context"));
var->is_constant = 0;
}
DBufFree(&buf);
return OK;
@@ -785,7 +804,7 @@ int DoDump(ParsePtr p)
fprintf(ErrFp, "%s ", v->name);
PrintValue(&(v->v), ErrFp);
if (dump_constness) {
if (!v->nonconstant) {
if (v->is_constant) {
fprintf(ErrFp, " <const>");
}
}
@@ -820,7 +839,7 @@ void DumpVarTable(int dump_constness)
fprintf(ErrFp, "%s ", v->name);
PrintValue(&(v->v), ErrFp);
if (dump_constness) {
if (!v->nonconstant) {
if (v->is_constant) {
fprintf(ErrFp, " <const>");
}
}
@@ -828,6 +847,23 @@ void DumpVarTable(int dump_constness)
}
}
void DumpUnusedVars(void)
{
Var *v;
int done_header = 0;
hash_table_for_each(v, &VHashTbl) {
if (v->used_since_set) {
continue;
}
if (!done_header) {
fprintf(ErrFp, "%s\n", tr("The following variables were set, but not subsequently used:"));
done_header = 1;
}
fprintf(ErrFp, "\t%s - %s %s:%d\n", v->name, tr("defined at"), v->filename, v->lineno);
}
}
/***************************************************************/
/* */
/* DestroyVars */
@@ -871,6 +907,9 @@ int PreserveVar(char const *name)
v = FindVar(name, 1);
if (!v) return E_NO_MEM;
v->preserve = 1;
/* Assume we're gonna use the variable */
v->used_since_set = 1;
return OK;
}

View File

@@ -730,8 +730,23 @@ EOF
# Test year-folding
TZ=America/Toronto ../src/remind -dx ../tests/yearfold.rem >> ../tests/test.out 2>&1
# Test unused-variable debugging
../src/remind -du - <<'EOF' >> ../tests/test.out 2>&1
set a 1
set b a*2
set c "What"
if c
set d "Told ya!"
endif
set x 44
set x 45
set y 1000
unset y
EOF
# Make sure all the include files are ok
find ../include -type f -name '*.rem' | while read x; do ../src/remind -n $x 1 Jan 2024 2>>../tests/test.out 1>/dev/null; done
find ../include -type f -name '*.rem' | while read x; do ../src/remind -du -n $x 1 Jan 2024 2>>../tests/test.out 1>/dev/null; done
cmp -s ../tests/test.out ../tests/test.cmp
if [ "$?" = "0" ]; then

View File

@@ -16466,10 +16466,14 @@ IF today() < '1990-01-01'
../tests/test.rem(1556): Potential variable assignment considered non-constant because of context
ENDIF
dump -c a
set b const(today())
../tests/test.rem(1559): Non-constant built-in function `today' makes expression non-constant
../tests/test.rem(1559): Non-constant expression converted to constant by `const' built-in function
dump -c a b
Variable Value
a 1
b 1991-02-16 <const>
DEBUG -n
@@ -16491,16 +16495,16 @@ Variable Value
a 1991-02-17
set a eval("1 +")
eval("1 +") => ../tests/test.rem(1569): Unexpected end of line
eval("1 +") => ../tests/test.rem(1570): Unexpected end of line
1 +
^-- here
Unexpected end of line
set a eval("1/0")
eval("1/0") => 1 / 0 => Division by zero
../tests/test.rem(1570): `/': Division by zero
../tests/test.rem(1571): `/': Division by zero
Division by zero
set a eval("1 / / 2")
eval("1 / / 2") => ../tests/test.rem(1571): Illegal character `/'
eval("1 / / 2") => ../tests/test.rem(1572): Illegal character `/'
1 / / 2
^-- here
Illegal character
@@ -16514,10 +16518,46 @@ catch(*Division by zero*, 34) => 34
set a catch(eval("1 / / 2"), 35)
eval("1 / / 2") => Illegal character
catch(*Illegal character*, 35) => 35
# Ensure RUN is disabled in eval
set a shell("echo foo")
shell("echo foo") => "foo"
set a eval("shell(\"echo foo\")")
eval("shell(\"echo foo\")") => shell("echo foo") => RUN disabled
../tests/test.rem(1579): shell(): RUN disabled
RUN disabled
set a shell("echo foo")
shell("echo foo") => "foo"
FSET i() shell("echo foo")
set a i()
Entering UserFN i()
shell("echo foo") => "foo"
Leaving UserFN i() => "foo"
set a eval("i()")
eval("i()") => Entering UserFN i()
shell("echo foo") => RUN disabled
../tests/test.rem(1584): shell(): RUN disabled
../tests/test.rem(1582): [#0] In function `i'
Leaving UserFN i() => RUN disabled
RUN disabled
set a i()
Entering UserFN i()
shell("echo foo") => "foo"
Leaving UserFN i() => "foo"
FUNSET i
set a "eval(\"1\")+ shell(\"ls\")"
set b eval(a)
a => "eval(\"1\")+ shell(\"ls\")"
eval("eval(\"1\")+ shell(\"ls\")") => eval("1") => 1
shell("ls") => RUN disabled
../tests/test.rem(1588): shell(): RUN disabled
RUN disabled
DEBUG -x
DEBUG -e
../tests/test.rem(1581): eval(): Too many recursive function calls
../tests/test.rem(1596): eval(): Too many recursive function calls
Base: 1991-02-09
Base: 1991-02-09
Variable hash table statistics:
@@ -18922,10 +18962,10 @@ September 30
2007/08/16 * * * * Should be included by 02.rem
# rem2ps end
Feb 29 Bug Test
-(1): Trig = Sunday, 3 March, 2024
-stdin-(1): Trig = Sunday, 3 March, 2024
No reminders.
Mon 31 Dec Bug Test
-(1): Expired
-stdin-(1): Expired
No reminders.
Color Test
(0lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk(B
@@ -20237,7 +20277,7 @@ Hi
How are you?
OK
MON WKDAY DAY across year test
-(1): Trig = Monday, 3 January, 2000
-stdin-(1): Trig = Monday, 3 January, 2000
No reminders.
Sort Test
Reminders for Saturday, 1st January, 2000:
@@ -20253,6 +20293,7 @@ Timed
Untimed
Purge Test
../tests/purge_dir/f3.rem(62): Attempt to redefine built-in function: `const'
../tests/purge_dir/f3.rem(76): `/': Division by zero
../tests/purge_dir/f3.rem(76): `/': Division by zero
F1
@@ -22763,11 +22804,11 @@ January 2012 31 0 0
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
December 31
February 29
{"date":"2012-01-02","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-09","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-16","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-23","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-30","filename":"-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-02","filename":"-stdin-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-09","filename":"-stdin-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-16","filename":"-stdin-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-23","filename":"-stdin-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
{"date":"2012-01-30","filename":"-stdin-","lineno":1,"wd":["Monday"],"priority":5000,"omitfunc":"foo","nonconst_expr":1,"body":"bar"}
# rem2ps2 end
-stdin-(8:9): Number too high
-stdin-(8:9): Number too high
@@ -22804,9 +22845,9 @@ February 29
[
{
"translations":{"LANGID":"en"},"caltype":"monthly","monthname":"January","year":2012,"daysinmonth":31,"firstwkday":0,"mondayfirst":0,"daynames":["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],"prevmonthname":"December","daysinprevmonth":31,"prevmonthyear":2011,"nextmonthname":"February","daysinnextmonth":29,"nextmonthyear":2012,"entries":[
{"date":"2012-01-02","filename":"-","lineno":1,"d":2,"priority":5000,"body":"Normal"},
{"date":"2012-01-03","filename":"-","lineno":4,"lineno_start":3,"passthru":"COLOR","d":3,"priority":5000,"r":255,"g":0,"b":0,"rawbody":"%\"Red%\" on the calendar!","calendar_body":"Red","plain_body":"Red on the calendar!","body":"255 0 0 %\"Red%\" on the calendar!"},
{"date":"2012-01-04","filename":"-","lineno":6,"d":4,"priority":5000,"body":"Normal"}
{"date":"2012-01-02","filename":"-stdin-","lineno":1,"d":2,"priority":5000,"body":"Normal"},
{"date":"2012-01-03","filename":"-stdin-","lineno":4,"lineno_start":3,"passthru":"COLOR","d":3,"priority":5000,"r":255,"g":0,"b":0,"rawbody":"%\"Red%\" on the calendar!","calendar_body":"Red","plain_body":"Red on the calendar!","body":"255 0 0 %\"Red%\" on the calendar!"},
{"date":"2012-01-04","filename":"-stdin-","lineno":6,"d":4,"priority":5000,"body":"Normal"}
]
}
]
@@ -23593,72 +23634,72 @@ In test mode, the system time is fixed at 2025-01-06@19:00
{"response":"queue","queue":[{"priority":2,"eventstart":"2025-01-06T23:59","time":"23:59","nexttime":"23:59","tdelta":0,"trep":0,"qid":"42424242","rundisabled":0,"ntrig":1,"filename":"../tests/queue2.rem","lineno":1,"type":"MSG_TYPE","body":"XXXX"},{"priority":999,"eventstart":"2025-01-06T23:58","info":{"info2":"Nope","info3":"heh"},"time":"23:58","nexttime":"23:58","tdelta":0,"trep":0,"qid":"42424242","rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":5,"type":"MSG_TYPE","body":"quux"},{"priority":42,"eventstart":"2025-01-06T23:57","info":{"info":"yuppers"},"time":"23:57","nexttime":"23:57","tdelta":0,"trep":0,"qid":"42424242","rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":4,"type":"MSG_TYPE","body":"bar"},{"priority":5000,"eventstart":"2025-01-06T23:56","time":"23:56","nexttime":"23:56","tdelta":0,"trep":0,"qid":"42424242","rundisabled":0,"ntrig":1,"filename":"../tests/queue1.rem","lineno":3,"type":"MSG_TYPE","body":"foo"}],"command":"QUEUE"}
BANNER %
REM 29 MSG One
-(2): Trig = Thursday, 29 February, 2024
-stdin-(2): Trig = Thursday, 29 February, 2024
REM 29 Feb MSG two
-(3): Trig = Thursday, 29 February, 2024
-stdin-(3): Trig = Thursday, 29 February, 2024
REM 29 2024 MSG three
-(4): Trig = Thursday, 29 February, 2024
-stdin-(4): Trig = Thursday, 29 February, 2024
REM 29 Feb 2024 MSG four
-(5): Trig = Thursday, 29 February, 2024
-stdin-(5): Trig = Thursday, 29 February, 2024
REM Thursday 29 MSG One
-(6): Trig = Thursday, 29 February, 2024
-stdin-(6): Trig = Thursday, 29 February, 2024
REM Thursday 29 Feb MSG two
-(7): Trig = Thursday, 29 February, 2024
-stdin-(7): Trig = Thursday, 29 February, 2024
REM Thursday 29 2024 MSG three
-(8): Trig = Thursday, 29 February, 2024
-stdin-(8): Trig = Thursday, 29 February, 2024
REM Thursday 29 Feb 2024 MSG four
-(9): Trig = Thursday, 29 February, 2024
-stdin-(9): Trig = Thursday, 29 February, 2024
REM Wednesday 29 MSG One
-(10): Trig = Wednesday, 6 March, 2024
-stdin-(10): Trig = Wednesday, 6 March, 2024
REM Wednesday 29 Feb MSG two
-(11): Trig = Wednesday, 6 March, 2024
-stdin-(11): Trig = Wednesday, 6 March, 2024
REM Wednesday 29 2024 MSG three
-(12): Trig = Wednesday, 6 March, 2024
-stdin-(12): Trig = Wednesday, 6 March, 2024
REM Wednesday 29 Feb 2024 MSG four
-(13): Trig = Wednesday, 6 March, 2024
-stdin-(13): Trig = Wednesday, 6 March, 2024
REM Friday 29 MSG One
-(14): Trig = Friday, 1 March, 2024
-stdin-(14): Trig = Friday, 1 March, 2024
REM Friday 29 Feb MSG two
-(15): Trig = Friday, 1 March, 2024
-stdin-(15): Trig = Friday, 1 March, 2024
REM Friday 29 2024 MSG three
-(16): Trig = Friday, 1 March, 2024
-stdin-(16): Trig = Friday, 1 March, 2024
REM Friday 29 Feb 2024 MSG four
-(17): Trig = Friday, 1 March, 2024
-stdin-(17): Trig = Friday, 1 March, 2024
No reminders.
BANNER %
REM 29 MSG One
-(2): Trig = Friday, 29 March, 2024
-stdin-(2): Trig = Friday, 29 March, 2024
REM 29 Feb MSG two
-(3): Trig = Tuesday, 29 February, 2028
-stdin-(3): Trig = Tuesday, 29 February, 2028
REM 29 2024 MSG three
-(4): Trig = Friday, 29 March, 2024
-stdin-(4): Trig = Friday, 29 March, 2024
REM 29 Feb 2024 MSG four
-(5): Expired
-stdin-(5): Expired
REM Thursday 29 MSG One
-(6): Trig = Thursday, 4 April, 2024
-stdin-(6): Trig = Thursday, 4 April, 2024
REM Thursday 29 Feb MSG two
-(7): Trig = Thursday, 2 March, 2028
-stdin-(7): Trig = Thursday, 2 March, 2028
REM Thursday 29 2024 MSG three
-(8): Trig = Thursday, 4 April, 2024
-stdin-(8): Trig = Thursday, 4 April, 2024
REM Thursday 29 Feb 2024 MSG four
-(9): Expired
-stdin-(9): Expired
REM Wednesday 29 MSG One
-(10): Trig = Wednesday, 6 March, 2024
-stdin-(10): Trig = Wednesday, 6 March, 2024
REM Wednesday 29 Feb MSG two
-(11): Trig = Wednesday, 6 March, 2024
-stdin-(11): Trig = Wednesday, 6 March, 2024
REM Wednesday 29 2024 MSG three
-(12): Trig = Wednesday, 6 March, 2024
-stdin-(12): Trig = Wednesday, 6 March, 2024
REM Wednesday 29 Feb 2024 MSG four
-(13): Trig = Wednesday, 6 March, 2024
-stdin-(13): Trig = Wednesday, 6 March, 2024
REM Friday 29 MSG One
-(14): Trig = Friday, 1 March, 2024
-stdin-(14): Trig = Friday, 1 March, 2024
REM Friday 29 Feb MSG two
-(15): Trig = Friday, 1 March, 2024
-stdin-(15): Trig = Friday, 1 March, 2024
REM Friday 29 2024 MSG three
-(16): Trig = Friday, 1 March, 2024
-stdin-(16): Trig = Friday, 1 March, 2024
REM Friday 29 Feb 2024 MSG four
-(17): Trig = Friday, 1 March, 2024
-stdin-(17): Trig = Friday, 1 March, 2024
One
@@ -23670,75 +23711,75 @@ four
BANNER %
REM 29 MSG One
-(2): Trig = Saturday, 29 March, 2025
-stdin-(2): Trig = Saturday, 29 March, 2025
REM 29 Feb MSG two
-(3): Trig = Tuesday, 29 February, 2028
-stdin-(3): Trig = Tuesday, 29 February, 2028
REM 29 2025 MSG three
-(4): Trig = Saturday, 29 March, 2025
-stdin-(4): Trig = Saturday, 29 March, 2025
REM 29 Feb 2025 MSG four
-stdin-(5): Bad date specification
REM Thursday 29 MSG One
-(6): Trig = Thursday, 3 April, 2025
-stdin-(6): Trig = Thursday, 3 April, 2025
REM Thursday 29 Feb MSG two
-(7): Trig = Thursday, 2 March, 2028
-stdin-(7): Trig = Thursday, 2 March, 2028
REM Thursday 29 2025 MSG three
-(8): Trig = Thursday, 3 April, 2025
-stdin-(8): Trig = Thursday, 3 April, 2025
REM Thursday 29 Feb 2025 MSG four
-stdin-(9): Bad date specification
REM Wednesday 29 MSG One
-(10): Trig = Wednesday, 2 April, 2025
-stdin-(10): Trig = Wednesday, 2 April, 2025
REM Wednesday 29 Feb MSG two
-(11): Trig = Wednesday, 1 March, 2028
-stdin-(11): Trig = Wednesday, 1 March, 2028
REM Wednesday 29 2025 MSG three
-(12): Trig = Wednesday, 2 April, 2025
-stdin-(12): Trig = Wednesday, 2 April, 2025
REM Wednesday 29 Feb 2025 MSG four
-stdin-(13): Bad date specification
REM Friday 29 MSG One
-(14): Trig = Friday, 4 April, 2025
-stdin-(14): Trig = Friday, 4 April, 2025
REM Friday 29 Feb MSG two
-(15): Trig = Friday, 3 March, 2028
-stdin-(15): Trig = Friday, 3 March, 2028
REM Friday 29 2025 MSG three
-(16): Trig = Friday, 4 April, 2025
-stdin-(16): Trig = Friday, 4 April, 2025
REM Friday 29 Feb 2025 MSG four
-stdin-(17): Bad date specification
No reminders.
BANNER %
REM 29 MSG One
-(2): Trig = Saturday, 29 March, 2025
-stdin-(2): Trig = Saturday, 29 March, 2025
REM 29 Feb MSG two
-(3): Trig = Tuesday, 29 February, 2028
-stdin-(3): Trig = Tuesday, 29 February, 2028
REM 29 2025 MSG three
-(4): Trig = Saturday, 29 March, 2025
-stdin-(4): Trig = Saturday, 29 March, 2025
REM 29 Feb 2025 MSG four
-stdin-(5): Bad date specification
REM Thursday 29 MSG One
-(6): Trig = Thursday, 3 April, 2025
-stdin-(6): Trig = Thursday, 3 April, 2025
REM Thursday 29 Feb MSG two
-(7): Trig = Thursday, 2 March, 2028
-stdin-(7): Trig = Thursday, 2 March, 2028
REM Thursday 29 2025 MSG three
-(8): Trig = Thursday, 3 April, 2025
-stdin-(8): Trig = Thursday, 3 April, 2025
REM Thursday 29 Feb 2025 MSG four
-stdin-(9): Bad date specification
REM Wednesday 29 MSG One
-(10): Trig = Wednesday, 2 April, 2025
-stdin-(10): Trig = Wednesday, 2 April, 2025
REM Wednesday 29 Feb MSG two
-(11): Trig = Wednesday, 1 March, 2028
-stdin-(11): Trig = Wednesday, 1 March, 2028
REM Wednesday 29 2025 MSG three
-(12): Trig = Wednesday, 2 April, 2025
-stdin-(12): Trig = Wednesday, 2 April, 2025
REM Wednesday 29 Feb 2025 MSG four
-stdin-(13): Bad date specification
REM Friday 29 MSG One
-(14): Trig = Friday, 4 April, 2025
-stdin-(14): Trig = Friday, 4 April, 2025
REM Friday 29 Feb MSG two
-(15): Trig = Friday, 3 March, 2028
-stdin-(15): Trig = Friday, 3 March, 2028
REM Friday 29 2025 MSG three
-(16): Trig = Friday, 4 April, 2025
-stdin-(16): Trig = Friday, 4 April, 2025
REM Friday 29 Feb 2025 MSG four
-stdin-(17): Bad date specification
No reminders.
-(2): Trig = Thursday, 29 February, 2024
-stdin-(2): Trig = Thursday, 29 February, 2024
No bug
Variable Value
@@ -24156,7 +24197,7 @@ Translation hash table statistics:
Expression nodes high-water: 499
Expression nodes leaked: 0
Parse level high-water: 2001
-stdin-(14): Unmatched PUSH-OMIT-CONTEXT at -(7)
-stdin-(14): Unmatched PUSH-OMIT-CONTEXT at -stdin-(7)
-stdin-(14): Warning: PUSH-OMIT-CONTEXT without matching POP-OMIT-CONTEXT
No reminders.
../tests/if2.rem(6): Warning: Missing ENDIF
@@ -24460,6 +24501,7 @@ char
choose
coerce
columns
const
current
date
datepart
@@ -24912,6 +24954,7 @@ TRANSLATE "Missing REM type; assuming MSG" ""
TRANSLATE "No Adar A in %d" ""
TRANSLATE "No substition function `%s' defined" ""
TRANSLATE "Non-constant built-in function `%s' makes expression non-constant" ""
TRANSLATE "Non-constant expression converted to constant by `const' built-in function" ""
TRANSLATE "Not setting $OnceFile: Already processed a reminder with a ONCE clause" ""
TRANSLATE "OMIT: UNTIL not allowed; did you mean THROUGH?" ""
TRANSLATE "OMITFUNC counts as a non-constant expression" ""
@@ -24930,6 +24973,7 @@ TRANSLATE "SECURITY: Won't read non-root-owned file or directory when running as
TRANSLATE "SECURITY: Won't read world-writable file or directory!" ""
TRANSLATE "Scanning directory `%s' for *.rem files" ""
TRANSLATE "System variable `$%s' makes expression non-constant" ""
TRANSLATE "The following variables were set, but not subsequently used:" ""
TRANSLATE "Undefined %s function: `%s'" ""
TRANSLATE "Unmatched PUSH-OMIT-CONTEXT at %s(%d)" ""
TRANSLATE "Unrecognized command; interpreting as REM" ""
@@ -24950,6 +24994,9 @@ TRANSLATE "Warning: Variable name `%.*s...' truncated to `%.*s'" ""
TRANSLATE "You have OMITted everything! The space-time continuum is at risk." ""
TRANSLATE "\\x00 is not a valid escape sequence" ""
TRANSLATE "`%%%c' substitution sequence should not be used without an AT clause" ""
TRANSLATE "`%s' UNSET without being used (previous SET: %s:%d)" ""
TRANSLATE "`%s' re-SET without being used (previous SET: %s:%d)" ""
TRANSLATE "defined at" ""
TRANSLATE "did you mean" ""
TRANSLATE "here" ""
TRANSLATE "psmoon() is deprecated; use SPECIAL MOON instead." ""
@@ -25063,10 +25110,10 @@ February 2024 29 4 0
Sunday Monday Tuesday Wednesday Thursday Friday Saturday
January 31
March 31
{"date":"2024-02-07","filename":"-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-14","filename":"-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-21","filename":"-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-28","filename":"-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-07","filename":"-stdin-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-14","filename":"-stdin-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-21","filename":"-stdin-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
{"date":"2024-02-28","filename":"-stdin-","lineno":1,"info":{"location":"here","summary":"Nope"},"wd":["Wednesday"],"priority":5000,"rawbody":"Meeting [triginfo(\"location\")] %<summary> %<nonexist> [triginfo(\"cabbage\")]","body":"Meeting here Nope "}
# rem2ps2 end
-stdin-(1): Invalid INFO string: Must be of the form "Header: Value"
-stdin-(2): Invalid INFO string: Must be of the form "Header: Value"
@@ -38671,3 +38718,10 @@ utctolocal(2050-03-13@05:00) => 2050-03-13@00:00
utctolocal(2050-11-06@04:00) => 2050-11-06@00:00
utctolocal(2050-11-06@07:00) => 2050-11-06@02:00
No reminders.
-stdin-(9): `x' re-SET without being used (previous SET: -stdin-:8)
-stdin-(11): `y' UNSET without being used (previous SET: -stdin-:10)
The following variables were set, but not subsequently used:
b - defined at -stdin-:2
x - defined at -stdin-:9
d - defined at -stdin-:5
No reminders.

View File

@@ -1556,7 +1556,8 @@ IF today() < '1990-01-01'
SET a 2
ENDIF
dump -c a
set b const(today())
dump -c a b
DEBUG -n
@@ -1572,6 +1573,20 @@ set a eval("1 / / 2")
set a catch(eval("1 +"), 33)
set a catch(eval("1/0"), 34)
set a catch(eval("1 / / 2"), 35)
# Ensure RUN is disabled in eval
set a shell("echo foo")
set a eval("shell(\"echo foo\")")
set a shell("echo foo")
FSET i() shell("echo foo")
set a i()
set a eval("i()")
set a i()
FUNSET i
set a "eval(\"1\")+ shell(\"ls\")"
set b eval(a)
DEBUG -x
DEBUG -e