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.
- checksums.yaml +7 -0
- data/LICENSE +328 -0
- data/README.md +141 -0
- data/ext/remind/shim.c +379 -0
- data/lib/remind/builder.rb +252 -0
- data/lib/remind/library.rb +141 -0
- data/lib/remind/native.rb +257 -0
- data/lib/remind/reminder.rb +527 -0
- data/lib/remind/runtime.rb +130 -0
- data/lib/remind/session.rb +246 -0
- data/lib/remind/source.rb +160 -0
- data/lib/remind/value.rb +170 -0
- data/lib/remind/version.rb +13 -0
- data/lib/remind.rb +147 -0
- data/remind-v06.02.10/COPYRIGHT +300 -0
- data/remind-v06.02.10/configure +5684 -0
- data/remind-v06.02.10/configure.ac +131 -0
- data/remind-v06.02.10/docs/WHATSNEW +3858 -0
- data/remind-v06.02.10/include/ansitext.rem +35 -0
- data/remind-v06.02.10/include/holidays/ad/02.rem +15 -0
- data/remind-v06.02.10/include/holidays/ad/03.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad/04.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad/05.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad/06.rem +16 -0
- data/remind-v06.02.10/include/holidays/ad/07.rem +15 -0
- data/remind-v06.02.10/include/holidays/ad/08.rem +14 -0
- data/remind-v06.02.10/include/holidays/ad.rem +28 -0
- data/remind-v06.02.10/include/holidays/ae.rem +10 -0
- data/remind-v06.02.10/include/holidays/al.rem +33 -0
- data/remind-v06.02.10/include/holidays/am.rem +19 -0
- data/remind-v06.02.10/include/holidays/ao.rem +41 -0
- data/remind-v06.02.10/include/holidays/ar.rem +38 -0
- data/remind-v06.02.10/include/holidays/as.rem +40 -0
- data/remind-v06.02.10/include/holidays/at/1.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/2.rem +16 -0
- data/remind-v06.02.10/include/holidays/at/3.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/4.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/5.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/6.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/7.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/8.rem +15 -0
- data/remind-v06.02.10/include/holidays/at/9.rem +15 -0
- data/remind-v06.02.10/include/holidays/at.rem +32 -0
- data/remind-v06.02.10/include/holidays/au/act.rem +27 -0
- data/remind-v06.02.10/include/holidays/au/nsw.rem +25 -0
- data/remind-v06.02.10/include/holidays/au/nt.rem +28 -0
- data/remind-v06.02.10/include/holidays/au/qld.rem +23 -0
- data/remind-v06.02.10/include/holidays/au/sa.rem +29 -0
- data/remind-v06.02.10/include/holidays/au/tas.rem +16 -0
- data/remind-v06.02.10/include/holidays/au/vic.rem +24 -0
- data/remind-v06.02.10/include/holidays/au/wa.rem +24 -0
- data/remind-v06.02.10/include/holidays/au.rem +21 -0
- data/remind-v06.02.10/include/holidays/aw.rem +19 -0
- data/remind-v06.02.10/include/holidays/az.rem +44 -0
- data/remind-v06.02.10/include/holidays/ba/bih.rem +23 -0
- data/remind-v06.02.10/include/holidays/ba/brc.rem +20 -0
- data/remind-v06.02.10/include/holidays/ba/srp.rem +23 -0
- data/remind-v06.02.10/include/holidays/ba.rem +22 -0
- data/remind-v06.02.10/include/holidays/bb.rem +28 -0
- data/remind-v06.02.10/include/holidays/bd.rem +14 -0
- data/remind-v06.02.10/include/holidays/be.rem +24 -0
- data/remind-v06.02.10/include/holidays/bf.rem +29 -0
- data/remind-v06.02.10/include/holidays/bg.rem +34 -0
- data/remind-v06.02.10/include/holidays/bh.rem +11 -0
- data/remind-v06.02.10/include/holidays/bi.rem +30 -0
- data/remind-v06.02.10/include/holidays/bn.rem +22 -0
- data/remind-v06.02.10/include/holidays/bo/b.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/c.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/h.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/l.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/n.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/o.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/p.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/s.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo/t.rem +13 -0
- data/remind-v06.02.10/include/holidays/bo.rem +32 -0
- data/remind-v06.02.10/include/holidays/br/ac.rem +21 -0
- data/remind-v06.02.10/include/holidays/br/al.rem +16 -0
- data/remind-v06.02.10/include/holidays/br/am.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/ap.rem +15 -0
- data/remind-v06.02.10/include/holidays/br/ba.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/ce.rem +15 -0
- data/remind-v06.02.10/include/holidays/br/df.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/es.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/go.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/ma.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/mg.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/ms.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pa.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pb.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pe.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pi.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/pr.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/rj.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/rn.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/ro.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/rr.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/rs.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/sc.rem +14 -0
- data/remind-v06.02.10/include/holidays/br/se.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/sp.rem +13 -0
- data/remind-v06.02.10/include/holidays/br/to.rem +15 -0
- data/remind-v06.02.10/include/holidays/br.rem +33 -0
- data/remind-v06.02.10/include/holidays/bs.rem +26 -0
- data/remind-v06.02.10/include/holidays/bw.rem +31 -0
- data/remind-v06.02.10/include/holidays/by.rem +17 -0
- data/remind-v06.02.10/include/holidays/bz.rem +43 -0
- data/remind-v06.02.10/include/holidays/ca/ab.rem +17 -0
- data/remind-v06.02.10/include/holidays/ca/bc.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/mb.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/nb.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/nl.rem +19 -0
- data/remind-v06.02.10/include/holidays/ca/ns.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/nt.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/nu.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/on.rem +16 -0
- data/remind-v06.02.10/include/holidays/ca/pe.rem +13 -0
- data/remind-v06.02.10/include/holidays/ca/qc.rem +18 -0
- data/remind-v06.02.10/include/holidays/ca/sk.rem +14 -0
- data/remind-v06.02.10/include/holidays/ca/yt.rem +17 -0
- data/remind-v06.02.10/include/holidays/ca.rem +37 -0
- data/remind-v06.02.10/include/holidays/cg.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/ag.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/ai.rem +20 -0
- data/remind-v06.02.10/include/holidays/ch/ar.rem +16 -0
- data/remind-v06.02.10/include/holidays/ch/be.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/bl.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/bs.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/fr.rem +19 -0
- data/remind-v06.02.10/include/holidays/ch/ge.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/gl.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/gr.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch/ju.rem +21 -0
- data/remind-v06.02.10/include/holidays/ch/lu.rem +21 -0
- data/remind-v06.02.10/include/holidays/ch/ne.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch/nw.rem +24 -0
- data/remind-v06.02.10/include/holidays/ch/ow.rem +24 -0
- data/remind-v06.02.10/include/holidays/ch/sg.rem +20 -0
- data/remind-v06.02.10/include/holidays/ch/sh.rem +20 -0
- data/remind-v06.02.10/include/holidays/ch/so.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/sz.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/tg.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch/ti.rem +23 -0
- data/remind-v06.02.10/include/holidays/ch/ur.rem +22 -0
- data/remind-v06.02.10/include/holidays/ch/vd.rem +17 -0
- data/remind-v06.02.10/include/holidays/ch/vs.rem +23 -0
- data/remind-v06.02.10/include/holidays/ch/zg.rem +23 -0
- data/remind-v06.02.10/include/holidays/ch/zh.rem +18 -0
- data/remind-v06.02.10/include/holidays/ch.rem +18 -0
- data/remind-v06.02.10/include/holidays/chinese-new-year.rem +86 -0
- data/remind-v06.02.10/include/holidays/cl/ap.rem +13 -0
- data/remind-v06.02.10/include/holidays/cl/nb.rem +13 -0
- data/remind-v06.02.10/include/holidays/cl.rem +46 -0
- data/remind-v06.02.10/include/holidays/cm.rem +21 -0
- data/remind-v06.02.10/include/holidays/co.rem +85 -0
- data/remind-v06.02.10/include/holidays/cr.rem +39 -0
- data/remind-v06.02.10/include/holidays/cu.rem +19 -0
- data/remind-v06.02.10/include/holidays/cw.rem +24 -0
- data/remind-v06.02.10/include/holidays/cy.rem +27 -0
- data/remind-v06.02.10/include/holidays/cz.rem +20 -0
- data/remind-v06.02.10/include/holidays/de/bb.rem +15 -0
- data/remind-v06.02.10/include/holidays/de/be.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/bw.rem +15 -0
- data/remind-v06.02.10/include/holidays/de/by.rem +18 -0
- data/remind-v06.02.10/include/holidays/de/hb.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/he.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/hh.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/mv.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/ni.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/nw.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/rp.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/sh.rem +13 -0
- data/remind-v06.02.10/include/holidays/de/sl.rem +15 -0
- data/remind-v06.02.10/include/holidays/de/sn.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/st.rem +14 -0
- data/remind-v06.02.10/include/holidays/de/th.rem +14 -0
- data/remind-v06.02.10/include/holidays/de.rem +23 -0
- data/remind-v06.02.10/include/holidays/discordian.rem +25 -0
- data/remind-v06.02.10/include/holidays/dj.rem +12 -0
- data/remind-v06.02.10/include/holidays/dk.rem +23 -0
- data/remind-v06.02.10/include/holidays/dm.rem +24 -0
- data/remind-v06.02.10/include/holidays/do.rem +36 -0
- data/remind-v06.02.10/include/holidays/dz.rem +12 -0
- data/remind-v06.02.10/include/holidays/ec.rem +48 -0
- data/remind-v06.02.10/include/holidays/ee.rem +19 -0
- data/remind-v06.02.10/include/holidays/eg.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/an.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/ar.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/as.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/cb.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ce.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/cl.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/cm.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/cn.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ct.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/ex.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/ga.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ib.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/mc.rem +17 -0
- data/remind-v06.02.10/include/holidays/es/md.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/ml.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/nc.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/pv.rem +15 -0
- data/remind-v06.02.10/include/holidays/es/ri.rem +16 -0
- data/remind-v06.02.10/include/holidays/es/vc.rem +16 -0
- data/remind-v06.02.10/include/holidays/es.rem +23 -0
- data/remind-v06.02.10/include/holidays/et.rem +20 -0
- data/remind-v06.02.10/include/holidays/fi.rem +43 -0
- data/remind-v06.02.10/include/holidays/fr/bl.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/ges.rem +14 -0
- data/remind-v06.02.10/include/holidays/fr/gp.rem +16 -0
- data/remind-v06.02.10/include/holidays/fr/gy.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/mf.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/mq.rem +15 -0
- data/remind-v06.02.10/include/holidays/fr/nc.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/pf.rem +15 -0
- data/remind-v06.02.10/include/holidays/fr/re.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr/wf.rem +14 -0
- data/remind-v06.02.10/include/holidays/fr/yt.rem +13 -0
- data/remind-v06.02.10/include/holidays/fr.rem +18 -0
- data/remind-v06.02.10/include/holidays/ga.rem +18 -0
- data/remind-v06.02.10/include/holidays/gb/eng.rem +14 -0
- data/remind-v06.02.10/include/holidays/gb/nir.rem +20 -0
- data/remind-v06.02.10/include/holidays/gb/sct.rem +20 -0
- data/remind-v06.02.10/include/holidays/gb/wls.rem +14 -0
- data/remind-v06.02.10/include/holidays/gb.rem +27 -0
- data/remind-v06.02.10/include/holidays/ge.rem +24 -0
- data/remind-v06.02.10/include/holidays/gh.rem +34 -0
- data/remind-v06.02.10/include/holidays/gl.rem +25 -0
- data/remind-v06.02.10/include/holidays/gr.rem +37 -0
- data/remind-v06.02.10/include/holidays/gt.rem +24 -0
- data/remind-v06.02.10/include/holidays/gu.rem +37 -0
- data/remind-v06.02.10/include/holidays/hk.rem +25 -0
- data/remind-v06.02.10/include/holidays/hn.rem +18 -0
- data/remind-v06.02.10/include/holidays/hr.rem +21 -0
- data/remind-v06.02.10/include/holidays/ht.rem +34 -0
- data/remind-v06.02.10/include/holidays/hu.rem +20 -0
- data/remind-v06.02.10/include/holidays/id.rem +15 -0
- data/remind-v06.02.10/include/holidays/ie.rem +41 -0
- data/remind-v06.02.10/include/holidays/im.rem +26 -0
- data/remind-v06.02.10/include/holidays/in/ap.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/as.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/br.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/cg.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/gj.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/hr.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/ka.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/kl.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/mh.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/mp.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/od.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/rj.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/sk.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/tn.rem +15 -0
- data/remind-v06.02.10/include/holidays/in/ts.rem +14 -0
- data/remind-v06.02.10/include/holidays/in/uk.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/up.rem +13 -0
- data/remind-v06.02.10/include/holidays/in/wb.rem +16 -0
- data/remind-v06.02.10/include/holidays/in.rem +24 -0
- data/remind-v06.02.10/include/holidays/is.rem +23 -0
- data/remind-v06.02.10/include/holidays/it/ag.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/al.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/an.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/andria.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ao.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ap.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/aq.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ar.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/at.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/av.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ba.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/barletta.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bg.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bl.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bo.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/br.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bs.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/bt.rem +15 -0
- data/remind-v06.02.10/include/holidays/it/bz.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/ca.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cb.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ce.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cesena.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ch.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cl.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/co.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cs.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ct.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/cz.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/en.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fc.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/fe.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fg.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fm.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/forli.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/fr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ge.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/go.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/gr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/im.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/is.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/kr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/lc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/le.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/li.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/lo.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/lt.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/lu.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mb.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/me.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mo.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ms.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/mt.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/na.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/no.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/nu.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/or.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pa.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pd.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pe.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pesaro.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pg.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/pi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pn.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/pr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pt.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pu.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/pv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/pz.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ra.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/re.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rg.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/ri.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rm.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/rn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ro.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sa.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/si.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/so.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sp.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ss.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/su.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/sv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ta.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/te.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tn.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/to.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tp.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/trani.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ts.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/tv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ud.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/urbino.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/va.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vb.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vc.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/ve.rem +14 -0
- data/remind-v06.02.10/include/holidays/it/vi.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vr.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vt.rem +13 -0
- data/remind-v06.02.10/include/holidays/it/vv.rem +13 -0
- data/remind-v06.02.10/include/holidays/it.rem +26 -0
- data/remind-v06.02.10/include/holidays/je.rem +19 -0
- data/remind-v06.02.10/include/holidays/jewish.rem +135 -0
- data/remind-v06.02.10/include/holidays/jm.rem +24 -0
- data/remind-v06.02.10/include/holidays/jo.rem +11 -0
- data/remind-v06.02.10/include/holidays/jp.rem +27 -0
- data/remind-v06.02.10/include/holidays/ke.rem +25 -0
- data/remind-v06.02.10/include/holidays/kg.rem +20 -0
- data/remind-v06.02.10/include/holidays/kh.rem +22 -0
- data/remind-v06.02.10/include/holidays/kn.rem +28 -0
- data/remind-v06.02.10/include/holidays/kr.rem +19 -0
- data/remind-v06.02.10/include/holidays/kw.rem +10 -0
- data/remind-v06.02.10/include/holidays/kz.rem +34 -0
- data/remind-v06.02.10/include/holidays/la.rem +47 -0
- data/remind-v06.02.10/include/holidays/lgbtq/au.rem +8 -0
- data/remind-v06.02.10/include/holidays/lgbtq/br.rem +10 -0
- data/remind-v06.02.10/include/holidays/lgbtq/ca.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/cl.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/ie.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/in.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/nl.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/ua.rem +7 -0
- data/remind-v06.02.10/include/holidays/lgbtq/uk.rem +8 -0
- data/remind-v06.02.10/include/holidays/lgbtq/us.rem +16 -0
- data/remind-v06.02.10/include/holidays/lgbtq.rem +34 -0
- data/remind-v06.02.10/include/holidays/li.rem +31 -0
- data/remind-v06.02.10/include/holidays/ls.rem +18 -0
- data/remind-v06.02.10/include/holidays/lt.rem +23 -0
- data/remind-v06.02.10/include/holidays/lu.rem +18 -0
- data/remind-v06.02.10/include/holidays/lv.rem +25 -0
- data/remind-v06.02.10/include/holidays/ma.rem +17 -0
- data/remind-v06.02.10/include/holidays/mc.rem +26 -0
- data/remind-v06.02.10/include/holidays/md.rem +21 -0
- data/remind-v06.02.10/include/holidays/me.rem +28 -0
- data/remind-v06.02.10/include/holidays/mg.rem +24 -0
- data/remind-v06.02.10/include/holidays/mh.rem +22 -0
- data/remind-v06.02.10/include/holidays/misc.rem +9 -0
- data/remind-v06.02.10/include/holidays/mk.rem +17 -0
- data/remind-v06.02.10/include/holidays/mp.rem +44 -0
- data/remind-v06.02.10/include/holidays/mr.rem +11 -0
- data/remind-v06.02.10/include/holidays/mt.rem +21 -0
- data/remind-v06.02.10/include/holidays/mv.rem +12 -0
- data/remind-v06.02.10/include/holidays/mw.rem +36 -0
- data/remind-v06.02.10/include/holidays/mx.rem +15 -0
- data/remind-v06.02.10/include/holidays/my/01.rem +13 -0
- data/remind-v06.02.10/include/holidays/my/02.rem +13 -0
- data/remind-v06.02.10/include/holidays/my/03.rem +14 -0
- data/remind-v06.02.10/include/holidays/my/04.rem +18 -0
- data/remind-v06.02.10/include/holidays/my/05.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/06.rem +17 -0
- data/remind-v06.02.10/include/holidays/my/07.rem +17 -0
- data/remind-v06.02.10/include/holidays/my/08.rem +15 -0
- data/remind-v06.02.10/include/holidays/my/09.rem +14 -0
- data/remind-v06.02.10/include/holidays/my/10.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/11.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/12.rem +19 -0
- data/remind-v06.02.10/include/holidays/my/13.rem +22 -0
- data/remind-v06.02.10/include/holidays/my/14.rem +16 -0
- data/remind-v06.02.10/include/holidays/my/15.rem +18 -0
- data/remind-v06.02.10/include/holidays/my/16.rem +16 -0
- data/remind-v06.02.10/include/holidays/my.rem +23 -0
- data/remind-v06.02.10/include/holidays/mz.rem +25 -0
- data/remind-v06.02.10/include/holidays/na.rem +27 -0
- data/remind-v06.02.10/include/holidays/ng.rem +21 -0
- data/remind-v06.02.10/include/holidays/ni/mn.rem +14 -0
- data/remind-v06.02.10/include/holidays/ni.rem +24 -0
- data/remind-v06.02.10/include/holidays/nl.rem +26 -0
- data/remind-v06.02.10/include/holidays/no.rem +19 -0
- data/remind-v06.02.10/include/holidays/nz/auk.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/can.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/cit.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/hkb.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/mbh.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/nsn.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/ntl.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/ota.rem +14 -0
- data/remind-v06.02.10/include/holidays/nz/south_canterbury.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/stl.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/tki.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/wgn.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz/wtc.rem +13 -0
- data/remind-v06.02.10/include/holidays/nz.rem +69 -0
- data/remind-v06.02.10/include/holidays/pa.rem +27 -0
- data/remind-v06.02.10/include/holidays/pagan.rem +65 -0
- data/remind-v06.02.10/include/holidays/pe.rem +22 -0
- data/remind-v06.02.10/include/holidays/pg.rem +24 -0
- data/remind-v06.02.10/include/holidays/ph.rem +26 -0
- data/remind-v06.02.10/include/holidays/pk.rem +13 -0
- data/remind-v06.02.10/include/holidays/pl.rem +20 -0
- data/remind-v06.02.10/include/holidays/pr.rem +40 -0
- data/remind-v06.02.10/include/holidays/pt/01.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/02.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/03.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/04.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/05.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/06.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/07.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/08.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/09.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/10.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/12.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/13.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/14.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/15.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/16.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/18.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/20.rem +13 -0
- data/remind-v06.02.10/include/holidays/pt/30.rem +14 -0
- data/remind-v06.02.10/include/holidays/pt.rem +17 -0
- data/remind-v06.02.10/include/holidays/pw.rem +34 -0
- data/remind-v06.02.10/include/holidays/py.rem +20 -0
- data/remind-v06.02.10/include/holidays/ro.rem +24 -0
- data/remind-v06.02.10/include/holidays/rs.rem +26 -0
- data/remind-v06.02.10/include/holidays/ru.rem +21 -0
- data/remind-v06.02.10/include/holidays/sa.rem +13 -0
- data/remind-v06.02.10/include/holidays/sc.rem +28 -0
- data/remind-v06.02.10/include/holidays/se.rem +23 -0
- data/remind-v06.02.10/include/holidays/sg.rem +16 -0
- data/remind-v06.02.10/include/holidays/si.rem +20 -0
- data/remind-v06.02.10/include/holidays/sk.rem +25 -0
- data/remind-v06.02.10/include/holidays/sm.rem +25 -0
- data/remind-v06.02.10/include/holidays/sv/ss.rem +14 -0
- data/remind-v06.02.10/include/holidays/sv.rem +25 -0
- data/remind-v06.02.10/include/holidays/sz.rem +26 -0
- data/remind-v06.02.10/include/holidays/td.rem +22 -0
- data/remind-v06.02.10/include/holidays/th.rem +72 -0
- data/remind-v06.02.10/include/holidays/tl.rem +31 -0
- data/remind-v06.02.10/include/holidays/tn.rem +15 -0
- data/remind-v06.02.10/include/holidays/to.rem +38 -0
- data/remind-v06.02.10/include/holidays/tr.rem +17 -0
- data/remind-v06.02.10/include/holidays/tw.rem +26 -0
- data/remind-v06.02.10/include/holidays/tz.rem +23 -0
- data/remind-v06.02.10/include/holidays/ua.rem +20 -0
- data/remind-v06.02.10/include/holidays/uk.rem +27 -0
- data/remind-v06.02.10/include/holidays/um.rem +32 -0
- data/remind-v06.02.10/include/holidays/us/ak.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/al.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/ar.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/as.rem +20 -0
- data/remind-v06.02.10/include/holidays/us/az.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ca.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/co.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ct.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/dc.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/de.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/fl.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ga.rem +18 -0
- data/remind-v06.02.10/include/holidays/us/gu.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/hi.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/ia.rem +15 -0
- data/remind-v06.02.10/include/holidays/us/id.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/il.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/in.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/ks.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/ky.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/la.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/ma.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/md-extra.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/md.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/me.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/mi.rem +19 -0
- data/remind-v06.02.10/include/holidays/us/mo.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/mp.rem +23 -0
- data/remind-v06.02.10/include/holidays/us/ms.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/mt.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/nc.rem +22 -0
- data/remind-v06.02.10/include/holidays/us/ne.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/nh.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/nj.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/nm.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/nv.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/ny.rem +17 -0
- data/remind-v06.02.10/include/holidays/us/oh.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/ok.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/pa.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/pr.rem +21 -0
- data/remind-v06.02.10/include/holidays/us/ri.rem +14 -0
- data/remind-v06.02.10/include/holidays/us/sc.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/sd.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/tn.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/tx.rem +25 -0
- data/remind-v06.02.10/include/holidays/us/ut.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/va.rem +13 -0
- data/remind-v06.02.10/include/holidays/us/vi.rem +22 -0
- data/remind-v06.02.10/include/holidays/us/vt.rem +16 -0
- data/remind-v06.02.10/include/holidays/us/wi.rem +20 -0
- data/remind-v06.02.10/include/holidays/us/wv.rem +17 -0
- data/remind-v06.02.10/include/holidays/us.rem +41 -0
- data/remind-v06.02.10/include/holidays/uy.rem +39 -0
- data/remind-v06.02.10/include/holidays/uz.rem +21 -0
- data/remind-v06.02.10/include/holidays/va.rem +23 -0
- data/remind-v06.02.10/include/holidays/ve.rem +21 -0
- data/remind-v06.02.10/include/holidays/vi.rem +41 -0
- data/remind-v06.02.10/include/holidays/vn.rem +17 -0
- data/remind-v06.02.10/include/holidays/vu.rem +32 -0
- data/remind-v06.02.10/include/holidays/ws.rem +18 -0
- data/remind-v06.02.10/include/holidays/za.rem +28 -0
- data/remind-v06.02.10/include/holidays/zm.rem +31 -0
- data/remind-v06.02.10/include/lang/auto.rem +32 -0
- data/remind-v06.02.10/include/lang/ca.rem +60 -0
- data/remind-v06.02.10/include/lang/da.rem +77 -0
- data/remind-v06.02.10/include/lang/de.rem +80 -0
- data/remind-v06.02.10/include/lang/en.rem +4 -0
- data/remind-v06.02.10/include/lang/es.rem +55 -0
- data/remind-v06.02.10/include/lang/fi.rem +202 -0
- data/remind-v06.02.10/include/lang/fr.rem +172 -0
- data/remind-v06.02.10/include/lang/gr.rem +74 -0
- data/remind-v06.02.10/include/lang/is.rem +58 -0
- data/remind-v06.02.10/include/lang/it.rem +76 -0
- data/remind-v06.02.10/include/lang/nl.rem +71 -0
- data/remind-v06.02.10/include/lang/no.rem +66 -0
- data/remind-v06.02.10/include/lang/pl.rem +177 -0
- data/remind-v06.02.10/include/lang/pt.rem +176 -0
- data/remind-v06.02.10/include/lang/ro.rem +74 -0
- data/remind-v06.02.10/include/lunar-eclipses.rem +149 -0
- data/remind-v06.02.10/include/moonphases.rem +19 -0
- data/remind-v06.02.10/include/seasons.rem +21 -0
- data/remind-v06.02.10/include/solar-eclipses.rem +238 -0
- data/remind-v06.02.10/include/sun.rem +12 -0
- data/remind-v06.02.10/include/translations/de/holidays/chinese-new-year.rem +13 -0
- data/remind-v06.02.10/include/translations/de/moonphases.rem +4 -0
- data/remind-v06.02.10/include/translations/de/seasons.rem +4 -0
- data/remind-v06.02.10/include/translations/de/sun.rem +2 -0
- data/remind-v06.02.10/include/translations/nl/holidays/chinese-new-year.rem +13 -0
- data/remind-v06.02.10/include/translations/nl/moonphases.rem +4 -0
- data/remind-v06.02.10/include/translations/nl/seasons.rem +4 -0
- data/remind-v06.02.10/include/translations/nl/sun.rem +2 -0
- data/remind-v06.02.10/include/utils/add-html-anchors.rem +5 -0
- data/remind-v06.02.10/install-sh +238 -0
- data/remind-v06.02.10/man/rem.1.in +21 -0
- data/remind-v06.02.10/man/rem2ps.1.in +816 -0
- data/remind-v06.02.10/man/remind.1.in +7658 -0
- data/remind-v06.02.10/man/tkremind.1.in +612 -0
- data/remind-v06.02.10/rem2html/Makefile.in +30 -0
- data/remind-v06.02.10/rem2html/rem2html.in +1299 -0
- data/remind-v06.02.10/rem2pdf/Makefile.PL.in +25 -0
- data/remind-v06.02.10/rem2pdf/Makefile.top.in +50 -0
- data/remind-v06.02.10/rem2pdf/bin/rem2pdf.in +761 -0
- data/remind-v06.02.10/scripts/tkremind.in +5794 -0
- data/remind-v06.02.10/src/Makefile.in +133 -0
- data/remind-v06.02.10/src/calendar.c +3069 -0
- data/remind-v06.02.10/src/config.h +117 -0
- data/remind-v06.02.10/src/config.h.in +116 -0
- data/remind-v06.02.10/src/custom.h +167 -0
- data/remind-v06.02.10/src/custom.h.in +167 -0
- data/remind-v06.02.10/src/dedupe.c +179 -0
- data/remind-v06.02.10/src/dorem.c +2389 -0
- data/remind-v06.02.10/src/dosubst.c +910 -0
- data/remind-v06.02.10/src/dynbuf.c +198 -0
- data/remind-v06.02.10/src/dynbuf.h +41 -0
- data/remind-v06.02.10/src/err.h +294 -0
- data/remind-v06.02.10/src/expr.c +3408 -0
- data/remind-v06.02.10/src/files.c +1437 -0
- data/remind-v06.02.10/src/funcs.c +5230 -0
- data/remind-v06.02.10/src/globals.c +23 -0
- data/remind-v06.02.10/src/globals.h +277 -0
- data/remind-v06.02.10/src/hashtab.c +428 -0
- data/remind-v06.02.10/src/hashtab.h +88 -0
- data/remind-v06.02.10/src/hashtab_stats.c +101 -0
- data/remind-v06.02.10/src/hbcal.c +579 -0
- data/remind-v06.02.10/src/ifelse.c +236 -0
- data/remind-v06.02.10/src/init.c +1494 -0
- data/remind-v06.02.10/src/json.c +1048 -0
- data/remind-v06.02.10/src/json.h +276 -0
- data/remind-v06.02.10/src/main.c +2310 -0
- data/remind-v06.02.10/src/md5.c +250 -0
- data/remind-v06.02.10/src/md5.h +33 -0
- data/remind-v06.02.10/src/moon.c +957 -0
- data/remind-v06.02.10/src/omit.c +560 -0
- data/remind-v06.02.10/src/protos.h +284 -0
- data/remind-v06.02.10/src/queue.c +1118 -0
- data/remind-v06.02.10/src/rem2ps.c +1383 -0
- data/remind-v06.02.10/src/rem2ps.h +229 -0
- data/remind-v06.02.10/src/sort.c +257 -0
- data/remind-v06.02.10/src/token.c +494 -0
- data/remind-v06.02.10/src/trans.c +544 -0
- data/remind-v06.02.10/src/trigger.c +871 -0
- data/remind-v06.02.10/src/types.h +341 -0
- data/remind-v06.02.10/src/userfns.c +810 -0
- data/remind-v06.02.10/src/utils.c +374 -0
- data/remind-v06.02.10/src/var.c +1762 -0
- data/remind-v06.02.10/src/version.h +1 -0
- data/remind-v06.02.10/src/version.h.in +1 -0
- data/remind-v06.02.10/src/xlat.c +100 -0
- data/remind-v06.02.10/www/Makefile.in +91 -0
- metadata +764 -0
data/ext/remind/shim.c
ADDED
|
@@ -0,0 +1,379 @@
|
|
|
1
|
+
/***************************************************************/
|
|
2
|
+
/* */
|
|
3
|
+
/* SHIM.C */
|
|
4
|
+
/* */
|
|
5
|
+
/* The one piece of C in remind-rb. */
|
|
6
|
+
/* */
|
|
7
|
+
/* Remind's C interface is not hostile to a binding, but two */
|
|
8
|
+
/* parts of it cannot be reached from Fiddle alone: */
|
|
9
|
+
/* */
|
|
10
|
+
/* 1. Struct layout. Trigger has thirty-odd fields, and */
|
|
11
|
+
/* reading them from Ruby would mean hard-coding byte */
|
|
12
|
+
/* offsets that the next release, the next compiler or the */
|
|
13
|
+
/* next platform is free to move. The accessors below are */
|
|
14
|
+
/* compiled against the same headers as the rest of the */
|
|
15
|
+
/* library, so the offsets are the compiler's problem */
|
|
16
|
+
/* rather than the binding's. */
|
|
17
|
+
/* */
|
|
18
|
+
/* 2. The sequence in DoRem. Parsing a REM line means */
|
|
19
|
+
/* CreateParser, ParseRem, ComputeTrigger, ParseToken, */
|
|
20
|
+
/* FindToken and DoSubst in that order, with cleanup on */
|
|
21
|
+
/* every early exit. Driving that from Ruby would mean */
|
|
22
|
+
/* six FFI calls per line and a Parser struct allocated by */
|
|
23
|
+
/* size; here it is one call that either works or does */
|
|
24
|
+
/* not. */
|
|
25
|
+
/* */
|
|
26
|
+
/* Everything else -- dates, the moon, the Hebrew calendar, */
|
|
27
|
+
/* expression evaluation -- is called directly from Ruby, and */
|
|
28
|
+
/* deliberately not wrapped here. */
|
|
29
|
+
/* */
|
|
30
|
+
/* This file is part of remind-rb, and is distributed under */
|
|
31
|
+
/* the same terms as Remind itself. */
|
|
32
|
+
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
33
|
+
/* */
|
|
34
|
+
/***************************************************************/
|
|
35
|
+
|
|
36
|
+
#include "config.h"
|
|
37
|
+
|
|
38
|
+
#include <stddef.h>
|
|
39
|
+
#include <string.h>
|
|
40
|
+
|
|
41
|
+
#include "types.h"
|
|
42
|
+
#include "protos.h"
|
|
43
|
+
#include "globals.h"
|
|
44
|
+
#include "err.h"
|
|
45
|
+
|
|
46
|
+
/* How big the caller has to make the blocks it hands back in. */
|
|
47
|
+
size_t remrb_sizeof_trigger(void) { return sizeof(Trigger); }
|
|
48
|
+
size_t remrb_sizeof_timetrig(void) { return sizeof(TimeTrig); }
|
|
49
|
+
|
|
50
|
+
/* The sentinels Remind uses for "the reminder did not say". */
|
|
51
|
+
int remrb_no_day(void) { return NO_DAY; }
|
|
52
|
+
int remrb_no_month(void) { return NO_MON; }
|
|
53
|
+
int remrb_no_year(void) { return NO_YR; }
|
|
54
|
+
int remrb_no_weekday(void) { return NO_WD; }
|
|
55
|
+
int remrb_no_until(void) { return NO_UNTIL; }
|
|
56
|
+
int remrb_no_time(void) { return NO_TIME; }
|
|
57
|
+
|
|
58
|
+
/* The marker DoSubst leaves around the part of a message that %" marked as
|
|
59
|
+
the calendar entry's title. */
|
|
60
|
+
int remrb_quote_marker(void) { return QUOTE_MARKER; }
|
|
61
|
+
|
|
62
|
+
/* The two ways DoSubst renders a message. */
|
|
63
|
+
int remrb_normal_mode(void) { return NORMAL_MODE; }
|
|
64
|
+
int remrb_cal_mode(void) { return CAL_MODE; }
|
|
65
|
+
|
|
66
|
+
/* The body types, so Ruby can tell a MSG from a RUN without repeating the
|
|
67
|
+
numbers. */
|
|
68
|
+
int remrb_msg_type(void) { return MSG_TYPE; }
|
|
69
|
+
int remrb_msf_type(void) { return MSF_TYPE; }
|
|
70
|
+
int remrb_run_type(void) { return RUN_TYPE; }
|
|
71
|
+
int remrb_cal_type(void) { return CAL_TYPE; }
|
|
72
|
+
int remrb_sat_type(void) { return SAT_TYPE; }
|
|
73
|
+
int remrb_passthru_type(void) { return PASSTHRU_TYPE; }
|
|
74
|
+
|
|
75
|
+
/* Trigger accessors. One line each, and each one is the compiler's opinion
|
|
76
|
+
of where the field is rather than the binding's. */
|
|
77
|
+
#define TRIGGER_READER(field) \
|
|
78
|
+
int remrb_trigger_##field(Trigger const *t) { return t->field; }
|
|
79
|
+
|
|
80
|
+
TRIGGER_READER(wd) /* bit set: 1 << 0 is Monday, as Remind counts */
|
|
81
|
+
TRIGGER_READER(d) /* day of month, or NO_DAY */
|
|
82
|
+
TRIGGER_READER(m) /* month, 0-based, or NO_MON */
|
|
83
|
+
TRIGGER_READER(y) /* year, or NO_YR */
|
|
84
|
+
TRIGGER_READER(back) /* the count on a --n / -n delta */
|
|
85
|
+
TRIGGER_READER(delta) /* advance warning, in days */
|
|
86
|
+
TRIGGER_READER(rep) /* *n repeat interval, in days */
|
|
87
|
+
TRIGGER_READER(localomit) /* bit set of weekdays this reminder OMITs */
|
|
88
|
+
TRIGGER_READER(skip) /* SKIP / BEFORE / AFTER */
|
|
89
|
+
TRIGGER_READER(until) /* UNTIL / THROUGH date, or NO_UNTIL */
|
|
90
|
+
TRIGGER_READER(typ) /* MSG_TYPE, RUN_TYPE, ... */
|
|
91
|
+
TRIGGER_READER(once) /* ONCE */
|
|
92
|
+
TRIGGER_READER(scanfrom) /* SCANFROM / FROM date */
|
|
93
|
+
TRIGGER_READER(from)
|
|
94
|
+
TRIGGER_READER(priority) /* PRIORITY */
|
|
95
|
+
TRIGGER_READER(duration_days)
|
|
96
|
+
TRIGGER_READER(eventduration) /* DURATION, in minutes */
|
|
97
|
+
TRIGGER_READER(eventstart) /* start as a Remind datetime */
|
|
98
|
+
TRIGGER_READER(is_todo)
|
|
99
|
+
TRIGGER_READER(addomit)
|
|
100
|
+
TRIGGER_READER(need_wkday)
|
|
101
|
+
|
|
102
|
+
char const *remrb_trigger_tags(Trigger *t)
|
|
103
|
+
{
|
|
104
|
+
return DBufValue(&t->tags);
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
char const *remrb_trigger_timezone(Trigger const *t)
|
|
108
|
+
{
|
|
109
|
+
return t->tz;
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/* TimeTrig accessors. */
|
|
113
|
+
int remrb_timetrig_time(TimeTrig const *tt) { return tt->ttime; }
|
|
114
|
+
int remrb_timetrig_delta(TimeTrig const *tt) { return tt->delta; }
|
|
115
|
+
int remrb_timetrig_repeat(TimeTrig const *tt) { return tt->rep; }
|
|
116
|
+
int remrb_timetrig_duration(TimeTrig const *tt) { return tt->duration; }
|
|
117
|
+
|
|
118
|
+
/* The tokens main.c dispatches to something other than DoRem. Everything
|
|
119
|
+
else -- a number, a month name, a word Remind does not know -- opens a
|
|
120
|
+
reminder, which is Remind's `default:` case. T_RemType is on the reminder
|
|
121
|
+
side: a line that opens with a bare MSG is a reminder with an empty
|
|
122
|
+
trigger. T_Omit is not: OMIT can carry a reminder, but the command itself
|
|
123
|
+
is a calendar-wide exclusion rather than an event. */
|
|
124
|
+
static int
|
|
125
|
+
is_command(enum TokTypes type)
|
|
126
|
+
{
|
|
127
|
+
switch (type) {
|
|
128
|
+
case T_Banner: case T_Clr: case T_Comment: case T_Debug:
|
|
129
|
+
case T_Dumpvars:case T_Else: case T_Empty: case T_EndIf:
|
|
130
|
+
case T_ErrMsg: case T_Exit: case T_Expr: case T_Flush:
|
|
131
|
+
case T_Frename: case T_Fset: case T_Funset: case T_If:
|
|
132
|
+
case T_IfTrig: case T_Include: case T_IncludeCmd:
|
|
133
|
+
case T_IncludeR:case T_IncludeSys: case T_Omit: case T_Pop:
|
|
134
|
+
case T_PopFuncs:case T_PopVars: case T_Preserve: case T_Push:
|
|
135
|
+
case T_PushFuncs: case T_PushVars: case T_Return: case T_Set:
|
|
136
|
+
case T_Translate: case T_UnSet:
|
|
137
|
+
return 1;
|
|
138
|
+
default:
|
|
139
|
+
return 0;
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
|
|
143
|
+
/* The expanded message from the last successful parse. One buffer, reused:
|
|
144
|
+
the caller copies the string into Ruby before the next call, and the Ruby
|
|
145
|
+
side serialises calls anyway because Remind's state is process-wide. */
|
|
146
|
+
static DynamicBuffer body;
|
|
147
|
+
static int body_ready = 0;
|
|
148
|
+
|
|
149
|
+
static void
|
|
150
|
+
reset_body(void)
|
|
151
|
+
{
|
|
152
|
+
if (!body_ready) {
|
|
153
|
+
DBufInit(&body);
|
|
154
|
+
body_ready = 1;
|
|
155
|
+
} else {
|
|
156
|
+
DBufFree(&body);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/***************************************************************/
|
|
161
|
+
/* */
|
|
162
|
+
/* remrb_parse_reminder */
|
|
163
|
+
/* */
|
|
164
|
+
/* Parse one REM line the way DoRem does, minus the parts a */
|
|
165
|
+
/* calendar has no use for: no queueing, no SATISFY, no purge */
|
|
166
|
+
/* mode, no output. */
|
|
167
|
+
/* */
|
|
168
|
+
/* Fills in the caller's Trigger and TimeTrig, writes the */
|
|
169
|
+
/* first date the reminder triggers on to *dse, and points */
|
|
170
|
+
/* *msg at the message with its %-substitutions expanded for */
|
|
171
|
+
/* that date. Answers OK, or the error code Remind raised; */
|
|
172
|
+
/* the caller frees the Trigger either way. */
|
|
173
|
+
/* */
|
|
174
|
+
/***************************************************************/
|
|
175
|
+
int
|
|
176
|
+
remrb_parse_reminder(char const *line, Trigger *trig, TimeTrig *tim,
|
|
177
|
+
int *dse, char const **msg, int mode)
|
|
178
|
+
{
|
|
179
|
+
Parser p;
|
|
180
|
+
DynamicBuffer token_buf;
|
|
181
|
+
Token tok;
|
|
182
|
+
int r;
|
|
183
|
+
|
|
184
|
+
reset_body();
|
|
185
|
+
DBufInit(&token_buf);
|
|
186
|
+
*dse = -1;
|
|
187
|
+
*msg = NULL;
|
|
188
|
+
|
|
189
|
+
CreateParser(line, &p);
|
|
190
|
+
|
|
191
|
+
/* Mirror how main.c decides what a line is. It reads the first token and
|
|
192
|
+
dispatches on it: T_Rem is a reminder, T_RemType (a bare MSG or CAL) is
|
|
193
|
+
a reminder, an unrecognised word is a reminder by default -- and
|
|
194
|
+
anything else is one of Remind's other commands, which is not an event
|
|
195
|
+
and must not be parsed as though it were.
|
|
196
|
+
|
|
197
|
+
ParseRem starts at the date specification, after the keyword, which is
|
|
198
|
+
why REM is consumed and everything else is pushed back. */
|
|
199
|
+
r = ParseToken(&p, &token_buf);
|
|
200
|
+
if (r != OK) {
|
|
201
|
+
DestroyParser(&p);
|
|
202
|
+
return r;
|
|
203
|
+
}
|
|
204
|
+
FindToken(DBufValue(&token_buf), &tok);
|
|
205
|
+
|
|
206
|
+
if (tok.type != T_Rem) {
|
|
207
|
+
if (is_command(tok.type)) {
|
|
208
|
+
DBufFree(&token_buf);
|
|
209
|
+
DestroyParser(&p);
|
|
210
|
+
return E_PARSE_ERR;
|
|
211
|
+
}
|
|
212
|
+
r = PushToken(DBufValue(&token_buf), &p);
|
|
213
|
+
if (r != OK) {
|
|
214
|
+
DBufFree(&token_buf);
|
|
215
|
+
DestroyParser(&p);
|
|
216
|
+
return r;
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
DBufFree(&token_buf);
|
|
220
|
+
|
|
221
|
+
r = ParseRem(&p, trig, tim);
|
|
222
|
+
if (r != OK) {
|
|
223
|
+
DestroyParser(&p);
|
|
224
|
+
return r;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/* SATISFY is a control construct, not a calendar entry, and the rest of
|
|
228
|
+
DoRem's handling of it is about the reminder queue. */
|
|
229
|
+
if (trig->typ == SAT_TYPE) {
|
|
230
|
+
DestroyParser(&p);
|
|
231
|
+
return E_PARSE_ERR;
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
*dse = ComputeTrigger(get_scanfrom(trig), trig, tim, &r, 1);
|
|
235
|
+
if (r != OK) {
|
|
236
|
+
DestroyParser(&p);
|
|
237
|
+
return r;
|
|
238
|
+
}
|
|
239
|
+
*dse = AdjustTriggerForTimeZone(trig, *dse, tim, 0);
|
|
240
|
+
|
|
241
|
+
/* ParseRem has already read the keyword that opens the body -- MSG, MSF,
|
|
242
|
+
RUN, CAL, SPECIAL -- and left trig->typ set to it, which is why DoRem
|
|
243
|
+
goes straight from here to rendering. A line with no body at all leaves
|
|
244
|
+
it at NO_TYPE. */
|
|
245
|
+
if (trig->typ == NO_TYPE) {
|
|
246
|
+
DestroyParser(&p);
|
|
247
|
+
return E_EOLN;
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/* NORMAL_MODE renders the message the way `remind` prints it; CAL_MODE
|
|
251
|
+
renders it the way a calendar entry wants it, which is where a %"..%"
|
|
252
|
+
title is honoured. The caller picks, because a calendar entry needs
|
|
253
|
+
both: one for the summary and one for the description. */
|
|
254
|
+
r = DoSubst(&p, &body, trig, tim, *dse, mode);
|
|
255
|
+
DestroyParser(&p);
|
|
256
|
+
|
|
257
|
+
if (r != OK) {
|
|
258
|
+
return r;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
*msg = DBufValue(&body);
|
|
262
|
+
return OK;
|
|
263
|
+
}
|
|
264
|
+
|
|
265
|
+
/***************************************************************/
|
|
266
|
+
/* */
|
|
267
|
+
/* remrb_next_trigger */
|
|
268
|
+
/* */
|
|
269
|
+
/* The next date this reminder triggers on, at or after */
|
|
270
|
+
/* `from`. This is the same call DoRem makes to find the */
|
|
271
|
+
/* first one, run again from further along, which is how */
|
|
272
|
+
/* Remind itself walks a reminder across a date range. */
|
|
273
|
+
/* */
|
|
274
|
+
/* It exists because a calendar has to decide whether an */
|
|
275
|
+
/* RRULE says what the reminder says, and the only authority */
|
|
276
|
+
/* on that is the reminder: generate a rule, expand it, and */
|
|
277
|
+
/* compare it against these dates. save_in_globals is 0 -- */
|
|
278
|
+
/* walking a reminder must not move Remind's idea of the last */
|
|
279
|
+
/* trigger. */
|
|
280
|
+
/* */
|
|
281
|
+
/* Answers -1 and sets *err when the reminder has no further */
|
|
282
|
+
/* trigger date, which is how a run-out or expired reminder */
|
|
283
|
+
/* ends a walk. */
|
|
284
|
+
/* */
|
|
285
|
+
/***************************************************************/
|
|
286
|
+
int
|
|
287
|
+
remrb_next_trigger(Trigger *trig, TimeTrig *tim, int from, int *err)
|
|
288
|
+
{
|
|
289
|
+
int dse;
|
|
290
|
+
|
|
291
|
+
*err = OK;
|
|
292
|
+
dse = ComputeTrigger(from, trig, tim, err, 0);
|
|
293
|
+
if (*err != OK) {
|
|
294
|
+
return -1;
|
|
295
|
+
}
|
|
296
|
+
return dse;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
/***************************************************************/
|
|
300
|
+
/* */
|
|
301
|
+
/* remrb_open_file / remrb_read_line */
|
|
302
|
+
/* */
|
|
303
|
+
/* Remind's own file reader. A reminder file is not a list of */
|
|
304
|
+
/* lines: a backslash continues one, INCLUDE pulls another */
|
|
305
|
+
/* file into the middle of it, and both are handled here */
|
|
306
|
+
/* rather than in the caller. ReadLine leaves the logical */
|
|
307
|
+
/* line in the CurLine global and pops back out of an included */
|
|
308
|
+
/* file when it ends. */
|
|
309
|
+
/* */
|
|
310
|
+
/* remrb_read_line answers OK, or E_EOF when there is nothing */
|
|
311
|
+
/* left in any open file. */
|
|
312
|
+
/* */
|
|
313
|
+
/***************************************************************/
|
|
314
|
+
int
|
|
315
|
+
remrb_open_file(char const *path)
|
|
316
|
+
{
|
|
317
|
+
return IncludeFile(path);
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/* INCLUDE is a command, not part of the reader: ReadLine pops back out of an
|
|
321
|
+
included file when it ends, but something has to push one on in the first
|
|
322
|
+
place, and in `remind` that something is DoCommand. This is that, for the
|
|
323
|
+
three forms that name a file.
|
|
324
|
+
|
|
325
|
+
INCLUDECMD is deliberately not among them. It runs a shell command and
|
|
326
|
+
reads its output as reminders, and a program that converts somebody else's
|
|
327
|
+
reminder file should not execute what is in it. */
|
|
328
|
+
static int
|
|
329
|
+
follow_include(char const *line)
|
|
330
|
+
{
|
|
331
|
+
Parser p;
|
|
332
|
+
DynamicBuffer buf;
|
|
333
|
+
Token tok;
|
|
334
|
+
int handled = 0;
|
|
335
|
+
|
|
336
|
+
CreateParser(line, &p);
|
|
337
|
+
DBufInit(&buf);
|
|
338
|
+
|
|
339
|
+
if (ParseToken(&p, &buf) == OK) {
|
|
340
|
+
FindToken(DBufValue(&buf), &tok);
|
|
341
|
+
if (tok.type == T_Include ||
|
|
342
|
+
tok.type == T_IncludeR ||
|
|
343
|
+
tok.type == T_IncludeSys) {
|
|
344
|
+
(void) DoInclude(&p, tok.type);
|
|
345
|
+
handled = 1;
|
|
346
|
+
}
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
DBufFree(&buf);
|
|
350
|
+
DestroyParser(&p);
|
|
351
|
+
return handled;
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
int
|
|
355
|
+
remrb_read_line(char const **text)
|
|
356
|
+
{
|
|
357
|
+
int r;
|
|
358
|
+
|
|
359
|
+
while (1) {
|
|
360
|
+
r = ReadLine();
|
|
361
|
+
if (r != OK) {
|
|
362
|
+
*text = NULL;
|
|
363
|
+
return r;
|
|
364
|
+
}
|
|
365
|
+
if (!follow_include(CurLine)) {
|
|
366
|
+
*text = CurLine;
|
|
367
|
+
return r;
|
|
368
|
+
}
|
|
369
|
+
}
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
int remrb_eof(void) { return E_EOF; }
|
|
373
|
+
|
|
374
|
+
/* ParseRem allocates: the tag buffer, the time zone, the INFO headers. */
|
|
375
|
+
void
|
|
376
|
+
remrb_free_trigger(Trigger *t)
|
|
377
|
+
{
|
|
378
|
+
FreeTrig(t);
|
|
379
|
+
}
|
|
@@ -0,0 +1,252 @@
|
|
|
1
|
+
# frozen_string_literal: true
|
|
2
|
+
|
|
3
|
+
require "fileutils"
|
|
4
|
+
|
|
5
|
+
require_relative "library"
|
|
6
|
+
|
|
7
|
+
module Remind
|
|
8
|
+
# Builds Remind's sources, plus this gem's shim, into a shared library.
|
|
9
|
+
#
|
|
10
|
+
# Remind's own Makefile links two programs and no library, so this is the
|
|
11
|
+
# one step that has to be invented rather than reused. It is deliberately
|
|
12
|
+
# thin: `./configure` still decides the compiler, the flags, the feature
|
|
13
|
+
# macros and the libraries to link, and this class reads those decisions
|
|
14
|
+
# back out of the generated `src/Makefile` rather than making its own. What
|
|
15
|
+
# it adds is `-fPIC -shared`, one output file, and `ext/shim.c`.
|
|
16
|
+
#
|
|
17
|
+
# The output goes where `Remind::Library` looks -- lib/remind/ -- because
|
|
18
|
+
# that is where a precompiled gem carries it, and a checkout that puts it
|
|
19
|
+
# somewhere else is a checkout that tests a different arrangement than the
|
|
20
|
+
# one users get.
|
|
21
|
+
#
|
|
22
|
+
# `rem2ps.c` is left out: the PostScript formatter is a second program with
|
|
23
|
+
# a second `main`, and nothing in it is worth binding. `main.c` stays in --
|
|
24
|
+
# a `main` symbol in a shared library is harmless, and leaving it out would
|
|
25
|
+
# strand every symbol defined beside it.
|
|
26
|
+
class Builder
|
|
27
|
+
EXCLUDED_SOURCES = ["rem2ps.c"].freeze
|
|
28
|
+
|
|
29
|
+
SHARED_FLAGS = ["-fPIC", "-shared"].freeze
|
|
30
|
+
|
|
31
|
+
# Remind resolves `INCLUDE` against this at runtime; pointing it at the
|
|
32
|
+
# vendored tree means a reminder can include the holiday files that ship
|
|
33
|
+
# with the release the bindings bind.
|
|
34
|
+
SYSDIR_TEMPLATE = "-DSYSDIR=%s"
|
|
35
|
+
|
|
36
|
+
# Extra arguments for `./configure`.
|
|
37
|
+
#
|
|
38
|
+
# There is one job that needs them: building a library to put inside a
|
|
39
|
+
# precompiled gem. Remind's configure links readline when it finds it, and
|
|
40
|
+
# a gem whose library needs a readline the installing machine may not have
|
|
41
|
+
# is a gem that fails to load there. CI therefore builds with
|
|
42
|
+
#
|
|
43
|
+
# REMIND_RB_CONFIGURE_ARGS="ac_cv_lib_readline_readline=no
|
|
44
|
+
# ac_cv_header_readline_readline_h=no"
|
|
45
|
+
#
|
|
46
|
+
# which tells configure's own cache the probe already failed. Nothing in
|
|
47
|
+
# the bindings uses readline -- it is there for `remind`'s interactive
|
|
48
|
+
# prompt, and there is no prompt in a library.
|
|
49
|
+
CONFIGURE_ARGS = "REMIND_RB_CONFIGURE_ARGS"
|
|
50
|
+
|
|
51
|
+
attr_reader :source_root, :output, :io
|
|
52
|
+
|
|
53
|
+
def initialize(source_root: Library.source_root, output: Library.default_path, io: $stderr)
|
|
54
|
+
@source_root = source_root
|
|
55
|
+
@output = output
|
|
56
|
+
@io = io
|
|
57
|
+
end
|
|
58
|
+
|
|
59
|
+
# Answers the path it built.
|
|
60
|
+
def call
|
|
61
|
+
configure
|
|
62
|
+
generate_translatables
|
|
63
|
+
compile
|
|
64
|
+
|
|
65
|
+
output
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
private
|
|
69
|
+
|
|
70
|
+
def source_directory
|
|
71
|
+
File.join(source_root, "src")
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
def makefile
|
|
75
|
+
File.join(source_directory, "Makefile")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
# `configure` writes src/Makefile, src/config.h and src/version.h. It is
|
|
79
|
+
# slow and idempotent, so it runs once and not again unless its output
|
|
80
|
+
# has gone.
|
|
81
|
+
def configure
|
|
82
|
+
if File.exist?(makefile)
|
|
83
|
+
io.puts("configure: already done")
|
|
84
|
+
else
|
|
85
|
+
run(configure_command, chdir: source_root, what: "configure")
|
|
86
|
+
end
|
|
87
|
+
end
|
|
88
|
+
|
|
89
|
+
def configure_command
|
|
90
|
+
["./configure", ENV.fetch(CONFIGURE_ARGS, nil)].compact.join(" ")
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
# xlat.c is generated by a Makefile rule that greps every `tr()` string
|
|
94
|
+
# out of the sources. Nothing else defines `translatables`, so a library
|
|
95
|
+
# built without it fails to load rather than failing to build.
|
|
96
|
+
def generate_translatables
|
|
97
|
+
run("make xlat.c", chdir: source_directory, what: "make xlat.c")
|
|
98
|
+
end
|
|
99
|
+
|
|
100
|
+
def compile
|
|
101
|
+
FileUtils.mkdir_p(File.dirname(output))
|
|
102
|
+
run(compile_command, chdir: source_directory, what: "compile")
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def compile_command
|
|
106
|
+
[
|
|
107
|
+
compiler,
|
|
108
|
+
*compile_flags,
|
|
109
|
+
*SHARED_FLAGS,
|
|
110
|
+
format(SYSDIR_TEMPLATE, File.join(source_root, "include")),
|
|
111
|
+
"-o",
|
|
112
|
+
output,
|
|
113
|
+
*sources,
|
|
114
|
+
*link_libraries,
|
|
115
|
+
].join(" ")
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
# The shim is compiled from where it lives rather than copied in beside
|
|
119
|
+
# the Remind sources, so a build leaves nothing behind in the vendored
|
|
120
|
+
# tree.
|
|
121
|
+
def sources
|
|
122
|
+
remind_sources + [Library.shim]
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
def remind_sources
|
|
126
|
+
Dir.children(source_directory)
|
|
127
|
+
.select { |name| name.end_with?(".c") }
|
|
128
|
+
.reject { |name| EXCLUDED_SOURCES.include?(name) }
|
|
129
|
+
.sort
|
|
130
|
+
end
|
|
131
|
+
|
|
132
|
+
# --- what configure decided ------------------------------------------
|
|
133
|
+
|
|
134
|
+
def makefile_text
|
|
135
|
+
File.read(makefile)
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
# The recipe under the `.c.o` suffix rule: the exact command configure
|
|
139
|
+
# chose for compiling one source file.
|
|
140
|
+
def compile_recipe
|
|
141
|
+
recipe(/^\.c\.o:\n\t(.*)$/)
|
|
142
|
+
end
|
|
143
|
+
|
|
144
|
+
# The recipe that links the program, which is where the libraries are.
|
|
145
|
+
def link_recipe
|
|
146
|
+
recipe(/^remind: [^\n]*\n\t(.*)$/)
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def recipe(pattern)
|
|
150
|
+
match = makefile_text.match(pattern)
|
|
151
|
+
|
|
152
|
+
if match
|
|
153
|
+
match[1].split
|
|
154
|
+
else
|
|
155
|
+
raise BuildError, "#{makefile} has no recipe matching #{pattern.inspect}"
|
|
156
|
+
end
|
|
157
|
+
end
|
|
158
|
+
|
|
159
|
+
def compiler
|
|
160
|
+
compile_recipe.first
|
|
161
|
+
end
|
|
162
|
+
|
|
163
|
+
# Everything the compile recipe passes except the parts that are about
|
|
164
|
+
# compiling one file into one object: `-c`, the source, and the make
|
|
165
|
+
# variables, which have no values outside make.
|
|
166
|
+
def compile_flags
|
|
167
|
+
compile_recipe.drop(1).reject { |flag| skip_flag?(flag) }
|
|
168
|
+
end
|
|
169
|
+
|
|
170
|
+
def skip_flag?(flag)
|
|
171
|
+
flag == "-c" || flag.include?("$") || flag.start_with?("-DSYSDIR")
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
def link_libraries
|
|
175
|
+
link_recipe.select { |flag| flag.start_with?("-l") }
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
def run(command, chdir:, what:)
|
|
179
|
+
io.puts("#{what}: #{command}")
|
|
180
|
+
|
|
181
|
+
if system(command, chdir: chdir)
|
|
182
|
+
command
|
|
183
|
+
else
|
|
184
|
+
raise BuildError, "#{what} failed in #{chdir}: #{command}"
|
|
185
|
+
end
|
|
186
|
+
end
|
|
187
|
+
end
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
__END__
|
|
191
|
+
|
|
192
|
+
require "stringio"
|
|
193
|
+
|
|
194
|
+
describe "Remind::Builder" do
|
|
195
|
+
# The build itself is what `rake library` does, and what every other spec
|
|
196
|
+
# here depends on having run. What is worth pinning is that the build takes
|
|
197
|
+
# its decisions from configure's output rather than inventing them.
|
|
198
|
+
builder = proc { Remind::Builder.new(io: StringIO.new) }
|
|
199
|
+
|
|
200
|
+
it "builds from the vendored sources" do
|
|
201
|
+
builder.().send(:source_directory).should == Remind::Library.source_directory
|
|
202
|
+
end
|
|
203
|
+
|
|
204
|
+
it "leaves the PostScript formatter out, and keeps main.c in" do
|
|
205
|
+
Remind::Builder::EXCLUDED_SOURCES.should.include "rem2ps.c"
|
|
206
|
+
Remind::Builder::EXCLUDED_SOURCES.should.not.include "main.c"
|
|
207
|
+
end
|
|
208
|
+
|
|
209
|
+
it "compiles the shim alongside them" do
|
|
210
|
+
builder.().send(:sources).last.should == Remind::Library.shim
|
|
211
|
+
end
|
|
212
|
+
|
|
213
|
+
it "takes the compiler from the generated Makefile" do
|
|
214
|
+
builder.().send(:compiler).should.not.be.empty
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
it "drops the flags that only make sense one file at a time" do
|
|
218
|
+
flags = builder.().send(:compile_flags)
|
|
219
|
+
|
|
220
|
+
flags.should.not.include "-c"
|
|
221
|
+
flags.any? { |flag| flag.include?("$") }.should.be.false
|
|
222
|
+
end
|
|
223
|
+
|
|
224
|
+
it "keeps the feature macros configure defined" do
|
|
225
|
+
builder.().send(:compile_flags).should.include "-DHAVE_CONFIG_H"
|
|
226
|
+
end
|
|
227
|
+
|
|
228
|
+
it "links what the program links" do
|
|
229
|
+
builder.().send(:link_libraries).all? { |flag| flag.start_with?("-l") }.should.be.true
|
|
230
|
+
end
|
|
231
|
+
|
|
232
|
+
it "passes on the configure arguments packaging needs" do
|
|
233
|
+
ENV[Remind::Builder::CONFIGURE_ARGS] = "ac_cv_lib_readline_readline=no"
|
|
234
|
+
|
|
235
|
+
builder.().send(:configure_command).should == "./configure ac_cv_lib_readline_readline=no"
|
|
236
|
+
ensure
|
|
237
|
+
ENV.delete(Remind::Builder::CONFIGURE_ARGS)
|
|
238
|
+
end
|
|
239
|
+
|
|
240
|
+
it "configures with nothing extra by default" do
|
|
241
|
+
builder.().send(:configure_command).should == "./configure"
|
|
242
|
+
end
|
|
243
|
+
|
|
244
|
+
it "builds one shared library out of all of it" do
|
|
245
|
+
command = builder.().send(:compile_command)
|
|
246
|
+
|
|
247
|
+
command.should.include "-fPIC"
|
|
248
|
+
command.should.include "-shared"
|
|
249
|
+
command.should.include "expr.c"
|
|
250
|
+
command.should.not.include "rem2ps.c"
|
|
251
|
+
end
|
|
252
|
+
end
|