| @@ -709,26 +709,19 @@ let keys_of_string s = · 708 unmodified lines |
| 709 | 709 | List.map (key_of_string (Str.regexp "-")) elems |
| 710 | 710 | ;; |
| 711 | 711 | |
| 712 | | −let validatehcs d v = |
| 713 | | − if String.length v > 1 && |
| 714 | | − let module S = Set.Make ( |
| 715 | | − struct type t = char |
| 716 | | − let compare a b = Char.code a - Char.code b |
| 717 | | − end) |
| 718 | | − in |
| 719 | | − let l = String.length v in |
| 720 | | − let rec fold s i = |
| 721 | | − if i = l |
| 722 | | − then true |
| 723 | | − else |
| 724 | | − let e = String.get v i in |
| 725 | | − if S.mem e s |
| 726 | | − then false |
| 727 | | − else fold (S.add e s) (i+1) |
| 728 | | − in |
| 729 | | − fold (S.singleton (String.get v 0)) 1 |
| 730 | | − then v |
| 731 | | − else (Format.eprintf "invalid hint charset %S@." v; d) |
| 712 | +let validatehcs v = |
| 713 | + let l = String.length v in |
| 714 | + if l < 2 then failwith "set is too small, must be greater than one char"; |
| 715 | + let module S = Set.Make (struct type t = char let compare = compare end) in |
| 716 | + let rec check s i = |
| 717 | + if i < l |
| 718 | + then |
| 719 | + let e = String.get v i in |
| 720 | + if S.mem e s |
| 721 | + then failwith "has duplicates" |
| 722 | + else check (S.add e s) (i+1) |
| 723 | + in |
| 724 | + check (S.singleton (String.get v 0)) 1 |
| 732 | 725 | ;; |
| 733 | 726 | |
| 734 | 727 | let config_of c attrs = |
| @@ -825,7 +818,7 @@ let config_of c attrs = · 90 unmodified lines |
| 825 | 818 | | "coarse-presentation-positioning" -> |
| 826 | 819 | { c with coarseprespos = bool_of_string v } |
| 827 | 820 | | "use-document-css" -> { c with usedoccss = bool_of_string v } |
| 828 | | − | "hint-charset" -> { c with hcs = validatehcs c.hcs v } |
| 821 | + | "hint-charset" -> validatehcs v; { c with hcs = v } |
| 829 | 822 | | _ -> c |
| 830 | 823 | with exn -> |
| 831 | 824 | dolog "error processing attribute (`%S' = `%S'): %s" k v @@ exntos exn; |