ref: 38c0cf0737de03906729054ad7b7b011dd1ca475
dir: /appl/ebook/strmap.b/
implement Strmap; include "strmap.m"; Map.new(a: array of string): ref Map { map := ref Map(a, array[31] of list of (string, int)); # enter all style names in hash table for reverse lookup s2i := map.s2i; for (i := 0; i < len a; i++) { if (a[i] != nil) { v := hashfn(a[i], len s2i); s2i[v] = (a[i], i) :: s2i[v]; } } return map; } Map.s(map: self ref Map, i: int): string { return map.i2s[i]; } Map.i(map: self ref Map, s: string): int { v := hashfn(s, len map.s2i); for (l := map.s2i[v]; l != nil; l = tl l) if ((hd l).t0 == s) return (hd l).t1; return -1; } hashfn(s: string, n: int): int { h := 0; m := len s; for(i:=0; i<m; i++){ h = 65599*h+s[i]; } return (h & 16r7fffffff) % n; }