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,1494 @@
1
+ /***************************************************************/
2
+ /* */
3
+ /* INIT.C */
4
+ /* */
5
+ /* Initialize remind; perform certain tasks between */
6
+ /* iterations in calendar mode; do certain checks after end */
7
+ /* in normal mode. */
8
+ /* */
9
+ /* This file is part of REMIND. */
10
+ /* Copyright (C) 1992-2026 by Dianne Skoll */
11
+ /* SPDX-License-Identifier: GPL-2.0-only */
12
+ /* */
13
+ /***************************************************************/
14
+
15
+ #include "version.h"
16
+ #include "config.h"
17
+
18
+ #define L_IN_INIT 1
19
+ #include <stdio.h>
20
+ #include <string.h>
21
+ #include <ctype.h>
22
+ #include <time.h>
23
+ #include <stdlib.h>
24
+ #include <sys/types.h>
25
+ #include <sys/stat.h>
26
+ #include <fcntl.h>
27
+ #include <errno.h>
28
+ #include <poll.h>
29
+ #include <pwd.h>
30
+ #include <unistd.h>
31
+ #include <sys/ioctl.h>
32
+ #include <termios.h>
33
+
34
+ #ifdef HAVE_INITGROUPS
35
+ #include <grp.h>
36
+ #endif
37
+
38
+ #ifdef HAVE_SYS_TERMIOS_H
39
+ #ifdef __sun
40
+ #include <sys/termios.h>
41
+ #endif
42
+ #endif
43
+
44
+
45
+ #include "types.h"
46
+ #include "globals.h"
47
+ #include "protos.h"
48
+ #include "err.h"
49
+
50
+ static int should_guess_terminal_background = 1;
51
+
52
+ static void guess_terminal_background(int *r, int *g, int *b);
53
+ static int tty_init(int fd);
54
+ static void tty_raw(int fd);
55
+ static void tty_reset(int fd);
56
+
57
+ static int GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime);
58
+ static void SetTodayFromCmdlineArgs(int dse, int y, int m, int d);
59
+
60
+ static void ProcessLongOption(char const *arg);
61
+ /***************************************************************
62
+ *
63
+ * Command line options recognized:
64
+ *
65
+ * -n = Output next trigger date of each reminder in
66
+ * simple calendar format.
67
+ * -r = Disallow RUN mode
68
+ * -c[n] = Produce a calendar for n months (default = 1)
69
+ * -@[n,m,b]= Colorize n=0 VT100 n=1 85 n=2 True m=0 dark terminal m=1 light
70
+ * b=0 ignore SHADE b=1 respect SHADE
71
+ * -w[n,n,n] = Specify output device width, padding and spacing
72
+ * -s[n] = Produce calendar in "simple calendar" format
73
+ * -p[n] = Produce calendar in format compatible with rem2ps
74
+ * -l = Prefix simple calendar lines with a comment containing
75
+ * their trigger line numbers and filenames
76
+ * -v = Verbose mode
77
+ * -o = Ignore ONCE directives
78
+ * -a = Don't issue timed reminders which will be queued
79
+ * -q = Don't queue timed reminders
80
+ * -t = Trigger all reminders (infinite delta)
81
+ * -h = Hush mode
82
+ * -f = Do not fork
83
+ * -dchars = Debugging mode: Chars are:
84
+ * f = Trace file openings
85
+ * e = Echo input lines
86
+ * x = Display expression evaluation
87
+ * t = Display trigger dates
88
+ * v = Dump variables at end
89
+ * l = Display entire line in error messages
90
+ * s = Display expression-parsing stack usage before exit
91
+ * -e = Send messages normally sent to stderr to stdout instead
92
+ * -z[n] = Daemon mode waking up every n (def 1) minutes.
93
+ * -bn = Time format for cal (0, 1, or 2)
94
+ * -xn = Max. number of iterations for SATISFY
95
+ * -uname = Run as user 'name' - only valid when run by root. If run
96
+ * by non-root, changes environment but not effective uid.
97
+ * -kcmd = Run 'cmd' for MSG-type reminders instead of printing to stdout
98
+ * -iVAR=EXPR = Initialize and preserve VAR.
99
+ * -m = Start calendar with Monday instead of Sunday.
100
+ * -j[n] = Purge all junk from reminder files (n = INCLUDE depth)
101
+ * A minus sign alone indicates to take input from stdin
102
+ *
103
+ **************************************************************/
104
+
105
+ /* For parsing an integer */
106
+ #define PARSENUM(var, s) \
107
+ do { \
108
+ var = 0; \
109
+ while (isdigit(*(s))) { \
110
+ var *= 10; \
111
+ var += *(s) - '0'; \
112
+ s++; \
113
+ }} while(0)
114
+
115
+ static void ChgUser(char const *u);
116
+ static void InitializeVar(char const *str);
117
+
118
+ static char const *BadDate = "Illegal date on command line\n";
119
+ static void AddTrustedUser(char const *username);
120
+
121
+ static DynamicBuffer default_filename_buf;
122
+
123
+ static void
124
+ InitCalWidthAndFormWidth(int fd)
125
+ {
126
+ struct winsize w;
127
+
128
+ if (!isatty(fd)) {
129
+ return;
130
+ }
131
+ if (ioctl(fd, TIOCGWINSZ, &w) == 0) {
132
+ CalWidth = w.ws_col;
133
+ if (CalWidth < 71) {
134
+ CalWidth = 71;
135
+ }
136
+ FormWidth = w.ws_col - 8;
137
+ if (FormWidth < 20) FormWidth = 20;
138
+ if (FormWidth > 500) FormWidth = 500;
139
+ }
140
+ }
141
+
142
+ /***************************************************************/
143
+ /* */
144
+ /* DefaultFilename */
145
+ /* */
146
+ /* If we're invoked as "rem" rather than "remind", use a */
147
+ /* default filename. Use $DOTREMINDERS or $HOME/.reminders */
148
+ /* */
149
+ /***************************************************************/
150
+ static char const *DefaultFilename(void)
151
+ {
152
+ char const *s;
153
+
154
+ DBufInit(&default_filename_buf);
155
+
156
+ s = getenv("DOTREMINDERS");
157
+ if (s) {
158
+ return s;
159
+ }
160
+
161
+ s = getenv("HOME");
162
+ if (!s) {
163
+ fprintf(ErrFp, "HOME environment variable not set. Unable to determine reminder file.\n");
164
+ exit(EXIT_FAILURE);
165
+ }
166
+ DBufPuts(&default_filename_buf, s);
167
+ DBufPuts(&default_filename_buf, "/.reminders");
168
+ return DBufValue(&default_filename_buf);
169
+ }
170
+
171
+ /***************************************************************/
172
+ /* */
173
+ /* InitRemind */
174
+ /* */
175
+ /* Initialize the system - called only once at beginning! */
176
+ /* */
177
+ /***************************************************************/
178
+ void InitRemind(int argc, char const *argv[])
179
+ {
180
+ char const *arg;
181
+ int i;
182
+ int y, m, d, rep;
183
+ Token tok;
184
+ int InvokedAsRem = 0;
185
+ char const *s;
186
+ int weeks;
187
+ int x;
188
+ int dse;
189
+ int ttyfd;
190
+ int r;
191
+
192
+ /* Make sure remind is not installed set-uid or set-gid */
193
+ if (getgid() != getegid() ||
194
+ getuid() != geteuid()) {
195
+ fprintf(ErrFp, "\nRemind should not be installed set-uid or set-gid.\nCHECK YOUR SYSTEM SECURITY.\n");
196
+ exit(EXIT_FAILURE);
197
+ }
198
+
199
+ dse = NO_DATE;
200
+
201
+ /* Initialize local time zone */
202
+ LocalTimeZone = getenv("TZ");
203
+ if (LocalTimeZone) {
204
+ LocalTimeZone = strdup(LocalTimeZone);
205
+ if (!LocalTimeZone) {
206
+ fprintf(stderr, "Out of memory!\n");
207
+ exit(1);
208
+ }
209
+ }
210
+
211
+ /* Initialize variable hash table */
212
+ InitVars();
213
+
214
+ /* Initialize user-defined functions hash table */
215
+ InitUserFunctions();
216
+
217
+ InitTranslationTable();
218
+ InitFiles();
219
+
220
+ /* If stdout is a terminal, initialize $FormWidth to terminal width-8,
221
+ but clamp to [20, 500] */
222
+ InitCalWidthAndFormWidth(STDOUT_FILENO);
223
+
224
+ /* Initialize global dynamic buffers */
225
+ DBufInit(&Banner);
226
+ DBufInit(&LineBuffer);
227
+ DBufInit(&ExprBuf);
228
+
229
+ DBufPuts(&Banner, "Reminders for %w, %d%s %m, %y%o:");
230
+
231
+ PurgeFP = NULL;
232
+
233
+ InitDedupeTable();
234
+
235
+ y = NO_YR;
236
+ m = NO_MON;
237
+ d = NO_DAY;
238
+ rep = NO_REP;
239
+
240
+ RealToday = SystemDate(&CurYear, &CurMon, &CurDay);
241
+ if (RealToday < 0) {
242
+ fprintf(ErrFp, GetErr(M_BAD_SYS_DATE), BASE);
243
+ fprintf(ErrFp, "\n");
244
+ exit(EXIT_FAILURE);
245
+ }
246
+ LocalSysTime = SystemTime(0);
247
+ DSEToday = RealToday;
248
+ LocalDSEToday = DSEToday;
249
+ FromDSE(DSEToday, &CurYear, &CurMon, &CurDay);
250
+
251
+ /* Initialize Latitude and Longitude */
252
+ set_components_from_lat_and_long();
253
+
254
+ /* See if we were invoked as "rem" rather than "remind" */
255
+ if (argv[0]) {
256
+ s = strrchr(argv[0], '/');
257
+ if (!s) {
258
+ s = argv[0];
259
+ } else {
260
+ s++;
261
+ }
262
+ if (!strcmp(s, "rem")) {
263
+ InvokedAsRem = 1;
264
+ }
265
+ } else {
266
+ fprintf(ErrFp, "Invoked with a NULL argv[0]; bailing because that's just plain bizarre.\n");
267
+ exit(EXIT_FAILURE);
268
+ }
269
+
270
+ /* Parse the command-line options */
271
+ i = 1;
272
+
273
+ while (i < argc) {
274
+ arg = argv[i];
275
+ if (*arg != '-') break; /* Exit the loop if it's not an option */
276
+ i++;
277
+ arg++;
278
+ if (!*arg) {
279
+ UseStdin = 1;
280
+ i--;
281
+ break;
282
+ }
283
+ while (*arg) {
284
+ switch(*arg++) {
285
+ case '+':
286
+ AddTrustedUser(arg);
287
+ while(*arg) arg++;
288
+ break;
289
+
290
+ case '-':
291
+ ProcessLongOption(arg);
292
+ while(*arg) arg++;
293
+ break;
294
+
295
+ case '@':
296
+ UseVTColors = 1;
297
+ if (*arg) {
298
+ PARSENUM(x, arg);
299
+ if (x == 1) {
300
+ Use256Colors = 1;
301
+ } else if (x == 2) {
302
+ UseTrueColors = 1;
303
+ } else if (x != 0) {
304
+ fprintf(ErrFp, "%s: -@n,m,b: n must be 0, 1 or 2 (assuming 0)\n",
305
+ argv[0]);
306
+ }
307
+ }
308
+ if (*arg == ',') {
309
+ arg++;
310
+ if (*arg != ',') {
311
+ if (*arg == 't') {
312
+ arg++;
313
+ should_guess_terminal_background = 2;
314
+ } else {
315
+ PARSENUM(x, arg);
316
+ if (x == 0) {
317
+ should_guess_terminal_background = 0;
318
+ TerminalBackground = TERMINAL_BACKGROUND_DARK;
319
+ } else if (x == 1) {
320
+ should_guess_terminal_background = 0;
321
+ TerminalBackground = TERMINAL_BACKGROUND_LIGHT;
322
+ } else if (x == 2) {
323
+ should_guess_terminal_background = 0;
324
+ TerminalBackground = TERMINAL_BACKGROUND_UNKNOWN;
325
+ } else {
326
+ fprintf(ErrFp, "%s: -@n,m,b: m must be t, 0, 1 or 2 (assuming 2)\n",
327
+ argv[0]);
328
+ }
329
+ }
330
+ }
331
+ }
332
+ if (*arg == ',') {
333
+ arg++;
334
+ PARSENUM(x, arg);
335
+ if (x != 0 && x != 1) {
336
+ fprintf(ErrFp, "%s: -@n,m,b: b must be 0 or 1 (assuming 0)\n",
337
+ argv[0]);
338
+ x = 0;
339
+ }
340
+ UseBGVTColors = x;
341
+ }
342
+ break;
343
+
344
+ case 'j':
345
+ case 'J':
346
+ PurgeMode = 1;
347
+ if (*arg) {
348
+ PARSENUM(PurgeIncludeDepth, arg);
349
+ }
350
+ break;
351
+ case 'i':
352
+ case 'I':
353
+ InitializeVar(arg);
354
+ while(*arg) arg++;
355
+ break;
356
+
357
+ case 'n':
358
+ case 'N':
359
+ NextMode = 1;
360
+ DontQueue = 1;
361
+ Daemon = 0;
362
+ IgnoreOnce = 1;
363
+ break;
364
+
365
+ case 'r':
366
+ case 'R':
367
+ RunDisabled = RUN_CMDLINE;
368
+ break;
369
+
370
+ case 'm':
371
+ case 'M':
372
+ MondayFirst = 1;
373
+ break;
374
+
375
+ case 'o':
376
+ case 'O':
377
+ IgnoreOnce = 1;
378
+ break;
379
+
380
+ case 'y':
381
+ case 'Y':
382
+ SynthesizeTags = 1;
383
+ break;
384
+
385
+ case 't':
386
+ case 'T':
387
+ if (*arg == 'T' || *arg == 't') {
388
+ arg++;
389
+ if (!*arg) {
390
+ DefaultTDelta = 5;
391
+ } else {
392
+ PARSENUM(DefaultTDelta, arg);
393
+ if (DefaultTDelta < 0) {
394
+ DefaultTDelta = 0;
395
+ } else if (DefaultTDelta > MINUTES_PER_DAY) {
396
+ DefaultTDelta = MINUTES_PER_DAY;
397
+ }
398
+ }
399
+ } else if (!*arg) {
400
+ InfiniteDelta = 1;
401
+ } else {
402
+ if (*arg == 'z') {
403
+ DeltaOverride = -1;
404
+ arg++;
405
+ } else {
406
+ PARSENUM(DeltaOverride, arg);
407
+ if (DeltaOverride < 0) {
408
+ DeltaOverride = 0;
409
+ }
410
+ }
411
+ }
412
+ break;
413
+ case 'e':
414
+ case 'E':
415
+ ErrFp = stdout;
416
+ break;
417
+
418
+ case 'h':
419
+ case 'H':
420
+ Hush = 1;
421
+ break;
422
+
423
+ case 'g':
424
+ case 'G':
425
+ SortByDate = SORT_ASCEND;
426
+ SortByTime = SORT_ASCEND;
427
+ SortByPrio = SORT_ASCEND;
428
+ UntimedBeforeTimed = 0;
429
+ if (*arg) {
430
+ if (*arg == 'D' || *arg == 'd')
431
+ SortByDate = SORT_DESCEND;
432
+ arg++;
433
+ }
434
+ if (*arg) {
435
+ if (*arg == 'D' || *arg == 'd')
436
+ SortByTime = SORT_DESCEND;
437
+ arg++;
438
+ }
439
+ if (*arg) {
440
+ if (*arg == 'D' || *arg == 'd')
441
+ SortByPrio = SORT_DESCEND;
442
+ arg++;
443
+ }
444
+ if (*arg) {
445
+ if (*arg == 'D' || *arg == 'd')
446
+ UntimedBeforeTimed = 1;
447
+ arg++;
448
+ }
449
+ break;
450
+
451
+ case 'u':
452
+ case 'U':
453
+ if (*arg == '+') {
454
+ ChgUser(arg+1);
455
+ } else {
456
+ RunDisabled = RUN_CMDLINE;
457
+ ChgUser(arg);
458
+ }
459
+ while (*arg) arg++;
460
+ break;
461
+ case 'z':
462
+ case 'Z':
463
+ DontFork = 1;
464
+ if (*arg == 'j' || *arg == 'J') {
465
+ while (*arg) arg++;
466
+ Daemon = -1;
467
+ DaemonJSON = 1;
468
+ } else if (*arg == '0') {
469
+ PARSENUM(Daemon, arg);
470
+ if (Daemon == 0) Daemon = -1;
471
+ else if (Daemon < 1) Daemon = 1;
472
+ else if (Daemon > 60) Daemon = 60;
473
+ } else {
474
+ PARSENUM(Daemon, arg);
475
+ if (Daemon<1) Daemon=1;
476
+ else if (Daemon>60) Daemon=60;
477
+ }
478
+ break;
479
+
480
+ case 'a':
481
+ case 'A':
482
+ DontIssueAts++;
483
+ break;
484
+
485
+ case 'q':
486
+ case 'Q':
487
+ DontQueue = 1;
488
+ break;
489
+
490
+ case 'f':
491
+ case 'F':
492
+ DontFork = 1;
493
+ break;
494
+ case 'c':
495
+ case 'C':
496
+ IgnoreOnce = 1;
497
+ DoCalendar = 1;
498
+ weeks = 0;
499
+ /* Parse the flags */
500
+ while(*arg) {
501
+ if (*arg == 'a' ||
502
+ *arg == 'A') {
503
+ DoSimpleCalDelta = 1;
504
+ arg++;
505
+ continue;
506
+ }
507
+ if (*arg == '+') {
508
+ weeks = 1;
509
+ arg++;
510
+ continue;
511
+ }
512
+ if (*arg == 'l' || *arg == 'L') {
513
+ UseVTChars = 1;
514
+ arg++;
515
+ continue;
516
+ }
517
+ if (*arg == 'u' || *arg == 'U') {
518
+ UseUTF8Chars = 1;
519
+ arg++;
520
+ continue;
521
+ }
522
+ if (*arg == 'z' || *arg == 'Z') {
523
+ TerminalHyperlinks = 1;
524
+ arg++;
525
+ continue;
526
+ }
527
+ if (*arg == 'c' || *arg == 'C') {
528
+ UseVTColors = 1;
529
+ arg++;
530
+ continue;
531
+ }
532
+ break;
533
+ }
534
+ if (weeks) {
535
+ CalType = "weekly";
536
+ PARSENUM(CalWeeks, arg);
537
+ if (!CalWeeks) CalWeeks = 1;
538
+ } else {
539
+ CalType = "monthly";
540
+ PARSENUM(CalMonths, arg);
541
+ if (!CalMonths) CalMonths = 1;
542
+ }
543
+ break;
544
+
545
+ case 's':
546
+ case 'S':
547
+ DoSimpleCalendar = 1;
548
+ IgnoreOnce = 1;
549
+ weeks = 0;
550
+ while(*arg) {
551
+ if (*arg == 'a' || *arg == 'A') {
552
+ DoSimpleCalDelta = 1;
553
+ arg++;
554
+ continue;
555
+ }
556
+ if (*arg == '+') {
557
+ arg++;
558
+ weeks = 1;
559
+ continue;
560
+ }
561
+ break;
562
+ }
563
+ if (weeks) {
564
+ CalType = "weekly";
565
+ PARSENUM(CalWeeks, arg);
566
+ if (!CalWeeks) CalWeeks = 1;
567
+ } else {
568
+ CalType = "monthly";
569
+ PARSENUM(CalMonths, arg);
570
+ if (!CalMonths) CalMonths = 1;
571
+ }
572
+ break;
573
+
574
+ case 'p':
575
+ case 'P':
576
+ DoSimpleCalendar = 1;
577
+ IgnoreOnce = 1;
578
+ PsCal = PSCAL_LEVEL1;
579
+ weeks = 0;
580
+ while (*arg == 'a' || *arg == 'A' ||
581
+ *arg == 'q' || *arg == 'Q' ||
582
+ *arg == '+' ||
583
+ *arg == 'p' || *arg == 'P') {
584
+ if (*arg == '+') {
585
+ weeks = 1;
586
+ } else if (*arg == 'a' || *arg == 'A') {
587
+ DoSimpleCalDelta = 1;
588
+ } else if (*arg == 'p' || *arg == 'P') {
589
+ /* JSON interchange formats always include
590
+ file and line number info */
591
+ DoPrefixLineNo = 1;
592
+ if (PsCal == PSCAL_LEVEL1) {
593
+ PsCal = PSCAL_LEVEL2;
594
+ } else {
595
+ PsCal = PSCAL_LEVEL3;
596
+ }
597
+ } else if (*arg == 'q' || *arg == 'Q') {
598
+ DontSuppressQuoteMarkers = 1;
599
+ }
600
+ arg++;
601
+ }
602
+ if (weeks) {
603
+ CalType = "weekly";
604
+ PARSENUM(CalWeeks, arg);
605
+ if (!CalWeeks) CalWeeks = 1;
606
+ PsCal = PSCAL_LEVEL3;
607
+ } else {
608
+ CalType = "monthly";
609
+ PARSENUM(CalMonths, arg);
610
+ if (!CalMonths) CalMonths = 1;
611
+ }
612
+ break;
613
+
614
+ case 'l':
615
+ case 'L':
616
+ DoPrefixLineNo = 1;
617
+ break;
618
+
619
+ case 'w':
620
+ case 'W':
621
+ if (*arg != ',') {
622
+ if (*arg == 't') {
623
+ arg++;
624
+ /* -wt means get width from /dev/tty */
625
+ ttyfd = open("/dev/tty", O_RDONLY);
626
+ if (ttyfd < 0) {
627
+ fprintf(ErrFp, "%s: `-wt': Cannot open /dev/tty: %s\n",
628
+ argv[0], strerror(errno));
629
+ } else {
630
+ InitCalWidthAndFormWidth(ttyfd);
631
+ close(ttyfd);
632
+ }
633
+ } else {
634
+ PARSENUM(CalWidth, arg);
635
+ if (CalWidth != 0 && CalWidth < 71) CalWidth = 71;
636
+ if (CalWidth == 0) {
637
+ /* Cal width of 0 means obtain from stdout */
638
+ if (isatty(STDOUT_FILENO)) {
639
+ InitCalWidthAndFormWidth(STDOUT_FILENO);
640
+ } else {
641
+ CalWidth = 80;
642
+ }
643
+ }
644
+ FormWidth = CalWidth - 8;
645
+ if (FormWidth < 20) FormWidth = 20;
646
+ if (FormWidth > 500) FormWidth = 500;
647
+ }
648
+ }
649
+ if (*arg == ',') {
650
+ arg++;
651
+ if (*arg != ',') {
652
+ PARSENUM(CalLines, arg);
653
+ if (CalLines > 20) CalLines = 20;
654
+ }
655
+ if (*arg == ',') {
656
+ arg++;
657
+ if (*arg != ',') {
658
+ PARSENUM(CalPad, arg);
659
+ if (CalPad > 20) CalPad = 20;
660
+ }
661
+ if (*arg == ',') {
662
+ arg++;
663
+ PARSENUM(CalSepLine, arg);
664
+ if (CalSepLine) {
665
+ CalSepLine = 1;
666
+ }
667
+ }
668
+ }
669
+ }
670
+ break;
671
+
672
+ case 'd':
673
+ case 'D':
674
+ while (*arg) {
675
+ switch(*arg++) {
676
+ case 'p': case 'P': DebugFlag |= DB_PUSHPOP; break;
677
+ case 's': case 'S': DebugFlag |= DB_PARSE_EXPR; break;
678
+ case 'h': case 'H': DebugFlag |= DB_HASHSTATS; break;
679
+ case 'e': case 'E': DebugFlag |= DB_ECHO_LINE; break;
680
+ case 'x': case 'X': DebugFlag |= DB_PRTEXPR; break;
681
+ case 't': case 'T': DebugFlag |= DB_PRTTRIG; break;
682
+ case 'v': case 'V': DebugFlag |= DB_DUMP_VARS; break;
683
+ case 'l': case 'L': DebugFlag |= DB_PRTLINE; break;
684
+ case 'f': case 'F': DebugFlag |= DB_TRACE_FILES; break;
685
+ case 'q': case 'Q': DebugFlag |= DB_TRANSLATE; break;
686
+ case 'n': case 'N': DebugFlag |= DB_NONCONST; break;
687
+ case 'u': case 'U': DebugFlag |= DB_UNUSED_VARS; break;
688
+ case 'z': case 'Z': DebugFlag |= DB_SWITCH_ZONE; break;
689
+ default:
690
+ fprintf(ErrFp, GetErr(M_BAD_DB_FLAG), *(arg-1));
691
+ fprintf(ErrFp, "\n");
692
+ }
693
+ }
694
+ break;
695
+
696
+ case 'v':
697
+ case 'V':
698
+ DebugFlag |= DB_PRTLINE;
699
+ ShowAllErrors = 1;
700
+ break;
701
+
702
+ case 'b':
703
+ case 'B':
704
+ PARSENUM(ScFormat, arg);
705
+ if (ScFormat<0 || ScFormat>2) ScFormat=SC_AMPM;
706
+ break;
707
+
708
+ case 'x':
709
+ case 'X':
710
+ PARSENUM(MaxSatIter, arg);
711
+ if (MaxSatIter < 10) MaxSatIter=10;
712
+ break;
713
+
714
+ case 'k':
715
+ case 'K':
716
+ if (*arg == ':') {
717
+ arg++;
718
+ QueuedMsgCommand = arg;
719
+ } else {
720
+ MsgCommand = arg;
721
+ }
722
+ while (*arg) arg++; /* Chew up remaining chars in this arg */
723
+ break;
724
+
725
+ default:
726
+ fprintf(ErrFp, GetErr(M_BAD_OPTION), *(arg-1));
727
+ fprintf(ErrFp, "\n");
728
+ }
729
+
730
+ }
731
+ }
732
+
733
+ /* Get the filename. */
734
+ if (!InvokedAsRem) {
735
+ if (i >= argc) {
736
+ Usage();
737
+ exit(EXIT_FAILURE);
738
+ }
739
+ InitialFile = argv[i++];
740
+ } else {
741
+ InitialFile = DefaultFilename();
742
+ }
743
+
744
+ /* Get the date, if any */
745
+ if (i < argc) {
746
+ while (i < argc) {
747
+ arg = argv[i++];
748
+ /* If it begins with '@' then it's a trigger spec */
749
+ if (*arg == '@') {
750
+ SetTodayFromCmdlineArgs(dse, y, m, d);
751
+ r = GetInitDateFromTrigger(arg+1, &y, &m, &d, &SysTime);
752
+ if (r == OK) {
753
+ dse = NO_DATE; /* Date is in y/m/d */
754
+ if (SysTime != -1) {
755
+ DontQueue = 1;
756
+ Daemon = 0;
757
+ LocalSysTime = SysTime;
758
+ }
759
+ } else {
760
+ fprintf(stderr, "Could not evaluate command-line trigger: %s\n", GetErr(r));
761
+ exit(1);
762
+ }
763
+ continue;
764
+ }
765
+ FindToken(arg, &tok);
766
+ switch (tok.type) {
767
+ case T_Time:
768
+ if (SysTime != -1) Usage();
769
+ else {
770
+ SysTime = (long) tok.val * 60L;
771
+ LocalSysTime = SysTime;
772
+ DontQueue = 1;
773
+ Daemon = 0;
774
+ }
775
+ break;
776
+
777
+ case T_DateTime:
778
+ if (SysTime != -1) Usage();
779
+ if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage();
780
+ SysTime = (tok.val % MINUTES_PER_DAY) * 60;
781
+ LocalSysTime = SysTime;
782
+ DontQueue = 1;
783
+ Daemon = 0;
784
+ dse = tok.val / MINUTES_PER_DAY;
785
+ break;
786
+
787
+ case T_Date:
788
+ if (m != NO_MON || d != NO_DAY || y != NO_YR || dse != NO_DATE) Usage();
789
+ dse = tok.val;
790
+ break;
791
+
792
+ case T_Month:
793
+ if (m != NO_MON || dse != NO_DATE) Usage();
794
+ else m = tok.val;
795
+ break;
796
+
797
+ case T_Day:
798
+ if (d != NO_DAY || dse != NO_DATE) Usage();
799
+ else d = tok.val;
800
+ break;
801
+
802
+ case T_Year:
803
+ if (y != NO_YR || dse != NO_DATE) Usage();
804
+ else y = tok.val;
805
+ break;
806
+
807
+ case T_Rep:
808
+ if (rep != NO_REP) Usage();
809
+ else rep = tok.val;
810
+ break;
811
+
812
+ default:
813
+ if (tok.type == T_Illegal && tok.val < 0) {
814
+ fprintf(ErrFp, "%s: `%s'\n", GetErr(-tok.val), arg);
815
+ Usage();
816
+ }
817
+ Usage();
818
+ }
819
+ }
820
+
821
+ if (rep > 0) {
822
+ Iterations = rep;
823
+ OrigIterations = rep;
824
+ IgnoreOnce = 1;
825
+ DontQueue = 1;
826
+ Daemon = 0;
827
+ }
828
+
829
+ SetTodayFromCmdlineArgs(dse, y, m, d);
830
+ }
831
+
832
+ /* JSON mode turns off sorting */
833
+ if (JSONMode) {
834
+ SortByTime = SORT_NONE;
835
+ SortByDate = SORT_NONE;
836
+ SortByPrio = SORT_NONE;
837
+ /* Make sure we don't blat errors to stdout! */
838
+ ErrFp = stderr;
839
+ }
840
+
841
+ /* Figure out the offset from UTC */
842
+ if (CalculateUTC) {
843
+ (void) CalcMinsFromUTC(DSEToday, MinutesPastMidnight(0),
844
+ &MinsFromUTC, NULL);
845
+ }
846
+
847
+ /* If stdout is a tty, enable terminal hyperlinks by default */
848
+ if (TerminalHyperlinks == -1) {
849
+ if (isatty(STDOUT_FILENO)) {
850
+ TerminalHyperlinks = 1;
851
+ } else {
852
+ TerminalHyperlinks = 0;
853
+ }
854
+ }
855
+ }
856
+
857
+ /***************************************************************/
858
+ /* */
859
+ /* Usage */
860
+ /* */
861
+ /* Print the usage info. */
862
+ /* */
863
+ /***************************************************************/
864
+ #ifndef L_USAGE_OVERRIDE
865
+ void Usage(void)
866
+ {
867
+ fprintf(ErrFp, "\nREMIND %s Copyright (C) 1992-2026 Dianne Skoll\n", VERSION);
868
+ #ifdef BETA
869
+ fprintf(ErrFp, ">>>> BETA VERSION <<<<\n");
870
+ #endif
871
+ fprintf(ErrFp, "Usage: remind [options] filename [date] [time] [*rep]\n");
872
+ fprintf(ErrFp, "Options:\n");
873
+ fprintf(ErrFp, " -n Output next occurrence of reminders in simple format\n");
874
+ fprintf(ErrFp, " -r Disable RUN directives\n");
875
+ fprintf(ErrFp, " -@[n,m,b] Colorize COLOR/SHADE reminders\n");
876
+ fprintf(ErrFp, " -c[a][n] Produce a calendar for n (default 1) months\n");
877
+ fprintf(ErrFp, " -c[a]+[n] Produce a calendar for n (default 1) weeks\n");
878
+ fprintf(ErrFp, " -w[n[,p[,s]]] Specify width, padding and spacing of calendar\n");
879
+ fprintf(ErrFp, " -s[a][+][n] Produce `simple calendar' for n (1) months (weeks)\n");
880
+ fprintf(ErrFp, " -p[a][n] Same as -s, but input compatible with rem2ps\n");
881
+ fprintf(ErrFp, " -l Prefix each simple calendar line with line number and filename comment\n");
882
+ fprintf(ErrFp, " -v Verbose mode\n");
883
+ fprintf(ErrFp, " -o Ignore ONCE directives\n");
884
+ fprintf(ErrFp, " -t[n] Trigger all future (or those within `n' days)\n");
885
+ fprintf(ErrFp, " -h `Hush' mode - be very quiet\n");
886
+ fprintf(ErrFp, " -a Don't trigger timed reminders immediately - just queue them\n");
887
+ fprintf(ErrFp, " -q Don't queue timed reminders\n");
888
+ fprintf(ErrFp, " -f Trigger timed reminders by staying in foreground\n");
889
+ fprintf(ErrFp, " -z[n] Enter daemon mode, waking every n (1) minutes.\n");
890
+ fprintf(ErrFp, " -d... Debug: See man page for details\n");
891
+ fprintf(ErrFp, " -e Divert messages normally sent to stderr to stdout\n");
892
+ fprintf(ErrFp, " -b[n] Time format for cal: 0=am/pm, 1=24hr, 2=none\n");
893
+ fprintf(ErrFp, " -x[n] Iteration limit for SATISFY clause (def=1000)\n");
894
+ fprintf(ErrFp, " -kcmd Run `cmd' for MSG-type reminders\n");
895
+ fprintf(ErrFp, " -g[dddd] Sort reminders by date, time, priority, and 'timedness'\n");
896
+ fprintf(ErrFp, " -ivar=val Initialize var to val and preserve var\n");
897
+ fprintf(ErrFp, " -m Start calendar with Monday rather than Sunday\n");
898
+ fprintf(ErrFp, " -y Synthesize tags for tagless reminders\n");
899
+ fprintf(ErrFp, " -j[n] Run in 'purge' mode. [n = INCLUDE depth]\n");
900
+ fprintf(ErrFp, "\nLong Options:\n");
901
+ fprintf(ErrFp, " --version Print Remind version\n");
902
+ fprintf(ErrFp, " --hide-completed-todos Don't show completed todos on calendar\n");
903
+ fprintf(ErrFp, " --only-todos Only issue TODO reminders\n");
904
+ fprintf(ErrFp, " --only-events Do not issue TODO reminders\n");
905
+ fprintf(ErrFp, " --json Use JSON output instead of plain-text\n");
906
+ fprintf(ErrFp, " --max-execution-time=n Limit execution time to n seconds\n");
907
+ fprintf(ErrFp, " --max-expr-complexity=n Limit expression evaluation to n nodes per line\n");
908
+ fprintf(ErrFp, " --print-config-cmd Print ./configure cmd used to build Remind\n");
909
+ fprintf(ErrFp, " --print-errs Print all possible error messages\n");
910
+ fprintf(ErrFp, " --print-tokens Print all possible Remind tokens\n");
911
+ fprintf(ErrFp, "\nRemind home page: %s\n", PACKAGE_URL);
912
+ exit(EXIT_FAILURE);
913
+ }
914
+ #endif /* L_USAGE_OVERRIDE */
915
+ /***************************************************************/
916
+ /* */
917
+ /* ChgUser */
918
+ /* */
919
+ /* Run as a specified user. Can only be used if Remind is */
920
+ /* started by root. This changes the real and effective uid, */
921
+ /* the real and effective gid, and sets the HOME, SHELL and */
922
+ /* USER environment variables. */
923
+ /* */
924
+ /***************************************************************/
925
+ static void ChgUser(char const *user)
926
+ {
927
+ uid_t myeuid;
928
+
929
+ struct passwd *pwent;
930
+ static char *home;
931
+ static char *shell;
932
+ static char *username;
933
+ static char *logname;
934
+
935
+ myeuid = geteuid();
936
+
937
+ pwent = getpwnam(user);
938
+
939
+ if (!pwent) {
940
+ fprintf(ErrFp, GetErr(M_BAD_USER), user);
941
+ fprintf(ErrFp, "\n");
942
+ exit(EXIT_FAILURE);
943
+ }
944
+
945
+ if (!myeuid) {
946
+ /* Started as root, so drop privileges */
947
+ #ifdef HAVE_INITGROUPS
948
+ if (initgroups(pwent->pw_name, pwent->pw_gid) < 0) {
949
+ fprintf(ErrFp, GetErr(M_NO_CHG_GID), pwent->pw_gid);
950
+ fprintf(ErrFp, "\n");
951
+ exit(EXIT_FAILURE);
952
+ };
953
+ #endif
954
+ if (setgid(pwent->pw_gid) < 0) {
955
+ fprintf(ErrFp, GetErr(M_NO_CHG_GID), pwent->pw_gid);
956
+ fprintf(ErrFp, "\n");
957
+ exit(EXIT_FAILURE);
958
+ }
959
+
960
+ if (setuid(pwent->pw_uid) < 0) {
961
+ fprintf(ErrFp, GetErr(M_NO_CHG_UID), pwent->pw_uid);
962
+ fprintf(ErrFp, "\n");
963
+ exit(EXIT_FAILURE);
964
+ }
965
+ }
966
+
967
+ home = malloc(strlen(pwent->pw_dir) + 6);
968
+ if (!home) {
969
+ fprintf(ErrFp, "%s", GetErr(M_NOMEM_ENV));
970
+ fprintf(ErrFp, "\n");
971
+ exit(EXIT_FAILURE);
972
+ }
973
+ sprintf(home, "HOME=%s", pwent->pw_dir);
974
+ putenv(home);
975
+
976
+ shell = malloc(strlen(pwent->pw_shell) + 7);
977
+ if (!shell) {
978
+ fprintf(ErrFp, "%s", GetErr(M_NOMEM_ENV));
979
+ fprintf(ErrFp, "\n");
980
+ exit(EXIT_FAILURE);
981
+ }
982
+ sprintf(shell, "SHELL=%s", pwent->pw_shell);
983
+ putenv(shell);
984
+
985
+ if (pwent->pw_uid) {
986
+ username = malloc(strlen(pwent->pw_name) + 6);
987
+ if (!username) {
988
+ fprintf(ErrFp, "%s", GetErr(M_NOMEM_ENV));
989
+ fprintf(ErrFp, "\n");
990
+ exit(EXIT_FAILURE);
991
+ }
992
+ sprintf(username, "USER=%s", pwent->pw_name);
993
+ putenv(username);
994
+ logname= malloc(strlen(pwent->pw_name) + 9);
995
+ if (!logname) {
996
+ fprintf(ErrFp, "%s", GetErr(M_NOMEM_ENV));
997
+ fprintf(ErrFp, "\n");
998
+ exit(EXIT_FAILURE);
999
+ }
1000
+ sprintf(logname, "LOGNAME=%s", pwent->pw_name);
1001
+ putenv(logname);
1002
+ }
1003
+ }
1004
+
1005
+ static void
1006
+ DefineFunction(char const *str)
1007
+ {
1008
+ Parser p;
1009
+ int r;
1010
+
1011
+ CreateParser(str, &p);
1012
+ r = DoFset(&p);
1013
+ DestroyParser(&p);
1014
+ if (r != OK) {
1015
+ fprintf(ErrFp, "-i option: %s: %s\n", str, GetErr(r));
1016
+ }
1017
+ }
1018
+ /***************************************************************/
1019
+ /* */
1020
+ /* InitializeVar */
1021
+ /* */
1022
+ /* Initialize and preserve a variable */
1023
+ /* */
1024
+ /***************************************************************/
1025
+ static void InitializeVar(char const *str)
1026
+ {
1027
+ char const *expr;
1028
+ char const *ostr = str;
1029
+ char varname[VAR_NAME_LEN+1];
1030
+
1031
+ Value val;
1032
+
1033
+ int r;
1034
+
1035
+ /* Scan for an '=' sign */
1036
+ r = 0;
1037
+ while (*str && *str != '=') {
1038
+ if (r < VAR_NAME_LEN) {
1039
+ if (isalpha(*str) || *str == '_' || (r > 0 && *str == '(') || (r == 0 && *str == '$') || (r > 0 && isdigit(*str))) {
1040
+ varname[r++] = *str;
1041
+ } else {
1042
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(E_ILLEGAL_CHAR));
1043
+ fprintf(ErrFp, "\n");
1044
+ return;
1045
+ }
1046
+ }
1047
+ if (*str == '(') {
1048
+ /* Do a function definition if we see a paren */
1049
+ DefineFunction(ostr);
1050
+ return;
1051
+ }
1052
+ str++;
1053
+ }
1054
+ varname[r] = 0;
1055
+ if (!*varname) {
1056
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(E_MISS_VAR));
1057
+ fprintf(ErrFp, "\n");
1058
+ return;
1059
+ }
1060
+ if (!*str) {
1061
+ val.type = INT_TYPE;
1062
+ val.v.val = 0;
1063
+ if (*varname == '$') {
1064
+ r = SetSysVar(varname+1, &val);
1065
+ } else {
1066
+ r = SetVar(varname, &val, 1);
1067
+ if (!r) {
1068
+ r = PreserveVar(varname);
1069
+ }
1070
+ }
1071
+ if (r) {
1072
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r));
1073
+ fprintf(ErrFp, "\n");
1074
+ }
1075
+ return;
1076
+ }
1077
+
1078
+ expr = str+1;
1079
+ if (!*expr) {
1080
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(E_MISS_EXPR));
1081
+ fprintf(ErrFp, "\n");
1082
+ return;
1083
+ }
1084
+
1085
+ r=EvalExpr(&expr, &val, NULL);
1086
+ if (r) {
1087
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r));
1088
+ fprintf(ErrFp, "\n");
1089
+ return;
1090
+ }
1091
+
1092
+ if (*varname == '$') {
1093
+ r=SetSysVar(varname+1, &val);
1094
+ DestroyValue(val);
1095
+ if (r) {
1096
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r));
1097
+ fprintf(ErrFp, "\n");
1098
+ }
1099
+ return;
1100
+ }
1101
+
1102
+ r=SetVar(varname, &val, 1);
1103
+ if (r) {
1104
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r));
1105
+ fprintf(ErrFp, "\n");
1106
+ return;
1107
+ }
1108
+ r=PreserveVar(varname);
1109
+ if (r) {
1110
+ fprintf(ErrFp, GetErr(M_I_OPTION), GetErr(r));
1111
+ fprintf(ErrFp, "\n");
1112
+ }
1113
+ return;
1114
+ }
1115
+
1116
+ static void
1117
+ AddTrustedUser(char const *username)
1118
+ {
1119
+ struct passwd const *pwent;
1120
+ if (NumTrustedUsers >= MAX_TRUSTED_USERS) {
1121
+ fprintf(ErrFp, "Too many trusted users (%d max)\n",
1122
+ MAX_TRUSTED_USERS);
1123
+ exit(EXIT_FAILURE);
1124
+ }
1125
+
1126
+ pwent = getpwnam(username);
1127
+ if (!pwent) {
1128
+ fprintf(ErrFp, GetErr(M_BAD_USER), username);
1129
+ fprintf(ErrFp, "\n");
1130
+ exit(EXIT_FAILURE);
1131
+ }
1132
+ TrustedUsers[NumTrustedUsers] = pwent->pw_uid;
1133
+ NumTrustedUsers++;
1134
+ }
1135
+
1136
+ static pid_t LimiterPid = (pid_t) -1;
1137
+
1138
+ void unlimit_execution_time(void)
1139
+ {
1140
+ if (LimiterPid != (pid_t) -1) {
1141
+ kill(LimiterPid, SIGTERM);
1142
+ LimiterPid = (pid_t) -1;
1143
+ }
1144
+ }
1145
+
1146
+ static void limit_execution_time(int t)
1147
+ {
1148
+ pid_t parent = getpid();
1149
+
1150
+ pid_t pid = fork();
1151
+ if (pid < 0) {
1152
+ perror("fork");
1153
+ exit(1);
1154
+ }
1155
+
1156
+ if (pid > 0) {
1157
+ LimiterPid = pid;
1158
+ /* In the parent */
1159
+ return;
1160
+ }
1161
+
1162
+ /* In the child */
1163
+ time_t start = time(NULL);
1164
+ while(1) {
1165
+ sleep(1);
1166
+ if (kill(parent, 0) < 0) {
1167
+ /* Parent has probably exited */
1168
+ exit(0);
1169
+ }
1170
+ if (time(NULL) - start > t) {
1171
+ kill(parent, SIGXCPU);
1172
+ exit(0);
1173
+ }
1174
+ }
1175
+ }
1176
+
1177
+ static void
1178
+ ProcessLongOption(char const *arg)
1179
+ {
1180
+ int t;
1181
+ unsigned long tt;
1182
+
1183
+ if (!strcmp(arg, "test")) {
1184
+ fprintf(stderr, "Enabling test mode: This is meant for the acceptance test.\nDo not use --test in production.\nIn test mode, the system time is fixed at 2025-01-06@19:00\n");
1185
+ TestMode = 1;
1186
+
1187
+ /* Update RealToday because of TestMode */
1188
+ RealToday = SystemDate(&CurYear, &CurMon, &CurDay);
1189
+ DSEToday = RealToday;
1190
+ LocalDSEToday = DSEToday;
1191
+ FromDSE(DSEToday, &CurYear, &CurMon, &CurDay);
1192
+
1193
+ return;
1194
+ }
1195
+ if (!strcmp(arg, "only-todos")) {
1196
+ if (TodoFilter == ONLY_EVENTS) {
1197
+ fprintf(ErrFp, "remind: Cannot combine --only-todos and --only-events\n");
1198
+ exit(1);
1199
+ }
1200
+ TodoFilter = ONLY_TODOS;
1201
+ return;
1202
+ }
1203
+ if (!strcmp(arg, "only-events")) {
1204
+ if (TodoFilter == ONLY_TODOS) {
1205
+ fprintf(ErrFp, "remind: Cannot combine --only-todos and --only-events\n");
1206
+ exit(1);
1207
+ }
1208
+ TodoFilter = ONLY_EVENTS;
1209
+ return;
1210
+ }
1211
+ if (!strcmp(arg, "flush")) {
1212
+ setvbuf(stdout, NULL, _IONBF, 0);
1213
+ setvbuf(stderr, NULL, _IONBF, 0);
1214
+ return;
1215
+ }
1216
+ if (!strcmp(arg, "json")) {
1217
+ JSONMode = 1;
1218
+ DontQueue = 1;
1219
+ return;
1220
+ }
1221
+
1222
+ if (!strcmp(arg, "version")) {
1223
+ printf("%s\n", VERSION);
1224
+ exit(EXIT_SUCCESS);
1225
+ }
1226
+ if (!strcmp(arg, "print-config-cmd")) {
1227
+ printf("%s\n", CONFIG_CMD);
1228
+ exit(EXIT_SUCCESS);
1229
+ }
1230
+ if (!strcmp(arg, "print-errs")) {
1231
+ for (t=0; t<NumErrs; t++) {
1232
+ if (*ErrMsg[t]) {
1233
+ print_escaped_string(stdout, ErrMsg[t]);
1234
+ printf("\n");
1235
+ }
1236
+ }
1237
+ exit(EXIT_SUCCESS);
1238
+ }
1239
+
1240
+ if (!strcmp(arg, "hide-completed-todos")) {
1241
+ HideCompletedTodos = 1;
1242
+ return;
1243
+ }
1244
+
1245
+ if (!strcmp(arg, "print-tokens")) {
1246
+ print_remind_tokens();
1247
+ print_builtinfunc_tokens();
1248
+ print_sysvar_tokens();
1249
+ exit(0);
1250
+ }
1251
+ if (sscanf(arg, "max-expr-complexity=%lu", &tt) == 1) {
1252
+ ExpressionNodeLimitPerLine = tt;
1253
+ return;
1254
+ }
1255
+ if (sscanf(arg, "max-execution-time=%d", &t) == 1) {
1256
+ if (t < 0) {
1257
+ fprintf(ErrFp, "%s: --max-execution-time must be non-negative\n", ArgV[0]);
1258
+ return;
1259
+ }
1260
+ if (t > 0) {
1261
+ limit_execution_time(t);
1262
+ }
1263
+ return;
1264
+ }
1265
+ fprintf(ErrFp, "%s: Unknown long option --%s\n", ArgV[0], arg);
1266
+ }
1267
+
1268
+ static void
1269
+ guess_terminal_background(int *r, int *g, int *b)
1270
+ {
1271
+ int ttyfd;
1272
+ struct pollfd p;
1273
+ unsigned int rr, gg, bb;
1274
+ char buf[128];
1275
+ int n;
1276
+
1277
+ *r = -1;
1278
+ *g = -1;
1279
+ *b = -1;
1280
+
1281
+ /* Don't guess if stdout not a terminal unless asked to by @,t */
1282
+ if (should_guess_terminal_background != 2) {
1283
+ if (!isatty(STDOUT_FILENO)) {
1284
+ return;
1285
+ }
1286
+ }
1287
+
1288
+ ttyfd = open("/dev/tty", O_RDWR);
1289
+ if (ttyfd < 0) {
1290
+ return;
1291
+ }
1292
+
1293
+ if (!isatty(ttyfd)) {
1294
+ /* Not a TTY: Can't guess the color */
1295
+ close(ttyfd);
1296
+ return;
1297
+ }
1298
+
1299
+ if (!tty_init(ttyfd)) {
1300
+ return;
1301
+ }
1302
+ tty_raw(ttyfd);
1303
+ n = write(ttyfd, "\033]11;?\033\\", 8);
1304
+
1305
+ if (n != 8) {
1306
+ /* write failed... WTF? Not much we can do */
1307
+ tty_reset(ttyfd);
1308
+ close(ttyfd);
1309
+ return;
1310
+ }
1311
+
1312
+ /* Wait up to 0.1s for terminal to respond */
1313
+ p.fd = ttyfd;
1314
+ p.events = POLLIN;
1315
+ if (poll(&p, 1, 100) < 0) {
1316
+ tty_reset(ttyfd);
1317
+ close(ttyfd);
1318
+ return;
1319
+ }
1320
+ if (!(p.revents & POLLIN)) {
1321
+ tty_reset(ttyfd);
1322
+ close(ttyfd);
1323
+ return;
1324
+ }
1325
+ n = read(ttyfd, buf, 127);
1326
+ if (n <= 0) {
1327
+ tty_reset(ttyfd);
1328
+ close(ttyfd);
1329
+ return;
1330
+ }
1331
+ tty_reset(ttyfd);
1332
+ close(ttyfd);
1333
+ buf[n+1] = 0;
1334
+ if (n < 25) {
1335
+ /* Too short */
1336
+ return;
1337
+ }
1338
+ if (sscanf(buf+5, "rgb:%x/%x/%x", &rr, &gg, &bb) != 3) {
1339
+ /* Couldn't scan color codes */
1340
+ return;
1341
+ }
1342
+ *r = (int) ((rr >> 8) & 255);
1343
+ *g = (int) ((gg >> 8) & 255);
1344
+ *b = (int) ((bb >> 8) & 255);
1345
+ }
1346
+
1347
+ static struct termios orig_termios;
1348
+
1349
+ static int
1350
+ tty_init(int fd)
1351
+ {
1352
+ if (tcgetattr(fd, &orig_termios) < 0) {
1353
+ return 0;
1354
+ }
1355
+ return 1;
1356
+ }
1357
+
1358
+ static void
1359
+ tty_raw(int fd)
1360
+ {
1361
+ struct termios raw;
1362
+
1363
+ raw = orig_termios;
1364
+
1365
+ raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON);
1366
+ raw.c_oflag &= ~(OPOST);
1367
+ raw.c_cflag |= (CS8);
1368
+ raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG);
1369
+
1370
+ /* put terminal in raw mode after flushing */
1371
+ tcsetattr(fd,TCSAFLUSH,&raw);
1372
+ }
1373
+
1374
+ static void
1375
+ tty_reset(int fd)
1376
+ {
1377
+ tcsetattr(fd, TCSAFLUSH, &orig_termios);
1378
+ }
1379
+
1380
+ int
1381
+ GetTerminalBackground(void)
1382
+ {
1383
+ int r, g, b;
1384
+ if (should_guess_terminal_background) {
1385
+ guess_terminal_background(&r, &g, &b);
1386
+ if (r >= 0 && g >= 0 && b >= 0) {
1387
+ if (r+g+b <= 85*3 && r <= 128 && g <= 128 && b <= 128) {
1388
+ TerminalBackground = TERMINAL_BACKGROUND_DARK;
1389
+ } else {
1390
+ TerminalBackground = TERMINAL_BACKGROUND_LIGHT;
1391
+ }
1392
+ }
1393
+ should_guess_terminal_background = 0;
1394
+ }
1395
+ return TerminalBackground;
1396
+ }
1397
+
1398
+ static int
1399
+ GetInitDateFromTrigger(char const *s, int *y, int *m, int *d, int *systime)
1400
+ {
1401
+ Parser p;
1402
+ Trigger trig;
1403
+ TimeTrig tim;
1404
+ int dse;
1405
+ int r;
1406
+
1407
+ CreateParser(s, &p);
1408
+ r = ParseRem(&p, &trig, &tim);
1409
+ if (r) {
1410
+ DestroyParser(&p);
1411
+ return r;
1412
+ }
1413
+ if (trig.tz != NULL && tim.ttime == NO_TIME) {
1414
+ DestroyParser(&p);
1415
+ FreeTrig(&trig);
1416
+ return E_TZ_NO_AT;
1417
+ }
1418
+ if (trig.typ == SAT_TYPE) {
1419
+ EnterTimezone(trig.tz);
1420
+ r=DoSatRemind(&trig, &tim, &p);
1421
+ ExitTimezone(trig.tz);
1422
+ if (r) {
1423
+ DestroyParser(&p);
1424
+ FreeTrig(&trig);
1425
+ return r;
1426
+ }
1427
+ dse = LastTriggerDate;
1428
+ } else if (trig.typ == NO_TYPE) {
1429
+ EnterTimezone(trig.tz);
1430
+ dse = ComputeTrigger(get_scanfrom(&trig), &trig, &tim, &r, 0);
1431
+ ExitTimezone(trig.tz);
1432
+ } else {
1433
+ DestroyParser(&p);
1434
+ FreeTrig(&trig);
1435
+ return E_PARSE_ERR;
1436
+ }
1437
+
1438
+ DestroyParser(&p);
1439
+ if (r) {
1440
+ FreeTrig(&trig);
1441
+ return r;
1442
+ }
1443
+ if (dse < 0) {
1444
+ FreeTrig(&trig);
1445
+ return E_CANT_TRIG;
1446
+ }
1447
+ if (dse >= 0) {
1448
+ if (tim.ttime != NO_TIME) {
1449
+ if (*systime != -1) {
1450
+ Usage();
1451
+ }
1452
+ dse=AdjustTriggerForTimeZone(&trig, dse, &tim, 1);
1453
+ *systime = tim.ttime * 60;
1454
+ }
1455
+ FromDSE(dse, y, m, d);
1456
+ if (dse != RealToday) {
1457
+ IgnoreOnce = 1;
1458
+ }
1459
+ }
1460
+ FreeTrig(&trig);
1461
+ return OK;
1462
+ }
1463
+
1464
+ static void
1465
+ SetTodayFromCmdlineArgs(int dse, int y, int m, int d)
1466
+ {
1467
+ if (dse != NO_DATE) {
1468
+ FromDSE(dse, &y, &m, &d);
1469
+ }
1470
+ /* Must supply date in the form: day, mon, yr OR mon, yr */
1471
+ if (m != NO_MON || y != NO_YR || d != NO_DAY) {
1472
+ if (y == NO_YR) {
1473
+ y = CurYear;
1474
+ }
1475
+ if (m == NO_MON) {
1476
+ Usage();
1477
+ }
1478
+ if (d == NO_DAY) d=1;
1479
+ if (d > DaysInMonth(m, y)) {
1480
+ fprintf(ErrFp, "%s", BadDate);
1481
+ Usage();
1482
+ }
1483
+ DSEToday = DSE(y, m, d);
1484
+ if (DSEToday == -1) {
1485
+ fprintf(ErrFp, "%s", BadDate);
1486
+ Usage();
1487
+ }
1488
+ LocalDSEToday = DSEToday;
1489
+ CurYear = y;
1490
+ CurMon = m;
1491
+ CurDay = d;
1492
+ if (DSEToday != RealToday) IgnoreOnce = 1;
1493
+ }
1494
+ }