remind-rb 6.2.10.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (658) hide show
  1. checksums.yaml +7 -0
  2. data/LICENSE +328 -0
  3. data/README.md +141 -0
  4. data/ext/remind/shim.c +379 -0
  5. data/lib/remind/builder.rb +252 -0
  6. data/lib/remind/library.rb +141 -0
  7. data/lib/remind/native.rb +257 -0
  8. data/lib/remind/reminder.rb +527 -0
  9. data/lib/remind/runtime.rb +130 -0
  10. data/lib/remind/session.rb +246 -0
  11. data/lib/remind/source.rb +160 -0
  12. data/lib/remind/value.rb +170 -0
  13. data/lib/remind/version.rb +13 -0
  14. data/lib/remind.rb +147 -0
  15. data/remind-v06.02.10/COPYRIGHT +300 -0
  16. data/remind-v06.02.10/configure +5684 -0
  17. data/remind-v06.02.10/configure.ac +131 -0
  18. data/remind-v06.02.10/docs/WHATSNEW +3858 -0
  19. data/remind-v06.02.10/include/ansitext.rem +35 -0
  20. data/remind-v06.02.10/include/holidays/ad/02.rem +15 -0
  21. data/remind-v06.02.10/include/holidays/ad/03.rem +14 -0
  22. data/remind-v06.02.10/include/holidays/ad/04.rem +14 -0
  23. data/remind-v06.02.10/include/holidays/ad/05.rem +14 -0
  24. data/remind-v06.02.10/include/holidays/ad/06.rem +16 -0
  25. data/remind-v06.02.10/include/holidays/ad/07.rem +15 -0
  26. data/remind-v06.02.10/include/holidays/ad/08.rem +14 -0
  27. data/remind-v06.02.10/include/holidays/ad.rem +28 -0
  28. data/remind-v06.02.10/include/holidays/ae.rem +10 -0
  29. data/remind-v06.02.10/include/holidays/al.rem +33 -0
  30. data/remind-v06.02.10/include/holidays/am.rem +19 -0
  31. data/remind-v06.02.10/include/holidays/ao.rem +41 -0
  32. data/remind-v06.02.10/include/holidays/ar.rem +38 -0
  33. data/remind-v06.02.10/include/holidays/as.rem +40 -0
  34. data/remind-v06.02.10/include/holidays/at/1.rem +15 -0
  35. data/remind-v06.02.10/include/holidays/at/2.rem +16 -0
  36. data/remind-v06.02.10/include/holidays/at/3.rem +15 -0
  37. data/remind-v06.02.10/include/holidays/at/4.rem +15 -0
  38. data/remind-v06.02.10/include/holidays/at/5.rem +15 -0
  39. data/remind-v06.02.10/include/holidays/at/6.rem +15 -0
  40. data/remind-v06.02.10/include/holidays/at/7.rem +15 -0
  41. data/remind-v06.02.10/include/holidays/at/8.rem +15 -0
  42. data/remind-v06.02.10/include/holidays/at/9.rem +15 -0
  43. data/remind-v06.02.10/include/holidays/at.rem +32 -0
  44. data/remind-v06.02.10/include/holidays/au/act.rem +27 -0
  45. data/remind-v06.02.10/include/holidays/au/nsw.rem +25 -0
  46. data/remind-v06.02.10/include/holidays/au/nt.rem +28 -0
  47. data/remind-v06.02.10/include/holidays/au/qld.rem +23 -0
  48. data/remind-v06.02.10/include/holidays/au/sa.rem +29 -0
  49. data/remind-v06.02.10/include/holidays/au/tas.rem +16 -0
  50. data/remind-v06.02.10/include/holidays/au/vic.rem +24 -0
  51. data/remind-v06.02.10/include/holidays/au/wa.rem +24 -0
  52. data/remind-v06.02.10/include/holidays/au.rem +21 -0
  53. data/remind-v06.02.10/include/holidays/aw.rem +19 -0
  54. data/remind-v06.02.10/include/holidays/az.rem +44 -0
  55. data/remind-v06.02.10/include/holidays/ba/bih.rem +23 -0
  56. data/remind-v06.02.10/include/holidays/ba/brc.rem +20 -0
  57. data/remind-v06.02.10/include/holidays/ba/srp.rem +23 -0
  58. data/remind-v06.02.10/include/holidays/ba.rem +22 -0
  59. data/remind-v06.02.10/include/holidays/bb.rem +28 -0
  60. data/remind-v06.02.10/include/holidays/bd.rem +14 -0
  61. data/remind-v06.02.10/include/holidays/be.rem +24 -0
  62. data/remind-v06.02.10/include/holidays/bf.rem +29 -0
  63. data/remind-v06.02.10/include/holidays/bg.rem +34 -0
  64. data/remind-v06.02.10/include/holidays/bh.rem +11 -0
  65. data/remind-v06.02.10/include/holidays/bi.rem +30 -0
  66. data/remind-v06.02.10/include/holidays/bn.rem +22 -0
  67. data/remind-v06.02.10/include/holidays/bo/b.rem +13 -0
  68. data/remind-v06.02.10/include/holidays/bo/c.rem +13 -0
  69. data/remind-v06.02.10/include/holidays/bo/h.rem +13 -0
  70. data/remind-v06.02.10/include/holidays/bo/l.rem +13 -0
  71. data/remind-v06.02.10/include/holidays/bo/n.rem +13 -0
  72. data/remind-v06.02.10/include/holidays/bo/o.rem +13 -0
  73. data/remind-v06.02.10/include/holidays/bo/p.rem +13 -0
  74. data/remind-v06.02.10/include/holidays/bo/s.rem +13 -0
  75. data/remind-v06.02.10/include/holidays/bo/t.rem +13 -0
  76. data/remind-v06.02.10/include/holidays/bo.rem +32 -0
  77. data/remind-v06.02.10/include/holidays/br/ac.rem +21 -0
  78. data/remind-v06.02.10/include/holidays/br/al.rem +16 -0
  79. data/remind-v06.02.10/include/holidays/br/am.rem +13 -0
  80. data/remind-v06.02.10/include/holidays/br/ap.rem +15 -0
  81. data/remind-v06.02.10/include/holidays/br/ba.rem +13 -0
  82. data/remind-v06.02.10/include/holidays/br/ce.rem +15 -0
  83. data/remind-v06.02.10/include/holidays/br/df.rem +14 -0
  84. data/remind-v06.02.10/include/holidays/br/es.rem +13 -0
  85. data/remind-v06.02.10/include/holidays/br/go.rem +14 -0
  86. data/remind-v06.02.10/include/holidays/br/ma.rem +13 -0
  87. data/remind-v06.02.10/include/holidays/br/mg.rem +13 -0
  88. data/remind-v06.02.10/include/holidays/br/ms.rem +13 -0
  89. data/remind-v06.02.10/include/holidays/br/pa.rem +13 -0
  90. data/remind-v06.02.10/include/holidays/br/pb.rem +13 -0
  91. data/remind-v06.02.10/include/holidays/br/pe.rem +13 -0
  92. data/remind-v06.02.10/include/holidays/br/pi.rem +13 -0
  93. data/remind-v06.02.10/include/holidays/br/pr.rem +13 -0
  94. data/remind-v06.02.10/include/holidays/br/rj.rem +13 -0
  95. data/remind-v06.02.10/include/holidays/br/rn.rem +14 -0
  96. data/remind-v06.02.10/include/holidays/br/ro.rem +14 -0
  97. data/remind-v06.02.10/include/holidays/br/rr.rem +13 -0
  98. data/remind-v06.02.10/include/holidays/br/rs.rem +13 -0
  99. data/remind-v06.02.10/include/holidays/br/sc.rem +14 -0
  100. data/remind-v06.02.10/include/holidays/br/se.rem +13 -0
  101. data/remind-v06.02.10/include/holidays/br/sp.rem +13 -0
  102. data/remind-v06.02.10/include/holidays/br/to.rem +15 -0
  103. data/remind-v06.02.10/include/holidays/br.rem +33 -0
  104. data/remind-v06.02.10/include/holidays/bs.rem +26 -0
  105. data/remind-v06.02.10/include/holidays/bw.rem +31 -0
  106. data/remind-v06.02.10/include/holidays/by.rem +17 -0
  107. data/remind-v06.02.10/include/holidays/bz.rem +43 -0
  108. data/remind-v06.02.10/include/holidays/ca/ab.rem +17 -0
  109. data/remind-v06.02.10/include/holidays/ca/bc.rem +14 -0
  110. data/remind-v06.02.10/include/holidays/ca/mb.rem +16 -0
  111. data/remind-v06.02.10/include/holidays/ca/nb.rem +14 -0
  112. data/remind-v06.02.10/include/holidays/ca/nl.rem +19 -0
  113. data/remind-v06.02.10/include/holidays/ca/ns.rem +16 -0
  114. data/remind-v06.02.10/include/holidays/ca/nt.rem +14 -0
  115. data/remind-v06.02.10/include/holidays/ca/nu.rem +16 -0
  116. data/remind-v06.02.10/include/holidays/ca/on.rem +16 -0
  117. data/remind-v06.02.10/include/holidays/ca/pe.rem +13 -0
  118. data/remind-v06.02.10/include/holidays/ca/qc.rem +18 -0
  119. data/remind-v06.02.10/include/holidays/ca/sk.rem +14 -0
  120. data/remind-v06.02.10/include/holidays/ca/yt.rem +17 -0
  121. data/remind-v06.02.10/include/holidays/ca.rem +37 -0
  122. data/remind-v06.02.10/include/holidays/cg.rem +17 -0
  123. data/remind-v06.02.10/include/holidays/ch/ag.rem +22 -0
  124. data/remind-v06.02.10/include/holidays/ch/ai.rem +20 -0
  125. data/remind-v06.02.10/include/holidays/ch/ar.rem +16 -0
  126. data/remind-v06.02.10/include/holidays/ch/be.rem +17 -0
  127. data/remind-v06.02.10/include/holidays/ch/bl.rem +17 -0
  128. data/remind-v06.02.10/include/holidays/ch/bs.rem +17 -0
  129. data/remind-v06.02.10/include/holidays/ch/fr.rem +19 -0
  130. data/remind-v06.02.10/include/holidays/ch/ge.rem +17 -0
  131. data/remind-v06.02.10/include/holidays/ch/gl.rem +22 -0
  132. data/remind-v06.02.10/include/holidays/ch/gr.rem +18 -0
  133. data/remind-v06.02.10/include/holidays/ch/ju.rem +21 -0
  134. data/remind-v06.02.10/include/holidays/ch/lu.rem +21 -0
  135. data/remind-v06.02.10/include/holidays/ch/ne.rem +18 -0
  136. data/remind-v06.02.10/include/holidays/ch/nw.rem +24 -0
  137. data/remind-v06.02.10/include/holidays/ch/ow.rem +24 -0
  138. data/remind-v06.02.10/include/holidays/ch/sg.rem +20 -0
  139. data/remind-v06.02.10/include/holidays/ch/sh.rem +20 -0
  140. data/remind-v06.02.10/include/holidays/ch/so.rem +17 -0
  141. data/remind-v06.02.10/include/holidays/ch/sz.rem +22 -0
  142. data/remind-v06.02.10/include/holidays/ch/tg.rem +18 -0
  143. data/remind-v06.02.10/include/holidays/ch/ti.rem +23 -0
  144. data/remind-v06.02.10/include/holidays/ch/ur.rem +22 -0
  145. data/remind-v06.02.10/include/holidays/ch/vd.rem +17 -0
  146. data/remind-v06.02.10/include/holidays/ch/vs.rem +23 -0
  147. data/remind-v06.02.10/include/holidays/ch/zg.rem +23 -0
  148. data/remind-v06.02.10/include/holidays/ch/zh.rem +18 -0
  149. data/remind-v06.02.10/include/holidays/ch.rem +18 -0
  150. data/remind-v06.02.10/include/holidays/chinese-new-year.rem +86 -0
  151. data/remind-v06.02.10/include/holidays/cl/ap.rem +13 -0
  152. data/remind-v06.02.10/include/holidays/cl/nb.rem +13 -0
  153. data/remind-v06.02.10/include/holidays/cl.rem +46 -0
  154. data/remind-v06.02.10/include/holidays/cm.rem +21 -0
  155. data/remind-v06.02.10/include/holidays/co.rem +85 -0
  156. data/remind-v06.02.10/include/holidays/cr.rem +39 -0
  157. data/remind-v06.02.10/include/holidays/cu.rem +19 -0
  158. data/remind-v06.02.10/include/holidays/cw.rem +24 -0
  159. data/remind-v06.02.10/include/holidays/cy.rem +27 -0
  160. data/remind-v06.02.10/include/holidays/cz.rem +20 -0
  161. data/remind-v06.02.10/include/holidays/de/bb.rem +15 -0
  162. data/remind-v06.02.10/include/holidays/de/be.rem +13 -0
  163. data/remind-v06.02.10/include/holidays/de/bw.rem +15 -0
  164. data/remind-v06.02.10/include/holidays/de/by.rem +18 -0
  165. data/remind-v06.02.10/include/holidays/de/hb.rem +13 -0
  166. data/remind-v06.02.10/include/holidays/de/he.rem +13 -0
  167. data/remind-v06.02.10/include/holidays/de/hh.rem +13 -0
  168. data/remind-v06.02.10/include/holidays/de/mv.rem +14 -0
  169. data/remind-v06.02.10/include/holidays/de/ni.rem +13 -0
  170. data/remind-v06.02.10/include/holidays/de/nw.rem +14 -0
  171. data/remind-v06.02.10/include/holidays/de/rp.rem +14 -0
  172. data/remind-v06.02.10/include/holidays/de/sh.rem +13 -0
  173. data/remind-v06.02.10/include/holidays/de/sl.rem +15 -0
  174. data/remind-v06.02.10/include/holidays/de/sn.rem +14 -0
  175. data/remind-v06.02.10/include/holidays/de/st.rem +14 -0
  176. data/remind-v06.02.10/include/holidays/de/th.rem +14 -0
  177. data/remind-v06.02.10/include/holidays/de.rem +23 -0
  178. data/remind-v06.02.10/include/holidays/discordian.rem +25 -0
  179. data/remind-v06.02.10/include/holidays/dj.rem +12 -0
  180. data/remind-v06.02.10/include/holidays/dk.rem +23 -0
  181. data/remind-v06.02.10/include/holidays/dm.rem +24 -0
  182. data/remind-v06.02.10/include/holidays/do.rem +36 -0
  183. data/remind-v06.02.10/include/holidays/dz.rem +12 -0
  184. data/remind-v06.02.10/include/holidays/ec.rem +48 -0
  185. data/remind-v06.02.10/include/holidays/ee.rem +19 -0
  186. data/remind-v06.02.10/include/holidays/eg.rem +17 -0
  187. data/remind-v06.02.10/include/holidays/es/an.rem +17 -0
  188. data/remind-v06.02.10/include/holidays/es/ar.rem +17 -0
  189. data/remind-v06.02.10/include/holidays/es/as.rem +17 -0
  190. data/remind-v06.02.10/include/holidays/es/cb.rem +15 -0
  191. data/remind-v06.02.10/include/holidays/es/ce.rem +15 -0
  192. data/remind-v06.02.10/include/holidays/es/cl.rem +17 -0
  193. data/remind-v06.02.10/include/holidays/es/cm.rem +15 -0
  194. data/remind-v06.02.10/include/holidays/es/cn.rem +15 -0
  195. data/remind-v06.02.10/include/holidays/es/ct.rem +16 -0
  196. data/remind-v06.02.10/include/holidays/es/ex.rem +16 -0
  197. data/remind-v06.02.10/include/holidays/es/ga.rem +15 -0
  198. data/remind-v06.02.10/include/holidays/es/ib.rem +15 -0
  199. data/remind-v06.02.10/include/holidays/es/mc.rem +17 -0
  200. data/remind-v06.02.10/include/holidays/es/md.rem +16 -0
  201. data/remind-v06.02.10/include/holidays/es/ml.rem +15 -0
  202. data/remind-v06.02.10/include/holidays/es/nc.rem +15 -0
  203. data/remind-v06.02.10/include/holidays/es/pv.rem +15 -0
  204. data/remind-v06.02.10/include/holidays/es/ri.rem +16 -0
  205. data/remind-v06.02.10/include/holidays/es/vc.rem +16 -0
  206. data/remind-v06.02.10/include/holidays/es.rem +23 -0
  207. data/remind-v06.02.10/include/holidays/et.rem +20 -0
  208. data/remind-v06.02.10/include/holidays/fi.rem +43 -0
  209. data/remind-v06.02.10/include/holidays/fr/bl.rem +13 -0
  210. data/remind-v06.02.10/include/holidays/fr/ges.rem +14 -0
  211. data/remind-v06.02.10/include/holidays/fr/gp.rem +16 -0
  212. data/remind-v06.02.10/include/holidays/fr/gy.rem +13 -0
  213. data/remind-v06.02.10/include/holidays/fr/mf.rem +13 -0
  214. data/remind-v06.02.10/include/holidays/fr/mq.rem +15 -0
  215. data/remind-v06.02.10/include/holidays/fr/nc.rem +13 -0
  216. data/remind-v06.02.10/include/holidays/fr/pf.rem +15 -0
  217. data/remind-v06.02.10/include/holidays/fr/re.rem +13 -0
  218. data/remind-v06.02.10/include/holidays/fr/wf.rem +14 -0
  219. data/remind-v06.02.10/include/holidays/fr/yt.rem +13 -0
  220. data/remind-v06.02.10/include/holidays/fr.rem +18 -0
  221. data/remind-v06.02.10/include/holidays/ga.rem +18 -0
  222. data/remind-v06.02.10/include/holidays/gb/eng.rem +14 -0
  223. data/remind-v06.02.10/include/holidays/gb/nir.rem +20 -0
  224. data/remind-v06.02.10/include/holidays/gb/sct.rem +20 -0
  225. data/remind-v06.02.10/include/holidays/gb/wls.rem +14 -0
  226. data/remind-v06.02.10/include/holidays/gb.rem +27 -0
  227. data/remind-v06.02.10/include/holidays/ge.rem +24 -0
  228. data/remind-v06.02.10/include/holidays/gh.rem +34 -0
  229. data/remind-v06.02.10/include/holidays/gl.rem +25 -0
  230. data/remind-v06.02.10/include/holidays/gr.rem +37 -0
  231. data/remind-v06.02.10/include/holidays/gt.rem +24 -0
  232. data/remind-v06.02.10/include/holidays/gu.rem +37 -0
  233. data/remind-v06.02.10/include/holidays/hk.rem +25 -0
  234. data/remind-v06.02.10/include/holidays/hn.rem +18 -0
  235. data/remind-v06.02.10/include/holidays/hr.rem +21 -0
  236. data/remind-v06.02.10/include/holidays/ht.rem +34 -0
  237. data/remind-v06.02.10/include/holidays/hu.rem +20 -0
  238. data/remind-v06.02.10/include/holidays/id.rem +15 -0
  239. data/remind-v06.02.10/include/holidays/ie.rem +41 -0
  240. data/remind-v06.02.10/include/holidays/im.rem +26 -0
  241. data/remind-v06.02.10/include/holidays/in/ap.rem +14 -0
  242. data/remind-v06.02.10/include/holidays/in/as.rem +13 -0
  243. data/remind-v06.02.10/include/holidays/in/br.rem +14 -0
  244. data/remind-v06.02.10/include/holidays/in/cg.rem +13 -0
  245. data/remind-v06.02.10/include/holidays/in/gj.rem +15 -0
  246. data/remind-v06.02.10/include/holidays/in/hr.rem +14 -0
  247. data/remind-v06.02.10/include/holidays/in/ka.rem +13 -0
  248. data/remind-v06.02.10/include/holidays/in/kl.rem +14 -0
  249. data/remind-v06.02.10/include/holidays/in/mh.rem +15 -0
  250. data/remind-v06.02.10/include/holidays/in/mp.rem +13 -0
  251. data/remind-v06.02.10/include/holidays/in/od.rem +15 -0
  252. data/remind-v06.02.10/include/holidays/in/rj.rem +14 -0
  253. data/remind-v06.02.10/include/holidays/in/sk.rem +13 -0
  254. data/remind-v06.02.10/include/holidays/in/tn.rem +15 -0
  255. data/remind-v06.02.10/include/holidays/in/ts.rem +14 -0
  256. data/remind-v06.02.10/include/holidays/in/uk.rem +13 -0
  257. data/remind-v06.02.10/include/holidays/in/up.rem +13 -0
  258. data/remind-v06.02.10/include/holidays/in/wb.rem +16 -0
  259. data/remind-v06.02.10/include/holidays/in.rem +24 -0
  260. data/remind-v06.02.10/include/holidays/is.rem +23 -0
  261. data/remind-v06.02.10/include/holidays/it/ag.rem +13 -0
  262. data/remind-v06.02.10/include/holidays/it/al.rem +13 -0
  263. data/remind-v06.02.10/include/holidays/it/an.rem +13 -0
  264. data/remind-v06.02.10/include/holidays/it/andria.rem +13 -0
  265. data/remind-v06.02.10/include/holidays/it/ao.rem +13 -0
  266. data/remind-v06.02.10/include/holidays/it/ap.rem +13 -0
  267. data/remind-v06.02.10/include/holidays/it/aq.rem +13 -0
  268. data/remind-v06.02.10/include/holidays/it/ar.rem +13 -0
  269. data/remind-v06.02.10/include/holidays/it/at.rem +13 -0
  270. data/remind-v06.02.10/include/holidays/it/av.rem +13 -0
  271. data/remind-v06.02.10/include/holidays/it/ba.rem +13 -0
  272. data/remind-v06.02.10/include/holidays/it/barletta.rem +13 -0
  273. data/remind-v06.02.10/include/holidays/it/bg.rem +13 -0
  274. data/remind-v06.02.10/include/holidays/it/bl.rem +13 -0
  275. data/remind-v06.02.10/include/holidays/it/bn.rem +13 -0
  276. data/remind-v06.02.10/include/holidays/it/bo.rem +13 -0
  277. data/remind-v06.02.10/include/holidays/it/br.rem +13 -0
  278. data/remind-v06.02.10/include/holidays/it/bs.rem +13 -0
  279. data/remind-v06.02.10/include/holidays/it/bt.rem +15 -0
  280. data/remind-v06.02.10/include/holidays/it/bz.rem +14 -0
  281. data/remind-v06.02.10/include/holidays/it/ca.rem +13 -0
  282. data/remind-v06.02.10/include/holidays/it/cb.rem +13 -0
  283. data/remind-v06.02.10/include/holidays/it/ce.rem +13 -0
  284. data/remind-v06.02.10/include/holidays/it/cesena.rem +13 -0
  285. data/remind-v06.02.10/include/holidays/it/ch.rem +13 -0
  286. data/remind-v06.02.10/include/holidays/it/cl.rem +13 -0
  287. data/remind-v06.02.10/include/holidays/it/cn.rem +13 -0
  288. data/remind-v06.02.10/include/holidays/it/co.rem +13 -0
  289. data/remind-v06.02.10/include/holidays/it/cr.rem +13 -0
  290. data/remind-v06.02.10/include/holidays/it/cs.rem +13 -0
  291. data/remind-v06.02.10/include/holidays/it/ct.rem +13 -0
  292. data/remind-v06.02.10/include/holidays/it/cz.rem +13 -0
  293. data/remind-v06.02.10/include/holidays/it/en.rem +13 -0
  294. data/remind-v06.02.10/include/holidays/it/fc.rem +14 -0
  295. data/remind-v06.02.10/include/holidays/it/fe.rem +13 -0
  296. data/remind-v06.02.10/include/holidays/it/fg.rem +13 -0
  297. data/remind-v06.02.10/include/holidays/it/fi.rem +13 -0
  298. data/remind-v06.02.10/include/holidays/it/fm.rem +14 -0
  299. data/remind-v06.02.10/include/holidays/it/forli.rem +13 -0
  300. data/remind-v06.02.10/include/holidays/it/fr.rem +13 -0
  301. data/remind-v06.02.10/include/holidays/it/ge.rem +13 -0
  302. data/remind-v06.02.10/include/holidays/it/go.rem +13 -0
  303. data/remind-v06.02.10/include/holidays/it/gr.rem +13 -0
  304. data/remind-v06.02.10/include/holidays/it/im.rem +13 -0
  305. data/remind-v06.02.10/include/holidays/it/is.rem +13 -0
  306. data/remind-v06.02.10/include/holidays/it/kr.rem +13 -0
  307. data/remind-v06.02.10/include/holidays/it/lc.rem +13 -0
  308. data/remind-v06.02.10/include/holidays/it/le.rem +13 -0
  309. data/remind-v06.02.10/include/holidays/it/li.rem +13 -0
  310. data/remind-v06.02.10/include/holidays/it/lo.rem +13 -0
  311. data/remind-v06.02.10/include/holidays/it/lt.rem +14 -0
  312. data/remind-v06.02.10/include/holidays/it/lu.rem +13 -0
  313. data/remind-v06.02.10/include/holidays/it/mb.rem +13 -0
  314. data/remind-v06.02.10/include/holidays/it/mc.rem +13 -0
  315. data/remind-v06.02.10/include/holidays/it/me.rem +13 -0
  316. data/remind-v06.02.10/include/holidays/it/mi.rem +13 -0
  317. data/remind-v06.02.10/include/holidays/it/mn.rem +13 -0
  318. data/remind-v06.02.10/include/holidays/it/mo.rem +13 -0
  319. data/remind-v06.02.10/include/holidays/it/ms.rem +13 -0
  320. data/remind-v06.02.10/include/holidays/it/mt.rem +13 -0
  321. data/remind-v06.02.10/include/holidays/it/na.rem +13 -0
  322. data/remind-v06.02.10/include/holidays/it/no.rem +13 -0
  323. data/remind-v06.02.10/include/holidays/it/nu.rem +13 -0
  324. data/remind-v06.02.10/include/holidays/it/or.rem +13 -0
  325. data/remind-v06.02.10/include/holidays/it/pa.rem +13 -0
  326. data/remind-v06.02.10/include/holidays/it/pc.rem +13 -0
  327. data/remind-v06.02.10/include/holidays/it/pd.rem +13 -0
  328. data/remind-v06.02.10/include/holidays/it/pe.rem +13 -0
  329. data/remind-v06.02.10/include/holidays/it/pesaro.rem +13 -0
  330. data/remind-v06.02.10/include/holidays/it/pg.rem +14 -0
  331. data/remind-v06.02.10/include/holidays/it/pi.rem +13 -0
  332. data/remind-v06.02.10/include/holidays/it/pn.rem +14 -0
  333. data/remind-v06.02.10/include/holidays/it/pr.rem +13 -0
  334. data/remind-v06.02.10/include/holidays/it/pt.rem +13 -0
  335. data/remind-v06.02.10/include/holidays/it/pu.rem +14 -0
  336. data/remind-v06.02.10/include/holidays/it/pv.rem +13 -0
  337. data/remind-v06.02.10/include/holidays/it/pz.rem +13 -0
  338. data/remind-v06.02.10/include/holidays/it/ra.rem +13 -0
  339. data/remind-v06.02.10/include/holidays/it/rc.rem +13 -0
  340. data/remind-v06.02.10/include/holidays/it/re.rem +13 -0
  341. data/remind-v06.02.10/include/holidays/it/rg.rem +14 -0
  342. data/remind-v06.02.10/include/holidays/it/ri.rem +13 -0
  343. data/remind-v06.02.10/include/holidays/it/rm.rem +13 -0
  344. data/remind-v06.02.10/include/holidays/it/rn.rem +13 -0
  345. data/remind-v06.02.10/include/holidays/it/ro.rem +13 -0
  346. data/remind-v06.02.10/include/holidays/it/sa.rem +13 -0
  347. data/remind-v06.02.10/include/holidays/it/si.rem +13 -0
  348. data/remind-v06.02.10/include/holidays/it/so.rem +13 -0
  349. data/remind-v06.02.10/include/holidays/it/sp.rem +13 -0
  350. data/remind-v06.02.10/include/holidays/it/sr.rem +13 -0
  351. data/remind-v06.02.10/include/holidays/it/ss.rem +13 -0
  352. data/remind-v06.02.10/include/holidays/it/su.rem +13 -0
  353. data/remind-v06.02.10/include/holidays/it/sv.rem +13 -0
  354. data/remind-v06.02.10/include/holidays/it/ta.rem +13 -0
  355. data/remind-v06.02.10/include/holidays/it/te.rem +13 -0
  356. data/remind-v06.02.10/include/holidays/it/tn.rem +13 -0
  357. data/remind-v06.02.10/include/holidays/it/to.rem +13 -0
  358. data/remind-v06.02.10/include/holidays/it/tp.rem +13 -0
  359. data/remind-v06.02.10/include/holidays/it/tr.rem +13 -0
  360. data/remind-v06.02.10/include/holidays/it/trani.rem +13 -0
  361. data/remind-v06.02.10/include/holidays/it/ts.rem +13 -0
  362. data/remind-v06.02.10/include/holidays/it/tv.rem +13 -0
  363. data/remind-v06.02.10/include/holidays/it/ud.rem +13 -0
  364. data/remind-v06.02.10/include/holidays/it/urbino.rem +13 -0
  365. data/remind-v06.02.10/include/holidays/it/va.rem +13 -0
  366. data/remind-v06.02.10/include/holidays/it/vb.rem +13 -0
  367. data/remind-v06.02.10/include/holidays/it/vc.rem +13 -0
  368. data/remind-v06.02.10/include/holidays/it/ve.rem +14 -0
  369. data/remind-v06.02.10/include/holidays/it/vi.rem +13 -0
  370. data/remind-v06.02.10/include/holidays/it/vr.rem +13 -0
  371. data/remind-v06.02.10/include/holidays/it/vt.rem +13 -0
  372. data/remind-v06.02.10/include/holidays/it/vv.rem +13 -0
  373. data/remind-v06.02.10/include/holidays/it.rem +26 -0
  374. data/remind-v06.02.10/include/holidays/je.rem +19 -0
  375. data/remind-v06.02.10/include/holidays/jewish.rem +135 -0
  376. data/remind-v06.02.10/include/holidays/jm.rem +24 -0
  377. data/remind-v06.02.10/include/holidays/jo.rem +11 -0
  378. data/remind-v06.02.10/include/holidays/jp.rem +27 -0
  379. data/remind-v06.02.10/include/holidays/ke.rem +25 -0
  380. data/remind-v06.02.10/include/holidays/kg.rem +20 -0
  381. data/remind-v06.02.10/include/holidays/kh.rem +22 -0
  382. data/remind-v06.02.10/include/holidays/kn.rem +28 -0
  383. data/remind-v06.02.10/include/holidays/kr.rem +19 -0
  384. data/remind-v06.02.10/include/holidays/kw.rem +10 -0
  385. data/remind-v06.02.10/include/holidays/kz.rem +34 -0
  386. data/remind-v06.02.10/include/holidays/la.rem +47 -0
  387. data/remind-v06.02.10/include/holidays/lgbtq/au.rem +8 -0
  388. data/remind-v06.02.10/include/holidays/lgbtq/br.rem +10 -0
  389. data/remind-v06.02.10/include/holidays/lgbtq/ca.rem +7 -0
  390. data/remind-v06.02.10/include/holidays/lgbtq/cl.rem +7 -0
  391. data/remind-v06.02.10/include/holidays/lgbtq/ie.rem +7 -0
  392. data/remind-v06.02.10/include/holidays/lgbtq/in.rem +7 -0
  393. data/remind-v06.02.10/include/holidays/lgbtq/nl.rem +7 -0
  394. data/remind-v06.02.10/include/holidays/lgbtq/ua.rem +7 -0
  395. data/remind-v06.02.10/include/holidays/lgbtq/uk.rem +8 -0
  396. data/remind-v06.02.10/include/holidays/lgbtq/us.rem +16 -0
  397. data/remind-v06.02.10/include/holidays/lgbtq.rem +34 -0
  398. data/remind-v06.02.10/include/holidays/li.rem +31 -0
  399. data/remind-v06.02.10/include/holidays/ls.rem +18 -0
  400. data/remind-v06.02.10/include/holidays/lt.rem +23 -0
  401. data/remind-v06.02.10/include/holidays/lu.rem +18 -0
  402. data/remind-v06.02.10/include/holidays/lv.rem +25 -0
  403. data/remind-v06.02.10/include/holidays/ma.rem +17 -0
  404. data/remind-v06.02.10/include/holidays/mc.rem +26 -0
  405. data/remind-v06.02.10/include/holidays/md.rem +21 -0
  406. data/remind-v06.02.10/include/holidays/me.rem +28 -0
  407. data/remind-v06.02.10/include/holidays/mg.rem +24 -0
  408. data/remind-v06.02.10/include/holidays/mh.rem +22 -0
  409. data/remind-v06.02.10/include/holidays/misc.rem +9 -0
  410. data/remind-v06.02.10/include/holidays/mk.rem +17 -0
  411. data/remind-v06.02.10/include/holidays/mp.rem +44 -0
  412. data/remind-v06.02.10/include/holidays/mr.rem +11 -0
  413. data/remind-v06.02.10/include/holidays/mt.rem +21 -0
  414. data/remind-v06.02.10/include/holidays/mv.rem +12 -0
  415. data/remind-v06.02.10/include/holidays/mw.rem +36 -0
  416. data/remind-v06.02.10/include/holidays/mx.rem +15 -0
  417. data/remind-v06.02.10/include/holidays/my/01.rem +13 -0
  418. data/remind-v06.02.10/include/holidays/my/02.rem +13 -0
  419. data/remind-v06.02.10/include/holidays/my/03.rem +14 -0
  420. data/remind-v06.02.10/include/holidays/my/04.rem +18 -0
  421. data/remind-v06.02.10/include/holidays/my/05.rem +16 -0
  422. data/remind-v06.02.10/include/holidays/my/06.rem +17 -0
  423. data/remind-v06.02.10/include/holidays/my/07.rem +17 -0
  424. data/remind-v06.02.10/include/holidays/my/08.rem +15 -0
  425. data/remind-v06.02.10/include/holidays/my/09.rem +14 -0
  426. data/remind-v06.02.10/include/holidays/my/10.rem +16 -0
  427. data/remind-v06.02.10/include/holidays/my/11.rem +16 -0
  428. data/remind-v06.02.10/include/holidays/my/12.rem +19 -0
  429. data/remind-v06.02.10/include/holidays/my/13.rem +22 -0
  430. data/remind-v06.02.10/include/holidays/my/14.rem +16 -0
  431. data/remind-v06.02.10/include/holidays/my/15.rem +18 -0
  432. data/remind-v06.02.10/include/holidays/my/16.rem +16 -0
  433. data/remind-v06.02.10/include/holidays/my.rem +23 -0
  434. data/remind-v06.02.10/include/holidays/mz.rem +25 -0
  435. data/remind-v06.02.10/include/holidays/na.rem +27 -0
  436. data/remind-v06.02.10/include/holidays/ng.rem +21 -0
  437. data/remind-v06.02.10/include/holidays/ni/mn.rem +14 -0
  438. data/remind-v06.02.10/include/holidays/ni.rem +24 -0
  439. data/remind-v06.02.10/include/holidays/nl.rem +26 -0
  440. data/remind-v06.02.10/include/holidays/no.rem +19 -0
  441. data/remind-v06.02.10/include/holidays/nz/auk.rem +13 -0
  442. data/remind-v06.02.10/include/holidays/nz/can.rem +13 -0
  443. data/remind-v06.02.10/include/holidays/nz/cit.rem +13 -0
  444. data/remind-v06.02.10/include/holidays/nz/hkb.rem +13 -0
  445. data/remind-v06.02.10/include/holidays/nz/mbh.rem +13 -0
  446. data/remind-v06.02.10/include/holidays/nz/nsn.rem +13 -0
  447. data/remind-v06.02.10/include/holidays/nz/ntl.rem +13 -0
  448. data/remind-v06.02.10/include/holidays/nz/ota.rem +14 -0
  449. data/remind-v06.02.10/include/holidays/nz/south_canterbury.rem +13 -0
  450. data/remind-v06.02.10/include/holidays/nz/stl.rem +13 -0
  451. data/remind-v06.02.10/include/holidays/nz/tki.rem +13 -0
  452. data/remind-v06.02.10/include/holidays/nz/wgn.rem +13 -0
  453. data/remind-v06.02.10/include/holidays/nz/wtc.rem +13 -0
  454. data/remind-v06.02.10/include/holidays/nz.rem +69 -0
  455. data/remind-v06.02.10/include/holidays/pa.rem +27 -0
  456. data/remind-v06.02.10/include/holidays/pagan.rem +65 -0
  457. data/remind-v06.02.10/include/holidays/pe.rem +22 -0
  458. data/remind-v06.02.10/include/holidays/pg.rem +24 -0
  459. data/remind-v06.02.10/include/holidays/ph.rem +26 -0
  460. data/remind-v06.02.10/include/holidays/pk.rem +13 -0
  461. data/remind-v06.02.10/include/holidays/pl.rem +20 -0
  462. data/remind-v06.02.10/include/holidays/pr.rem +40 -0
  463. data/remind-v06.02.10/include/holidays/pt/01.rem +13 -0
  464. data/remind-v06.02.10/include/holidays/pt/02.rem +13 -0
  465. data/remind-v06.02.10/include/holidays/pt/03.rem +13 -0
  466. data/remind-v06.02.10/include/holidays/pt/04.rem +13 -0
  467. data/remind-v06.02.10/include/holidays/pt/05.rem +13 -0
  468. data/remind-v06.02.10/include/holidays/pt/06.rem +13 -0
  469. data/remind-v06.02.10/include/holidays/pt/07.rem +13 -0
  470. data/remind-v06.02.10/include/holidays/pt/08.rem +13 -0
  471. data/remind-v06.02.10/include/holidays/pt/09.rem +13 -0
  472. data/remind-v06.02.10/include/holidays/pt/10.rem +13 -0
  473. data/remind-v06.02.10/include/holidays/pt/12.rem +13 -0
  474. data/remind-v06.02.10/include/holidays/pt/13.rem +13 -0
  475. data/remind-v06.02.10/include/holidays/pt/14.rem +13 -0
  476. data/remind-v06.02.10/include/holidays/pt/15.rem +13 -0
  477. data/remind-v06.02.10/include/holidays/pt/16.rem +13 -0
  478. data/remind-v06.02.10/include/holidays/pt/18.rem +13 -0
  479. data/remind-v06.02.10/include/holidays/pt/20.rem +13 -0
  480. data/remind-v06.02.10/include/holidays/pt/30.rem +14 -0
  481. data/remind-v06.02.10/include/holidays/pt.rem +17 -0
  482. data/remind-v06.02.10/include/holidays/pw.rem +34 -0
  483. data/remind-v06.02.10/include/holidays/py.rem +20 -0
  484. data/remind-v06.02.10/include/holidays/ro.rem +24 -0
  485. data/remind-v06.02.10/include/holidays/rs.rem +26 -0
  486. data/remind-v06.02.10/include/holidays/ru.rem +21 -0
  487. data/remind-v06.02.10/include/holidays/sa.rem +13 -0
  488. data/remind-v06.02.10/include/holidays/sc.rem +28 -0
  489. data/remind-v06.02.10/include/holidays/se.rem +23 -0
  490. data/remind-v06.02.10/include/holidays/sg.rem +16 -0
  491. data/remind-v06.02.10/include/holidays/si.rem +20 -0
  492. data/remind-v06.02.10/include/holidays/sk.rem +25 -0
  493. data/remind-v06.02.10/include/holidays/sm.rem +25 -0
  494. data/remind-v06.02.10/include/holidays/sv/ss.rem +14 -0
  495. data/remind-v06.02.10/include/holidays/sv.rem +25 -0
  496. data/remind-v06.02.10/include/holidays/sz.rem +26 -0
  497. data/remind-v06.02.10/include/holidays/td.rem +22 -0
  498. data/remind-v06.02.10/include/holidays/th.rem +72 -0
  499. data/remind-v06.02.10/include/holidays/tl.rem +31 -0
  500. data/remind-v06.02.10/include/holidays/tn.rem +15 -0
  501. data/remind-v06.02.10/include/holidays/to.rem +38 -0
  502. data/remind-v06.02.10/include/holidays/tr.rem +17 -0
  503. data/remind-v06.02.10/include/holidays/tw.rem +26 -0
  504. data/remind-v06.02.10/include/holidays/tz.rem +23 -0
  505. data/remind-v06.02.10/include/holidays/ua.rem +20 -0
  506. data/remind-v06.02.10/include/holidays/uk.rem +27 -0
  507. data/remind-v06.02.10/include/holidays/um.rem +32 -0
  508. data/remind-v06.02.10/include/holidays/us/ak.rem +17 -0
  509. data/remind-v06.02.10/include/holidays/us/al.rem +17 -0
  510. data/remind-v06.02.10/include/holidays/us/ar.rem +13 -0
  511. data/remind-v06.02.10/include/holidays/us/as.rem +20 -0
  512. data/remind-v06.02.10/include/holidays/us/az.rem +14 -0
  513. data/remind-v06.02.10/include/holidays/us/ca.rem +16 -0
  514. data/remind-v06.02.10/include/holidays/us/co.rem +14 -0
  515. data/remind-v06.02.10/include/holidays/us/ct.rem +17 -0
  516. data/remind-v06.02.10/include/holidays/us/dc.rem +16 -0
  517. data/remind-v06.02.10/include/holidays/us/de.rem +14 -0
  518. data/remind-v06.02.10/include/holidays/us/fl.rem +14 -0
  519. data/remind-v06.02.10/include/holidays/us/ga.rem +18 -0
  520. data/remind-v06.02.10/include/holidays/us/gu.rem +17 -0
  521. data/remind-v06.02.10/include/holidays/us/hi.rem +19 -0
  522. data/remind-v06.02.10/include/holidays/us/ia.rem +15 -0
  523. data/remind-v06.02.10/include/holidays/us/id.rem +14 -0
  524. data/remind-v06.02.10/include/holidays/us/il.rem +17 -0
  525. data/remind-v06.02.10/include/holidays/us/in.rem +19 -0
  526. data/remind-v06.02.10/include/holidays/us/ks.rem +16 -0
  527. data/remind-v06.02.10/include/holidays/us/ky.rem +16 -0
  528. data/remind-v06.02.10/include/holidays/us/la.rem +14 -0
  529. data/remind-v06.02.10/include/holidays/us/ma.rem +17 -0
  530. data/remind-v06.02.10/include/holidays/us/md-extra.rem +19 -0
  531. data/remind-v06.02.10/include/holidays/us/md.rem +14 -0
  532. data/remind-v06.02.10/include/holidays/us/me.rem +14 -0
  533. data/remind-v06.02.10/include/holidays/us/mi.rem +19 -0
  534. data/remind-v06.02.10/include/holidays/us/mo.rem +16 -0
  535. data/remind-v06.02.10/include/holidays/us/mp.rem +23 -0
  536. data/remind-v06.02.10/include/holidays/us/ms.rem +14 -0
  537. data/remind-v06.02.10/include/holidays/us/mt.rem +13 -0
  538. data/remind-v06.02.10/include/holidays/us/nc.rem +22 -0
  539. data/remind-v06.02.10/include/holidays/us/ne.rem +14 -0
  540. data/remind-v06.02.10/include/holidays/us/nh.rem +14 -0
  541. data/remind-v06.02.10/include/holidays/us/nj.rem +17 -0
  542. data/remind-v06.02.10/include/holidays/us/nm.rem +14 -0
  543. data/remind-v06.02.10/include/holidays/us/nv.rem +16 -0
  544. data/remind-v06.02.10/include/holidays/us/ny.rem +17 -0
  545. data/remind-v06.02.10/include/holidays/us/oh.rem +13 -0
  546. data/remind-v06.02.10/include/holidays/us/ok.rem +13 -0
  547. data/remind-v06.02.10/include/holidays/us/pa.rem +14 -0
  548. data/remind-v06.02.10/include/holidays/us/pr.rem +21 -0
  549. data/remind-v06.02.10/include/holidays/us/ri.rem +14 -0
  550. data/remind-v06.02.10/include/holidays/us/sc.rem +13 -0
  551. data/remind-v06.02.10/include/holidays/us/sd.rem +13 -0
  552. data/remind-v06.02.10/include/holidays/us/tn.rem +13 -0
  553. data/remind-v06.02.10/include/holidays/us/tx.rem +25 -0
  554. data/remind-v06.02.10/include/holidays/us/ut.rem +16 -0
  555. data/remind-v06.02.10/include/holidays/us/va.rem +13 -0
  556. data/remind-v06.02.10/include/holidays/us/vi.rem +22 -0
  557. data/remind-v06.02.10/include/holidays/us/vt.rem +16 -0
  558. data/remind-v06.02.10/include/holidays/us/wi.rem +20 -0
  559. data/remind-v06.02.10/include/holidays/us/wv.rem +17 -0
  560. data/remind-v06.02.10/include/holidays/us.rem +41 -0
  561. data/remind-v06.02.10/include/holidays/uy.rem +39 -0
  562. data/remind-v06.02.10/include/holidays/uz.rem +21 -0
  563. data/remind-v06.02.10/include/holidays/va.rem +23 -0
  564. data/remind-v06.02.10/include/holidays/ve.rem +21 -0
  565. data/remind-v06.02.10/include/holidays/vi.rem +41 -0
  566. data/remind-v06.02.10/include/holidays/vn.rem +17 -0
  567. data/remind-v06.02.10/include/holidays/vu.rem +32 -0
  568. data/remind-v06.02.10/include/holidays/ws.rem +18 -0
  569. data/remind-v06.02.10/include/holidays/za.rem +28 -0
  570. data/remind-v06.02.10/include/holidays/zm.rem +31 -0
  571. data/remind-v06.02.10/include/lang/auto.rem +32 -0
  572. data/remind-v06.02.10/include/lang/ca.rem +60 -0
  573. data/remind-v06.02.10/include/lang/da.rem +77 -0
  574. data/remind-v06.02.10/include/lang/de.rem +80 -0
  575. data/remind-v06.02.10/include/lang/en.rem +4 -0
  576. data/remind-v06.02.10/include/lang/es.rem +55 -0
  577. data/remind-v06.02.10/include/lang/fi.rem +202 -0
  578. data/remind-v06.02.10/include/lang/fr.rem +172 -0
  579. data/remind-v06.02.10/include/lang/gr.rem +74 -0
  580. data/remind-v06.02.10/include/lang/is.rem +58 -0
  581. data/remind-v06.02.10/include/lang/it.rem +76 -0
  582. data/remind-v06.02.10/include/lang/nl.rem +71 -0
  583. data/remind-v06.02.10/include/lang/no.rem +66 -0
  584. data/remind-v06.02.10/include/lang/pl.rem +177 -0
  585. data/remind-v06.02.10/include/lang/pt.rem +176 -0
  586. data/remind-v06.02.10/include/lang/ro.rem +74 -0
  587. data/remind-v06.02.10/include/lunar-eclipses.rem +149 -0
  588. data/remind-v06.02.10/include/moonphases.rem +19 -0
  589. data/remind-v06.02.10/include/seasons.rem +21 -0
  590. data/remind-v06.02.10/include/solar-eclipses.rem +238 -0
  591. data/remind-v06.02.10/include/sun.rem +12 -0
  592. data/remind-v06.02.10/include/translations/de/holidays/chinese-new-year.rem +13 -0
  593. data/remind-v06.02.10/include/translations/de/moonphases.rem +4 -0
  594. data/remind-v06.02.10/include/translations/de/seasons.rem +4 -0
  595. data/remind-v06.02.10/include/translations/de/sun.rem +2 -0
  596. data/remind-v06.02.10/include/translations/nl/holidays/chinese-new-year.rem +13 -0
  597. data/remind-v06.02.10/include/translations/nl/moonphases.rem +4 -0
  598. data/remind-v06.02.10/include/translations/nl/seasons.rem +4 -0
  599. data/remind-v06.02.10/include/translations/nl/sun.rem +2 -0
  600. data/remind-v06.02.10/include/utils/add-html-anchors.rem +5 -0
  601. data/remind-v06.02.10/install-sh +238 -0
  602. data/remind-v06.02.10/man/rem.1.in +21 -0
  603. data/remind-v06.02.10/man/rem2ps.1.in +816 -0
  604. data/remind-v06.02.10/man/remind.1.in +7658 -0
  605. data/remind-v06.02.10/man/tkremind.1.in +612 -0
  606. data/remind-v06.02.10/rem2html/Makefile.in +30 -0
  607. data/remind-v06.02.10/rem2html/rem2html.in +1299 -0
  608. data/remind-v06.02.10/rem2pdf/Makefile.PL.in +25 -0
  609. data/remind-v06.02.10/rem2pdf/Makefile.top.in +50 -0
  610. data/remind-v06.02.10/rem2pdf/bin/rem2pdf.in +761 -0
  611. data/remind-v06.02.10/scripts/tkremind.in +5794 -0
  612. data/remind-v06.02.10/src/Makefile.in +133 -0
  613. data/remind-v06.02.10/src/calendar.c +3069 -0
  614. data/remind-v06.02.10/src/config.h +117 -0
  615. data/remind-v06.02.10/src/config.h.in +116 -0
  616. data/remind-v06.02.10/src/custom.h +167 -0
  617. data/remind-v06.02.10/src/custom.h.in +167 -0
  618. data/remind-v06.02.10/src/dedupe.c +179 -0
  619. data/remind-v06.02.10/src/dorem.c +2389 -0
  620. data/remind-v06.02.10/src/dosubst.c +910 -0
  621. data/remind-v06.02.10/src/dynbuf.c +198 -0
  622. data/remind-v06.02.10/src/dynbuf.h +41 -0
  623. data/remind-v06.02.10/src/err.h +294 -0
  624. data/remind-v06.02.10/src/expr.c +3408 -0
  625. data/remind-v06.02.10/src/files.c +1437 -0
  626. data/remind-v06.02.10/src/funcs.c +5230 -0
  627. data/remind-v06.02.10/src/globals.c +23 -0
  628. data/remind-v06.02.10/src/globals.h +277 -0
  629. data/remind-v06.02.10/src/hashtab.c +428 -0
  630. data/remind-v06.02.10/src/hashtab.h +88 -0
  631. data/remind-v06.02.10/src/hashtab_stats.c +101 -0
  632. data/remind-v06.02.10/src/hbcal.c +579 -0
  633. data/remind-v06.02.10/src/ifelse.c +236 -0
  634. data/remind-v06.02.10/src/init.c +1494 -0
  635. data/remind-v06.02.10/src/json.c +1048 -0
  636. data/remind-v06.02.10/src/json.h +276 -0
  637. data/remind-v06.02.10/src/main.c +2310 -0
  638. data/remind-v06.02.10/src/md5.c +250 -0
  639. data/remind-v06.02.10/src/md5.h +33 -0
  640. data/remind-v06.02.10/src/moon.c +957 -0
  641. data/remind-v06.02.10/src/omit.c +560 -0
  642. data/remind-v06.02.10/src/protos.h +284 -0
  643. data/remind-v06.02.10/src/queue.c +1118 -0
  644. data/remind-v06.02.10/src/rem2ps.c +1383 -0
  645. data/remind-v06.02.10/src/rem2ps.h +229 -0
  646. data/remind-v06.02.10/src/sort.c +257 -0
  647. data/remind-v06.02.10/src/token.c +494 -0
  648. data/remind-v06.02.10/src/trans.c +544 -0
  649. data/remind-v06.02.10/src/trigger.c +871 -0
  650. data/remind-v06.02.10/src/types.h +341 -0
  651. data/remind-v06.02.10/src/userfns.c +810 -0
  652. data/remind-v06.02.10/src/utils.c +374 -0
  653. data/remind-v06.02.10/src/var.c +1762 -0
  654. data/remind-v06.02.10/src/version.h +1 -0
  655. data/remind-v06.02.10/src/version.h.in +1 -0
  656. data/remind-v06.02.10/src/xlat.c +100 -0
  657. data/remind-v06.02.10/www/Makefile.in +91 -0
  658. metadata +764 -0
