]> xenbits.xensource.com Git - xenclient/toolstack.git/commitdiff
[json] in-progress code-generation
authorPrashanth Mundkur <prashanth.mundkur@citrix.com>
Fri, 3 Apr 2009 05:26:09 +0000 (22:26 -0700)
committerPrashanth Mundkur <prashanth.mundkur@citrix.com>
Fri, 3 Apr 2009 05:26:09 +0000 (22:26 -0700)
libs/json/codegen.ml

index b8fa6fa831a6a68984e772eecf1209649c2293a0..697f44ce05235a55ea3b2c73e914305794d32100 100644 (file)
  *)
 
 open Syntax
+open Format
+
+type var =
+{
+       stem: string;
+       mark: int
+}
+
+type cg_state
+
+let ident_of_var v =
+       match v.mark with
+       | 0 -> Printf.sprintf "%s" v.stem
+       | d -> Printf.sprintf "%s_%d" v.stem d
+
+module type VAR_ENV = sig
+       type t
+       val new_env: t
+       val new_ident_from_string: string -> var * t
+       val new_ident_from_type: complex_type -> var * t
+end
+
+module type TYPE_ENV = sig
+       type 'a t
+       val new_env: 'a t
+       val record: 'a t -> var -> 'a -> 'a t
+       val lookup: 'a t -> var -> 'a
+end
+
+module type TO = sig
+       val disp_array: formatter -> var list -> formatter
+       val disp_object: formatter -> (string * var) list -> formatter
+       val let_binding: cg_state -> formatter
+                       -> (* out *) var -> (* in *) var -> complex_type
+                       -> formatter
+end
+
+let generate_to_def ff (tname, trep) =
+       let fn = tname ^ "_to_json" in
+       match trep with
+       | C_base _ ->
+               (* already present in lib; assumed generated for B_ident *)
+               ()
+       | _ -> Printf.printf "Generating %s\n" fn
+
+let generate_from_def ff (tname, trep) =
+       let fn = tname ^ "_from_json" in
+       Printf.printf "Generating %s\n" fn
 
 let generate defn_list f =
-       Printf.printf "Generating conversions for %d definitions in %s.\n" (List.length defn_list) f
+       let generate_one ff td =
+               generate_to_def ff td;
+               generate_from_def ff td in
+       let generate_one_defn ff td =
+               List.iter (generate_one ff) td in
+       let ff = formatter_of_out_channel (open_out f) in
+       List.iter (generate_one_defn ff) defn_list