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
|
@@ -0,0 +1,428 @@
|
|
|
1
|
+
/***************************************************************/
|
|
2
|
+
/* */
|
|
3
|
+
/* HASHTAB.C */
|
|
4
|
+
/* */
|
|
5
|
+
/* Implementation of hash table. */
|
|
6
|
+
/* */
|
|
7
|
+
/* This file is part of REMIND. */
|
|
8
|
+
/* Copyright (C) 1992-2026 by Dianne Skoll */
|
|
9
|
+
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
10
|
+
/* */
|
|
11
|
+
/***************************************************************/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* \file hashtab.c
|
|
15
|
+
*
|
|
16
|
+
* \brief Implementation of hash table
|
|
17
|
+
*
|
|
18
|
+
* A hash table manages an array of buckets, each of which is the
|
|
19
|
+
* head of a singly-linked list. A given hash table can store items
|
|
20
|
+
* of a given type. The items in a hash table must be structs, and one
|
|
21
|
+
* of their members must be a struct hash_link object. For example,
|
|
22
|
+
* a hash table containing integers might have the hash objects
|
|
23
|
+
* defined as:
|
|
24
|
+
*
|
|
25
|
+
* struct int_object {
|
|
26
|
+
* int value;
|
|
27
|
+
* struct hash_link link;
|
|
28
|
+
* };
|
|
29
|
+
*
|
|
30
|
+
* When you initialize the hash table, you pass in the offset to the hash
|
|
31
|
+
* link. For example, to initialize a hash table designed to hold
|
|
32
|
+
* int_objects, you'd do something like:
|
|
33
|
+
*
|
|
34
|
+
* unsigned int hash_int_obj(void *x) {
|
|
35
|
+
* return (unsigned int) ((int_object *) x)->value;
|
|
36
|
+
* }
|
|
37
|
+
* int compare_int_obj(void *a, void *b) {
|
|
38
|
+
* return ((int_object *)a)->value - ((int_object *)b)->value;
|
|
39
|
+
* }
|
|
40
|
+
*
|
|
41
|
+
* hash_table tab;
|
|
42
|
+
* hash_table_init(&tab, offsetof(struct int_object, link), hash_int_obj, compare_int_obj);
|
|
43
|
+
*
|
|
44
|
+
* An item can be in multiple hash tables at once; just declare multiple
|
|
45
|
+
* hash_link members and pass in the appropriate offset to each hash
|
|
46
|
+
* table.
|
|
47
|
+
*/
|
|
48
|
+
|
|
49
|
+
#include "hashtab.h"
|
|
50
|
+
#include <stdlib.h>
|
|
51
|
+
#include <errno.h>
|
|
52
|
+
|
|
53
|
+
/*
|
|
54
|
+
* The number of buckets should be a prime number.
|
|
55
|
+
* Use these numbers of buckets to grow or shrink the hash table.
|
|
56
|
+
* Yes, OK, the list below is probably excessive.
|
|
57
|
+
*/
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* \brief A list of prime numbers from 17 to about 1.4 billion, approximately
|
|
61
|
+
* doubling with each successive number.
|
|
62
|
+
*
|
|
63
|
+
* These are used as choices for the number of hash buckets in the table
|
|
64
|
+
*/
|
|
65
|
+
static size_t bucket_choices[] = {
|
|
66
|
+
7, 17, 37, 79, 163, 331, 673, 1361, 2729, 5471, 10949, 21911, 43853, 87719,
|
|
67
|
+
175447, 350899, 701819, 1403641, 2807303, 5614657, 11229331, 22458671,
|
|
68
|
+
44917381, 89834777, 179669557, 359339171, 718678369, 1437356741 };
|
|
69
|
+
|
|
70
|
+
#define NUM_BUCKET_CHOICES (sizeof(bucket_choices) / sizeof(bucket_choices[0]))
|
|
71
|
+
|
|
72
|
+
#define NUM_BUCKETS(t) (bucket_choices[t->bucket_choice_index])
|
|
73
|
+
|
|
74
|
+
#define LINK(t, p) ( (struct hash_link *) (( ((char *) p) + t->hash_link_offset)) )
|
|
75
|
+
|
|
76
|
+
/**
|
|
77
|
+
* \brief Initialize a hash table
|
|
78
|
+
*
|
|
79
|
+
* Initializes a hash table. A given hash table can contain a collection
|
|
80
|
+
* of items, all of which must be the same. An item in a hash table is
|
|
81
|
+
* a structure and one of the elements in the structure must be a
|
|
82
|
+
* struct hash_link object. For example, if you are storing a collection
|
|
83
|
+
* of integers in a hash table, your item might look like this:
|
|
84
|
+
*
|
|
85
|
+
* struct item {
|
|
86
|
+
* int value;
|
|
87
|
+
* struct hash_link link;
|
|
88
|
+
* };
|
|
89
|
+
*
|
|
90
|
+
* \param t Pointer to a hash_table object
|
|
91
|
+
* \param link_offset The offset to the struct hash_link object within the object being put in the hash table. In the example above, it would be
|
|
92
|
+
* offsetof(struct item, link)
|
|
93
|
+
* \param hashfunc A pointer to a function that computes a hash given a pointer to an object. This function must return an unsigned int.
|
|
94
|
+
* \param compare A pointer to a function that compares two objects. It must
|
|
95
|
+
* return 0 if they compare equal and non-zero if they do not.
|
|
96
|
+
*
|
|
97
|
+
* \return 0 on success, -1 on failure (and errno is set appropriately)
|
|
98
|
+
*/
|
|
99
|
+
int
|
|
100
|
+
hash_table_init(hash_table *t,
|
|
101
|
+
size_t link_offset,
|
|
102
|
+
unsigned int (*hashfunc)(void const *x),
|
|
103
|
+
int (*compare)(void const *a, void const *b))
|
|
104
|
+
{
|
|
105
|
+
t->bucket_choice_index = 0;
|
|
106
|
+
t->num_entries = 0;
|
|
107
|
+
t->hash_link_offset = link_offset;
|
|
108
|
+
t->hashfunc = hashfunc;
|
|
109
|
+
t->compare = compare;
|
|
110
|
+
t->buckets = malloc(sizeof(void *) * bucket_choices[0]);
|
|
111
|
+
t->num_growths = 0;
|
|
112
|
+
t->num_shrinks = 0;
|
|
113
|
+
if (!t->buckets) {
|
|
114
|
+
return -1;
|
|
115
|
+
}
|
|
116
|
+
for (size_t i=0; i<bucket_choices[0]; i++) {
|
|
117
|
+
t->buckets[i] = NULL;
|
|
118
|
+
}
|
|
119
|
+
return 0;
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* \brief Free memory used by a hash table
|
|
124
|
+
*
|
|
125
|
+
* \param t Pointer to a hash_table object
|
|
126
|
+
*/
|
|
127
|
+
void
|
|
128
|
+
hash_table_free(hash_table *t)
|
|
129
|
+
{
|
|
130
|
+
free(t->buckets);
|
|
131
|
+
t->buckets = NULL;
|
|
132
|
+
t->bucket_choice_index = -1;
|
|
133
|
+
t->num_entries = 0;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* \brief Return the number of items in a hash table
|
|
138
|
+
*
|
|
139
|
+
* \param t Pointer to a hash_table object
|
|
140
|
+
*
|
|
141
|
+
* \return The number of items in the hash table
|
|
142
|
+
*/
|
|
143
|
+
size_t
|
|
144
|
+
hash_table_num_entries(hash_table const *t)
|
|
145
|
+
{
|
|
146
|
+
return t->num_entries;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* \brief Return the number of buckets in a hash table
|
|
151
|
+
*
|
|
152
|
+
* \param t Pointer to a hash_table object
|
|
153
|
+
*
|
|
154
|
+
* \return The number of buckets in the hash table
|
|
155
|
+
*/
|
|
156
|
+
size_t
|
|
157
|
+
hash_table_num_buckets(hash_table const *t)
|
|
158
|
+
{
|
|
159
|
+
if (t->bucket_choice_index >= NUM_BUCKET_CHOICES) {
|
|
160
|
+
return 0;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return NUM_BUCKETS(t);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* \brief Return the length of the i'th bucket chain
|
|
168
|
+
*
|
|
169
|
+
* If i >= num_buckets, returns (size_t) -1
|
|
170
|
+
*
|
|
171
|
+
* \param t Pointer to a hash_table object
|
|
172
|
+
* \param i The bucket whose length we want (0 to num_buckets-1)
|
|
173
|
+
* \return The length of the i'th bucket chain
|
|
174
|
+
*/
|
|
175
|
+
size_t
|
|
176
|
+
hash_table_chain_len(hash_table *t, size_t i)
|
|
177
|
+
{
|
|
178
|
+
if (i >= hash_table_num_buckets(t)) {
|
|
179
|
+
return (size_t) -1;
|
|
180
|
+
}
|
|
181
|
+
size_t len = 0;
|
|
182
|
+
void *ptr = t->buckets[i];
|
|
183
|
+
while(ptr) {
|
|
184
|
+
len++;
|
|
185
|
+
ptr = LINK(t, ptr)->next;
|
|
186
|
+
}
|
|
187
|
+
return len;
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
/**
|
|
191
|
+
* \brief Resize a hash table
|
|
192
|
+
*
|
|
193
|
+
* Resizes (either grows or shrinks) a hash table's bucket array
|
|
194
|
+
*
|
|
195
|
+
* \param t Pointer to a hash_table object
|
|
196
|
+
* \param dir Must be either 1 (to increase the bucket array size) or
|
|
197
|
+
* -1 (to decrease it).
|
|
198
|
+
* \return 0 on success, non-zero if resizing fails. NOTE: Currently, resizing
|
|
199
|
+
* cannot fail; if we fail to allocate memory for the new bucket array,
|
|
200
|
+
* we just keep the existing array. This behaviour may change in future.
|
|
201
|
+
*/
|
|
202
|
+
static int
|
|
203
|
+
hash_table_resize(hash_table *t, int dir)
|
|
204
|
+
{
|
|
205
|
+
if (dir != 1 && dir != -1) {
|
|
206
|
+
return 0;
|
|
207
|
+
}
|
|
208
|
+
if ((dir == -1 && t->bucket_choice_index == 0) ||
|
|
209
|
+
(dir == 1 && t->bucket_choice_index == NUM_BUCKET_CHOICES-1)) {
|
|
210
|
+
return 0;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
size_t num_old_buckets = bucket_choices[t->bucket_choice_index];
|
|
214
|
+
size_t num_new_buckets = bucket_choices[t->bucket_choice_index + dir];
|
|
215
|
+
|
|
216
|
+
void **new_buckets = malloc(sizeof(void *) * num_new_buckets);
|
|
217
|
+
if (!new_buckets) {
|
|
218
|
+
/* Out of memory... just don't resize? */
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
if (dir == 1) {
|
|
222
|
+
t->num_growths++;
|
|
223
|
+
} else {
|
|
224
|
+
t->num_shrinks++;
|
|
225
|
+
}
|
|
226
|
+
for (size_t j=0; j<num_new_buckets; j++) {
|
|
227
|
+
new_buckets[j] = NULL;
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/* Move everything from the old buckets into the new */
|
|
231
|
+
for (size_t i=0; i<num_old_buckets; i++) {
|
|
232
|
+
void *p = t->buckets[i];
|
|
233
|
+
while(p) {
|
|
234
|
+
struct hash_link *l = LINK(t, p);
|
|
235
|
+
void *nxt = l->next;
|
|
236
|
+
size_t j = l->hashval % num_new_buckets;
|
|
237
|
+
l->next = new_buckets[j];
|
|
238
|
+
new_buckets[j] = p;
|
|
239
|
+
p = nxt;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
free(t->buckets);
|
|
243
|
+
t->buckets = new_buckets;
|
|
244
|
+
t->bucket_choice_index += dir;
|
|
245
|
+
|
|
246
|
+
return 0;
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* \brief Insert an item into a hash table
|
|
251
|
+
*
|
|
252
|
+
* Inserts an item into a hash table. The item MUST NOT be freed as
|
|
253
|
+
* long as it is in a hash table
|
|
254
|
+
*
|
|
255
|
+
* \param t Pointer to a hash_table object
|
|
256
|
+
* \param item Pointer to the item to insert
|
|
257
|
+
*
|
|
258
|
+
* \return 0 on success, -1 on failure (and errno is set appropriately)
|
|
259
|
+
*/
|
|
260
|
+
int
|
|
261
|
+
hash_table_insert(hash_table *t, void *item)
|
|
262
|
+
{
|
|
263
|
+
if (!item) {
|
|
264
|
+
errno = EINVAL;
|
|
265
|
+
return -1;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
unsigned int v = t->hashfunc(item);
|
|
269
|
+
|
|
270
|
+
struct hash_link *l = LINK(t, item);
|
|
271
|
+
l->hashval = v;
|
|
272
|
+
|
|
273
|
+
v = v % NUM_BUCKETS(t);
|
|
274
|
+
|
|
275
|
+
l->next = t->buckets[v];
|
|
276
|
+
t->buckets[v] = item;
|
|
277
|
+
t->num_entries++;
|
|
278
|
+
|
|
279
|
+
/* Grow table for load factor > 2 */
|
|
280
|
+
if (t->bucket_choice_index < NUM_BUCKET_CHOICES-1 &&
|
|
281
|
+
t->num_entries > 2 * NUM_BUCKETS(t)) {
|
|
282
|
+
return hash_table_resize(t, 1);
|
|
283
|
+
}
|
|
284
|
+
return 0;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/**
|
|
288
|
+
* \brief Find an item in a hash table
|
|
289
|
+
*
|
|
290
|
+
* \param t Pointer to a hash_table object
|
|
291
|
+
* \param candidate Pointer to an object to be sought in the table
|
|
292
|
+
*
|
|
293
|
+
* \return A pointer to the object if one that matches candidate is found. NULL if not found
|
|
294
|
+
*/
|
|
295
|
+
void *
|
|
296
|
+
hash_table_find(hash_table *t, void *candidate)
|
|
297
|
+
{
|
|
298
|
+
if (!candidate) {
|
|
299
|
+
return NULL;
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
unsigned int v = t->hashfunc(candidate);
|
|
303
|
+
|
|
304
|
+
void *ptr = t->buckets[v % NUM_BUCKETS(t)];
|
|
305
|
+
|
|
306
|
+
while(ptr) {
|
|
307
|
+
if (!t->compare(candidate, ptr)) {
|
|
308
|
+
return ptr;
|
|
309
|
+
}
|
|
310
|
+
ptr = LINK(t, ptr)->next;
|
|
311
|
+
}
|
|
312
|
+
return NULL;
|
|
313
|
+
}
|
|
314
|
+
|
|
315
|
+
/**
|
|
316
|
+
* \brief Delete an item from a hash table
|
|
317
|
+
*
|
|
318
|
+
* \param t Pointer to a hash_table object
|
|
319
|
+
* \param candidate Pointer to an object that is in the table and must be removed from it
|
|
320
|
+
* \param resize_ok If non-zero, then it's OK to resize the hash table.
|
|
321
|
+
*
|
|
322
|
+
* \return 0 on success, -1 on failure
|
|
323
|
+
*/
|
|
324
|
+
static int
|
|
325
|
+
hash_table_delete_helper(hash_table *t, void *item, int resize_ok)
|
|
326
|
+
{
|
|
327
|
+
if (!item) {
|
|
328
|
+
errno = EINVAL;
|
|
329
|
+
return -1;
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
struct hash_link *l = LINK(t, item);
|
|
333
|
+
unsigned int v = l->hashval;
|
|
334
|
+
|
|
335
|
+
v = v % NUM_BUCKETS(t);
|
|
336
|
+
|
|
337
|
+
if (t->buckets[v] == item) {
|
|
338
|
+
t->buckets[v] = l->next;
|
|
339
|
+
t->num_entries--;
|
|
340
|
+
if (resize_ok) {
|
|
341
|
+
/* Shrink table for load factor < 1 */
|
|
342
|
+
if (t->bucket_choice_index > 0 &&
|
|
343
|
+
t->num_entries < NUM_BUCKETS(t) / 2) {
|
|
344
|
+
return hash_table_resize(t, -1);
|
|
345
|
+
}
|
|
346
|
+
}
|
|
347
|
+
return 0;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
void *ptr = t->buckets[v];
|
|
351
|
+
while(ptr) {
|
|
352
|
+
struct hash_link *l2 = LINK(t, ptr);
|
|
353
|
+
if (l2->next == item) {
|
|
354
|
+
l2->next = l->next;
|
|
355
|
+
t->num_entries--;
|
|
356
|
+
/* Shrink table for load factor < 1 */
|
|
357
|
+
if (resize_ok) {
|
|
358
|
+
if (t->bucket_choice_index > 0 &&
|
|
359
|
+
t->num_entries < NUM_BUCKETS(t) / 2) {
|
|
360
|
+
return hash_table_resize(t, -1);
|
|
361
|
+
}
|
|
362
|
+
}
|
|
363
|
+
return 0;
|
|
364
|
+
}
|
|
365
|
+
ptr = l2->next;
|
|
366
|
+
}
|
|
367
|
+
|
|
368
|
+
/* Item not found in hash table */
|
|
369
|
+
errno = ENOENT;
|
|
370
|
+
return -1;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
int
|
|
374
|
+
hash_table_delete(hash_table *t, void *item)
|
|
375
|
+
{
|
|
376
|
+
return hash_table_delete_helper(t, item, 1);
|
|
377
|
+
}
|
|
378
|
+
|
|
379
|
+
int
|
|
380
|
+
hash_table_delete_no_resize(hash_table *t, void *item)
|
|
381
|
+
{
|
|
382
|
+
return hash_table_delete_helper(t, item, 0);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
/**
|
|
386
|
+
* \brief Iterate to the next item in a hash table
|
|
387
|
+
*
|
|
388
|
+
* Acts as an iterator. Given a pointer to an item in the hash
|
|
389
|
+
* table, returns the next item, or NULL if no more items. If the
|
|
390
|
+
* existing-item pointer is supplied as NULL, returns a pointer to the
|
|
391
|
+
* first item in the hash table. You can therefore iterate across the
|
|
392
|
+
* hash table like this*
|
|
393
|
+
*
|
|
394
|
+
* void *item = NULL;
|
|
395
|
+
* while ( (item = hash_table_next(&table, item) ) != NULL) {
|
|
396
|
+
* // Do something with item
|
|
397
|
+
* }
|
|
398
|
+
*
|
|
399
|
+
* NOTE that you MUST NOT modify the hash table while iterating over it.
|
|
400
|
+
*
|
|
401
|
+
* \param t Pointer to a hash_table object
|
|
402
|
+
* \param cur The current item. Supply as NULL to get the first item
|
|
403
|
+
*
|
|
404
|
+
* \return A pointer to the next item in the hash table, or NULL if there
|
|
405
|
+
* are no more items
|
|
406
|
+
*/
|
|
407
|
+
void *
|
|
408
|
+
hash_table_next(hash_table *t, void *cur)
|
|
409
|
+
{
|
|
410
|
+
size_t n_buckets = NUM_BUCKETS(t);
|
|
411
|
+
|
|
412
|
+
size_t start_bucket = 0;
|
|
413
|
+
if (cur) {
|
|
414
|
+
struct hash_link *l = LINK(t, cur);
|
|
415
|
+
if (l->next) {
|
|
416
|
+
return l->next;
|
|
417
|
+
}
|
|
418
|
+
/* End of this chain; start searching at the next bucket */
|
|
419
|
+
start_bucket = (l->hashval % n_buckets) + 1;
|
|
420
|
+
}
|
|
421
|
+
|
|
422
|
+
for (size_t i=start_bucket; i<n_buckets; i++) {
|
|
423
|
+
if (t->buckets[i]) {
|
|
424
|
+
return t->buckets[i];
|
|
425
|
+
}
|
|
426
|
+
}
|
|
427
|
+
return NULL;
|
|
428
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
/***************************************************************/
|
|
2
|
+
/* */
|
|
3
|
+
/* HASHTAB.H */
|
|
4
|
+
/* */
|
|
5
|
+
/* Header file for hash-table related functions. */
|
|
6
|
+
/* */
|
|
7
|
+
/* This file is part of REMIND. */
|
|
8
|
+
/* Copyright (C) 1992-2026 by Dianne Skoll */
|
|
9
|
+
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
10
|
+
/* */
|
|
11
|
+
/***************************************************************/
|
|
12
|
+
|
|
13
|
+
/* For size_t */
|
|
14
|
+
#include <stdio.h>
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* \brief A structure for holding hash table chain links.
|
|
18
|
+
*
|
|
19
|
+
* This structure is embedded in a container structure to make up
|
|
20
|
+
* a hash table entry
|
|
21
|
+
*/
|
|
22
|
+
struct hash_link {
|
|
23
|
+
void *next; /**< Link to next item in the chain */
|
|
24
|
+
unsigned int hashval; /**< Cached hash function value */
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* \brief A hash table
|
|
29
|
+
*/
|
|
30
|
+
typedef struct {
|
|
31
|
+
unsigned int bucket_choice_index; /**< Index into array of possible bucket counts */
|
|
32
|
+
size_t num_growths; /**< How many times have we grown the hash table? */
|
|
33
|
+
size_t num_shrinks; /**< How many times have we grown the hash table? */
|
|
34
|
+
size_t num_entries; /**< Number of entries in the hash table */
|
|
35
|
+
size_t hash_link_offset; /**< Offset of the struct hash_link in the container */
|
|
36
|
+
void **buckets; /**< Array of buckets */
|
|
37
|
+
unsigned int (*hashfunc)(void const *x); /**< Pointer to the hashing function */
|
|
38
|
+
int (*compare)(void const *a, void const *b); /**< Pointer to the comparison function */
|
|
39
|
+
} hash_table;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* \brief Data type to hold statistics about a hash table
|
|
43
|
+
*/
|
|
44
|
+
struct hash_table_stats {
|
|
45
|
+
size_t num_entries; /**< Number of items in the hash table */
|
|
46
|
+
size_t num_buckets; /**< Number of buckets in the hash table */
|
|
47
|
+
size_t num_nonempty_buckets; /**< Number of non-emptry buckets */
|
|
48
|
+
size_t max_len; /**< Length of longest chain in the hash table */
|
|
49
|
+
size_t min_len; /**< Length of the shortest chain in the hash table */
|
|
50
|
+
size_t num_growths; /**< How many times have we grown the hash table? */
|
|
51
|
+
size_t num_shrinks; /**< How many times have we grown the hash table? */
|
|
52
|
+
double avg_len; /**< Average chain length */
|
|
53
|
+
double avg_nonempty_len; /**< Average chain length of non-empty bucket */
|
|
54
|
+
double stddev; /**< Standard deviation of chain lengths */
|
|
55
|
+
};
|
|
56
|
+
|
|
57
|
+
int hash_table_init(hash_table *t,
|
|
58
|
+
size_t link_offset,
|
|
59
|
+
unsigned int (*hashfunc)(void const *x),
|
|
60
|
+
int (*compare)(void const *a, void const *b));
|
|
61
|
+
void hash_table_free(hash_table *t);
|
|
62
|
+
size_t hash_table_num_entries(hash_table const *t);
|
|
63
|
+
size_t hash_table_num_buckets(hash_table const *t);
|
|
64
|
+
size_t hash_table_chain_len(hash_table *t, size_t i);
|
|
65
|
+
int hash_table_insert(hash_table *t, void *item);
|
|
66
|
+
void *hash_table_find(hash_table *t, void *candidate);
|
|
67
|
+
int hash_table_delete(hash_table *t, void *item);
|
|
68
|
+
int hash_table_delete_no_resize(hash_table *t, void *item);
|
|
69
|
+
void *hash_table_next(hash_table *t, void *cur);
|
|
70
|
+
void hash_table_dump_stats(hash_table *t, FILE *fp);
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* \brief Iterate over all items in a hash table
|
|
74
|
+
*
|
|
75
|
+
* This macro iterates over all items in a hash table. Here is an
|
|
76
|
+
* example of how to use it:
|
|
77
|
+
*
|
|
78
|
+
* hash_table tab;
|
|
79
|
+
* void *item;
|
|
80
|
+
* hash_table_for_each(item, &tab) {
|
|
81
|
+
* // Do something with item
|
|
82
|
+
* }
|
|
83
|
+
*/
|
|
84
|
+
#define hash_table_for_each(item, t) \
|
|
85
|
+
for ((item) = hash_table_next((t), NULL); \
|
|
86
|
+
(item); \
|
|
87
|
+
(item) = hash_table_next((t), (item)))
|
|
88
|
+
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
/***************************************************************/
|
|
2
|
+
/* */
|
|
3
|
+
/* HASHTAB_STATS.C */
|
|
4
|
+
/* */
|
|
5
|
+
/* Utility function to print hash table stats. */
|
|
6
|
+
/* */
|
|
7
|
+
/* This file is part of REMIND. */
|
|
8
|
+
/* Copyright (C) 1992-2026 by Dianne Skoll */
|
|
9
|
+
/* SPDX-License-Identifier: GPL-2.0-only */
|
|
10
|
+
/* */
|
|
11
|
+
/***************************************************************/
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* \file hashtab_stats.c
|
|
15
|
+
* \brief Obtain or print statistics about a hash table
|
|
16
|
+
*
|
|
17
|
+
* NOTE: Use of any of the functions in this file will require linking
|
|
18
|
+
* with the math library to pull in the sqrt() function.
|
|
19
|
+
*/
|
|
20
|
+
|
|
21
|
+
#include "hashtab.h"
|
|
22
|
+
#include <stdio.h>
|
|
23
|
+
#include <math.h>
|
|
24
|
+
|
|
25
|
+
static void hash_table_get_stats(hash_table *t, struct hash_table_stats *stat);
|
|
26
|
+
|
|
27
|
+
/**
|
|
28
|
+
* \brief Dump hash table statistics to a stdio FILE
|
|
29
|
+
*
|
|
30
|
+
* \param t A pointer to a hash_table object
|
|
31
|
+
* \param fp A stdio file pointer that is writable
|
|
32
|
+
*/
|
|
33
|
+
void
|
|
34
|
+
hash_table_dump_stats(hash_table *t, FILE *fp)
|
|
35
|
+
{
|
|
36
|
+
struct hash_table_stats stat;
|
|
37
|
+
hash_table_get_stats(t, &stat);
|
|
38
|
+
fprintf(fp, " Entries: %lu; Buckets: %lu; Non-empty Buckets: %lu\n",
|
|
39
|
+
(unsigned long) stat.num_entries,
|
|
40
|
+
(unsigned long) stat.num_buckets,
|
|
41
|
+
(unsigned long) stat.num_nonempty_buckets);
|
|
42
|
+
fprintf(fp, " Maxlen: %lu; Minlen: %lu; Avglen: %.3f; Stddev: %.3f; Avg nonempty len: %.3f\n",
|
|
43
|
+
(unsigned long) stat.max_len,
|
|
44
|
+
(unsigned long) stat.min_len,
|
|
45
|
+
stat.avg_len, stat.stddev, stat.avg_nonempty_len);
|
|
46
|
+
fprintf(fp, " Growths: %lu; Shrinks: %lu\n", (unsigned long) stat.num_growths, (unsigned long) stat.num_shrinks);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/**
|
|
50
|
+
* \brief Obtain hash table statistics
|
|
51
|
+
*
|
|
52
|
+
* This function fills in the elements of a struct hash_table_stats object
|
|
53
|
+
* with hash table statistics.
|
|
54
|
+
*
|
|
55
|
+
* \param t A pointer to a hash_table object
|
|
56
|
+
* \param stat A pointer to a hash_table_stats object that will be filled in
|
|
57
|
+
*/
|
|
58
|
+
static void
|
|
59
|
+
hash_table_get_stats(hash_table *t, struct hash_table_stats *stat)
|
|
60
|
+
{
|
|
61
|
+
size_t n = hash_table_num_buckets(t);
|
|
62
|
+
size_t max_len = 0;
|
|
63
|
+
size_t min_len = 1000000000;
|
|
64
|
+
|
|
65
|
+
stat->num_buckets = n;
|
|
66
|
+
stat->num_entries = hash_table_num_entries(t);
|
|
67
|
+
stat->max_len = 0;
|
|
68
|
+
stat->min_len = 0;
|
|
69
|
+
stat->avg_len = 0.0;
|
|
70
|
+
stat->stddev = 0.0;
|
|
71
|
+
stat->num_nonempty_buckets = 0;
|
|
72
|
+
stat->avg_nonempty_len = 0.0;
|
|
73
|
+
stat->num_growths = t->num_growths;
|
|
74
|
+
stat->num_shrinks = t->num_shrinks;
|
|
75
|
+
double sum = 0.0;
|
|
76
|
+
double sumsq = 0.0;
|
|
77
|
+
|
|
78
|
+
if (n == 0) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
for (size_t i=0; i<n; i++) {
|
|
83
|
+
size_t c = hash_table_chain_len(t, i);
|
|
84
|
+
if (c != 0) {
|
|
85
|
+
stat->num_nonempty_buckets++;
|
|
86
|
+
}
|
|
87
|
+
sum += (double) c;
|
|
88
|
+
sumsq += (double) c * (double) c;
|
|
89
|
+
if (c > max_len) max_len = c;
|
|
90
|
+
if (c < min_len) min_len = c;
|
|
91
|
+
}
|
|
92
|
+
double avg_len = sum / (double) n;
|
|
93
|
+
double stddev = sqrt( (sumsq / (double) n) - (avg_len * avg_len) );
|
|
94
|
+
if (stat->num_nonempty_buckets > 0) {
|
|
95
|
+
stat->avg_nonempty_len = sum / (double) stat->num_nonempty_buckets;
|
|
96
|
+
}
|
|
97
|
+
stat->max_len = max_len;
|
|
98
|
+
stat->min_len = min_len;
|
|
99
|
+
stat->avg_len = avg_len;
|
|
100
|
+
stat->stddev = stddev;
|
|
101
|
+
}
|