meta.ml 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. open Globals
  2. include MetaList
  3. let has m ml = List.exists (fun (m2,_,_) -> m = m2) ml
  4. let has_one_of ml1 ml2 = List.exists (fun (m2,_,_) -> List.mem m2 ml1) ml2
  5. let get m ml = List.find (fun (m2,_,_) -> m = m2) ml
  6. let rec remove m = function
  7. | [] -> []
  8. | (m2,_,_) :: l when m = m2 -> l
  9. | x :: l -> x :: remove m l
  10. let to_string m = fst (get_info m)
  11. let hmeta =
  12. let h = Hashtbl.create 0 in
  13. let rec loop i =
  14. let m = Obj.magic i in
  15. if m <> Last then begin
  16. Hashtbl.add h (fst (get_info m)) m;
  17. loop (i + 1);
  18. end;
  19. in
  20. loop 0;
  21. h
  22. let parse s = try Hashtbl.find hmeta (":" ^ s) with Not_found -> Custom (":" ^ s)
  23. let from_string s =
  24. if s = "" then Custom "" else match s.[0] with
  25. | ':' -> (try Hashtbl.find hmeta s with Not_found -> Custom s)
  26. | '$' -> Dollar (String.sub s 1 (String.length s - 1))
  27. | _ -> Custom s
  28. let get_documentation d =
  29. let t, (doc,flags) = get_info d in
  30. if not (List.mem UsedInternally flags) then begin
  31. let params = ref [] and used = ref [] and pfs = ref [] in
  32. List.iter (function
  33. | HasParam s -> params := s :: !params
  34. | Platforms fl -> pfs := fl @ !pfs
  35. | UsedOn ul -> used := ul @ !used
  36. | UsedInternally -> die "" __LOC__
  37. | Link _ -> ()
  38. ) flags;
  39. let params = (match List.rev !params with
  40. | [] -> ""
  41. | l -> "(<" ^ String.concat ">, <" l ^ ">) "
  42. ) in
  43. let pfs = platform_list_help (List.rev !pfs) in
  44. let str = "@" ^ t in
  45. Some (str,params ^ doc ^ pfs)
  46. end else
  47. None
  48. let get_documentation_list () =
  49. let m = ref 0 in
  50. let rec loop i =
  51. let d = Obj.magic i in
  52. if d <> Last then begin match get_documentation d with
  53. | None -> loop (i + 1)
  54. | Some (str,desc) ->
  55. if String.length str > !m then m := String.length str;
  56. (str,desc) :: loop (i + 1)
  57. end else
  58. []
  59. in
  60. let all = List.sort (fun (s1,_) (s2,_) -> String.compare s1 s2) (loop 0) in
  61. all,!m
  62. let get_all () =
  63. let rec loop i =
  64. let d = Obj.magic i in
  65. if d <> Last then d :: loop (i + 1)
  66. else []
  67. in
  68. loop 0
  69. let copy_from_to m src dst =
  70. try (get m src) :: dst
  71. with Not_found -> dst