@@ -0,0 +1,1118 @@
1
+ /***************************************************************/
2
+ /* */
3
+ /* QUEUE.C */
4
+ /* */
5
+ /* Queue up reminders for subsequent execution. */
6
+ /* */
7
+ /* This file is part of REMIND. */
8
+ /* Copyright (C) 1992-2026 by Dianne Skoll */
9
+ /* SPDX-License-Identifier: GPL-2.0-only */
10
+ /* */
11
+ /***************************************************************/
12
+
13
+ #include "config.h"
14
+
15
+ #include <stdio.h>
16
+ #include <string.h>
17
+ #include <signal.h>
18
+ #include <sys/types.h>
19
+ #include <sys/stat.h>
20
+ #include <sys/time.h>
21
+ #include <time.h>
22
+ #include <sys/select.h>
23
+ #include <stdlib.h>
24
+ #include <unistd.h>
25
+ #include <fcntl.h>
26
+ #include <errno.h>
27
+ #include "types.h"
28
+ #include "globals.h"
29
+ #include "err.h"
30
+ #include "protos.h"
31
+
32
+ #undef USE_INOTIFY
33
+ #if defined(HAVE_SYS_INOTIFY_H) && defined(HAVE_INOTIFY_INIT1)
34
+ #define USE_INOTIFY 1
35
+ #include <sys/inotify.h>
36
+
37
+ int watch_fd = -1;
38
+ static void consume_inotify_events(int fd);
39
+ static int setup_inotify_watch(void);
40
+ #endif
41
+
42
+ /* List structure for holding queued reminders */
43
+ typedef struct queuedrem {
44
+ struct queuedrem *next;
45
+ int typ;
46
+ int RunDisabled;
47
+ int ntrig;
48
+ int dse;
49
+ char const *text;
50
+ char const *fname;
51
+ int lineno;
52
+ int lineno_start;
53
+ char passthru[PASSTHRU_LEN+1];
54
+ char sched[VAR_NAME_LEN+1];
55
+ Trigger t;
56
+ TimeTrig tt;
57
+ int red, green, blue;
58
+ int qid;
59
+ } QueuedRem;
60
+
61
+ /* Global variables */
62
+
63
+ static QueuedRem *QueueHead = NULL;
64
+ static time_t FileModTime;
65
+ static struct stat StatBuf;
66
+
67
+ static void CheckInitialFile (void);
68
+ static int CalculateNextDtime (QueuedRem *q);
69
+ static QueuedRem *FindNextReminder (void);
70
+ static int CalculateNextDtimeUsingSched (QueuedRem *q);
71
+ static void ServerWait (struct timeval *sleep_tv);
72
+ static void reread (void);
73
+ static void PrintQueue(void);
74
+
75
+ static int
76
+ GetNextTime(QueuedRem *q)
77
+ {
78
+ if (q->tt.nextdtime == NO_DATETIME) {
79
+ return NO_TIME;
80
+ }
81
+ return (q->tt.nextdtime % MINUTES_PER_DAY);
82
+ }
83
+
84
+ static int
85
+ GetNextDate(QueuedRem *q)
86
+ {
87
+ if (q->tt.nextdtime == NO_DATETIME) {
88
+ return NO_DATE;
89
+ }
90
+ return (q->tt.nextdtime / MINUTES_PER_DAY);
91
+ }
92
+
93
+ static int
94
+ GetQDateTime(QueuedRem *q)
95
+ {
96
+ return q->dse * MINUTES_PER_DAY + q->tt.ttime;
97
+ }
98
+
99
+ static void chomp(DynamicBuffer *buf)
100
+ {
101
+ char *s = DBufValue(buf);
102
+ int l = DBufLen(buf);
103
+ while (l) {
104
+ if (s[l-1] == '\n') {
105
+ s[l-1] = 0;
106
+ DBufLen(buf)--;
107
+ l--;
108
+ } else {
109
+ break;
110
+ }
111
+ }
112
+ }
113
+
114
+ static char const *SimpleTimeNoSpace(int tim)
115
+ {
116
+ char *s = (char *) SimpleTime(tim);
117
+ if (s && *s) {
118
+ size_t l = strlen(s);
119
+ if (l > 0 && s[l-1] == ' ') {
120
+ s[l-1] = 0;
121
+ }
122
+ }
123
+ return s;
124
+ }
125
+
126
+ static void del_reminder(int qid)
127
+ {
128
+ QueuedRem *q = QueueHead;
129
+ QueuedRem *next;
130
+ if (!q) {
131
+ return;
132
+ }
133
+ if (q->qid == qid) {
134
+ QueueHead = q->next;
135
+ if (q->text) free((void *) q->text);
136
+ FreeTrig(&(q->t));
137
+ free(q);
138
+ return;
139
+ }
140
+ while(q->next) {
141
+ next = q->next;
142
+ if (q->next->qid == qid) {
143
+ q->next = q->next->next;
144
+ if (next->text) free((void *) next->text);
145
+ FreeTrig(&(next->t));
146
+ free(next);
147
+ return;
148
+ }
149
+ q = q->next;
150
+ }
151
+ }
152
+
153
+ /***************************************************************/
154
+ /* */
155
+ /* QueueReminder */
156
+ /* */
157
+ /* Put the reminder on a queue for later, if queueing is */
158
+ /* enabled. */
159
+ /* */
160
+ /***************************************************************/
161
+ int QueueReminder(ParsePtr p, Trigger *trig,
162
+ TimeTrig const *tim, char const *sched, int dse)
163
+ {
164
+ QueuedRem *qelem;
165
+ TrigInfo *ti;
166
+
167
+ qelem = NEW(QueuedRem);
168
+ if (!qelem) {
169
+ return E_NO_MEM;
170
+ }
171
+ qelem->dse = dse;
172
+ qelem->red = DefaultColorR;
173
+ qelem->green = DefaultColorG;
174
+ qelem->blue = DefaultColorB;
175
+ qelem->text = strdup(p->pos); /* Guaranteed that parser is not nested. */
176
+ if (!qelem->text) {
177
+ free(qelem);
178
+ return E_NO_MEM;
179
+ }
180
+ qelem->fname = GetCurrentFilename();
181
+ qelem->lineno = LineNo;
182
+ qelem->lineno_start = LineNoStart;
183
+ qelem->qid = NumQueued;
184
+ NumQueued++;
185
+ qelem->typ = trig->typ;
186
+ strcpy(qelem->passthru, trig->passthru);
187
+ qelem->tt = *tim;
188
+ qelem->t = *trig;
189
+
190
+ /* Copy infos */
191
+ qelem->t.infos = NULL;
192
+ ti = trig->infos;
193
+ while(ti) {
194
+ (void) AppendTrigInfo(&qelem->t, ti->info);
195
+ ti = ti->next;
196
+ }
197
+
198
+ DBufInit(&(qelem->t.tags));
199
+ DBufPuts(&(qelem->t.tags), DBufValue(&(trig->tags)));
200
+ if (SynthesizeTags) {
201
+ AppendTag(&(qelem->t.tags), SynthesizeTag());
202
+ }
203
+ qelem->next = QueueHead;
204
+ qelem->RunDisabled = RunDisabled;
205
+ qelem->ntrig = 0;
206
+ strcpy(qelem->sched, sched);
207
+ QueueHead = qelem;
208
+ return OK;
209
+ }
210
+
211
+ static void
212
+ maybe_close(int fd)
213
+ {
214
+ int new_fd;
215
+ /* Don't close descriptors connected to a TTY, except for stdin */
216
+ if (fd != STDIN_FILENO && isatty(fd)) return;
217
+
218
+ (void) close(fd);
219
+ if (fd != STDIN_FILENO) {
220
+ new_fd = open("/dev/null", O_WRONLY);
221
+ } else {
222
+ new_fd = open("/dev/null", O_RDONLY);
223
+ }
224
+
225
+ /* If the open failed... well... not much we can do */
226
+ if (new_fd < 0) return;
227
+
228
+ /* If we got back the same fd as what we just closed, aces! */
229
+ if (fd == new_fd) return;
230
+
231
+ (void) dup2(new_fd, fd);
232
+ (void) close(new_fd);
233
+ }
234
+
235
+ static void
236
+ SigContHandler(int d)
237
+ {
238
+ UNUSED(d);
239
+ }
240
+
241
+ static void
242
+ print_num_queued(void)
243
+ {
244
+ int nqueued = 0;
245
+ QueuedRem *q = QueueHead;
246
+ while(q) {
247
+ if (q->tt.nextdtime != NO_DATETIME) {
248
+ nqueued++;
249
+ }
250
+ q = q->next;
251
+ }
252
+ if (DaemonJSON) {
253
+ printf("{");
254
+ PrintJSONKeyPairString("response", "queued");
255
+ PrintJSONKeyPairInt("nqueued", nqueued);
256
+ printf("\"command\":\"STATUS\"}\n");
257
+ } else {
258
+ printf("NOTE queued %d\n", nqueued);
259
+ }
260
+ fflush(stdout);
261
+ }
262
+
263
+ static sig_atomic_t got_sighup = 0;
264
+
265
+ static void
266
+ SigHupHandler(int d)
267
+ {
268
+ UNUSED(d);
269
+ got_sighup = 1;
270
+ }
271
+
272
+ static void
273
+ reread_because_of_sighup(void)
274
+ {
275
+ if (DaemonJSON) {
276
+ printf("{\"response\":\"reread\",\"command\":\"SIGHUP\"}\n");
277
+ } else {
278
+ printf("NOTE SIGHUP\nNOTE reread\n");
279
+ }
280
+ fflush(stdout);
281
+ reread();
282
+ }
283
+
284
+ /***************************************************************/
285
+ /* */
286
+ /* HandleQueuedReminders */
287
+ /* */
288
+ /* Handle the issuing of queued reminders in the background */
289
+ /* */
290
+ /***************************************************************/
291
+ void HandleQueuedReminders(void)
292
+ {
293
+ QueuedRem *q = QueueHead;
294
+ QueuedRem *next;
295
+ int TimeToSleep;
296
+ unsigned SleepTime;
297
+ Parser p;
298
+ struct timeval tv;
299
+ struct timeval sleep_tv;
300
+ struct sigaction sa;
301
+
302
+ /* Disable any potential pending SIGALRMs */
303
+ alarm(0);
304
+
305
+ /* Un-limit execution time */
306
+ unlimit_execution_time();
307
+
308
+ /* Turn off sorting -- otherwise, TriggerReminder has no effect! */
309
+ SortByDate = 0;
310
+
311
+ /* We don't need to keep the dedupe table around */
312
+ ClearDedupeTable();
313
+
314
+ /* If we are not connected to a tty, then we must close the
315
+ * standard file descriptors. This is to prevent someone
316
+ * doing:
317
+ * remind file | <filter> | >log
318
+ * and have <filter> hung because the child (us) is still
319
+ * connected to it. This means the only commands that will be
320
+ * processed correctly are RUN commands, provided they mail
321
+ * the result back or use their own resource (as a window).
322
+ */
323
+ if (ShouldFork) {
324
+ maybe_close(STDIN_FILENO);
325
+ maybe_close(STDOUT_FILENO);
326
+ maybe_close(STDERR_FILENO);
327
+ } else if (!Daemon) {
328
+ maybe_close(STDIN_FILENO);
329
+ }
330
+
331
+ /* If we're a daemon, get the mod time of initial file */
332
+ if (Daemon > 0) {
333
+ if (stat(InitialFile, &StatBuf)) {
334
+ fprintf(ErrFp, tr("Cannot stat %s - not running as daemon!"),
335
+ InitialFile);
336
+ fprintf(ErrFp, "\n");
337
+ Daemon = 0;
338
+ } else FileModTime = StatBuf.st_mtime;
339
+ }
340
+
341
+ /* Initialize the queue - initialize all the entries time of issue */
342
+
343
+ while (q) {
344
+ next = q->next;
345
+ q->tt.nextdtime = NO_DATETIME;
346
+ q->tt.nextdtime = CalculateNextDtime(q);
347
+ /* If it won't be issued, delete it */
348
+ if (q->tt.nextdtime == NO_DATETIME) {
349
+ del_reminder(q->qid);
350
+ } else if (Daemon && (q->tt.nextdtime / MINUTES_PER_DAY) > DSEToday) {
351
+ /* If we are in daemon mode and it won't trigger today,
352
+ don't bother queueing it */
353
+ del_reminder(q->qid);
354
+ }
355
+ q = next;
356
+ }
357
+
358
+ if (ShouldFork || Daemon) {
359
+ sa.sa_handler = SigIntHandler;
360
+ sa.sa_flags = SA_RESTART;
361
+ sigemptyset(&sa.sa_mask);
362
+ (void) sigaction(SIGINT, &sa, NULL);
363
+ sa.sa_handler = SigContHandler;
364
+ (void) sigaction(SIGCONT, &sa, NULL);
365
+ sa.sa_handler = SigHupHandler;
366
+ (void) sigaction(SIGHUP, &sa, NULL);
367
+ }
368
+
369
+ #ifdef USE_INOTIFY
370
+ if (IsServerMode()) {
371
+ watch_fd = setup_inotify_watch();
372
+ }
373
+ #endif
374
+ /* Sit in a loop, issuing reminders when necessary */
375
+ while(1) {
376
+ q = FindNextReminder();
377
+
378
+ /* If no more reminders to issue, we're done unless we're a daemon. */
379
+ if (!q && !Daemon) break;
380
+
381
+ if (Daemon && !q) {
382
+ if (IsServerMode()) {
383
+ /* Sleep until midnight */
384
+ TimeToSleep = SECONDS_PER_DAY - SystemTime(1);
385
+ } else {
386
+ TimeToSleep = 60*Daemon;
387
+ }
388
+ } else {
389
+ if (GetNextDate(q) == RealToday) {
390
+ TimeToSleep = GetNextTime(q) * 60 - SystemTime(1);
391
+ } else {
392
+ /* If next queued reminder is not today, sleep
393
+ until midnight */
394
+ TimeToSleep = SECONDS_PER_DAY - SystemTime(1);
395
+ }
396
+ }
397
+
398
+ while (TimeToSleep > 0L) {
399
+ SleepTime = TimeToSleep;
400
+
401
+ if (Daemon > 0 && SleepTime > (unsigned int) 60*Daemon) {
402
+ SleepTime = 60*Daemon;
403
+ }
404
+
405
+ if (IsServerMode()) {
406
+ /* Wake up on the next exact minute */
407
+ gettimeofday(&tv, NULL);
408
+ sleep_tv.tv_sec = 60 - (tv.tv_sec % 60);
409
+ if (tv.tv_usec != 0 && sleep_tv.tv_sec != 0) {
410
+ sleep_tv.tv_sec--;
411
+ sleep_tv.tv_usec = 1000000 - tv.tv_usec;
412
+ } else {
413
+ sleep_tv.tv_usec = 0;
414
+ }
415
+ ServerWait(&sleep_tv);
416
+ /* A DEL command might have deleted our queued reminder! */
417
+ q = FindNextReminder();
418
+ } else {
419
+ sleep(SleepTime);
420
+ }
421
+
422
+ if (GotSigInt()) {
423
+ PrintQueue();
424
+ }
425
+ if (got_sighup) {
426
+ reread_because_of_sighup();
427
+ }
428
+
429
+ if (Daemon > 0 && SleepTime) {
430
+ CheckInitialFile();
431
+ }
432
+
433
+ if (Daemon && !q) {
434
+ if (IsServerMode()) {
435
+ /* Sleep until midnight */
436
+ TimeToSleep = SECONDS_PER_DAY - SystemTime(1);
437
+ } else {
438
+ TimeToSleep = 60*Daemon;
439
+ }
440
+ } else {
441
+ if (GetNextDate(q) == RealToday) {
442
+ TimeToSleep = GetNextTime(q) * 60 - SystemTime(1);
443
+ } else {
444
+ TimeToSleep = SECONDS_PER_DAY - SystemTime(1);
445
+ }
446
+ }
447
+
448
+ }
449
+
450
+ /* Do NOT trigger the reminder if tt.nextdtime is more than a
451
+ minute in the past. This can happen if the clock is
452
+ changed or a laptop awakes from hibernation.
453
+ However, DO trigger if we are at the ACTUAL trigger time
454
+ within MaxLateTrigger minutes so all
455
+ queued reminders are triggered at least once. */
456
+ if ((SystemTime(1) - (GetNextTime(q) * 60) <= 60) ||
457
+ ((GetNextTime(q) == q->tt.ttime && GetNextDate(q) == RealToday) &&
458
+ ( (MaxLateMinutes == 0) || (SystemTime(1) - GetNextTime(q) * 60 <= 60 * MaxLateMinutes)))) {
459
+
460
+ /* Trigger the reminder */
461
+ CreateParser(q->text, &p);
462
+ if (IsServerMode() && q->typ != RUN_TYPE) {
463
+ if (DaemonJSON) {
464
+ printf("{\"response\":\"reminder\",");
465
+ PrintJSONKeyPairInt("qid", q->qid);
466
+ PrintJSONKeyPairString("ttime", SimpleTimeNoSpace(q->tt.ttime));
467
+ PrintJSONKeyPairDateTime("tdatetime", GetQDateTime(q));
468
+ PrintJSONKeyPairString("now", SimpleTimeNoSpace(MinutesPastMidnight(1)));
469
+ if (q->t.infos) {
470
+ WriteJSONInfoChain(q->t.infos);
471
+ }
472
+ PrintJSONKeyPairString("tags", DBufValue(&q->t.tags));
473
+ } else {
474
+ printf("NOTE reminder %s",
475
+ SimpleTime(q->tt.ttime));
476
+ printf("%s", SimpleTime(MinutesPastMidnight(1)));
477
+ if (!*DBufValue(&q->t.tags)) {
478
+ printf("*\n");
479
+ } else {
480
+ printf("%s\n", DBufValue(&(q->t.tags)));
481
+ }
482
+ }
483
+ }
484
+
485
+ /* Set up global variables so some functions like trigdate()
486
+ and trigtime() work correctly */
487
+ SaveAllTriggerInfo(&(q->t), &(q->tt), q->dse, q->tt.ttime, 1);
488
+ SetCurrentFilename(q->fname);
489
+ DefaultColorR = q->red;
490
+ DefaultColorG = q->green;
491
+ DefaultColorB = q->blue;
492
+ /* Make a COPY of q->t because TriggerReminder can change q->t.typ */
493
+ Trigger tcopy = q->t;
494
+
495
+ if (DaemonJSON) {
496
+ DynamicBuffer out;
497
+ DBufInit(&out);
498
+ (void) TriggerReminder(&p, &tcopy, &q->tt, q->dse, 1, &out, NULL, NULL, NULL);
499
+ if (q->typ != RUN_TYPE) {
500
+ printf("\"body\":\"");
501
+ chomp(&out);
502
+ PrintJSONString(DBufValue(&out));
503
+ printf("\"}\n");
504
+ }
505
+ DBufFree(&out);
506
+ } else {
507
+ (void) TriggerReminder(&p, &tcopy, &q->tt, q->dse, 1, NULL, NULL, NULL, NULL);
508
+ }
509
+ if (IsServerMode() && !DaemonJSON && q->typ != RUN_TYPE) {
510
+ printf("NOTE endreminder\n");
511
+ }
512
+ fflush(stdout);
513
+ DestroyParser(&p);
514
+ }
515
+
516
+ /* Calculate the next trigger time */
517
+ q->tt.nextdtime = CalculateNextDtime(q);
518
+
519
+ if (q->tt.nextdtime != NO_DATETIME) {
520
+ /* If trigger time is way in the past because computer has been
521
+ suspended or hibernated, remove from queue */
522
+ if ((GetQDateTime(q) < SystemDateTime(1) - MaxLateMinutes) &&
523
+ (q->tt.nextdtime < SystemDateTime(1) - MaxLateMinutes)) {
524
+ q->tt.nextdtime = NO_DATETIME;
525
+ }
526
+ }
527
+
528
+ /* If queued reminder has expired, actually remove it from queue
529
+ and update status */
530
+ if (q->tt.nextdtime == NO_DATETIME) {
531
+ del_reminder(q->qid);
532
+ if (IsServerMode()) {
533
+ print_num_queued();
534
+ }
535
+ }
536
+ }
537
+ exit(EXIT_SUCCESS);
538
+ }
539
+
540
+
541
+ /***************************************************************/
542
+ /* */
543
+ /* CalculateNextDtime */
544
+ /* */
545
+ /* Calculate the next datetime when a reminder should be */
546
+ /* issued. */
547
+ /* Return NO_DATETIME if reminder expired. */
548
+ /* Strategy is: If a sched() function is defined, call it. */
549
+ /* Otherwise, use AT time with delta and rep. If sched() */
550
+ /* fails, revert to AT with delta and rep. */
551
+ /* */
552
+ /***************************************************************/
553
+ static int CalculateNextDtime(QueuedRem *q)
554
+ {
555
+ int dtim = GetQDateTime(q);
556
+ int rep = q->tt.rep;
557
+ int delta = q->tt.delta;
558
+ int curdtime;
559
+ int r;
560
+
561
+ int now = SystemDateTime(1);
562
+ /* Initialize curdtime to the last time it was triggered plus
563
+ one minute, or else to the first trigger dtime if it
564
+ was never triggered */
565
+ if (q->tt.nextdtime == NO_DATETIME) {
566
+ curdtime = dtim - delta;
567
+ } else {
568
+ curdtime = q->tt.nextdtime + 1;
569
+ }
570
+ /* Increment number of times this one has been triggered */
571
+
572
+ q->ntrig++;
573
+ if (q->sched[0]) {
574
+ r = CalculateNextDtimeUsingSched(q);
575
+ if (r != NO_DATETIME) return r;
576
+ }
577
+ if (delta == NO_DELTA) {
578
+ if (dtim < curdtime) {
579
+ return NO_DATETIME;
580
+ } else {
581
+ return dtim;
582
+ }
583
+ }
584
+
585
+ dtim -= delta;
586
+ if (rep == NO_REP) rep = delta;
587
+ if (dtim < curdtime) dtim += ((curdtime - dtim) / rep) * rep;
588
+ if (dtim < curdtime) dtim += rep;
589
+ if (dtim < now) dtim += ((now - dtim) / rep) * rep;
590
+ if (dtim < now) dtim += rep;
591
+
592
+ if (dtim > GetQDateTime(q)) dtim = GetQDateTime(q);
593
+ if (dtim < curdtime) return NO_DATETIME; else return dtim;
594
+ }
595
+
596
+ /***************************************************************/
597
+ /* */
598
+ /* FindNextReminder */
599
+ /* */
600
+ /* Find the next reminder to trigger */
601
+ /* */
602
+ /***************************************************************/
603
+ static QueuedRem *FindNextReminder(void)
604
+ {
605
+ QueuedRem *q = QueueHead;
606
+ QueuedRem *ans = NULL;
607
+
608
+ while (q) {
609
+ if (q->tt.nextdtime != NO_DATETIME) {
610
+ if (!ans) ans = q;
611
+ else if (q->tt.nextdtime < ans->tt.nextdtime) ans = q;
612
+ }
613
+ q = q->next;
614
+ }
615
+ return ans;
616
+ }
617
+
618
+
619
+ /***************************************************************/
620
+ /* */
621
+ /* PrintQueue */
622
+ /* */
623
+ /* For debugging: Print queue contents to STDOUT */
624
+ /* */
625
+ /***************************************************************/
626
+ static
627
+ void PrintQueue(void)
628
+ {
629
+ QueuedRem *q = QueueHead;
630
+
631
+ printf("Contents of AT queue:%s", NL);
632
+
633
+ while (q) {
634
+ if (q->tt.nextdtime != NO_DATETIME) {
635
+ printf("Trigger: %02d%c%02d Activate: %02d%c%02d Rep: %d Delta: %d Sched: %s",
636
+ q->tt.ttime / 60, TimeSep, q->tt.ttime % 60,
637
+ GetNextTime(q) / 60, TimeSep, GetNextTime(q) % 60,
638
+ q->tt.rep, q->tt.delta, q->sched);
639
+ if (*q->sched) printf("(%d)", q->ntrig+1);
640
+ printf("%s", NL);
641
+ printf("Text: %s %s%s%s%s%s", ((q->typ == MSG_TYPE) ? "MSG" :
642
+ ((q->typ == MSF_TYPE) ? "MSF" :
643
+ ((q->typ == RUN_TYPE) ? "RUN" : "SPECIAL"))),
644
+ q->passthru,
645
+ (*(q->passthru)) ? " " : "",
646
+ q->text,
647
+ NL, NL);
648
+ }
649
+ q = q->next;
650
+ }
651
+ printf(NL);
652
+ printf("To terminate program, send SIGQUIT (probably Ctrl-\\ on the keyboard.)%s", NL);
653
+ }
654
+
655
+ /***************************************************************/
656
+ /* */
657
+ /* CheckInitialFile */
658
+ /* */
659
+ /* If the initial file has been modified, then restart the */
660
+ /* daemon. */
661
+ /* */
662
+ /***************************************************************/
663
+ static void CheckInitialFile(void)
664
+ {
665
+ /* If date has rolled around, or file has changed, spawn a new version. */
666
+ time_t tim = FileModTime;
667
+ int y, m, d;
668
+ #ifdef USE_INOTIFY
669
+ char buf[sizeof(struct inotify_event) + NAME_MAX + 1];
670
+ int n;
671
+ #endif
672
+
673
+ #ifdef USE_INOTIFY
674
+ /* If there are any inotify events, reread */
675
+ if (watch_fd >= 0) {
676
+ while(1) {
677
+ n = read(watch_fd, buf, sizeof(buf));
678
+ if (n < 0 && errno == EINTR) continue;
679
+ if (n > 0) {
680
+ close(watch_fd);
681
+ reread();
682
+ }
683
+ break;
684
+ }
685
+ }
686
+ #endif
687
+ if (stat(InitialFile, &StatBuf) == 0) tim = StatBuf.st_mtime;
688
+ if (tim != FileModTime ||
689
+ RealToday != SystemDate(&y, &m, &d)) {
690
+ reread();
691
+ }
692
+ }
693
+
694
+ /***************************************************************/
695
+ /* */
696
+ /* CalculateNextDtimeUsingSched */
697
+ /* */
698
+ /* Call the scheduling function. */
699
+ /* */
700
+ /***************************************************************/
701
+ static int CalculateNextDtimeUsingSched(QueuedRem *q)
702
+ {
703
+ /* Use LineBuffer for temp. string storage. */
704
+ int r;
705
+ Value v;
706
+ char const *s;
707
+ int LastDTime = q->tt.nextdtime;
708
+ int ThisDTime;
709
+
710
+ if (UserFuncExists(q->sched) != 1) {
711
+ q->sched[0] = 0;
712
+ return NO_DATETIME;
713
+ }
714
+
715
+ while(1) {
716
+ char exprBuf[VAR_NAME_LEN+32];
717
+ snprintf(exprBuf, sizeof(exprBuf), "%s(%d)", q->sched, q->ntrig);
718
+ s = exprBuf;
719
+ if (q->RunDisabled) {
720
+ r = EvalExprRunDisabled(&s, &v, NULL);
721
+ } else {
722
+ r = EvalExpr(&s, &v, NULL);
723
+ }
724
+ if (r) {
725
+ q->sched[0] = 0;
726
+ return NO_DATETIME;
727
+ }
728
+ if (v.type == TIME_TYPE) {
729
+ ThisDTime = q->dse * MINUTES_PER_DAY + v.v.val;
730
+ } else if (v.type == INT_TYPE) {
731
+ if (v.v.val > 0)
732
+ if (LastDTime >= 0) {
733
+ ThisDTime = LastDTime + v.v.val;
734
+ } else {
735
+ ThisDTime = GetQDateTime(q) + v.v.val;
736
+ }
737
+ else {
738
+ ThisDTime = GetQDateTime(q) + v.v.val;
739
+ }
740
+ } else {
741
+ DestroyValue(v);
742
+ q->sched[0] = 0;
743
+ return NO_DATETIME;
744
+ }
745
+ if (ThisDTime < 0) {
746
+ /* Can't be less than beginning of time! */
747
+ ThisDTime = 0;
748
+ }
749
+
750
+ /* It can go past the Q datetime, but not across day boundaries */
751
+ if ((ThisDTime / MINUTES_PER_DAY) > q->dse) {
752
+ return NO_DATETIME;
753
+ }
754
+ if (DebugFlag & DB_PRTEXPR) {
755
+ int y, m, d;
756
+ FromDSE(ThisDTime / MINUTES_PER_DAY, &y, &m, &d);
757
+ fprintf(ErrFp, "SCHED: Considering %04d%c%02d%c%02d%c%02d%c%02d\n",
758
+ y, DateSep, m+1, DateSep, d, DateTimeSep,
759
+ (ThisDTime % MINUTES_PER_DAY) / 60, TimeSep, (ThisDTime % MINUTES_PER_DAY) % 60);
760
+ }
761
+ if (ThisDTime > q->tt.nextdtime && ThisDTime >= SystemDateTime(1)) return ThisDTime;
762
+ if (ThisDTime <= LastDTime) {
763
+ q->sched[0] = 0;
764
+ return NO_DATETIME;
765
+ }
766
+ LastDTime = ThisDTime;
767
+ q->ntrig++;
768
+ }
769
+ }
770
+
771
+ /* Dump the queue in JSON format */
772
+ static void
773
+ json_queue(QueuedRem const *q)
774
+ {
775
+ int done = 0;
776
+ if (DaemonJSON) {
777
+ printf("{\"response\":\"queue\",\"queue\":");
778
+ }
779
+ printf("[");
780
+ while(q) {
781
+ if (q->tt.nextdtime == NO_DATETIME) {
782
+ q = q->next;
783
+ continue;
784
+ }
785
+ if (done) {
786
+ printf(",");
787
+ }
788
+ done = 1;
789
+ printf("{");
790
+ WriteJSONTrigger(&(q->t), 1);
791
+ WriteJSONTimeTrigger(&(q->tt));
792
+ PrintJSONKeyPairInt("qid", q->qid);
793
+ PrintJSONKeyPairInt("rundisabled", q->RunDisabled);
794
+ PrintJSONKeyPairInt("ntrig", q->ntrig);
795
+ PrintJSONKeyPairString("filename", q->fname);
796
+ PrintJSONKeyPairInt("lineno", q->lineno);
797
+ if (q->lineno_start != q->lineno) {
798
+ PrintJSONKeyPairInt("lineno_start", q->lineno_start);
799
+ }
800
+ switch(q->typ) {
801
+ case NO_TYPE: PrintJSONKeyPairString("type", "NO_TYPE"); break;
802
+ case MSG_TYPE: PrintJSONKeyPairString("type", "MSG_TYPE"); break;
803
+ case RUN_TYPE: PrintJSONKeyPairString("type", "RUN_TYPE"); break;
804
+ case CAL_TYPE: PrintJSONKeyPairString("type", "CAL_TYPE"); break;
805
+ case SAT_TYPE: PrintJSONKeyPairString("type", "SAT_TYPE"); break;
806
+ case PS_TYPE: PrintJSONKeyPairString("type", "PS_TYPE"); break;
807
+ case PSF_TYPE: PrintJSONKeyPairString("type", "PSF_TYPE"); break;
808
+ case MSF_TYPE: PrintJSONKeyPairString("type", "MSF_TYPE"); break;
809
+ case PASSTHRU_TYPE:
810
+ PrintJSONKeyPairString("type", "PASSTHRU_TYPE");
811
+ PrintJSONKeyPairString("passthru", q->passthru);
812
+ break;
813
+ default: PrintJSONKeyPairString("type", "?"); break;
814
+ }
815
+
816
+ /* Last one is a special case - no trailing comma */
817
+ printf("\"");
818
+ PrintJSONString("body");
819
+ printf("\":\"");
820
+ if (q->text) {
821
+ PrintJSONString(q->text);
822
+ } else {
823
+ PrintJSONString("");
824
+ }
825
+ printf("\"}");
826
+ q = q->next;
827
+ }
828
+ printf("]");
829
+ if (DaemonJSON) {
830
+ printf(",\"command\":\"QUEUE\"}\n");
831
+ } else {
832
+ printf("\n");
833
+ }
834
+ }
835
+
836
+ /***************************************************************/
837
+ /* */
838
+ /* ServerWait */
839
+ /* */
840
+ /* Sleep or read command from stdin in server mode */
841
+ /* */
842
+ /***************************************************************/
843
+ static void ServerWait(struct timeval *sleep_tv)
844
+ {
845
+ fd_set readSet;
846
+ int retval;
847
+ int y, m, d;
848
+ int max = 1;
849
+ char cmdLine[256];
850
+ char *s;
851
+ int r;
852
+ DynamicBuffer tx;
853
+
854
+ DBufInit(&tx);
855
+
856
+ FD_ZERO(&readSet);
857
+ FD_SET(0, &readSet);
858
+
859
+ #ifdef USE_INOTIFY
860
+ if (watch_fd >= 0) {
861
+ FD_SET(watch_fd, &readSet);
862
+ if (watch_fd > max-1)
863
+ max = watch_fd+1;
864
+ }
865
+ #endif
866
+ retval = select(max, &readSet, NULL, NULL, sleep_tv);
867
+
868
+ /* If date has rolled around, restart */
869
+ if (RealToday != SystemDate(&y, &m, &d)) {
870
+ if (DaemonJSON) {
871
+ printf("{\"response\":\"newdate\"}\n{\"response\":\"reread\",\"command\":\"newdate\"}\n");
872
+ } else {
873
+ printf("NOTE newdate\nNOTE reread\n");
874
+ }
875
+ fflush(stdout);
876
+ reread();
877
+ }
878
+
879
+ /* If we got a SIGHUP, restart */
880
+ if (got_sighup) {
881
+ reread_because_of_sighup();
882
+ }
883
+
884
+ /* If nothing readable or interrupted system call, return */
885
+ if (retval <= 0) return;
886
+
887
+ /* If inotify watch descriptor is readable, handle it */
888
+ #ifdef USE_INOTIFY
889
+ if (watch_fd >= 0) {
890
+ if (FD_ISSET(watch_fd, &readSet)) {
891
+ consume_inotify_events(watch_fd);
892
+ if (DaemonJSON) {
893
+ printf("{\"response\":\"reread\",\"command\":\"inotify\"}\n");
894
+ } else {
895
+ /* In deprecated server mode, we need to spit out
896
+ a NOTE newdate to force the front-end to redraw
897
+ the calendar */
898
+ printf("NOTE newdate\nNOTE reread\n");
899
+ }
900
+ fflush(stdout);
901
+ reread();
902
+ }
903
+ }
904
+ #endif
905
+ /* If stdin not readable, return */
906
+ if (!FD_ISSET(0, &readSet)) return;
907
+
908
+ /* If EOF on stdin, exit */
909
+ if (feof(stdin)) {
910
+ exit(EXIT_SUCCESS);
911
+ }
912
+
913
+ /* Read a line using read() one char at a time to avoid resetting
914
+ * readability if we get two commands quickly */
915
+
916
+ s = cmdLine;
917
+ *s = 0;
918
+ while (1) {
919
+ r = read(fileno(stdin), s, 1);
920
+ if (r == 0) {
921
+ /* EOF */
922
+ exit(EXIT_SUCCESS);
923
+ }
924
+ if (r != 1) {
925
+ /* Error? */
926
+ if (errno == EINTR) {
927
+ if (got_sighup) {
928
+ reread_because_of_sighup();
929
+ }
930
+ continue;
931
+ }
932
+ exit(EXIT_FAILURE);
933
+ }
934
+ *(s+1) = 0;
935
+ if (*s == '\n') {
936
+ break;
937
+ }
938
+ if ((size_t) (s - cmdLine) >= sizeof(cmdLine)-1) {
939
+ break;
940
+ }
941
+ s++;
942
+ }
943
+
944
+ if (!strcmp(cmdLine, "EXIT\n")) {
945
+ exit(EXIT_SUCCESS);
946
+ } else if (!strcmp(cmdLine, "STATUS\n")) {
947
+ print_num_queued();
948
+ } else if (!strcmp(cmdLine, "QUEUE\n")) {
949
+ if (DaemonJSON) {
950
+ json_queue(QueueHead);
951
+ } else {
952
+ printf("NOTE queue\n");
953
+ QueuedRem *q = QueueHead;
954
+ while (q) {
955
+ if (q->tt.nextdtime != NO_DATETIME) {
956
+ switch (q->typ) {
957
+ case NO_TYPE: printf("NO_TYPE"); break;
958
+ case MSG_TYPE: printf("MSG_TYPE"); break;
959
+ case RUN_TYPE: printf("RUN_TYPE"); break;
960
+ case CAL_TYPE: printf("CAL_TYPE"); break;
961
+ case SAT_TYPE: printf("SAT_TYPE"); break;
962
+ case PS_TYPE: printf("PS_TYPE"); break;
963
+ case PSF_TYPE: printf("PSF_TYPE"); break;
964
+ case MSF_TYPE: printf("MSF_TYPE"); break;
965
+ case PASSTHRU_TYPE: printf("PASSTHRU_TYPE"); break;
966
+ default: printf("?"); break;
967
+ }
968
+ printf(" RunDisabled=%d ntrig=%d ttime=%02d:%02d nexttime=%02d:%02d delta=%d rep=%d duration=%d ", q->RunDisabled, q->ntrig, q->tt.ttime/60, q->tt.ttime % 60, GetNextTime(q) / 60, GetNextTime(q) % 60, q->tt.delta, (q->tt.rep != NO_TIME ? q->tt.rep : -1), (q->tt.duration != NO_TIME ? q->tt.duration : -1));
969
+ printf("%s %s %s\n",
970
+ (q->passthru[0] ? q->passthru : "*"),
971
+ (q->sched[0] ? q->sched : "*"),
972
+ q->text ? q->text : "NULL");
973
+ }
974
+ q = q->next;
975
+ }
976
+ printf("NOTE endqueue\n");
977
+ }
978
+ fflush(stdout);
979
+ } else if (!strcmp(cmdLine, "JSONQUEUE\n")) {
980
+ if (!DaemonJSON) {
981
+ printf("NOTE JSONQUEUE\n");
982
+ }
983
+ json_queue(QueueHead);
984
+ if (!DaemonJSON) {
985
+ printf("NOTE ENDJSONQUEUE\n");
986
+ }
987
+ fflush(stdout);
988
+ } else if (DaemonJSON && !strncmp(cmdLine, "TRANSLATE ", 10)) {
989
+ /* Cut off the trailing "\n" */
990
+ if (*(cmdLine + strlen(cmdLine)-1) == '\n') {
991
+ *(cmdLine + strlen(cmdLine)-1) = 0;
992
+ }
993
+
994
+ r = GetTranslatedStringTryingVariants(cmdLine+10, &tx);
995
+
996
+ /* Output NOTHING if there's no translation */
997
+ if (r) {
998
+ printf("{");
999
+ PrintJSONKeyPairString("response", "translate");
1000
+ printf("\"translation\":{\"");
1001
+ PrintJSONString(cmdLine+10);
1002
+ printf("\":\"");
1003
+ PrintJSONString(DBufValue(&tx));
1004
+ DBufFree(&tx);
1005
+ printf("\"},");
1006
+ printf("\"command\":\"TRANSLATE\"}\n");
1007
+ fflush(stdout);
1008
+ }
1009
+ } else if (!strcmp(cmdLine, "TRANSLATE_DUMP\n")) {
1010
+ if (!DaemonJSON) {
1011
+ printf("NOTE TRANSLATE_DUMP\n");
1012
+ } else {
1013
+ printf("{");
1014
+ PrintJSONKeyPairString("response", "translate_dump");
1015
+ printf("\"table\":");
1016
+ }
1017
+ DumpTranslationTable(stdout, 1);
1018
+ if (!DaemonJSON) {
1019
+ printf("\nNOTE ENDTRANSLATE_DUMP\n");
1020
+ } else {
1021
+ printf(",\"command\":\"TRANSLATE_DUMP\"}\n");
1022
+ }
1023
+ fflush(stdout);
1024
+ } else if (!strcmp(cmdLine, "REREAD\n")) {
1025
+ if (DaemonJSON) {
1026
+ printf("{\"response\":\"reread\",\"command\":\"REREAD\"}\n");
1027
+ } else {
1028
+ printf("NOTE reread\n");
1029
+ }
1030
+ fflush(stdout);
1031
+ reread();
1032
+ } else if (!strncmp(cmdLine, "DEL ", 4)) {
1033
+ int qid;
1034
+ if (sscanf(cmdLine, "DEL %d", &qid) == 1) {
1035
+ del_reminder(qid);
1036
+ }
1037
+ print_num_queued();
1038
+ } else {
1039
+ if (DaemonJSON) {
1040
+ size_t l = strlen(cmdLine);
1041
+ if (l && cmdLine[l-1] == '\n') {
1042
+ cmdLine[l-1] = 0;
1043
+ }
1044
+ printf("{\"response\":\"error\",\"error\":\"Unknown command\",\"command\":\"");
1045
+ PrintJSONString(cmdLine);
1046
+ printf("\"}\n");
1047
+ } else {
1048
+ printf("ERR Invalid daemon command: %s", cmdLine);
1049
+ }
1050
+ fflush(stdout);
1051
+ }
1052
+ }
1053
+
1054
+ /***************************************************************/
1055
+ /* */
1056
+ /* reread */
1057
+ /* */
1058
+ /* Restarts Remind if date rolls over or REREAD cmd received */
1059
+ /* */
1060
+ /***************************************************************/
1061
+ static void reread(void)
1062
+ {
1063
+ execvp(ArgV[0], (char **) ArgV);
1064
+ }
1065
+
1066
+ #ifdef USE_INOTIFY
1067
+ static void consume_inotify_events(int fd)
1068
+ {
1069
+ char buf[sizeof(struct inotify_event) + NAME_MAX + 1];
1070
+ int n;
1071
+
1072
+ struct timespec sleeptime;
1073
+
1074
+ int slept = 0;
1075
+ /* Consume all the inotify events */
1076
+ while(1) {
1077
+ n = read(fd, buf, sizeof(buf));
1078
+ if (n > 0) {
1079
+ /* Something new since we slept */
1080
+ slept = 0;
1081
+ }
1082
+ if (n < 0) {
1083
+ if (errno == EINTR) continue;
1084
+ if (slept) {
1085
+ /* Nothing new since we slept */
1086
+ return;
1087
+ }
1088
+ slept = 1;
1089
+ /* HACK: sleep for 0.2 seconds to let multiple events queue up so we
1090
+ only do a single reread */
1091
+ sleeptime.tv_sec = 0;
1092
+ sleeptime.tv_nsec = 200000000;
1093
+ nanosleep(&sleeptime, NULL);
1094
+ }
1095
+ }
1096
+ }
1097
+
1098
+ static int setup_inotify_watch(void)
1099
+ {
1100
+ int fd;
1101
+
1102
+ /* Don't inotify_watch stdin */
1103
+ if (!strcmp(InitialFile, "-")) {
1104
+ return -1;
1105
+ }
1106
+
1107
+ fd = inotify_init1(IN_NONBLOCK | IN_CLOEXEC);
1108
+ if (fd < 0) {
1109
+ return fd;
1110
+ }
1111
+ if (inotify_add_watch(fd, InitialFile, IN_CLOSE_WRITE | IN_CREATE | IN_DELETE | IN_MODIFY | IN_MOVED_FROM | IN_MOVED_TO) < 0) {
1112
+ close(fd);
1113
+ return -1;
1114
+ }
1115
+ return fd;
1116
+ }
1117
+
1118
+ #endif