diff options
author | Damien Doligez <damien.doligez-inria.fr> | 2006-01-04 16:55:50 +0000 |
---|---|---|
committer | Damien Doligez <damien.doligez-inria.fr> | 2006-01-04 16:55:50 +0000 |
commit | 125ea40d4c63e7bae69e30c2b6ba2b598b1bd5c2 (patch) | |
tree | 6884b9b9821851f7f57add043646b54fe4cc85f3 | |
parent | 3aaf0659a4c172c71cbf4828ed3bb6aa833c53e0 (diff) |
fusion 3.09.0 -> 3.09.1
git-svn-id: http://caml.inria.fr/svn/ocaml/trunk@7307 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
82 files changed, 2449 insertions, 2168 deletions
diff --git a/.cvsignore b/.cvsignore index 25b310383..413f27843 100644 --- a/.cvsignore +++ b/.cvsignore @@ -11,3 +11,4 @@ ocamlcomp.sh ocamlcompopt.sh package-macosx .DS_Store +*.annot @@ -17,6 +17,9 @@ PREREQUISITES limit stacksize 64M # if your shell is zsh or tcsh ulimit -s 65536 # if your shell is bash +* If you do not have write access to /tmp, you should set the environment + variable TMPDIR to the name of some other temporary directory. + INSTALLATION INSTRUCTIONS diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index a5ef1dcdd..74ce9c24a 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -534,7 +534,12 @@ let emit_instr fallthrough i = end | Lswitch jumptbl -> let lbl = new_label() in - ` jmp *{emit_label lbl}(, {emit_reg i.arg.(0)}, 8)\n`; + if !pic_code then begin + ` leaq {emit_label lbl}(%rip), %r11\n`; + ` jmp *(%r11, {emit_reg i.arg.(0)}, 8)\n` + end else begin + ` jmp *{emit_label lbl}(, {emit_reg i.arg.(0)}, 8)\n` + end; ` .section .rodata\n`; emit_align 8; `{emit_label lbl}:`; diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index 856e4655a..0e274b4f4 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -92,6 +92,7 @@ let phys_reg n = let rax = phys_reg 0 let rcx = phys_reg 5 let rdx = phys_reg 4 +let r11 = phys_reg 9 let rxmm15 = phys_reg 115 let stack_slot slot ty = @@ -169,6 +170,7 @@ let destroyed_at_oper = function | Iop(Istore(Single, _)) -> [| rxmm15 |] | Iop(Ialloc _ | Iintop(Icomp _) | Iintop_imm((Idiv|Imod|Icomp _), _)) -> [| rax |] + | Iswitch(_, _) when !pic_code -> [| r11 |] | _ -> [||] let destroyed_at_raise = all_phys_regs diff --git a/asmcomp/asmpackager.ml b/asmcomp/asmpackager.ml index 71ffa9b1a..abc8b5b05 100644 --- a/asmcomp/asmpackager.ml +++ b/asmcomp/asmpackager.ml @@ -97,7 +97,7 @@ let make_package_object ppf members targetobj targetname coercion = (List.filter (fun m -> m.pm_kind <> PM_intf) members) in let ld_cmd = sprintf "%s -o %s %s %s" - Config.native_pack_linker + Config.native_pack_linker (Filename.quote targetobj) (Filename.quote objtemp) (Ccomp.quote_files objfiles) in @@ -118,17 +118,17 @@ let build_package_cmx members cmxfile = (fun accu n -> if List.mem n accu then accu else n :: accu)) [] lst in let units = - List.fold_left - (fun accu m -> + List.fold_right + (fun m accu -> match m.pm_kind with PM_intf -> accu | PM_impl info -> info :: accu) - [] members in + members [] in let ui = Compilenv.current_unit_infos() in let pkg_infos = { ui_name = ui.ui_name; ui_symbol = ui.ui_symbol; ui_defines = - ui.ui_symbol :: - union (List.map (fun info -> info.ui_defines) units); + List.flatten (List.map (fun info -> info.ui_defines) units) @ + [ui.ui_symbol]; ui_imports_cmi = (ui.ui_name, Env.crc_of_unit ui.ui_name) :: filter(Asmlink.extract_crc_interfaces()); @@ -148,7 +148,7 @@ let build_package_cmx members cmxfile = (* Make the .cmx and the .o for the package *) -let package_object_files ppf files targetcmx +let package_object_files ppf files targetcmx targetobj targetname coercion = let pack_path = match !Clflags.for_package with @@ -194,7 +194,7 @@ let report_error ppf = function | Forward_reference(file, ident) -> fprintf ppf "Forward reference to %s in file %s" ident file | Wrong_for_pack(file, path) -> - fprintf ppf "File %s@ was not compiled with the `-pack %s' option" + fprintf ppf "File %s@ was not compiled with the `-for-pack %s' option" file path | File_not_found file -> fprintf ppf "File %s not found" file diff --git a/asmcomp/closure.ml b/asmcomp/closure.ml index c4232bcd2..216f27356 100644 --- a/asmcomp/closure.ml +++ b/asmcomp/closure.ml @@ -33,9 +33,18 @@ let rec split_list n l = let rec build_closure_env env_param pos = function [] -> Tbl.empty | id :: rem -> - Tbl.add id (Uprim(Pfield pos, [Uvar env_param])) + Tbl.add id (Uprim(Pfield pos, [Uvar env_param])) (build_closure_env env_param (pos+1) rem) +(* Auxiliary for accessing globals. We change the name of the global + to the name of the corresponding asm symbol. This is done here + and no longer in Cmmgen so that approximations stored in .cmx files + contain the right names if the -for-pack option is active. *) + +let getglobal id = + Uprim(Pgetglobal (Ident.create_persistent (Compilenv.symbol_for_global id)), + []) + (* Check if a variable occurs in a [clambda] term. *) let occurs_var var u = @@ -62,7 +71,7 @@ let occurs_var var u = | Uwhile(cond, body) -> occurs cond || occurs body | Ufor(id, lo, hi, dir, body) -> occurs lo || occurs hi || occurs body | Uassign(id, u) -> id = var || occurs u - | Usend(_, met, obj, args) -> + | Usend(_, met, obj, args) -> occurs met || occurs obj || List.exists occurs args and occurs_array a = try @@ -103,7 +112,7 @@ let prim_size prim args = | _ -> 2 (* arithmetic and comparisons *) (* Very raw approximation of switch cost *) - + let lambda_smaller lam threshold = let size = ref 0 in let rec lambda_size lam = @@ -276,7 +285,7 @@ let rec substitute sb ulam = let bindings1 = List.map (fun (id, rhs) -> (id, Ident.rename id, rhs)) bindings in let sb' = - List.fold_right + List.fold_right (fun (id, id', _) s -> Tbl.add id (Uvar id') s) bindings1 sb in Uletrec( @@ -529,7 +538,8 @@ let rec close fenv cenv = function end | Lprim(Pgetglobal id, []) as lam -> check_constant_result lam - (Uprim(Pgetglobal id, [])) (Compilenv.global_approx id) + (getglobal id) + (Compilenv.global_approx id) | Lprim(Pmakeblock(tag, mut) as prim, lams) -> let (ulams, approxs) = List.split (List.map (close fenv cenv) lams) in (Uprim(prim, ulams), @@ -547,7 +557,7 @@ let rec close fenv cenv = function | Lprim(Psetfield(n, _), [Lprim(Pgetglobal id, []); lam]) -> let (ulam, approx) = close fenv cenv lam in (!global_approx).(n) <- approx; - (Uprim(Psetfield(n, false), [Uprim(Pgetglobal id, []); ulam]), + (Uprim(Psetfield(n, false), [getglobal id; ulam]), Value_unknown) | Lprim(p, args) -> simplif_prim p (close_list_approx fenv cenv args) @@ -558,7 +568,7 @@ let rec close fenv cenv = function close_switch fenv cenv sw.sw_consts sw.sw_numconsts sw.sw_failaction and block_index, block_actions = close_switch fenv cenv sw.sw_blocks sw.sw_numblocks sw.sw_failaction in - (Uswitch(uarg, + (Uswitch(uarg, {us_index_consts = const_index; us_actions_consts = const_actions; us_index_blocks = block_index; @@ -579,7 +589,7 @@ let rec close fenv cenv = function (uarg, Value_constptr n) -> sequence_constant_expr arg uarg (close fenv cenv (if n = 0 then ifnot else ifso)) - | (uarg, _ ) -> + | (uarg, _ ) -> let (uifso, _) = close fenv cenv ifso in let (uifnot, _) = close fenv cenv ifnot in (Uifthenelse(uarg, uifso, uifnot), Value_unknown) diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index 1a3824f22..caf69738b 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -27,7 +27,7 @@ open Cmm let bind name arg fn = match arg with - Cvar _ | Cconst_int _ | Cconst_natint _ | Cconst_symbol _ + Cvar _ | Cconst_int _ | Cconst_natint _ | Cconst_symbol _ | Cconst_pointer _ | Cconst_natpointer _ -> fn arg | _ -> let id = Ident.create name in Clet(id, arg, fn (Cvar id)) @@ -343,7 +343,7 @@ let make_alloc_generic set_fn tag wordsize args = [] -> Cvar id | e1::el -> Csequence(set_fn (Cvar id) (Cconst_int idx) e1, fill_fields (idx + 2) el) in - Clet(id, + Clet(id, Cop(Cextcall("caml_alloc", typ_addr, true), [Cconst_int wordsize; Cconst_int tag]), fill_fields 1 args) @@ -423,7 +423,7 @@ let transl_constant = function int_const n | Const_base(Const_char c) -> Cconst_int(((Char.code c) lsl 1) + 1) - | Const_pointer n -> + | Const_pointer n -> if n <= max_repr_int && n >= min_repr_int then Cconst_pointer((n lsl 1) + 1) else Cconst_natpointer @@ -477,7 +477,7 @@ let unbox_int bi arg = when bi = Pint32 && size_int = 8 && not big_endian -> (* Force sign-extension of low 32 bits *) Cop(Casr, [Cop(Clsl, [contents; Cconst_int 32]); Cconst_int 32]) - | Cop(Calloc, [hdr; ops; contents]) -> + | Cop(Calloc, [hdr; ops; contents]) -> contents | _ -> Cop(Cload(if bi = Pint32 then Thirtytwo_signed else Word), @@ -645,7 +645,7 @@ let make_switch_gen arg cases acts = let lcases = Array.length cases in let new_cases = Array.create lcases 0 in let store = Switch.mk_store (=) in - + for i = 0 to Array.length cases-1 do let act = cases.(i) in let new_act = store.Switch.act_store act in @@ -741,7 +741,7 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id exp = Cvar id as e -> if Ident.same id boxed_id then need_boxed := true; e | Clet(id, arg, body) -> Clet(id, subst arg, subst body) - | Cassign(id, arg) -> + | Cassign(id, arg) -> if Ident.same id boxed_id then begin assigned := true; Cassign(unboxed_id, subst(unbox_fn arg)) @@ -759,11 +759,11 @@ let subst_boxed_number unbox_fn boxed_id unboxed_id exp = Cswitch(subst arg, index, Array.map subst cases) | Cloop e -> Cloop(subst e) | Ccatch(nfail, ids, e1, e2) -> Ccatch(nfail, ids, subst e1, subst e2) - | Cexit (nfail, el) -> Cexit (nfail, List.map subst el) + | Cexit (nfail, el) -> Cexit (nfail, List.map subst el) | Ctrywith(e1, id, e2) -> Ctrywith(subst e1, id, subst e2) | e -> e in let res = subst exp in - (res, !need_boxed, !assigned) + (res, !need_boxed, !assigned) (* Translate an expression *) @@ -820,20 +820,20 @@ let rec transl = function Cop(Capply typ_addr, cargs) | Usend(kind, met, obj, args) -> let call_met obj args clos = - if args = [] then Cop(Capply typ_addr,[get_field clos 0;obj;clos]) else - let arity = List.length args + 1 in + if args = [] then Cop(Capply typ_addr,[get_field clos 0;obj;clos]) else + let arity = List.length args + 1 in let cargs = Cconst_symbol(apply_function arity) :: obj :: - (List.map transl args) @ [clos] in + (List.map transl args) @ [clos] in Cop(Capply typ_addr, cargs) in bind "obj" (transl obj) (fun obj -> - match kind, args with - Self, _ -> + match kind, args with + Self, _ -> bind "met" (lookup_label obj (transl met)) (call_met obj args) - | Cached, cache :: pos :: args -> + | Cached, cache :: pos :: args -> call_cached_method obj (transl met) (transl cache) (transl pos) (List.map transl args) - | _ -> + | _ -> bind "met" (lookup_tag obj (transl met)) (call_met obj args)) | Ulet(id, exp, body) -> begin match is_unboxed_number exp with @@ -853,7 +853,7 @@ let rec transl = function | Uprim(prim, args) -> begin match (simplif_primitive prim, args) with (Pgetglobal id, []) -> - Cconst_symbol (Compilenv.symbol_for_global id) + Cconst_symbol (Ident.name id) | (Pmakeblock(tag, mut), []) -> transl_constant(Const_block(tag, [])) | (Pmakeblock(tag, mut), args) -> @@ -961,7 +961,7 @@ let rec transl = function (exit_if_false cond (transl ifso) raise_num) (transl ifnot) | Uifthenelse(Uprim(Psequor, _) as cond, ifso, ifnot) -> - let raise_num = next_raise_count () in + let raise_num = next_raise_count () in make_catch raise_num (exit_if_true cond raise_num (transl ifnot)) @@ -1007,7 +1007,7 @@ let rec transl = function (remove_unit(transl body), Clet(id_prev, Cvar id, Csequence - (Cassign(id, + (Cassign(id, Cop(inc, [Cvar id; Cconst_int 2])), Cifthenelse (Cop(Ccmpi Ceq, [Cvar id_prev; high]), @@ -1152,7 +1152,7 @@ and transl_prim_2 p arg1 arg2 = | Pintcomp cmp -> tag_int(Cop(Ccmpi(transl_comparison cmp), [transl arg1; transl arg2])) | Pisout -> - transl_isout (transl arg1) (transl arg2) + transl_isout (transl arg1) (transl arg2) (* Float operations *) | Paddfloat -> box_float(Cop(Caddf, @@ -1216,7 +1216,7 @@ and transl_prim_2 p arg1 arg2 = box_float( bind "index" (transl arg2) (fun idx -> bind "arr" (transl arg1) (fun arr -> - Csequence(Cop(Ccheckbound, + Csequence(Cop(Ccheckbound, [float_array_length(header arr); idx]), unboxed_float_array_ref arr idx)))) end @@ -1239,7 +1239,7 @@ and transl_prim_2 p arg1 arg2 = box_int bi (Cop(Csubi, [transl_unbox_int bi arg1; transl_unbox_int bi arg2])) | Pmulbint bi -> - box_int bi (Cop(Cmuli, + box_int bi (Cop(Cmuli, [transl_unbox_int bi arg1; transl_unbox_int bi arg2])) | Pdivbint bi -> box_int bi (safe_divmod Cdivi @@ -1366,7 +1366,7 @@ and transl_unbox_let box_fn unbox_fn transl_unbox_fn id exp body = and make_catch ncatch body handler = match body with | Cexit (nexit,[]) when nexit=ncatch -> handler -| _ -> Ccatch (ncatch, [], body, handler) +| _ -> Ccatch (ncatch, [], body, handler) and make_catch2 mk_body handler = match handler with | Cexit (_,[])|Ctuple []|Cconst_int _|Cconst_pointer _ -> @@ -1377,7 +1377,7 @@ and make_catch2 mk_body handler = match handler with nfail (mk_body (Cexit (nfail,[]))) handler - + and exit_if_true cond nfail otherwise = match cond with | Uconst (Const_pointer 0) -> otherwise @@ -1387,14 +1387,14 @@ and exit_if_true cond nfail otherwise = | Uprim(Psequand, _) -> begin match otherwise with | Cexit (raise_num,[]) -> - exit_if_false cond (Cexit (nfail,[])) raise_num + exit_if_false cond (Cexit (nfail,[])) raise_num | _ -> let raise_num = next_raise_count () in make_catch raise_num (exit_if_false cond (Cexit (nfail,[])) raise_num) otherwise - end + end | Uprim(Pnot, [arg]) -> exit_if_false arg otherwise nfail | Uifthenelse (cond, ifso, ifnot) -> @@ -1444,7 +1444,7 @@ and transl_switch arg index cases = match Array.length cases with | _ -> let n_index = Array.length index in let actions = Array.map transl cases in - + let inters = ref [] and this_high = ref (n_index-1) and this_low = ref (n_index-1) @@ -1576,17 +1576,17 @@ and emit_constant_field field cont = | Const_base(Const_string s) -> let lbl = new_const_label() in (Clabel_address lbl, - Cint(string_header (String.length s)) :: Cdefine_label lbl :: + Cint(string_header (String.length s)) :: Cdefine_label lbl :: emit_string_constant s cont) | Const_immstring s -> begin try - (Clabel_address (Hashtbl.find immstrings s), cont) + (Clabel_address (Hashtbl.find immstrings s), cont) with Not_found -> - let lbl = new_const_label() in - Hashtbl.add immstrings s lbl; - (Clabel_address lbl, - Cint(string_header (String.length s)) :: Cdefine_label lbl :: - emit_string_constant s cont) + let lbl = new_const_label() in + Hashtbl.add immstrings s lbl; + (Clabel_address lbl, + Cint(string_header (String.length s)) :: Cdefine_label lbl :: + emit_string_constant s cont) end | Const_base(Const_int32 n) -> let lbl = new_const_label() in @@ -1733,22 +1733,22 @@ let cache_public_method meths tag cache = (raise_num, [], Cloop (Clet( - mi, - Cop(Cor, - [Cop(Clsr, [Cop(Caddi, [Cvar li; Cvar hi]); Cconst_int 1]); - Cconst_int 1]), - Csequence( - Cifthenelse - (Cop (Ccmpi Clt, - [tag; - Cop(Cload Word, - [Cop(Cadda, - [meths; lsl_const (Cvar mi) log2_size_addr])])]), - Cassign(hi, Cop(Csubi, [Cvar mi; Cconst_int 2])), - Cassign(li, Cvar mi)), - Cifthenelse - (Cop(Ccmpi Cge, [Cvar li; Cvar hi]), Cexit (raise_num, []), - Ctuple [])))), + mi, + Cop(Cor, + [Cop(Clsr, [Cop(Caddi, [Cvar li; Cvar hi]); Cconst_int 1]); + Cconst_int 1]), + Csequence( + Cifthenelse + (Cop (Ccmpi Clt, + [tag; + Cop(Cload Word, + [Cop(Cadda, + [meths; lsl_const (Cvar mi) log2_size_addr])])]), + Cassign(hi, Cop(Csubi, [Cvar mi; Cconst_int 2])), + Cassign(li, Cvar mi)), + Cifthenelse + (Cop(Ccmpi Cge, [Cvar li; Cvar hi]), Cexit (raise_num, []), + Ctuple [])))), Ctuple []), Clet ( tagged, Cop(Cadda, [lsl_const (Cvar li) log2_size_addr; @@ -1811,13 +1811,13 @@ let send_function arity = Clet ( cached, Cop(Cand, [Cop(Cload Word, [cache]); mask]), Clet ( - real, + real, Cifthenelse(Cop(Ccmpa Cne, [tag'; tag]), - cache_public_method (Cvar meths) tag cache, + cache_public_method (Cvar meths) tag cache, cached_pos), Cop(Cload Word, [Cop(Cadda, [Cop (Cadda, [Cvar real; Cvar meths]); Cconst_int(2*size_addr-1)])])))) - + in let body = Clet(clos', clos, body) in let fun_args = @@ -1904,13 +1904,13 @@ let rec intermediate_curry_functions arity num = {fun_name = name2; fun_args = [arg, typ_addr; clos, typ_addr]; fun_body = Cop(Calloc, - [alloc_closure_header 4; + [alloc_closure_header 4; Cconst_symbol(name1 ^ "_" ^ string_of_int (num+1)); int_const 1; Cvar arg; Cvar clos]); fun_fast = true} :: intermediate_curry_functions arity (num+1) end - + let curry_function arity = if arity >= 0 then intermediate_curry_functions arity 0 diff --git a/asmrun/amd64.S b/asmrun/amd64.S index b1f204f44..5fd5440cf 100644 --- a/asmrun/amd64.S +++ b/asmrun/amd64.S @@ -52,7 +52,7 @@ FUNCTION(caml_call_gc) pushq %rdi pushq %rbx pushq %rax - movq %rsp, caml_gc_regs + movq %rsp, caml_gc_regs(%rip) /* Save floating-point registers */ subq $(16*8), %rsp movlpd %xmm0, 0*8(%rsp) diff --git a/asmrun/signals_osdep.h b/asmrun/signals_osdep.h index aa4594e89..f64c99f15 100644 --- a/asmrun/signals_osdep.h +++ b/asmrun/signals_osdep.h @@ -89,7 +89,7 @@ typedef int context_reg; #define CONTEXT_PC (context->sc_pc) #define CONTEXT_EXCEPTION_POINTER (context->sc_regs[30]) - #define CONTEXT_YOUNG_LIMIT (context->sc_regs[22] + #define CONTEXT_YOUNG_LIMIT (context->sc_regs[22]) #define CONTEXT_YOUNG_PTR (context->sc_regs[23]) /****************** PowerPC, MacOS X */ diff --git a/byterun/Makefile b/byterun/Makefile index 6165e725d..d6e4a6340 100644 --- a/byterun/Makefile +++ b/byterun/Makefile @@ -57,7 +57,7 @@ install: done cp ld.conf $(LIBDIR)/ld.conf -ld.conf: +ld.conf: ../config/Makefile echo "$(STUBLIBDIR)" >ld.conf echo "$(LIBDIR)" >>ld.conf @@ -72,6 +72,7 @@ libcamlrund.a: $(DOBJS) clean: rm -f ocamlrun$(EXE) ocamlrund$(EXE) *.o lib*.a rm -f primitives prims.c opnames.h jumptbl.h ld.conf + rm -f version.h primitives : $(PRIMS) sed -n -e "s/CAMLprim value \([a-z0-9_][a-z0-9_]*\).*/\1/p" \ diff --git a/byterun/Makefile.nt b/byterun/Makefile.nt index 93fe717fc..b6ec01da7 100644 --- a/byterun/Makefile.nt +++ b/byterun/Makefile.nt @@ -104,7 +104,7 @@ main.$(DO): main.c $(CC) $(CFLAGS) $(BYTECCCOMPOPTS) -c $< mv $*.$(O) $*.$(SO) -.depend.nt: +.depend.nt: .depend sed -e '/\.d\.o/q' -e 's/^\(.*\)\.o:/\1.$$(DO) \1.$$(SO):/' .depend > .depend.nt include .depend.nt diff --git a/byterun/callback.c b/byterun/callback.c index a960df544..bfafd349d 100644 --- a/byterun/callback.c +++ b/byterun/callback.c @@ -220,6 +220,12 @@ CAMLprim value caml_register_named_value(value vname, value val) char * name = String_val(vname); unsigned int h = hash_value_name(name); + for (nv = named_value_table[h]; nv != NULL; nv = nv->next) { + if (strcmp(name, nv->name) == 0) { + nv->val = val; + return Val_unit; + } + } nv = (struct named_value *) caml_stat_alloc(sizeof(struct named_value) + strlen(name)); strcpy(nv->name, name); diff --git a/byterun/extern.c b/byterun/extern.c index a8e367f18..f27a95844 100644 --- a/byterun/extern.c +++ b/byterun/extern.c @@ -144,6 +144,13 @@ static void init_extern_output(void) extern_limit = extern_output_block->data + SIZE_EXTERN_OUTPUT_BLOCK; } +static void close_extern_output(void) +{ + if (extern_userprovided_output == NULL){ + extern_output_block->end = extern_ptr; + } +} + static void free_extern_output(void) { struct output_block * blk, * nextblk; @@ -465,7 +472,7 @@ static intnat extern_value(value v, value flags) /* Marshal the object */ extern_rec(v); /* Record end of output */ - extern_output_block->end = extern_ptr; + close_extern_output(); /* Undo the modifications done on externed blocks */ extern_replay_trail(); /* Write the sizes */ diff --git a/byterun/sys.c b/byterun/sys.c index 2dd20312a..7e130c065 100644 --- a/byterun/sys.c +++ b/byterun/sys.c @@ -34,6 +34,10 @@ #ifdef HAS_TIMES #include <sys/times.h> #endif +#ifdef HAS_GETRUSAGE +#include <sys/time.h> +#include <sys/resource.h> +#endif #ifdef HAS_GETTIMEOFDAY #include <sys/time.h> #endif @@ -247,20 +251,28 @@ CAMLprim value caml_sys_system_command(value command) CAMLprim value caml_sys_time(value unit) { -#ifdef HAS_TIMES -#ifndef CLK_TCK -#ifdef HZ -#define CLK_TCK HZ -#else -#define CLK_TCK 60 -#endif -#endif - struct tms t; - times(&t); - return caml_copy_double((double)(t.tms_utime + t.tms_stime) / CLK_TCK); +#ifdef HAS_GETRUSAGE + struct rusage ru; + + getrusage (RUSAGE_SELF, &ru); + return caml_copy_double (ru.ru_utime.tv_sec + ru.ru_utime.tv_usec / 1e6 + + ru.ru_stime.tv_sec + ru.ru_stime.tv_usec / 1e6); #else - /* clock() is standard ANSI C */ - return caml_copy_double((double)clock() / CLOCKS_PER_SEC); + #ifdef HAS_TIMES + #ifndef CLK_TCK + #ifdef HZ + #define CLK_TCK HZ + #else + #define CLK_TCK 60 + #endif + #endif + struct tms t; + times(&t); + return caml_copy_double((double)(t.tms_utime + t.tms_stime) / CLK_TCK); + #else + /* clock() is standard ANSI C */ + return caml_copy_double((double)clock() / CLOCKS_PER_SEC); + #endif #endif } diff --git a/byterun/weak.c b/byterun/weak.c index efd23c465..0cea2a6dc 100644 --- a/byterun/weak.c +++ b/byterun/weak.c @@ -19,6 +19,7 @@ #include "alloc.h" #include "fail.h" +#include "major_gc.h" #include "memory.h" #include "mlvalues.h" @@ -113,7 +114,11 @@ CAMLprim value caml_weak_get_copy (value ar, value n) if (Tag_val (v) < No_scan_tag){ mlsize_t i; for (i = 0; i < Wosize_val (v); i++){ - Modify (&Field (elt, i), Field (v, i)); + value f = Field (v, i); + if (caml_gc_phase == Phase_mark && Is_block (f) && Is_in_heap (f)){ + caml_darken (f, NULL); + } + Modify (&Field (elt, i), f); } }else{ memmove (Bp_val (elt), Bp_val (v), Bosize_val (v)); diff --git a/camlp4/unmaintained/scheme/Makefile b/camlp4/unmaintained/scheme/Makefile index a26ed8b14..01036c225 100644 --- a/camlp4/unmaintained/scheme/Makefile +++ b/camlp4/unmaintained/scheme/Makefile @@ -77,9 +77,9 @@ pr_schemep.cmo: pr_schp_main.cmo .ml.cmo: - $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + $(OCAMLC) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<` -loc loc" -c $< .ml.cmx: - $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<`" -c $< + $(OCAMLOPT) $(OCAMLCFLAGS) -pp "$(CAMLP4) $(P4INCLUDES) `awk 'NR == 1 { ORS=" "; for (i=2; i < NF; i++) print $$i; } ' $<` -loc loc" -c $< include .depend diff --git a/camlp4/unmaintained/scheme/pa_scheme.ml b/camlp4/unmaintained/scheme/pa_scheme.ml index 45b97e3c4..f91acd497 100644 --- a/camlp4/unmaintained/scheme/pa_scheme.ml +++ b/camlp4/unmaintained/scheme/pa_scheme.ml @@ -237,7 +237,7 @@ and question = and minus kwt = parser [ [: `'.' :] -> identifier kwt ("-.", False) - | [: `('0'..'9' as c); n = number (Buff.store (Buff.store 0 '-') c) :] ep -> + | [: `('0'..'9' as c); n = number (Buff.store (Buff.store 0 '-') c) :] -> n | [: id = ident (Buff.store 0 '-') :] -> identifier kwt id ] and less kwt = diff --git a/camlp4/unmaintained/scheme/pr_scheme.ml b/camlp4/unmaintained/scheme/pr_scheme.ml index 149b6c7cf..57f1b4c8c 100644 --- a/camlp4/unmaintained/scheme/pr_scheme.ml +++ b/camlp4/unmaintained/scheme/pr_scheme.ml @@ -203,7 +203,7 @@ pr_constr_decl.pr_levels := pr_box ppf f x = fprintf ppf "@[%t@]" f; pr_rules = extfun Extfun.empty with - [ (loc, c, []) as x -> + [ (loc, c, []) -> fun ppf curr next dg k -> fprintf ppf "(@[<hv>%s%t@]" c (ks ")" k) | (loc, c, tl) -> fun ppf curr next dg k -> @@ -293,7 +293,10 @@ case "$bytecc,$host" in gcc*,x86_64-*-linux*) bytecccompopts="-fno-defer-pop $gcc_warnings" # Tell gcc that we can use 32-bit code addresses for threaded code - echo "#define ARCH_CODE32" >> m.h;; + # unless we are compiled for a shared library (-fPIC option) + echo "#ifndef __PIC__" >> m.h + echo "# define ARCH_CODE32" >> m.h + echo "#endif" >> m.h;; gcc*) bytecccompopts="-fno-defer-pop $gcc_warnings";; esac @@ -400,7 +403,7 @@ esac # Determine alignment constraints case "$host" in - sparc-*-*|hppa*-*-*) + sparc*-*-*|hppa*-*-*) # On Sparc V9 with certain versions of gcc, determination of double # alignment is not reliable (PR#1521), hence force it. # Same goes for hppa. @@ -431,7 +434,7 @@ esac if $int64_native; then case "$host" in - hppa*-*-*) + sparc*-*-*|hppa*-*-*) if test $2 = 8; then echo "64-bit integers can be word-aligned." echo "#undef ARCH_ALIGN_INT64" >> m.h @@ -723,6 +726,11 @@ fi # For the sys module +if sh ./hasgot getrusage; then + echo "getrusage() found." + echo "#define HAS_GETRUSAGE" >> s.h +fi + if sh ./hasgot times; then echo "times() found." echo "#define HAS_TIMES" >> s.h diff --git a/debugger/main.ml b/debugger/main.ml index 76426c6ec..90f9e8984 100644 --- a/debugger/main.ml +++ b/debugger/main.ml @@ -111,7 +111,8 @@ let speclist = [ let main () = try - socket_name := "/tmp/camldebug" ^ (string_of_int (Unix.getpid ())); + socket_name := Filename.concat Filename.temp_dir_name + ("camldebug" ^ (string_of_int (Unix.getpid ()))); begin try Arg.parse speclist anonymous ""; Arg.usage speclist @@ -130,10 +131,10 @@ let main () = toplevel_loop (); (* Toplevel. *) kill_program (); exit 0 - with + with Toplevel -> exit 2 - | Env.Error e -> + | Env.Error e -> eprintf "Debugger [version %s] environment error:@ @[@;" Config.version; Env.report_error err_formatter e; eprintf "@]@."; diff --git a/driver/errors.ml b/driver/errors.ml index 03cd5690c..56c4e2f3c 100644 --- a/driver/errors.ml +++ b/driver/errors.ml @@ -63,7 +63,7 @@ let report_error ppf exn = | Sys_error msg -> fprintf ppf "I/O error: %s" msg | Warnings.Errors (n) -> - fprintf ppf "@.Error: %d error-enabled warnings occurred." n + fprintf ppf "@.Error: error-enabled warnings (%d occurrences)" n | x -> fprintf ppf "@]"; raise x in fprintf ppf "@[%a@]@." report exn diff --git a/driver/main_args.ml b/driver/main_args.ml index 84e61e59c..ad8bc06d5 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -127,10 +127,10 @@ struct "-version", Arg.Unit F._version, " Print compiler version and exit"; "-verbose", Arg.Unit F._verbose, " Print calls to external commands"; "-vmthread", Arg.Unit F._vmthread, - " Generate code that supports the threads library with VM-level scheduling"; + " Generate code that supports the threads library with VM-level\n\ + \ scheduling"; "-w", Arg.String F._w, "<flags> Enable or disable warnings according to <flags>:\n\ - \032 A/a enable/disable all warnings\n\ \032 C/c enable/disable suspicious comment\n\ \032 D/d enable/disable deprecated features\n\ \032 E/e enable/disable fragile match\n\ @@ -144,11 +144,12 @@ struct \032 Y/y enable/disable suspicious unused variables\n\ \032 Z/z enable/disable all other unused variables\n\ \032 X/x enable/disable all other warnings\n\ + \032 A/a enable/disable all warnings\n\ \032 default setting is \"Aelz\""; "-warn-error" , Arg.String F._warn_error, - "<flags> Treat the warnings of <flags> as errors, if they are enabled.\n\ - \032 See option -w for the list of flags.\n\ - \032 Default setting is \"a\" (warnings are not errors)"; + "<flags> Treat the warnings of <flags> as errors, if they are\n\ + \ enabled. See option -w for the list of flags.\n\ + \ Default setting is \"a\" (warnings are not errors)"; "-where", Arg.Unit F._where, " Print location of standard library and exit"; "-nopervasives", Arg.Unit F._nopervasives, " (undocumented)"; diff --git a/driver/optmain.ml b/driver/optmain.ml index 4ca0c2058..e2a33a08d 100644 --- a/driver/optmain.ml +++ b/driver/optmain.ml @@ -112,8 +112,8 @@ let main () = "-dtypes", Arg.Set save_types, " Save type information in <filename>.annot"; "-for-pack", Arg.String (fun s -> for_package := Some s), - "<ident> Generate code that can later be `packed' with\n - \t\t\tocamlopt -pack -o <ident>.cmx"; + "<ident> Generate code that can later be `packed' with\n\ + \ ocamlopt -pack -o <ident>.cmx"; "-i", Arg.Unit (fun () -> print_types := true; compile_only := true), " Print inferred interface"; "-I", Arg.String(fun dir -> include_dirs := dir :: !include_dirs), @@ -143,7 +143,7 @@ let main () = " Output a C object file instead of an executable"; "-p", Arg.Set gprofile, " Compile and link with profiling support for \"gprof\"\n\ - \t(not supported on all platforms)"; + \ (not supported on all platforms)"; "-pack", Arg.Set make_package, " Package the given .cmx files into one .cmx"; "-pp", Arg.String(fun s -> preprocessor := Some s), @@ -164,7 +164,6 @@ let main () = "-verbose", Arg.Set verbose, " Print calls to external commands"; "-w", Arg.String (Warnings.parse_options false), "<flags> Enable or disable warnings according to <flags>:\n\ - \032 A/a enable/disable all warnings\n\ \032 C/c enable/disable suspicious comment\n\ \032 D/d enable/disable deprecated features\n\ \032 E/e enable/disable fragile match\n\ @@ -178,11 +177,12 @@ let main () = \032 Y/y enable/disable suspicious unused variables\n\ \032 Z/z enable/disable all other unused variables\n\ \032 X/x enable/disable all other warnings\n\ + \032 A/a enable/disable all warnings\n\ \032 default setting is \"Aelz\""; "-warn-error" , Arg.String (Warnings.parse_options true), - "<flags> Treat the warnings of <flags> as errors, if they are enabled.\n\ - \032 See option -w for the list of flags.\n\ - \032 Default setting is \"a\" (warnings are not errors)"; + "<flags> Treat the warnings of <flags> as errors, if they are\n\ + \ enabled. See option -w for the list of flags.\n\ + \ Default setting is \"a\" (warnings are not errors)"; "-where", Arg.Unit print_standard_library, " Print location of standard library and exit"; diff --git a/lex/lexer.mll b/lex/lexer.mll index fa1d15bda..b72804287 100644 --- a/lex/lexer.mll +++ b/lex/lexer.mll @@ -29,7 +29,7 @@ exception Lexical_error of string * string * int * int let string_buff = Buffer.create 256 -let reset_string_buffer () = Buffer.clear string_buff +let reset_string_buffer () = Buffer.clear string_buff let store_string_char c = Buffer.add_char string_buff c @@ -62,7 +62,7 @@ let handle_lexical_error fn lexbuf = raise(Lexical_error(msg, file, line, column)) let get_input_name () = Sys.argv.(Array.length Sys.argv - 1) - + let warning lexbuf msg = let p = Lexing.lexeme_start_p lexbuf in Printf.eprintf "ocamllex warning:\nFile \"%s\", line %d, character %d: %s.\n" @@ -117,7 +117,7 @@ let backslash_escapes = ['\\' '"' '\'' 'n' 't' 'b' 'r'] rule main = parse - [' ' '\013' '\009' '\012' ] + + [' ' '\013' '\009' '\012' ] + { main lexbuf } | '\010' { incr_loc lexbuf 0; @@ -128,7 +128,7 @@ rule main = parse { update_loc lexbuf name (int_of_string num); main lexbuf } - | "(*" + | "(*" { comment_depth := 1; handle_lexical_error comment lexbuf; main lexbuf } @@ -143,16 +143,16 @@ rule main = parse | "let" -> Tlet | "as" -> Tas | s -> Tident s } - | '"' + | '"' { reset_string_buffer(); handle_lexical_error string lexbuf; Tstring(get_stored_string()) } -(* note: ''' is a valid character literall (by contrast with the compiler) *) - | "'" [^ '\\'] "'" +(* note: ''' is a valid character literal (by contrast with the compiler) *) + | "'" [^ '\\'] "'" { Tchar(Char.code(Lexing.lexeme_char lexbuf 1)) } - | "'" '\\' backslash_escapes "'" + | "'" '\\' backslash_escapes "'" { Tchar(Char.code(char_for_backslash (Lexing.lexeme_char lexbuf 2))) } - | "'" '\\' (['0'-'9'] as c) (['0'-'9'] as d) (['0'-'9'] as u)"'" + | "'" '\\' (['0'-'9'] as c) (['0'-'9'] as d) (['0'-'9'] as u)"'" { let v = decimal_code c d u in if v > 255 then raise_lexical_error lexbuf @@ -166,7 +166,7 @@ rule main = parse { raise_lexical_error lexbuf (Printf.sprintf "illegal escape sequence \\%c" c) } - | '{' + | '{' { let p = Lexing.lexeme_end_p lexbuf in let n1 = p.Lexing.pos_cnum and l1 = p.Lexing.pos_lnum @@ -196,7 +196,7 @@ rule main = parse (* String parsing comes from the compiler lexer *) and string = parse - '"' + '"' { () } | '\\' ("\010" | "\013" | "\013\010") ([' ' '\009'] * as spaces) { incr_loc lexbuf (String.length spaces); @@ -222,7 +222,7 @@ and string = parse store_string_char '\\' ; store_string_char c ; string lexbuf } - | eof + | eof { raise(Lexical_error("unterminated string", "", 0, 0)) } | '\010' { store_string_char '\010'; @@ -239,12 +239,12 @@ and string = parse *) and comment = parse - "(*" + "(*" { incr comment_depth; comment lexbuf } - | "*)" + | "*)" { decr comment_depth; if !comment_depth = 0 then () else comment lexbuf } - | '"' + | '"' { reset_string_buffer(); string lexbuf; reset_string_buffer(); @@ -252,22 +252,22 @@ and comment = parse | "'" { skip_char lexbuf ; comment lexbuf } - | eof + | eof { raise(Lexical_error("unterminated comment", "", 0, 0)) } | '\010' { incr_loc lexbuf 0; comment lexbuf } - | _ + | _ { comment lexbuf } and action = parse - '{' + '{' { incr brace_depth; action lexbuf } - | '}' + | '}' { decr brace_depth; if !brace_depth = 0 then Lexing.lexeme_start lexbuf else action lexbuf } - | '"' + | '"' { reset_string_buffer(); handle_lexical_error string lexbuf; reset_string_buffer(); @@ -275,16 +275,16 @@ and action = parse | "'" { skip_char lexbuf ; action lexbuf } - | "(*" + | "(*" { comment_depth := 1; comment lexbuf; action lexbuf } - | eof + | eof { raise (Lexical_error("unterminated action", "", 0, 0)) } | '\010' { incr_loc lexbuf 0; action lexbuf } - | _ + | _ { action lexbuf } and skip_char = parse @@ -298,4 +298,4 @@ and skip_char = parse | '\\' 'x' ['0'-'9' 'a'-'f' 'A'-'F'] ['0'-'9' 'a'-'f' 'A'-'F'] "'" {()} (* A dieu va ! *) - | "" {()} + | "" {()} diff --git a/lex/parser.mly b/lex/parser.mly index 8f6ff7052..273e8388a 100644 --- a/lex/parser.mly +++ b/lex/parser.mly @@ -141,7 +141,7 @@ regexp: let s1 = as_cset $1 and s2 = as_cset $3 in Characters (Cset.diff s1 s2) - } + } | regexp Tor regexp { Alternative($1,$3) } | regexp regexp %prec CONCAT @@ -182,4 +182,3 @@ char_class1: ; %% - diff --git a/ocamldoc/.depend b/ocamldoc/.depend index 9d1be2e92..238d372c5 100644 --- a/ocamldoc/.depend +++ b/ocamldoc/.depend @@ -7,10 +7,11 @@ odoc.cmx: ../typing/typedtree.cmx odoc_texi.cmx odoc_messages.cmx \ odoc_dot.cmx odoc_config.cmx odoc_args.cmx odoc_analyse.cmx \ ../utils/misc.cmx ../utils/config.cmx ../utils/clflags.cmx odoc_analyse.cmo: ../utils/warnings.cmi ../typing/typetexp.cmi \ - ../typing/typemod.cmi ../typing/typedtree.cmi ../typing/typedecl.cmi \ - ../typing/typecore.cmi ../typing/typeclass.cmi ../bytecomp/translcore.cmi \ - ../bytecomp/translclass.cmi ../parsing/syntaxerr.cmi ../parsing/parse.cmi \ - odoc_types.cmi odoc_sig.cmi odoc_module.cmo odoc_misc.cmi \ + ../typing/types.cmi ../typing/typemod.cmi ../typing/typedtree.cmi \ + ../typing/typedecl.cmi ../typing/typecore.cmi ../typing/typeclass.cmi \ + ../bytecomp/translcore.cmi ../bytecomp/translclass.cmi \ + ../parsing/syntaxerr.cmi ../parsing/parse.cmi odoc_types.cmi \ + odoc_text.cmi odoc_sig.cmi odoc_module.cmo odoc_misc.cmi \ odoc_messages.cmo odoc_merge.cmi odoc_global.cmi odoc_dep.cmo \ odoc_cross.cmi odoc_comments.cmi odoc_class.cmo odoc_ast.cmi \ odoc_args.cmi ../utils/misc.cmi ../parsing/location.cmi \ @@ -18,10 +19,11 @@ odoc_analyse.cmo: ../utils/warnings.cmi ../typing/typetexp.cmi \ ../typing/ctype.cmi ../utils/config.cmi ../utils/clflags.cmo \ ../utils/ccomp.cmi odoc_analyse.cmi odoc_analyse.cmx: ../utils/warnings.cmx ../typing/typetexp.cmx \ - ../typing/typemod.cmx ../typing/typedtree.cmx ../typing/typedecl.cmx \ - ../typing/typecore.cmx ../typing/typeclass.cmx ../bytecomp/translcore.cmx \ - ../bytecomp/translclass.cmx ../parsing/syntaxerr.cmx ../parsing/parse.cmx \ - odoc_types.cmx odoc_sig.cmx odoc_module.cmx odoc_misc.cmx \ + ../typing/types.cmx ../typing/typemod.cmx ../typing/typedtree.cmx \ + ../typing/typedecl.cmx ../typing/typecore.cmx ../typing/typeclass.cmx \ + ../bytecomp/translcore.cmx ../bytecomp/translclass.cmx \ + ../parsing/syntaxerr.cmx ../parsing/parse.cmx odoc_types.cmx \ + odoc_text.cmx odoc_sig.cmx odoc_module.cmx odoc_misc.cmx \ odoc_messages.cmx odoc_merge.cmx odoc_global.cmx odoc_dep.cmx \ odoc_cross.cmx odoc_comments.cmx odoc_class.cmx odoc_ast.cmx \ odoc_args.cmx ../utils/misc.cmx ../parsing/location.cmx \ @@ -53,11 +55,11 @@ odoc_class.cmo: ../typing/types.cmi odoc_value.cmo odoc_types.cmi \ odoc_class.cmx: ../typing/types.cmx odoc_value.cmx odoc_types.cmx \ odoc_parameter.cmx odoc_name.cmx odoc_comments.cmo: odoc_types.cmi odoc_text.cmi odoc_see_lexer.cmo \ - odoc_parser.cmi odoc_messages.cmo odoc_lexer.cmo odoc_global.cmi \ - odoc_comments_global.cmi odoc_comments.cmi + odoc_parser.cmi odoc_misc.cmi odoc_messages.cmo odoc_lexer.cmo \ + odoc_global.cmi odoc_comments_global.cmi odoc_comments.cmi odoc_comments.cmx: odoc_types.cmx odoc_text.cmx odoc_see_lexer.cmx \ - odoc_parser.cmx odoc_messages.cmx odoc_lexer.cmx odoc_global.cmx \ - odoc_comments_global.cmx odoc_comments.cmi + odoc_parser.cmx odoc_misc.cmx odoc_messages.cmx odoc_lexer.cmx \ + odoc_global.cmx odoc_comments_global.cmx odoc_comments.cmi odoc_comments_global.cmo: odoc_comments_global.cmi odoc_comments_global.cmx: odoc_comments_global.cmi odoc_config.cmo: ../utils/config.cmi odoc_config.cmi @@ -87,9 +89,9 @@ odoc_exception.cmx: ../typing/types.cmx odoc_types.cmx odoc_name.cmx odoc_global.cmo: ../utils/clflags.cmo odoc_global.cmi odoc_global.cmx: ../utils/clflags.cmx odoc_global.cmi odoc_html.cmo: odoc_text.cmi odoc_ocamlhtml.cmo odoc_messages.cmo \ - odoc_info.cmi odoc_dag2html.cmi + odoc_info.cmi odoc_dag2html.cmi odoc_args.cmi odoc_html.cmx: odoc_text.cmx odoc_ocamlhtml.cmx odoc_messages.cmx \ - odoc_info.cmx odoc_dag2html.cmx + odoc_info.cmx odoc_dag2html.cmx odoc_args.cmx odoc_info.cmo: ../typing/printtyp.cmi odoc_value.cmo odoc_types.cmi \ odoc_type.cmo odoc_text.cmi odoc_str.cmi odoc_search.cmi odoc_scan.cmo \ odoc_print.cmi odoc_parameter.cmo odoc_name.cmi odoc_module.cmo \ @@ -190,8 +192,8 @@ odoc_text.cmo: odoc_types.cmi odoc_text_parser.cmi odoc_text_lexer.cmo \ odoc_text.cmi odoc_text.cmx: odoc_types.cmx odoc_text_parser.cmx odoc_text_lexer.cmx \ odoc_text.cmi -odoc_text_lexer.cmo: odoc_text_parser.cmi -odoc_text_lexer.cmx: odoc_text_parser.cmx +odoc_text_lexer.cmo: odoc_text_parser.cmi odoc_misc.cmi +odoc_text_lexer.cmx: odoc_text_parser.cmx odoc_misc.cmx odoc_text_parser.cmo: odoc_types.cmi odoc_misc.cmi odoc_text_parser.cmi odoc_text_parser.cmx: odoc_types.cmx odoc_misc.cmx odoc_text_parser.cmi odoc_to_text.cmo: odoc_messages.cmo odoc_info.cmi diff --git a/ocamldoc/Changes.txt b/ocamldoc/Changes.txt index 2863ce7aa..5f67b0cf4 100644 --- a/ocamldoc/Changes.txt +++ b/ocamldoc/Changes.txt @@ -2,9 +2,25 @@ TODO: - need to fix display of type parameters for inherited classes/class types - latex: types variant polymorphes dépassent de la page quand ils sont trop longs - utilisation nouvelles infos de Xavier: "début de rec", etc. + - xml generator ===== -Next release: +Release 3.09.1: + - fix: remove .TP for generated man pages, use .sp instead + (.TP caused a lot of odd margins) + - fix: html generator now output DOCTYPE and character encoding information. + - add: m_text_only field in Module.t_module, to separate real modules + from text files handled as modules. + - fix: display only text for "text modules" + - extensible {foo } syntax + - user can give .txt files on the command line, containing ocamldoc formatted + text, to be able to include bigger texts out of source files + - -o option is now used by the html generator to indicate the prefix + of generated index files (to avoid conflict when a Index module exists + on case-insensitive file systems). + +===== +Release 3.08.4: - some improvements in html display - better error messages for misplaced variant constructors comments - some fixes in man page generation (escaping characters) diff --git a/ocamldoc/Makefile b/ocamldoc/Makefile index 727a51685..744745769 100644 --- a/ocamldoc/Makefile +++ b/ocamldoc/Makefile @@ -277,7 +277,7 @@ installopt_really: ########### test: dummy $(MKDIR) $@ - $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/ocamldoc.odoc odoc*.ml odoc*.mli + $(OCAMLDOC_RUN) -html -colorize-code -sort -d $@ $(INCLUDES) -dump $@/ocamldoc.odoc test.txt test2.txt odoc*.ml odoc*.mli -v test_stdlib: dummy $(MKDIR) $@ @@ -292,7 +292,7 @@ test_framed: dummy test_latex: dummy $(MKDIR) $@ - $(OCAMLDOC_RUN) -latex -sort -o $@/test.tex -d $@ $(INCLUDES) odoc*.ml odoc*.mli ../stdlib/*.mli ../otherlibs/unix/unix.mli + $(OCAMLDOC_RUN) -latex -sort -o $@/test.tex -d $@ $(INCLUDES) odoc*.ml odoc*.mli test2.txt ../stdlib/*.mli ../otherlibs/unix/unix.mli test_latex_simple: dummy $(MKDIR) $@ diff --git a/ocamldoc/odoc_analyse.ml b/ocamldoc/odoc_analyse.ml index 07b03d643..28cdf08a5 100644 --- a/ocamldoc/odoc_analyse.ml +++ b/ocamldoc/odoc_analyse.ml @@ -11,7 +11,8 @@ (* $Id$ *) -(** Analysis of source files. This module is strongly inspired from driver/main.ml :-) *) +(** Analysis of source files. This module is strongly inspired from + driver/main.ml :-) *) let print_DEBUG s = print_string s ; print_newline () @@ -152,7 +153,7 @@ module Sig_analyser = Odoc_sig.Analyser (Odoc_comments.Basic_info_retriever) driver/error.ml file. We do this because there are some differences between the possibly raised exceptions in the bytecode (error.ml) and opt (opterros.ml) compilers - and we don't want to take care of this. Besisdes, this + and we don't want to take care of this. Besises, these differences only concern code generation (i believe).*) let process_error exn = let report ppf = function @@ -196,7 +197,11 @@ let process_error exn = let process_file ppf sourcefile = if !Odoc_args.verbose then ( - let f = match sourcefile with Odoc_args.Impl_file f | Odoc_args.Intf_file f -> f in + let f = match sourcefile with + Odoc_args.Impl_file f + | Odoc_args.Intf_file f -> f + | Odoc_args.Text_file f -> f + in print_string (Odoc_messages.analysing f) ; print_newline (); ); @@ -204,20 +209,20 @@ let process_file ppf sourcefile = Odoc_args.Impl_file file -> ( try - let (parsetree_typedtree_opt, input_file) = process_implementation_file ppf file in - match parsetree_typedtree_opt with + let (parsetree_typedtree_opt, input_file) = process_implementation_file ppf file in + match parsetree_typedtree_opt with None -> None - | Some (parsetree, typedtree) -> + | Some (parsetree, typedtree) -> let file_module = Ast_analyser.analyse_typed_tree file - !Location.input_name parsetree typedtree - in + !Location.input_name parsetree typedtree + in file_module.Odoc_module.m_top_deps <- Odoc_dep.impl_dependencies parsetree ; if !Odoc_args.verbose then ( - print_string Odoc_messages.ok; - print_newline () + print_string Odoc_messages.ok; + print_newline () ); remove_preprocessed input_file; Some file_module @@ -237,8 +242,8 @@ let process_file ppf sourcefile = try let (ast, signat, input_file) = process_interface_file ppf file in let file_module = Sig_analyser.analyse_signature file - !Location.input_name ast signat - in + !Location.input_name ast signat + in file_module.Odoc_module.m_top_deps <- Odoc_dep.intf_dependencies ast ; @@ -260,6 +265,45 @@ let process_file ppf sourcefile = incr Odoc_global.errors ; None ) + | Odoc_args.Text_file file -> + try + let mod_name = + String.capitalize (Filename.basename (Filename.chop_extension file)) + in + let txt = + try Odoc_text.Texter.text_of_string (Odoc_misc.input_file_as_string file) + with Odoc_text.Text_syntax (l, c, s) -> + raise (Failure (Odoc_messages.text_parse_error l c s)) + in + let m = + { + Odoc_module.m_name = mod_name ; + Odoc_module.m_type = Types.Tmty_signature [] ; + Odoc_module.m_info = None ; + Odoc_module.m_is_interface = true ; + Odoc_module.m_file = file ; + Odoc_module.m_kind = Odoc_module.Module_struct + [Odoc_module.Element_module_comment txt] ; + Odoc_module.m_loc = + { Odoc_types.loc_impl = None ; + Odoc_types.loc_inter = Some (file, 0) } ; + Odoc_module.m_top_deps = [] ; + Odoc_module.m_code = None ; + Odoc_module.m_code_intf = None ; + Odoc_module.m_text_only = true ; + } + in + Some m + with + | Sys_error s + | Failure s -> + prerr_endline s; + incr Odoc_global.errors ; + None + | e -> + process_error e ; + incr Odoc_global.errors ; + None (** Remove the class elements between the stop special comments. *) let rec remove_class_elements_between_stop keep eles = @@ -480,6 +524,3 @@ let load_modules file = with Sys_error s -> raise (Failure s) - - -(* eof $Id$ *) diff --git a/ocamldoc/odoc_args.ml b/ocamldoc/odoc_args.ml index 05d9e55c1..91122ed68 100644 --- a/ocamldoc/odoc_args.ml +++ b/ocamldoc/odoc_args.ml @@ -20,6 +20,7 @@ module M = Odoc_messages type source_file = Impl_file of string | Intf_file of string + | Text_file of string let include_dirs = Clflags.include_dirs @@ -214,6 +215,7 @@ let options = ref [ "-pp", Arg.String (fun s -> preprocessor := Some s), M.preprocess ; "-impl", Arg.String (fun s -> files := !files @ [Impl_file s]), M.option_impl ; "-intf", Arg.String (fun s -> files := !files @ [Intf_file s]), M.option_intf ; + "-text", Arg.String (fun s -> files := !files @ [Text_file s]), M.option_text ; "-rectypes", Arg.Set recursive_types, M.rectypes ; "-nolabels", Arg.Unit (fun () -> classic := true), M.nolabels ; "-warn-error", Arg.Set Odoc_global.warn_error, M.werr ; @@ -313,12 +315,15 @@ let parse ~html_generator ~latex_generator ~texi_generator ~man_generator ~dot_g let anonymous f = let sf = if Filename.check_suffix f "ml" then - Impl_file f + Impl_file f else - if Filename.check_suffix f "mli" then - Intf_file f - else - failwith (Odoc_messages.unknown_extension f) + if Filename.check_suffix f "mli" then + Intf_file f + else + if Filename.check_suffix f "txt" then + Text_file f + else + failwith (Odoc_messages.unknown_extension f) in files := !files @ [sf] in diff --git a/ocamldoc/odoc_args.mli b/ocamldoc/odoc_args.mli index e7f2dda8b..242f55659 100644 --- a/ocamldoc/odoc_args.mli +++ b/ocamldoc/odoc_args.mli @@ -17,6 +17,7 @@ type source_file = Impl_file of string | Intf_file of string + | Text_file of string (** The include_dirs in the OCaml compiler. *) val include_dirs : string list ref diff --git a/ocamldoc/odoc_ast.ml b/ocamldoc/odoc_ast.ml index f683159a4..eea59b749 100644 --- a/ocamldoc/odoc_ast.ml +++ b/ocamldoc/odoc_ast.ml @@ -1405,6 +1405,7 @@ module Analyser = m_top_deps = [] ; m_code = None ; (* code is set by the caller, after the module is created *) m_code_intf = m_code_intf ; + m_text_only = false ; } in match (p_module_expr.Parsetree.pmod_desc, tt_module_expr.Typedtree.mod_desc) with @@ -1586,6 +1587,7 @@ module Analyser = m_top_deps = [] ; m_code = (if !Odoc_args.keep_code then Some !file else None) ; m_code_intf = None ; + m_text_only = false ; } end diff --git a/ocamldoc/odoc_comments.ml b/ocamldoc/odoc_comments.ml index 765207ddc..54650acb5 100644 --- a/ocamldoc/odoc_comments.ml +++ b/ocamldoc/odoc_comments.ml @@ -20,7 +20,7 @@ let print_DEBUG s = print_string s ; print_newline ();; (** This variable contains the regular expression representing a blank but not a '\n'.*) let simple_blank = "[ \013\009\012]" -module type Texter = +module type Texter = sig (** Return a text structure from a string. *) val text_of_string : string -> text @@ -50,7 +50,7 @@ module Info_retriever = (0, None) | Some (desc, remain_opt) -> let mem_nb_chars = !Odoc_comments_global.nb_chars in - let _ = + let _ = match remain_opt with None -> () @@ -59,7 +59,7 @@ module Info_retriever = let lexbuf2 = Lexing.from_string s in Odoc_parser.info_part2 Odoc_lexer.elements lexbuf2 in - (mem_nb_chars, + (mem_nb_chars, Some { i_desc = (match desc with "" -> None | _ -> Some (MyTexter.text_of_string desc)); @@ -67,22 +67,22 @@ module Info_retriever = i_version = !Odoc_comments_global.version; i_sees = (List.map create_see !Odoc_comments_global.sees) ; i_since = !Odoc_comments_global.since; - i_deprecated = - (match !Odoc_comments_global.deprecated with + i_deprecated = + (match !Odoc_comments_global.deprecated with None -> None | Some s -> Some (MyTexter.text_of_string s)); - i_params = - (List.map (fun (n, s) -> + i_params = + (List.map (fun (n, s) -> (n, MyTexter.text_of_string s)) !Odoc_comments_global.params); - i_raised_exceptions = + i_raised_exceptions = (List.map (fun (n, s) -> (n, MyTexter.text_of_string s)) !Odoc_comments_global.raised_exceptions); i_return_value = - (match !Odoc_comments_global.return_value with + (match !Odoc_comments_global.return_value with None -> None | Some s -> Some (MyTexter.text_of_string s)) ; i_custom = (List.map - (fun (tag, s) -> (tag, MyTexter.text_of_string s)) + (fun (tag, s) -> (tag, MyTexter.text_of_string s)) !Odoc_comments_global.customs) - } + } ) with Failure s -> @@ -133,7 +133,7 @@ module Info_retriever = with Not_found -> false - + let retrieve_info_special file (s : string) = retrieve_info Odoc_lexer.main file s @@ -188,7 +188,7 @@ module Info_retriever = let retrieve_last_info_simple file (s : string) = print_DEBUG ("retrieve_last_info_simple:"^s); let rec f cur_len cur_d = - try + try let s2 = String.sub s cur_len ((String.length s) - cur_len) in print_DEBUG ("retrieve_last_info_simple.f:"^s2); match retrieve_info_simple file s2 with @@ -208,7 +208,7 @@ module Info_retriever = let retrieve_last_special_no_blank_after file (s : string) = print_DEBUG ("retrieve_last_special_no_blank_after:"^s); let rec f cur_len cur_d = - try + try let s2 = String.sub s cur_len ((String.length s) - cur_len) in print_DEBUG ("retrieve_last_special_no_blank_after.f:"^s2); match retrieve_info_special file s2 with @@ -257,7 +257,7 @@ module Info_retriever = (* if the special comment is the stop comment (**/**), then we must not associate it. *) let pos = Str.search_forward (Str.regexp_string "(**") s 0 in - if blank_line (String.sub s 0 pos) or + if blank_line (String.sub s 0 pos) or d.Odoc_types.i_desc = Some [Odoc_types.Raw "/*"] then (0, None) @@ -282,7 +282,7 @@ module Info_retriever = (* get the comments *) let (len, special_coms) = all_special file s in (* if there is no blank line after the special comments, and - if the last special comment is not the stop special comment, then the + if the last special comment is not the stop special comment, then the last special comments must be associated to the element. *) match List.rev special_coms with [] -> @@ -312,4 +312,33 @@ module Info_retriever = module Basic_info_retriever = Info_retriever (Odoc_text.Texter) +let info_of_string s = + let dummy = + { + i_desc = None ; + i_authors = [] ; + i_version = None ; + i_sees = [] ; + i_since = None ; + i_deprecated = None ; + i_params = [] ; + i_raised_exceptions = [] ; + i_return_value = None ; + i_custom = [] ; + } + in + let s2 = Printf.sprintf "(** %s *)" s in + let (_, i_opt) = Basic_info_retriever.first_special "-" s2 in + match i_opt with + None -> dummy + | Some i -> i + +let info_of_comment_file f = + try + let s = Odoc_misc.input_file_as_string f in + info_of_string s + with + Sys_error s -> + failwith s + (* eof $Id$ *) diff --git a/ocamldoc/odoc_comments.mli b/ocamldoc/odoc_comments.mli index 0579926a9..b78369d18 100644 --- a/ocamldoc/odoc_comments.mli +++ b/ocamldoc/odoc_comments.mli @@ -16,7 +16,7 @@ val simple_blank : string (** The type of modules in argument to Info_retriever *) -module type Texter = +module type Texter = sig (** Return a text structure from a string. *) val text_of_string : string -> Odoc_types.text @@ -33,21 +33,21 @@ module Basic_info_retriever : val all_special : string -> string -> int * Odoc_types.info list (** [just_after_special file str] return the pair ([length], [info_opt]) - where [info_opt] is the first optional special comment found + where [info_opt] is the first optional special comment found in [str], without any blank line before. [length] is the number of chars from the beginning of [str] to the end of the special comment. *) val just_after_special : string -> string -> int * Odoc_types.info option (** [first_special file str] return the pair ([length], [info_opt]) - where [info_opt] is the first optional special comment found + where [info_opt] is the first optional special comment found in [str]. [length] is the number of chars from the beginning of [str] to the end of the special comment. *) val first_special : string -> string -> int * Odoc_types.info option (** Return a pair [(comment_opt, element_comment_list)], where [comment_opt] is the last special - comment found in the given string and not followed by a blank line, + comment found in the given string and not followed by a blank line, and [element_comment_list] the list of values built from the other special comments found and the given function. *) val get_comments : @@ -55,3 +55,18 @@ module Basic_info_retriever : string -> string -> Odoc_types.info option * 'a list end + +(** [info_of_string s] parses the given string + like a regular ocamldoc comment and return an + {!Odoc_types.info} structure. + @return an empty structure if there was a syntax error. TODO: change this +*) +val info_of_string : string -> Odoc_types.info + +(** [info_of_comment_file file] parses the given file + and return an {!Odoc_types.info} structure. The content of the + file must have the same syntax as the content of a special comment. + @raise Failure is the file could not be opened or there is a + syntax error. +*) +val info_of_comment_file : string -> Odoc_types.info diff --git a/ocamldoc/odoc_cross.ml b/ocamldoc/odoc_cross.ml index cbe949ede..f589858fa 100644 --- a/ocamldoc/odoc_cross.ml +++ b/ocamldoc/odoc_cross.ml @@ -20,13 +20,13 @@ open Odoc_exception open Odoc_types open Odoc_value open Odoc_type -open Odoc_parameter +open Odoc_parameter -(*** Replacements of aliases : if e1 = e2 and e2 = e3, then replace e2 by e3 to have e1 = e3, +(*** Replacements of aliases : if e1 = e2 and e2 = e3, then replace e2 by e3 to have e1 = e3, in order to associate the element with complete information. *) (** The module used to keep what refs were modified. *) -module S = Set.Make +module S = Set.Make ( struct type t = string * ref_kind option let compare = Pervasives.compare @@ -43,7 +43,7 @@ module P_alias = struct type t = int - let p_module m _ = + let p_module m _ = (true, match m.m_kind with Module_alias _ -> true @@ -86,7 +86,7 @@ let rec build_alias_list = function | (Odoc_search.Res_module m) :: q -> ( match m.m_kind with - Module_alias ma -> + Module_alias ma -> Hashtbl.add module_aliases m.m_name (ma.ma_name, Alias_to_resolve); Hashtbl.add module_and_modtype_aliases m.m_name (ma.ma_name, Alias_to_resolve) | _ -> () @@ -95,8 +95,8 @@ let rec build_alias_list = function | (Odoc_search.Res_module_type mt) :: q -> ( match mt.mt_kind with - Some (Module_type_alias mta) -> - Hashtbl.add module_and_modtype_aliases + Some (Module_type_alias mta) -> + Hashtbl.add module_and_modtype_aliases mt.mt_name (mta.mta_name, Alias_to_resolve) | _ -> () ); @@ -105,22 +105,22 @@ let rec build_alias_list = function ( match e.ex_alias with None -> () - | Some ea -> - Hashtbl.add exception_aliases + | Some ea -> + Hashtbl.add exception_aliases e.ex_name (ea.ea_name,Alias_to_resolve) ); build_alias_list q | _ :: q -> build_alias_list q -(** Retrieve the aliases for modules, module types and exceptions +(** Retrieve the aliases for modules, module types and exceptions and put them in global hash tables. *) let get_alias_names module_list = Hashtbl.clear module_aliases; Hashtbl.clear module_and_modtype_aliases; Hashtbl.clear exception_aliases; build_alias_list (Search_alias.search module_list 0) - + exception Found of string let name_alias = let rec f t name = @@ -153,14 +153,14 @@ let name_alias = module Map_ord = struct - type t = string + type t = string let compare = Pervasives.compare end module Ele_map = Map.Make (Map_ord) let known_elements = ref Ele_map.empty -let add_known_element name k = +let add_known_element name k = try let l = Ele_map.find name !known_elements in let s = Ele_map.remove name !known_elements in @@ -174,7 +174,7 @@ let get_known_elements name = with Not_found -> [] let kind_name_exists kind = - let pred = + let pred = match kind with RK_module -> (fun e -> match e with Odoc_search.Res_module _ -> true | _ -> false) | RK_module_type -> (fun e -> match e with Odoc_search.Res_module_type _ -> true | _ -> false) @@ -203,7 +203,7 @@ let method_exists = kind_name_exists RK_method let lookup_module name = match List.find - (fun k -> match k with Odoc_search.Res_module _ -> true | _ -> false) + (fun k -> match k with Odoc_search.Res_module _ -> true | _ -> false) (get_known_elements name) with | Odoc_search.Res_module m -> m @@ -211,7 +211,7 @@ let lookup_module name = let lookup_module_type name = match List.find - (fun k -> match k with Odoc_search.Res_module_type _ -> true | _ -> false) + (fun k -> match k with Odoc_search.Res_module_type _ -> true | _ -> false) (get_known_elements name) with | Odoc_search.Res_module_type m -> m @@ -219,7 +219,7 @@ let lookup_module_type name = let lookup_class name = match List.find - (fun k -> match k with Odoc_search.Res_class _ -> true | _ -> false) + (fun k -> match k with Odoc_search.Res_class _ -> true | _ -> false) (get_known_elements name) with | Odoc_search.Res_class c -> c @@ -227,7 +227,7 @@ let lookup_class name = let lookup_class_type name = match List.find - (fun k -> match k with Odoc_search.Res_class_type _ -> true | _ -> false) + (fun k -> match k with Odoc_search.Res_class_type _ -> true | _ -> false) (get_known_elements name) with | Odoc_search.Res_class_type c -> c @@ -235,7 +235,7 @@ let lookup_class_type name = let lookup_exception name = match List.find - (fun k -> match k with Odoc_search.Res_exception _ -> true | _ -> false) + (fun k -> match k with Odoc_search.Res_exception _ -> true | _ -> false) (get_known_elements name) with | Odoc_search.Res_exception e -> e @@ -244,9 +244,9 @@ let lookup_exception name = class scan = object inherit Odoc_scan.scanner - method scan_value v = + method scan_value v = add_known_element v.val_name (Odoc_search.Res_value v) - method scan_type t = + method scan_type t = add_known_element t.ty_name (Odoc_search.Res_type t) method scan_exception e = add_known_element e.ex_name (Odoc_search.Res_exception e) @@ -277,7 +277,7 @@ let init_known_elements_map module_list = (** The type to describe the names not found. *) -type not_found_name = +type not_found_name = NF_m of Name.t | NF_mt of Name.t | NF_mmt of Name.t @@ -296,7 +296,7 @@ let rec associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_ (associate_in_module_element module_list m.m_name) (acc_b, acc_inc, acc_names) elements - + | Module_alias ma -> ( match ma.ma_module with @@ -310,16 +310,16 @@ let rec associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_ with Not_found -> None in match mmt_opt with - None -> (acc_b, (Name.head m.m_name) :: acc_inc, - (* we don't want to output warning messages for + None -> (acc_b, (Name.head m.m_name) :: acc_inc, + (* we don't want to output warning messages for "sig ... end" or "struct ... end" modules not found *) - (if ma.ma_name = Odoc_messages.struct_end or + (if ma.ma_name = Odoc_messages.struct_end or ma.ma_name = Odoc_messages.sig_end then acc_names else (NF_mmt ma.ma_name) :: acc_names) ) - | Some mmt -> + | Some mmt -> ma.ma_module <- Some mmt ; (true, acc_inc, acc_names) ) @@ -332,7 +332,7 @@ let rec associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_ { mt_name = "" ; mt_info = None ; mt_type = None ; mt_is_interface = false ; mt_file = ""; mt_kind = Some tk ; mt_loc = Odoc_types.dummy_loc } - + | Module_apply (k1, k2) -> let (acc_b2, acc_inc2, acc_names2) = iter_kind (acc_b, acc_inc, acc_names) k1 in iter_kind (acc_b2, acc_inc2, acc_names2) k2 @@ -345,7 +345,7 @@ let rec associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_ mt_loc = Odoc_types.dummy_loc } in iter_kind (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) m.m_kind - + and associate_in_module_type module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) mt = let rec iter_kind (acc_b, acc_inc, acc_names) k = match k with @@ -371,28 +371,28 @@ and associate_in_module_type module_list (acc_b_modif, acc_incomplete_top_module with Not_found -> None in match mt_opt with - None -> (acc_b, (Name.head mt.mt_name) :: acc_inc, - (* we don't want to output warning messages for + None -> (acc_b, (Name.head mt.mt_name) :: acc_inc, + (* we don't want to output warning messages for "sig ... end" or "struct ... end" modules not found *) - (if mta.mta_name = Odoc_messages.struct_end or + (if mta.mta_name = Odoc_messages.struct_end or mta.mta_name = Odoc_messages.sig_end then - acc_names - else + acc_names + else (NF_mt mta.mta_name) :: acc_names) ) - | Some mt -> + | Some mt -> mta.mta_module <- Some mt ; (true, acc_inc, acc_names) in match mt.mt_kind with None -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) | Some k -> iter_kind (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) k - + and associate_in_module_element module_list m_name (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) element = match element with Element_module m -> associate_in_module module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) m | Element_module_type mt -> associate_in_module_type module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) mt - | Element_included_module im -> + | Element_included_module im -> ( match im.im_module with Some _ -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) @@ -404,16 +404,16 @@ and associate_in_module_element module_list m_name (acc_b_modif, acc_incomplete_ with Not_found -> None in match mmt_opt with - None -> (acc_b_modif, (Name.head m_name) :: acc_incomplete_top_module_names, - (* we don't want to output warning messages for + None -> (acc_b_modif, (Name.head m_name) :: acc_incomplete_top_module_names, + (* we don't want to output warning messages for "sig ... end" or "struct ... end" modules not found *) - (if im.im_name = Odoc_messages.struct_end or + (if im.im_name = Odoc_messages.struct_end or im.im_name = Odoc_messages.sig_end then acc_names_not_found else (NF_mmt im.im_name) :: acc_names_not_found) ) - | Some mmt -> + | Some mmt -> im.im_module <- Some mmt ; (true, acc_incomplete_top_module_names, acc_names_not_found) ) @@ -426,9 +426,9 @@ and associate_in_module_element module_list m_name (acc_b_modif, acc_incomplete_ None -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) | Some ea -> match ea.ea_ex with - Some _ -> + Some _ -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) - | None -> + | None -> let ex_opt = try Some (lookup_exception ea.ea_name) with Not_found -> None @@ -443,7 +443,7 @@ and associate_in_module_element module_list m_name (acc_b_modif, acc_incomplete_ | Element_module_comment _ -> (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) and associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) c = - let rec iter_kind (acc_b, acc_inc, acc_names) k = + let rec iter_kind (acc_b, acc_inc, acc_names) k = match k with Class_structure (inher_l, _) -> let f (acc_b2, acc_inc2, acc_names2) ic = @@ -460,7 +460,7 @@ and associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names None -> (acc_b2, (Name.head c.cl_name) :: acc_inc2, (* we don't want to output warning messages for "object ... end" classes not found *) (if ic.ic_name = Odoc_messages.object_end then acc_names2 else (NF_cct ic.ic_name) :: acc_names2)) - | Some cct -> + | Some cct -> ic.ic_class <- Some cct ; (true, acc_inc2, acc_names2) in @@ -470,13 +470,13 @@ and associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names ( match capp.capp_class with Some _ -> (acc_b, acc_inc, acc_names) - | None -> + | None -> let cl_opt = try Some (lookup_class capp.capp_name) with Not_found -> None in match cl_opt with - None -> (acc_b, (Name.head c.cl_name) :: acc_inc, + None -> (acc_b, (Name.head c.cl_name) :: acc_inc, (* we don't want to output warning messages for "object ... end" classes not found *) (if capp.capp_name = Odoc_messages.object_end then acc_names else (NF_c capp.capp_name) :: acc_names)) | Some c -> @@ -488,13 +488,13 @@ and associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names ( match cco.cco_class with Some _ -> (acc_b, acc_inc, acc_names) - | None -> + | None -> let cl_opt = try Some (lookup_class cco.cco_name) with Not_found -> None in match cl_opt with - None -> + None -> ( let clt_opt = try Some (lookup_class_type cco.cco_name) @@ -502,7 +502,7 @@ and associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names in match clt_opt with None -> - (acc_b, (Name.head c.cl_name) :: acc_inc, + (acc_b, (Name.head c.cl_name) :: acc_inc, (* we don't want to output warning messages for "object ... end" classes not found *) (if cco.cco_name = Odoc_messages.object_end then acc_names else (NF_cct cco.cco_name) :: acc_names)) | Some ct -> @@ -526,7 +526,7 @@ and associate_in_class module_list (acc_b_modif, acc_incomplete_top_module_names iter_kind (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) c.cl_kind and associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_names, acc_names_not_found) ct = - let rec iter_kind (acc_b, acc_inc, acc_names) k = + let rec iter_kind (acc_b, acc_inc, acc_names) k = match k with Class_signature (inher_l, _) -> let f (acc_b2, acc_inc2, acc_names2) ic = @@ -540,10 +540,10 @@ and associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_ with Not_found -> None in match cct_opt with - None -> (acc_b2, (Name.head ct.clt_name) :: acc_inc2, + None -> (acc_b2, (Name.head ct.clt_name) :: acc_inc2, (* we don't want to output warning messages for "object ... end" class types not found *) (if ic.ic_name = Odoc_messages.object_end then acc_names2 else (NF_cct ic.ic_name) :: acc_names2)) - | Some cct -> + | Some cct -> ic.ic_class <- Some cct ; (true, acc_inc2, acc_names2) in @@ -553,15 +553,15 @@ and associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_ ( match cta.cta_class with Some _ -> (acc_b, acc_inc, acc_names) - | None -> + | None -> let cct_opt = try Some (Cltype (lookup_class_type cta.cta_name, [])) - with Not_found -> + with Not_found -> try Some (Cl (lookup_class cta.cta_name)) with Not_found -> None in match cct_opt with - None -> (acc_b, (Name.head ct.clt_name) :: acc_inc, + None -> (acc_b, (Name.head ct.clt_name) :: acc_inc, (* we don't want to output warning messages for "object ... end" class types not found *) (if cta.cta_name = Odoc_messages.object_end then acc_names else (NF_cct cta.cta_name) :: acc_names)) | Some c -> @@ -574,7 +574,7 @@ and associate_in_class_type module_list (acc_b_modif, acc_incomplete_top_module_ (*************************************************************) (** Association of types to elements referenced in comments .*) -let ao = Odoc_misc.apply_opt +let ao = Odoc_misc.apply_opt let rec assoc_comments_text_elements module_list t_ele = match t_ele with @@ -615,7 +615,7 @@ let rec assoc_comments_text_elements module_list t_ele = ) | ele :: _ -> (* we look for the first element with this name *) - let kind = + let kind = match ele with Odoc_search.Res_module _ -> RK_module | Odoc_search.Res_module_type _ -> RK_module_type @@ -631,7 +631,7 @@ let rec assoc_comments_text_elements module_list t_ele = add_verified (name, Some kind) ; Ref (name, Some kind) ) - | Ref (name, Some kind) -> + | Ref (name, Some kind) -> ( let v = (name, Some kind) in if was_verified v then @@ -653,7 +653,7 @@ let rec assoc_comments_text_elements module_list t_ele = Ref (name, None) ) | _ -> - let (f,f_mes) = + let (f,f_mes) = match kind with RK_module -> module_exists, Odoc_messages.cross_module_not_found | RK_module_type -> module_type_exists, Odoc_messages.cross_module_type_not_found @@ -677,10 +677,11 @@ let rec assoc_comments_text_elements module_list t_ele = Ref (name, None) ) ) - | Module_list l -> + | Module_list l -> Module_list l | Index_list -> Index_list + | Custom (s,t) -> Custom (s, (assoc_comments_text module_list t)) and assoc_comments_text module_list text = List.map (assoc_comments_text_elements module_list) text @@ -696,8 +697,8 @@ and assoc_comments_info module_list i = i_raised_exceptions = List.map (fun (name, t) -> (name, ft t)) i.i_raised_exceptions; i_return_value = ao ft i.i_return_value ; i_custom = List.map (fun (tag, t) -> (tag, ft t)) i.i_custom ; - } - + } + let rec assoc_comments_module_element module_list m_ele = match m_ele with @@ -719,17 +720,17 @@ and assoc_comments_class_element module_list c_ele = and assoc_comments_module_kind module_list mk = match mk with - | Module_struct eles -> + | Module_struct eles -> Module_struct (List.map (assoc_comments_module_element module_list) eles) - | Module_alias _ - | Module_functor _ -> + | Module_alias _ + | Module_functor _ -> mk - | Module_apply (mk1, mk2) -> + | Module_apply (mk1, mk2) -> Module_apply (assoc_comments_module_kind module_list mk1, assoc_comments_module_kind module_list mk2) - | Module_with (mtk, s) -> + | Module_with (mtk, s) -> Module_with (assoc_comments_module_type_kind module_list mtk, s) - | Module_constraint (mk1, mtk) -> + | Module_constraint (mk1, mtk) -> Module_constraint (assoc_comments_module_kind module_list mk1, assoc_comments_module_type_kind module_list mtk) @@ -737,7 +738,7 @@ and assoc_comments_module_type_kind module_list mtk = match mtk with | Module_type_struct eles -> Module_type_struct (List.map (assoc_comments_module_element module_list) eles) - | Module_type_functor (params, mtk1) -> + | Module_type_functor (params, mtk1) -> Module_type_functor (params, assoc_comments_module_type_kind module_list mtk1) | Module_type_alias _ -> mtk @@ -747,9 +748,9 @@ and assoc_comments_module_type_kind module_list mtk = and assoc_comments_class_kind module_list ck = match ck with Class_structure (inher, eles) -> - let inher2 = - List.map - (fun ic -> { ic with + let inher2 = + List.map + (fun ic -> { ic with ic_text = ao (assoc_comments_text module_list) ic.ic_text }) inher in @@ -764,9 +765,9 @@ and assoc_comments_class_kind module_list ck = and assoc_comments_class_type_kind module_list ctk = match ctk with Class_signature (inher, eles) -> - let inher2 = - List.map - (fun ic -> { ic with + let inher2 = + List.map + (fun ic -> { ic with ic_text = ao (assoc_comments_text module_list) ic.ic_text }) inher in @@ -785,7 +786,7 @@ and assoc_comments_module_type module_list mt = mt.mt_kind <- ao (assoc_comments_module_type_kind module_list) mt.mt_kind ; mt -and assoc_comments_class module_list c = +and assoc_comments_class module_list c = c.cl_info <- ao (assoc_comments_info module_list) c.cl_info ; c.cl_kind <- assoc_comments_class_kind module_list c.cl_kind ; assoc_comments_parameter_list module_list c.cl_parameters; @@ -798,7 +799,7 @@ and assoc_comments_class_type module_list ct = and assoc_comments_parameter module_list p = match p with - Simple_name sn -> + Simple_name sn -> sn.sn_text <- ao (assoc_comments_text module_list) sn.sn_text | Tuple (l, t) -> List.iter (assoc_comments_parameter module_list) l @@ -820,11 +821,11 @@ and assoc_comments_type module_list t = (match t.ty_kind with Type_abstract -> () | Type_variant (vl, _) -> - List.iter + List.iter (fun vc -> vc.vc_text <- ao (assoc_comments_text module_list) vc.vc_text) - vl + vl | Type_record (fl, _) -> - List.iter + List.iter (fun rf -> rf.rf_text <- ao (assoc_comments_text module_list) rf.rf_text) fl ); @@ -856,7 +857,7 @@ let associate module_list = else remove_doubles (h :: acc) q in let rec iter incomplete_modules = - let (b_modif, remaining_inc_modules, acc_names_not_found) = + let (b_modif, remaining_inc_modules, acc_names_not_found) = List.fold_left (associate_in_module module_list) (false, [], []) incomplete_modules in let remaining_no_doubles = remove_doubles [] remaining_inc_modules in @@ -877,7 +878,7 @@ let associate module_list = [] -> () | l -> - List.iter + List.iter (fun nf -> Odoc_messages.pwarning ( @@ -896,6 +897,6 @@ let associate module_list = (* Find a type for each name of element which is referenced in comments. *) ignore (associate_type_of_elements_in_comments module_list) - + (* eof $Id$ *) diff --git a/ocamldoc/odoc_html.ml b/ocamldoc/odoc_html.ml index 3aa73c4a5..104695813 100644 --- a/ocamldoc/odoc_html.ml +++ b/ocamldoc/odoc_html.ml @@ -11,7 +11,7 @@ (* $Id$ *) -(** Generation of html documentation. *) +(** Generation of html documentation.*) let print_DEBUG s = print_string s ; print_newline () @@ -93,8 +93,8 @@ module Naming = let ch c = Buffer.add_char buf c in let st s = Buffer.add_string buf s in for i = 0 to len - 1 do - match name.[i] with - | '|' -> st "_pipe_" + match name.[i] with + | '|' -> st "_pipe_" | '<' -> st "_lt_" | '>' -> st "_gt_" | '@' -> st "_at_" @@ -110,7 +110,7 @@ module Naming = | ':' -> st "_column_" | '~' -> st "_tilde_" | '!' -> st "_bang_" - | c -> ch c + | c -> ch c done; Buffer.contents buf @@ -246,8 +246,11 @@ class virtual text = | Odoc_info.Ref (name, ref_opt) -> self#html_of_Ref b name ref_opt | Odoc_info.Superscript t -> self#html_of_Superscript b t | Odoc_info.Subscript t -> self#html_of_Subscript b t - | Odoc_info.Module_list l -> self#html_of_Module_list b l - | Odoc_info.Index_list -> self#html_of_Index_list b + | Odoc_info.Module_list l -> self#html_of_Module_list b l + | Odoc_info.Index_list -> self#html_of_Index_list b + | Odoc_info.Custom (s,t) -> self#html_of_custom_text b s t + + method html_of_custom_text b s t = () method html_of_Raw b s = bs b (self#escape s) @@ -255,55 +258,55 @@ class virtual text = if !Args.colorize_code then self#html_of_code b ~with_pre: false s else - ( - bs b "<code class=\""; - bs b Odoc_ocamlhtml.code_class ; - bs b "\">"; - bs b (self#escape s); - bs b "</code>" - ) + ( + bs b "<code class=\""; + bs b Odoc_ocamlhtml.code_class ; + bs b "\">"; + bs b (self#escape s); + bs b "</code>" + ) method html_of_CodePre = - let remove_useless_newlines s = - let len = String.length s in - let rec iter_first n = - if n >= len then - None - else - match s.[n] with - | '\n' -> iter_first (n+1) - | _ -> Some n - in - match iter_first 0 with - None -> "" - | Some first -> - let rec iter_last n = - if n <= first then - None - else - match s.[n] with - '\t' -> iter_last (n-1) - | _ -> Some n - in - match iter_last (len-1) with - None -> String.sub s first 1 - | Some last -> String.sub s first ((last-first)+1) - in - fun b s -> + let remove_useless_newlines s = + let len = String.length s in + let rec iter_first n = + if n >= len then + None + else + match s.[n] with + | '\n' -> iter_first (n+1) + | _ -> Some n + in + match iter_first 0 with + None -> "" + | Some first -> + let rec iter_last n = + if n <= first then + None + else + match s.[n] with + '\t' -> iter_last (n-1) + | _ -> Some n + in + match iter_last (len-1) with + None -> String.sub s first 1 + | Some last -> String.sub s first ((last-first)+1) + in + fun b s -> if !Args.colorize_code then - ( + ( bs b "<pre></pre>"; - self#html_of_code b (remove_useless_newlines s); - bs b "<pre></pre>" - ) + self#html_of_code b (remove_useless_newlines s); + bs b "<pre></pre>" + ) else ( - bs b "<pre><code class=\""; - bs b Odoc_ocamlhtml.code_class; - bs b "\">" ; - bs b (self#escape (remove_useless_newlines s)); - bs b "</code></pre>" - ) + bs b "<pre><code class=\""; + bs b Odoc_ocamlhtml.code_class; + bs b "\">" ; + bs b (self#escape (remove_useless_newlines s)); + bs b "</code></pre>" + ) method html_of_Verbatim b s = bs b "<pre>"; @@ -343,15 +346,15 @@ class virtual text = method html_of_List b tl = bs b "<ul>\n"; List.iter - (fun t -> bs b "<li>"; self#html_of_text b t; bs b "</li>\n") - tl; + (fun t -> bs b "<li>"; self#html_of_text b t; bs b "</li>\n") + tl; bs b "</ul>\n" method html_of_Enum b tl = bs b "<OL>\n"; List.iter - (fun t -> bs b "<li>"; self#html_of_text b t; bs b"</li>\n") - tl; + (fun t -> bs b "<li>"; self#html_of_text b t; bs b"</li>\n") + tl; bs b "</OL>\n" method html_of_Newline b = bs b "\n<p>\n" @@ -367,10 +370,10 @@ class virtual text = bs b (Naming.label_target label1); bs b "\"></a>\n"; let (tag_o, tag_c) = - if n > 6 then - (Printf.sprintf "div class=\"h%d\"" n, "div") - else - let t = Printf.sprintf "h%d" n in (t, t) + if n > 6 then + (Printf.sprintf "div class=\"h%d\"" n, "div") + else + let t = Printf.sprintf "h%d" n in (t, t) in bs b "<"; bs b tag_o; @@ -395,7 +398,7 @@ class virtual text = None -> self#html_of_text_element b (Odoc_info.Code name) | Some kind -> - let h name = Odoc_info.Code (Odoc_info.use_hidden_modules name) in + let h name = Odoc_info.Code (Odoc_info.use_hidden_modules name) in let (target, text) = match kind with Odoc_info.RK_module @@ -410,11 +413,11 @@ class virtual text = | Odoc_info.RK_attribute -> (Naming.complete_target Naming.mark_attribute name, h name) | Odoc_info.RK_method -> (Naming.complete_target Naming.mark_method name, h name) | Odoc_info.RK_section t -> (Naming.complete_label_target name, - Odoc_info.Italic [Raw (Odoc_info.string_of_text t)]) + Odoc_info.Italic [Raw (Odoc_info.string_of_text t)]) in bs b ("<a href=\""^target^"\">"); self#html_of_text_element b text; - bs b "</a>" + bs b "</a>" method html_of_Superscript b t = bs b "<sup class=\"superscript\">"; @@ -432,25 +435,25 @@ class virtual text = bs b "<br>\n<table class=\"indextable\">\n"; List.iter (fun name -> - bs b "<tr><td>"; - ( - try - let m = - List.find (fun m -> m.m_name = name) self#list_modules - in - let (html, _) = Naming.html_files m.m_name in - bp b "<a href=\"%s\">%s</a></td>" html m.m_name; - bs b "<td>"; - self#html_of_info_first_sentence b m.m_info; - with - Not_found -> - Odoc_messages.pwarning (Odoc_messages.cross_module_not_found name); - bp b "%s</td><td>" name - ); - bs b "</td></tr>\n" - ) + bs b "<tr><td>"; + ( + try + let m = + List.find (fun m -> m.m_name = name) self#list_modules + in + let (html, _) = Naming.html_files m.m_name in + bp b "<a href=\"%s\">%s</a></td>" html m.m_name; + bs b "<td>"; + self#html_of_info_first_sentence b m.m_info; + with + Not_found -> + Odoc_messages.pwarning (Odoc_messages.cross_module_not_found name); + bp b "%s</td><td>" name + ); + bs b "</td></tr>\n" + ) l; - bs b "</table>\n</body>\n</html>"; + bs b "</table>\n" method html_of_Index_list b = let index_if_not_empty l url m = @@ -506,7 +509,7 @@ class virtual info = [] -> () | _ -> bp b "<b>%s:</b> %s<br>\n" - Odoc_messages.authors + Odoc_messages.authors (String.concat ", " l) (** Print html code for the given optional version information.*) @@ -514,33 +517,33 @@ class virtual info = match v_opt with None -> () | Some v -> - bp b "<b>%s:</b> %s<br>\n" Odoc_messages.version v + bp b "<b>%s:</b> %s<br>\n" Odoc_messages.version v (** Print html code for the given optional since information.*) method html_of_since_opt b s_opt = match s_opt with None -> () | Some s -> - bp b "<b>%s</b> %s<br>\n" Odoc_messages.since s + bp b "<b>%s</b> %s<br>\n" Odoc_messages.since s (** Print html code for the given list of raised exceptions.*) method html_of_raised_exceptions b l = match l with [] -> () | (s, t) :: [] -> - bp b "<b>%s</b> <code>%s</code> " - Odoc_messages.raises - s; - self#html_of_text b t; - bs b "<br>\n" + bp b "<b>%s</b> <code>%s</code> " + Odoc_messages.raises + s; + self#html_of_text b t; + bs b "<br>\n" | _ -> bp b "<b>%s</b><ul>" Odoc_messages.raises; - List.iter + List.iter (fun (ex, desc) -> - bp b "<li><code>%s</code> " ex ; - self#html_of_text b desc; - bs b "</li>\n" - ) + bp b "<li><code>%s</code> " ex ; + self#html_of_text b desc; + bs b "</li>\n" + ) l; bs b "</ul>\n" @@ -559,17 +562,17 @@ class virtual info = match l with [] -> () | see :: [] -> - bp b "<b>%s</b> " Odoc_messages.see_also; - self#html_of_see b see; - bs b "<br>\n" + bp b "<b>%s</b> " Odoc_messages.see_also; + self#html_of_see b see; + bs b "<br>\n" | _ -> bp b "<b>%s</b><ul>" Odoc_messages.see_also; List.iter (fun see -> - bs b "<li>" ; - self#html_of_see b see; - bs b "</li>\n" - ) + bs b "<li>" ; + self#html_of_see b see; + bs b "</li>\n" + ) l; bs b "</ul>\n" @@ -578,9 +581,9 @@ class virtual info = match return_opt with None -> () | Some s -> - bp b "<b>%s</b> " Odoc_messages.returns; - self#html_of_text b s; - bs b "<br>\n" + bp b "<b>%s</b> " Odoc_messages.returns; + self#html_of_text b s; + bs b "<br>\n" (** Print html code for the given list of custom tagged texts. *) method html_of_custom b l = @@ -607,17 +610,17 @@ class virtual info = let module M = Odoc_info in if indent then bs b "<div class=\"info\">\n"; ( - match info.M.i_deprecated with + match info.M.i_deprecated with None -> () | Some d -> bs b "<span class=\"warning\">"; - bs b Odoc_messages.deprecated ; - bs b "</span>" ; - self#html_of_text b d; + bs b Odoc_messages.deprecated ; + bs b "</span>" ; + self#html_of_text b d; bs b "<br>\n" ); ( - match info.M.i_desc with + match info.M.i_desc with None -> () | Some d when d = [Odoc_info.Raw ""] -> () | Some d -> self#html_of_text b d; bs b "<br>\n" @@ -642,14 +645,14 @@ class virtual info = bs b "<div class=\"info\">\n"; if dep then bs b "<font color=\"#CCCCCC\">"; ( - match info.M.i_desc with + match info.M.i_desc with None -> () | Some d when d = [Odoc_info.Raw ""] -> () | Some d -> - self#html_of_text b + self#html_of_text b (Odoc_info.text_no_title_no_list (Odoc_info.first_sentence_of_text d)); - bs b "\n" + bs b "\n" ); if dep then bs b "</font>"; bs b "</div>\n" @@ -665,9 +668,9 @@ let print_concat b sep f = [] -> () | [c] -> f c | c :: q -> - f c; - bs b sep; - iter q + f c; + bs b sep; + iter q in iter @@ -687,6 +690,11 @@ class html = inherit text inherit info + val mutable doctype = + "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">\n" + val mutable character_encoding = + "<meta content=\"text/html; charset=iso-8859-1\" http-equiv=\"Content-Type\">\n" + (** The default style options. *) val mutable default_style_options = ["a:visited {color : #416DFF; text-decoration : none; }" ; @@ -707,55 +715,55 @@ class html = ".code { color : #465F91 ; }" ; "h1 { font-size : 20pt ; text-align: center; }" ; - "h2 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90BDFF ;"^ - "padding: 2px; }" ; - - "h3 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90DDFF ;"^ - "padding: 2px; }" ; - - "h4 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90EDFF ;"^ - "padding: 2px; }" ; - - "h5 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #90FDFF ;"^ - "padding: 2px; }" ; - - "h6 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #C0FFFF ; "^ - "padding: 2px; }" ; - - "div.h7 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #E0FFFF ; "^ - "padding: 2px; }" ; - - "div.h8 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #F0FFFF ; "^ - "padding: 2px; }" ; - - "div.h9 { font-size : 20pt ; border: 1px solid #000000; "^ - "margin-top: 5px; margin-bottom: 2px;"^ - "text-align: center; background-color: #FFFFFF ; "^ - "padding: 2px; }" ; - - ".typetable { border-style : hidden }" ; - ".indextable { border-style : hidden }" ; - ".paramstable { border-style : hidden ; padding: 5pt 5pt}" ; + "h2 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #90BDFF ;"^ + "padding: 2px; }" ; + + "h3 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #90DDFF ;"^ + "padding: 2px; }" ; + + "h4 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #90EDFF ;"^ + "padding: 2px; }" ; + + "h5 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #90FDFF ;"^ + "padding: 2px; }" ; + + "h6 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #C0FFFF ; "^ + "padding: 2px; }" ; + + "div.h7 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #E0FFFF ; "^ + "padding: 2px; }" ; + + "div.h8 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #F0FFFF ; "^ + "padding: 2px; }" ; + + "div.h9 { font-size : 20pt ; border: 1px solid #000000; "^ + "margin-top: 5px; margin-bottom: 2px;"^ + "text-align: center; background-color: #FFFFFF ; "^ + "padding: 2px; }" ; + + ".typetable { border-style : hidden }" ; + ".indextable { border-style : hidden }" ; + ".paramstable { border-style : hidden ; padding: 5pt 5pt}" ; "body { background-color : White }" ; "tr { background-color : White }" ; - "td.typefieldcomment { background-color : #FFFFFF ; font-size: smaller ;}" ; - "pre { margin-bottom: 4px }" ; + "td.typefieldcomment { background-color : #FFFFFF ; font-size: smaller ;}" ; + "pre { margin-bottom: 4px }" ; - "div.sig_block {margin-left: 2em}" ; + "div.sig_block {margin-left: 2em}" ; ] (** The style file for all pages. *) @@ -779,26 +787,35 @@ class html = when printing a module type. *) val mutable known_modules_names = StringSet.empty + method index_prefix = + if !Odoc_args.out_file = Odoc_messages.default_out_file then + "index" + else + Filename.basename !Odoc_args.out_file + (** The main file. *) - method index = "index.html" + method index = + let p = self#index_prefix in + Printf.sprintf "%s.html" p + (** The file for the index of values. *) - method index_values = "index_values.html" + method index_values = Printf.sprintf "%s_values.html" self#index_prefix (** The file for the index of types. *) - method index_types = "index_types.html" + method index_types = Printf.sprintf "%s_types.html" self#index_prefix (** The file for the index of exceptions. *) - method index_exceptions = "index_exceptions.html" + method index_exceptions = Printf.sprintf "%s_exceptions.html" self#index_prefix (** The file for the index of attributes. *) - method index_attributes = "index_attributes.html" + method index_attributes = Printf.sprintf "%s_attributes.html" self#index_prefix (** The file for the index of methods. *) - method index_methods = "index_methods.html" + method index_methods = Printf.sprintf "%s_methods.html" self#index_prefix (** The file for the index of classes. *) - method index_classes = "index_classes.html" + method index_classes = Printf.sprintf "%s_classes.html" self#index_prefix (** The file for the index of class types. *) - method index_class_types = "index_class_types.html" + method index_class_types = Printf.sprintf "%s_class_types.html" self#index_prefix (** The file for the index of modules. *) - method index_modules = "index_modules.html" + method index_modules = Printf.sprintf "%s_modules.html" self#index_prefix (** The file for the index of module types. *) - method index_module_types = "index_module_types.html" + method index_module_types = Printf.sprintf "%s_module_types.html" self#index_prefix (** The list of attributes. Filled in the [generate] method. *) @@ -839,17 +856,17 @@ class html = let default_style = String.concat "\n" default_style_options in ( try - let file = Filename.concat !Args.target_dir style_file in - if Sys.file_exists file then - Odoc_info.verbose (Odoc_messages.file_exists_dont_generate file) - else - ( - let chanout = open_out file in - output_string chanout default_style ; - flush chanout ; - close_out chanout; - Odoc_info.verbose (Odoc_messages.file_generated file) - ) + let file = Filename.concat !Args.target_dir style_file in + if Sys.file_exists file then + Odoc_info.verbose (Odoc_messages.file_exists_dont_generate file) + else + ( + let chanout = open_out file in + output_string chanout default_style ; + flush chanout ; + close_out chanout; + Odoc_info.verbose (Odoc_messages.file_generated file) + ) with Sys_error s -> prerr_endline s ; @@ -878,13 +895,14 @@ class html = match l with [] -> () | _ -> - bp b "<link title=\"%s\" rel=Appendix href=\"%s\">\n" m url + bp b "<link title=\"%s\" rel=Appendix href=\"%s\">\n" m url in bs b "<head>\n"; - bs b style; + bs b style; + bs b character_encoding ; bs b "<link rel=\"Start\" href=\""; - bs b self#index; - bs b "\">\n" ; + bs b self#index; + bs b "\">\n" ; ( match nav with None -> () @@ -893,13 +911,13 @@ class html = None -> () | Some name -> bp b "<link rel=\"previous\" href=\"%s\">\n" - (fst (Naming.html_files name)); + (fst (Naming.html_files name)); ); (match post_opt with None -> () | Some name -> bp b "<link rel=\"next\" href=\"%s\">\n" - (fst (Naming.html_files name)); + (fst (Naming.html_files name)); ); ( let father = Name.father name in @@ -916,16 +934,16 @@ class html = link_if_not_empty self#list_class_types Odoc_messages.index_of_class_types self#index_class_types; link_if_not_empty self#list_modules Odoc_messages.index_of_modules self#index_modules; link_if_not_empty self#list_module_types Odoc_messages.index_of_module_types self#index_module_types; - let print_one m = - let html_file = fst (Naming.html_files m.m_name) in + let print_one m = + let html_file = fst (Naming.html_files m.m_name) in bp b "<link title=\"%s\" rel=\"Chapter\" href=\"%s\">" - m.m_name html_file + m.m_name html_file in - print_concat b "\n" print_one module_list; + print_concat b "\n" print_one module_list; self#html_sections_links b comments; bs b "<title>"; - bs b t ; - bs b "</title>\n</head>\n" + bs b t ; + bs b "</title>\n</head>\n" in header <- f @@ -964,7 +982,7 @@ class html = let s = Odoc_info.string_of_text t in let label = self#create_title_label (n,lopt,t) in bp b "<link title=\"%s\" rel=\"%s\" href=\"#%s\">\n" s s_rel label - ) + ) titles in print_lines "Section" section_titles ; @@ -982,8 +1000,8 @@ class html = None -> () | Some name -> bp b "<a href=\"%s\">%s</a>\n" - (fst (Naming.html_files name)) - Odoc_messages.previous + (fst (Naming.html_files name)) + Odoc_messages.previous ); bs b " "; let father = Name.father name in @@ -995,8 +1013,8 @@ class html = None -> () | Some name -> bp b "<a href=\"%s\">%s</a>\n" - (fst (Naming.html_files name)) - Odoc_messages.next + (fst (Naming.html_files name)) + Odoc_messages.next ); bs b "</div>\n" @@ -1011,13 +1029,13 @@ class html = method private output_code in_title file code = try let chanout = open_out file in - let b = new_buf () in + let b = new_buf () in bs b "<html>"; - self#print_header b (self#inner_title in_title); - bs b"<body>\n"; + self#print_header b (self#inner_title in_title); + bs b"<body>\n"; self#html_of_code b code; bs b "</body></html>"; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with Sys_error s -> @@ -1059,8 +1077,8 @@ class html = method create_fully_qualified_module_idents_links m_name s = let f str_t = let match_s = Str.matched_string str_t in - let rel = Name.get_relative m_name match_s in - let s_final = Odoc_info.apply_if_equal + let rel = Name.get_relative m_name match_s in + let s_final = Odoc_info.apply_if_equal Odoc_info.use_hidden_modules match_s rel @@ -1132,52 +1150,52 @@ class html = (** Print html code to display the given module kind. *) method html_of_module_kind b father ?modu kind = match kind with - Module_struct eles -> - self#html_of_text b [Code "sig"]; - ( - match modu with - None -> - bs b "<div class=\"sig_block\">"; - List.iter (self#html_of_module_element b father) eles; - bs b "</div>" - | Some m -> - let (html_file, _) = Naming.html_files m.m_name in - bp b " <a href=\"%s\">..</a> " html_file - ); - self#html_of_text b [Code "end"] + Module_struct eles -> + self#html_of_text b [Code "sig"]; + ( + match modu with + None -> + bs b "<div class=\"sig_block\">"; + List.iter (self#html_of_module_element b father) eles; + bs b "</div>" + | Some m -> + let (html_file, _) = Naming.html_files m.m_name in + bp b " <a href=\"%s\">..</a> " html_file + ); + self#html_of_text b [Code "end"] | Module_alias a -> - bs b "<code class=\"type\">"; - bs b (self#create_fully_qualified_module_idents_links father a.ma_name); - bs b "</code>" + bs b "<code class=\"type\">"; + bs b (self#create_fully_qualified_module_idents_links father a.ma_name); + bs b "</code>" | Module_functor (p, k) -> - bs b "<div class=\"sig_block\">"; - self#html_of_module_parameter b father p; - self#html_of_module_kind b father ?modu k; - bs b "</div>" + bs b "<div class=\"sig_block\">"; + self#html_of_module_parameter b father p; + self#html_of_module_kind b father ?modu k; + bs b "</div>" | Module_apply (k1, k2) -> - (* TODO: l'application n'est pas correcte dans un .mli. - Que faire ? -> afficher le module_type du typedtree *) - self#html_of_module_kind b father k1; - self#html_of_text b [Code "("]; - self#html_of_module_kind b father k2; - self#html_of_text b [Code ")"] + (* TODO: l'application n'est pas correcte dans un .mli. + Que faire ? -> afficher le module_type du typedtree *) + self#html_of_module_kind b father k1; + self#html_of_text b [Code "("]; + self#html_of_module_kind b father k2; + self#html_of_text b [Code ")"] | Module_with (k, s) -> - (* TODO: à modifier quand Module_with sera plus détaillé *) - self#html_of_module_type_kind b father ?modu k; - bs b "<code class=\"type\"> "; - bs b (self#create_fully_qualified_module_idents_links father s); - bs b "</code>" + (* TODO: à modifier quand Module_with sera plus détaillé *) + self#html_of_module_type_kind b father ?modu k; + bs b "<code class=\"type\"> "; + bs b (self#create_fully_qualified_module_idents_links father s); + bs b "</code>" | Module_constraint (k, tk) -> - (* TODO: on affiche quoi ? *) - self#html_of_module_kind b father ?modu k + (* TODO: on affiche quoi ? *) + self#html_of_module_kind b father ?modu k method html_of_module_parameter b father p = self#html_of_text b - [ - Code "functor ("; - Code p.mp_name ; - Code " : "; - ] ; + [ + Code "functor ("; + Code p.mp_name ; + Code " : "; + ] ; self#html_of_module_type_kind b father p.mp_kind; self#html_of_text b [ Code ") -> "] @@ -1205,38 +1223,38 @@ class html = (** Print html code to display the given module type kind. *) method html_of_module_type_kind b father ?modu ?mt kind = match kind with - Module_type_struct eles -> - self#html_of_text b [Code "sig"]; - ( - match mt with - None -> - ( - match modu with - None -> - bs b "<div class=\"sig_block\">"; - List.iter (self#html_of_module_element b father) eles; - bs b "</div>" - | Some m -> - let (html_file, _) = Naming.html_files m.m_name in - bp b " <a href=\"%s\">..</a> " html_file - ) - | Some mt -> - let (html_file, _) = Naming.html_files mt.mt_name in - bp b " <a href=\"%s\">..</a> " html_file - ); - self#html_of_text b [Code "end"] + Module_type_struct eles -> + self#html_of_text b [Code "sig"]; + ( + match mt with + None -> + ( + match modu with + None -> + bs b "<div class=\"sig_block\">"; + List.iter (self#html_of_module_element b father) eles; + bs b "</div>" + | Some m -> + let (html_file, _) = Naming.html_files m.m_name in + bp b " <a href=\"%s\">..</a> " html_file + ) + | Some mt -> + let (html_file, _) = Naming.html_files mt.mt_name in + bp b " <a href=\"%s\">..</a> " html_file + ); + self#html_of_text b [Code "end"] | Module_type_functor (p, k) -> - self#html_of_module_parameter b father p; - self#html_of_module_type_kind b father ?modu ?mt k + self#html_of_module_parameter b father p; + self#html_of_module_type_kind b father ?modu ?mt k | Module_type_alias a -> - bs b "<code class=\"type\">"; - bs b (self#create_fully_qualified_module_idents_links father a.mta_name); - bs b "</code>" + bs b "<code class=\"type\">"; + bs b (self#create_fully_qualified_module_idents_links father a.mta_name); + bs b "</code>" | Module_type_with (k, s) -> - self#html_of_module_type_kind b father ?modu ?mt k; - bs b "<code class=\"type\"> "; - bs b (self#create_fully_qualified_module_idents_links father s); - bs b "</code>" + self#html_of_module_type_kind b father ?modu ?mt k; + bs b "<code class=\"type\"> "; + bs b (self#create_fully_qualified_module_idents_links father s); + bs b "</code>" (** Print html code to display the type of a module parameter.. *) method html_of_module_parameter_type b m_name p = @@ -1262,11 +1280,11 @@ class html = bp b "<a name=\"%s\"></a>" (Naming.value_target v); ( match v.val_code with - None -> bs b (Name.simple v.val_name) + None -> bs b (self#escape (Name.simple v.val_name)) | Some c -> let file = Naming.file_code_value_complete_target v in self#output_code v.val_name (Filename.concat !Args.target_dir file) c; - bp b "<a href=\"%s\">%s</a>" file (Name.simple v.val_name) + bp b "<a href=\"%s\">%s</a>" file (self#escape (Name.simple v.val_name)) ); bs b " : "; self#html_of_type_expr b (Name.father v.val_name) v.val_type; @@ -1287,26 +1305,26 @@ class html = bs b " "; (* html mark *) bp b "<a name=\"%s\"></a>%s" - (Naming.exception_target e) - (Name.simple e.ex_name); + (Naming.exception_target e) + (Name.simple e.ex_name); ( match e.ex_args with [] -> () | _ -> bs b (" "^(self#keyword "of")^" "); self#html_of_type_expr_list - ~par: false b (Name.father e.ex_name) " * " e.ex_args + ~par: false b (Name.father e.ex_name) " * " e.ex_args ); ( match e.ex_alias with None -> () | Some ea -> - bs b " = "; + bs b " = "; ( match ea.ea_ex with None -> bs b ea.ea_name | Some e -> - bp b "<a href=\"%s\">%s</a>" (Naming.complete_exception_target e) e.ex_name + bp b "<a href=\"%s\">%s</a>" (Naming.complete_exception_target e) e.ex_name ) ); bs b "</pre>\n"; @@ -1317,14 +1335,14 @@ class html = Odoc_info.reset_type_names (); let father = Name.father t.ty_name in bs b - (match t.ty_manifest, t.ty_kind with - None, Type_abstract -> "<pre>" - | None, Type_variant _ - | None, Type_record _ -> "<br><code>" - | Some _, Type_abstract -> "<pre>" - | Some _, Type_variant _ - | Some _, Type_record _ -> "<pre>" - ); + (match t.ty_manifest, t.ty_kind with + None, Type_abstract -> "<pre>" + | None, Type_variant _ + | None, Type_record _ -> "<br><code>" + | Some _, Type_abstract -> "<pre>" + | Some _, Type_variant _ + | Some _, Type_record _ -> "<pre>" + ); bs b ((self#keyword "type")^" "); (* html mark *) bp b "<a name=\"%s\"></a>" (Naming.type_target t); @@ -1333,82 +1351,82 @@ class html = bs b ((Name.simple t.ty_name)^" "); ( match t.ty_manifest with - None -> () + None -> () | Some typ -> - bs b "= "; - self#html_of_type_expr b father typ; - bs b " " + bs b "= "; + self#html_of_type_expr b father typ; + bs b " " ); (match t.ty_kind with Type_abstract -> bs b "</pre>" | Type_variant (l, priv) -> bs b "= "; - if priv then bs b "private" ; - bs b - ( - match t.ty_manifest with - None -> "</code>" - | Some _ -> "</pre>" - ); + if priv then bs b "private" ; + bs b + ( + match t.ty_manifest with + None -> "</code>" + | Some _ -> "</pre>" + ); bs b "<table class=\"typetable\">\n"; - let print_one constr = + let print_one constr = bs b "<tr>\n<td align=\"left\" valign=\"top\" >\n"; bs b "<code>"; - bs b (self#keyword "|"); + bs b (self#keyword "|"); bs b "</code></td>\n<td align=\"left\" valign=\"top\" >\n"; bs b "<code>"; - bs b (self#constructor constr.vc_name); + bs b (self#constructor constr.vc_name); ( - match constr.vc_args with + match constr.vc_args with [] -> () | l -> - bs b (" " ^ (self#keyword "of") ^ " "); - self#html_of_type_expr_list ~par: false b father " * " l; + bs b (" " ^ (self#keyword "of") ^ " "); + self#html_of_type_expr_list ~par: false b father " * " l; ); bs b "</code></td>\n"; ( - match constr.vc_text with + match constr.vc_text with None -> () | Some t -> - bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"top\" >"; - bs b "<code>"; - bs b "(*"; - bs b "</code></td>"; - bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"top\" >"; - self#html_of_text b t; - bs b "</td>"; - bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"bottom\" >"; - bs b "<code>"; - bs b "*)"; - bs b "</code></td>"; + bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"top\" >"; + bs b "<code>"; + bs b "(*"; + bs b "</code></td>"; + bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"top\" >"; + self#html_of_text b t; + bs b "</td>"; + bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"bottom\" >"; + bs b "<code>"; + bs b "*)"; + bs b "</code></td>"; ); bs b "\n</tr>" - in - print_concat b "\n" print_one l; + in + print_concat b "\n" print_one l; bs b "</table>\n" | Type_record (l, priv) -> bs b "= "; - if priv then bs b "private " ; - bs b "{"; - bs b - ( - match t.ty_manifest with - None -> "</code>" - | Some _ -> "</pre>" - ); + if priv then bs b "private " ; + bs b "{"; + bs b + ( + match t.ty_manifest with + None -> "</code>" + | Some _ -> "</pre>" + ); bs b "<table class=\"typetable\">\n" ; - let print_one r = + let print_one r = bs b "<tr>\n<td align=\"left\" valign=\"top\" >\n"; bs b "<code> </code>"; bs b "</td>\n<td align=\"left\" valign=\"top\" >\n"; bs b "<code>"; - if r.rf_mutable then bs b (self#keyword "mutable ") ; + if r.rf_mutable then bs b (self#keyword "mutable ") ; bs b (r.rf_name ^ " : ") ; - self#html_of_type_expr b father r.rf_type; + self#html_of_type_expr b father r.rf_type; bs b ";</code></td>\n"; ( - match r.rf_text with + match r.rf_text with None -> () | Some t -> bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"top\" >"; @@ -1416,13 +1434,13 @@ class html = bs b "(*"; bs b "</code></td>"; bs b "<td class=\"typefieldcomment\" align=\"left\" valign=\"top\" >"; - self#html_of_text b t; + self#html_of_text b t; bs b "</td><td class=\"typefieldcomment\" align=\"left\" valign=\"bottom\" >"; bs b "<code>*)</code></td>"; - ); + ); bs b "\n</tr>" - in - print_concat b "\n" print_one l; + in + print_concat b "\n" print_one l; bs b "</table>\n}\n" ); bs b "\n"; @@ -1439,9 +1457,9 @@ class html = bp b "<a name=\"%s\"></a>" (Naming.attribute_target a); ( if a.att_mutable then - bs b ((self#keyword Odoc_messages.mutab)^ " ") + bs b ((self#keyword Odoc_messages.mutab)^ " ") else - () + () ); ( match a.att_value.val_code with @@ -1480,10 +1498,10 @@ class html = ( if !Args.with_parameter_list then self#html_of_parameter_list b - module_name m.met_value.val_parameters + module_name m.met_value.val_parameters else self#html_of_described_parameter_list b - module_name m.met_value.val_parameters + module_name m.met_value.val_parameters ) (** Print html code for the description of a function parameter. *) @@ -1501,19 +1519,19 @@ class html = | l -> (* A list of names, we display those with a description. *) let l2 = List.filter - (fun n -> (Parameter.desc_by_name p n) <> None) - l - in - let print_one n = - match Parameter.desc_by_name p n with + (fun n -> (Parameter.desc_by_name p n) <> None) + l + in + let print_one n = + match Parameter.desc_by_name p n with None -> () | Some t -> - bs b "<code>"; - bs b n; - bs b "</code> : "; - self#html_of_text b t - in - print_concat b "<br>\n" print_one l2 + bs b "<code>"; + bs b n; + bs b "</code> : "; + self#html_of_text b t + in + print_concat b "<br>\n" print_one l2 (** Print html code for a list of parameters. *) method html_of_parameter_list b m_name l = @@ -1523,25 +1541,25 @@ class html = bs b "<div class=\"param_info\">"; bs b "<table border=\"0\" cellpadding=\"3\" width=\"100%\">\n"; bs b "<tr>\n<td align=\"left\" valign=\"top\" width=\"1%\">"; - bs b "<b>"; - bs b Odoc_messages.parameters; - bs b ": </b></td>\n" ; + bs b "<b>"; + bs b Odoc_messages.parameters; + bs b ": </b></td>\n" ; bs b "<td>\n<table class=\"paramstable\">\n"; - let print_one p = + let print_one p = bs b "<tr>\n<td align=\"center\" valign=\"top\" width=\"15%\" class=\"code\">\n"; bs b - ( - match Parameter.complete_name p with - "" -> "?" + ( + match Parameter.complete_name p with + "" -> "?" | s -> s ); - bs b "</td>\n<td align=\"center\" valign=\"top\">:</td>\n"; + bs b "</td>\n<td align=\"center\" valign=\"top\">:</td>\n"; bs b "<td>"; - self#html_of_type_expr b m_name (Parameter.typ p); - bs b "<br>\n"; + self#html_of_type_expr b m_name (Parameter.typ p); + bs b "<br>\n"; self#html_of_parameter_description b p; - bs b "\n</tr>\n"; - in + bs b "\n</tr>\n"; + in List.iter print_one l; bs b "</table>\n</td>\n</tr>\n</table></div>\n" @@ -1557,10 +1575,10 @@ class html = in let f p = bs b "<div class=\"param_info\"><code class=\"code\">"; - bs b (Parameter.complete_name p); - bs b "</code> : " ; + bs b (Parameter.complete_name p); + bs b "</code> : " ; self#html_of_parameter_description b p; - bs b "</div>\n" + bs b "</div>\n" in List.iter f l2 @@ -1573,28 +1591,28 @@ class html = bs b "<table border=\"0\" cellpadding=\"3\" width=\"100%\">\n"; bs b "<tr>\n"; bs b "<td align=\"left\" valign=\"top\" width=\"1%%\"><b>"; - bs b Odoc_messages.parameters ; - bs b ": </b></td>\n<td>\n"; + bs b Odoc_messages.parameters ; + bs b ": </b></td>\n<td>\n"; bs b "<table class=\"paramstable\">\n"; - List.iter + List.iter (fun (p, desc_opt) -> bs b "<tr>\n"; bs b "<td align=\"center\" valign=\"top\" width=\"15%\">\n<code>" ; - bs b p.mp_name; + bs b p.mp_name; bs b "</code></td>\n" ; bs b "<td align=\"center\" valign=\"top\">:</td>\n"; bs b "<td>" ; - self#html_of_module_parameter_type b m_name p; - bs b "\n"; + self#html_of_module_parameter_type b m_name p; + bs b "\n"; ( - match desc_opt with + match desc_opt with None -> () | Some t -> - bs b "<br>"; - self#html_of_text b t; - bs b "\n</tr>\n" ; + bs b "<br>"; + self#html_of_text b t; + bs b "\n</tr>\n" ; ) - ) + ) l; bs b "</table>\n</td>\n</tr>\n</table>\n" @@ -1615,11 +1633,11 @@ class html = bs b "</pre>"; if info then ( - if complete then - self#html_of_info ~indent: false - else - self#html_of_info_first_sentence - ) b m.m_info + if complete then + self#html_of_info ~indent: false + else + self#html_of_info_first_sentence + ) b m.m_info else () @@ -1638,17 +1656,17 @@ class html = (match mt.mt_kind with None -> () | Some k -> - bs b " = "; - self#html_of_module_type_kind b father ~mt k + bs b " = "; + self#html_of_module_type_kind b father ~mt k ); bs b "</pre>"; if info then ( - if complete then - self#html_of_info ~indent: false - else - self#html_of_info_first_sentence - ) b mt.mt_info + if complete then + self#html_of_info ~indent: false + else + self#html_of_info_first_sentence + ) b mt.mt_info else () @@ -1687,39 +1705,39 @@ class html = method html_of_class_kind b father ?cl kind = match kind with Class_structure (inh, eles) -> - self#html_of_text b [Code "object"]; - ( - match cl with - None -> - bs b "\n"; - ( - match inh with - [] -> () - | _ -> - self#generate_inheritance_info b inh - ); - List.iter (self#html_of_class_element b) eles; - | Some cl -> - let (html_file, _) = Naming.html_files cl.cl_name in - bp b " <a href=\"%s\">..</a> " html_file - ); - self#html_of_text b [Code "end"] + self#html_of_text b [Code "object"]; + ( + match cl with + None -> + bs b "\n"; + ( + match inh with + [] -> () + | _ -> + self#generate_inheritance_info b inh + ); + List.iter (self#html_of_class_element b) eles; + | Some cl -> + let (html_file, _) = Naming.html_files cl.cl_name in + bp b " <a href=\"%s\">..</a> " html_file + ); + self#html_of_text b [Code "end"] | Class_apply capp -> - (* TODO: afficher le type final à partir du typedtree *) - self#html_of_text b [Raw "class application not handled yet"] + (* TODO: afficher le type final à partir du typedtree *) + self#html_of_text b [Raw "class application not handled yet"] | Class_constr cco -> - ( + ( match cco.cco_type_parameters with [] -> () | l -> self#html_of_class_type_param_expr_list b father l; - bs b " " - ); - bs b "<code class=\"type\">"; - bs b (self#create_fully_qualified_idents_links father cco.cco_name); - bs b "</code>" + bs b " " + ); + bs b "<code class=\"type\">"; + bs b (self#create_fully_qualified_idents_links father cco.cco_name); + bs b "</code>" | Class_constraint (ck, ctk) -> self#html_of_text b [Code "( "] ; @@ -1735,30 +1753,30 @@ class html = match cta.cta_type_parameters with [] -> () | l -> - self#html_of_class_type_param_expr_list b father l; - bs b " " + self#html_of_class_type_param_expr_list b father l; + bs b " " ); bs b "<code class=\"type\">"; - bs b (self#create_fully_qualified_idents_links father cta.cta_name); - bs b "</code>" + bs b (self#create_fully_qualified_idents_links father cta.cta_name); + bs b "</code>" | Class_signature (inh, eles) -> - self#html_of_text b [Code "object"]; - ( - match ct with - None -> - bs b "\n"; - ( - match inh with - [] -> () - | _ -> self#generate_inheritance_info b inh - ); - List.iter (self#html_of_class_element b) eles - | Some ct -> - let (html_file, _) = Naming.html_files ct.clt_name in - bp b " <a href=\"%s\">..</a> " html_file - ); - self#html_of_text b [Code "end"] + self#html_of_text b [Code "object"]; + ( + match ct with + None -> + bs b "\n"; + ( + match inh with + [] -> () + | _ -> self#generate_inheritance_info b inh + ); + List.iter (self#html_of_class_element b) eles + | Some ct -> + let (html_file, _) = Naming.html_files ct.clt_name in + bp b " <a href=\"%s\">..</a> " html_file + ); + self#html_of_text b [Code "end"] (** Print html code for a class. *) method html_of_class b ?(complete=true) ?(with_link=true) c = @@ -1775,9 +1793,9 @@ class html = ty_info = None ; ty_parameters = [] ; ty_kind = Type_abstract ; ty_manifest = None ; ty_loc = Odoc_info.dummy_loc ; - ty_code = None ; - } - ); + ty_code = None ; + } + ); print_DEBUG "html#html_of_class : virtual or not" ; if c.cl_virtual then bs b ((self#keyword "virtual")^" "); ( @@ -1785,7 +1803,7 @@ class html = [] -> () | l -> self#html_of_class_type_param_expr_list b father l; - bs b " " + bs b " " ); print_DEBUG "html#html_of_class : with link or not" ; ( @@ -1802,9 +1820,9 @@ class html = print_DEBUG "html#html_of_class : info" ; ( if complete then - self#html_of_info ~indent: false + self#html_of_info ~indent: false else - self#html_of_info_first_sentence + self#html_of_info_first_sentence ) b c.cl_info (** Print html code for a class type. *) @@ -1822,16 +1840,16 @@ class html = ty_info = None ; ty_parameters = [] ; ty_kind = Type_abstract ; ty_manifest = None ; ty_loc = Odoc_info.dummy_loc ; - ty_code = None ; - } - ); + ty_code = None ; + } + ); if ct.clt_virtual then bs b ((self#keyword "virtual")^" "); ( match ct.clt_type_parameters with [] -> () | l -> - self#html_of_class_type_param_expr_list b father l; - bs b " " + self#html_of_class_type_param_expr_list b father l; + bs b " " ); if with_link then @@ -1844,9 +1862,9 @@ class html = bs b "</pre>"; ( if complete then - self#html_of_info ~indent: false + self#html_of_info ~indent: false else - self#html_of_info_first_sentence + self#html_of_info_first_sentence ) b ct.clt_info (** Return html code to represent a dag, represented as in Odoc_dag2html. *) @@ -1953,12 +1971,12 @@ class html = fun elements name info target title simple_file -> try let chanout = open_out (Filename.concat !Args.target_dir simple_file) in - let b = new_buf () in - bs b "<html>\n"; + let b = new_buf () in + bs b "<html>\n"; self#print_header b (self#inner_title title); - bs b "<body>\n<center><h1>"; - bs b title; - bs b "</h1></center>\n" ; + bs b "<body>\n<center><h1>"; + bs b title; + bs b "</h1></center>\n" ; let sorted_elements = List.sort (fun e1 e2 -> compare (Name.simple (name e1)) (Name.simple (name e2))) @@ -1968,12 +1986,12 @@ class html = let f_ele e = let simple_name = Name.simple (name e) in let father_name = Name.father (name e) in - bp b "<tr><td><a href=\"%s\">%s</a> " (target e) simple_name; + bp b "<tr><td><a href=\"%s\">%s</a> " (target e) (self#escape simple_name); if simple_name <> father_name && father_name <> "" then bp b "[<a href=\"%s\">%s</a>]" (fst (Naming.html_files father_name)) father_name; bs b "</td>\n<td>"; - self#html_of_info_first_sentence b (info e); - bs b "</td></tr>\n"; + self#html_of_info_first_sentence b (info e); + bs b "</td></tr>\n"; in let f_group l = match l with @@ -1985,15 +2003,15 @@ class html = | _ -> "" in bs b "<tr><td align=\"left\"><br>"; - bs b s ; - bs b "</td></tr>\n" ; + bs b s ; + bs b "</td></tr>\n" ; List.iter f_ele l in bs b "<table>\n"; List.iter f_group groups ; bs b "</table><br>\n" ; bs b "</body>\n</html>"; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with Sys_error s -> @@ -2019,34 +2037,35 @@ class html = let type_file = Naming.file_type_class_complete_target cl.cl_name in try let chanout = open_out (Filename.concat !Args.target_dir html_file) in - let b = new_buf () in + let b = new_buf () in let pre_name = opt (fun c -> c.cl_name) pre in let post_name = opt (fun c -> c.cl_name) post in - bs b "<html>\n"; + bs b doctype ; + bs b "<html>\n"; self#print_header b ~nav: (Some (pre_name, post_name, cl.cl_name)) ~comments: (Class.class_comments cl) (self#inner_title cl.cl_name); - bs b "<body>\n"; + bs b "<body>\n"; self#print_navbar b pre_name post_name cl.cl_name; bs b "<center><h1>"; - bs b (Odoc_messages.clas^" "); + bs b (Odoc_messages.clas^" "); if cl.cl_virtual then bs b "virtual " ; bp b "<a href=\"%s\">%s</a>" type_file cl.cl_name; bs b "</h1></center>\n<br>\n"; self#html_of_class b ~with_link: false cl; (* parameters *) self#html_of_described_parameter_list b - (Name.father cl.cl_name) cl.cl_parameters; + (Name.father cl.cl_name) cl.cl_parameters; (* class inheritance *) - self#generate_class_inheritance_info b cl; + self#generate_class_inheritance_info b cl; (* a horizontal line *) bs b "<hr width=\"100%\">\n"; (* the various elements *) List.iter (self#html_of_class_element b) (Class.class_elements ~trans:false cl); bs b "</body></html>"; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout; (* generate the file with the complete class type *) @@ -2065,10 +2084,11 @@ class html = let type_file = Naming.file_type_class_complete_target clt.clt_name in try let chanout = open_out (Filename.concat !Args.target_dir html_file) in - let b = new_buf () in + let b = new_buf () in let pre_name = opt (fun ct -> ct.clt_name) pre in let post_name = opt (fun ct -> ct.clt_name) post in - bs b "<html>\n"; + bs b doctype ; + bs b "<html>\n"; self#print_header b ~nav: (Some (pre_name, post_name, clt.clt_name)) ~comments: (Class.class_type_comments clt) @@ -2077,7 +2097,7 @@ class html = bs b "<body>\n"; self#print_navbar b pre_name post_name clt.clt_name; bs b "<center><h1>"; - bs b (Odoc_messages.class_type^" "); + bs b (Odoc_messages.class_type^" "); if clt.clt_virtual then bs b "virtual "; bp b "<a href=\"%s\">%s</a>" type_file clt.clt_name; bs b "</h1></center>\n<br>\n"; @@ -2091,7 +2111,7 @@ class html = List.iter (self#html_of_class_element b) (Class.class_type_elements ~trans: false clt); bs b "</body></html>"; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout; (* generate the file with the complete class type *) @@ -2110,10 +2130,11 @@ class html = let (html_file, _) = Naming.html_files mt.mt_name in let type_file = Naming.file_type_module_complete_target mt.mt_name in let chanout = open_out (Filename.concat !Args.target_dir html_file) in - let b = new_buf () in + let b = new_buf () in let pre_name = opt (fun mt -> mt.mt_name) pre in let post_name = opt (fun mt -> mt.mt_name) post in - bs b "<html>\n"; + bs b doctype ; + bs b "<html>\n"; self#print_header b ~nav: (Some (pre_name, post_name, mt.mt_name)) ~comments: (Module.module_type_comments mt) @@ -2121,9 +2142,9 @@ class html = bs b "<body>\n"; self#print_navbar b pre_name post_name mt.mt_name; bp b "<center><h1>"; - bs b (Odoc_messages.module_type^" "); + bs b (Odoc_messages.module_type^" "); ( - match mt.mt_type with + match mt.mt_type with Some _ -> bp b "<a href=\"%s\">%s</a>" type_file mt.mt_name | None-> bs b mt.mt_name ); @@ -2132,17 +2153,17 @@ class html = (* parameters for functors *) self#html_of_module_parameter_list b - (Name.father mt.mt_name) - (Module.module_type_parameters mt); + (Name.father mt.mt_name) + (Module.module_type_parameters mt); (* a horizontal line *) bs b "<hr width=\"100%\">\n"; (* module elements *) List.iter - (self#html_of_module_element b (Name.father mt.mt_name)) + (self#html_of_module_element b (Name.father mt.mt_name)) (Module.module_type_elements mt); bs b "</body></html>"; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout; (* generate html files for submodules *) @@ -2159,7 +2180,7 @@ class html = match mt.mt_type with None -> () | Some mty -> - self#output_module_type + self#output_module_type mt.mt_name (Filename.concat !Args.target_dir type_file) mty @@ -2177,41 +2198,47 @@ class html = let type_file = Naming.file_type_module_complete_target modu.m_name in let code_file = Naming.file_code_module_complete_target modu.m_name in let chanout = open_out (Filename.concat !Args.target_dir html_file) in - let b = new_buf () in + let b = new_buf () in let pre_name = opt (fun m -> m.m_name) pre in let post_name = opt (fun m -> m.m_name) post in - bs b "<html>\n"; + bs b doctype ; + bs b "<html>\n"; self#print_header b ~nav: (Some (pre_name, post_name, modu.m_name)) ~comments: (Module.module_comments modu) (self#inner_title modu.m_name); - bs b "<body>\n" ; + bs b "<body>\n" ; self#print_navbar b pre_name post_name modu.m_name ; bs b "<center><h1>"; - bs b + if modu.m_text_only then + bs b modu.m_name + else ( - if Module.module_is_functor modu then - Odoc_messages.functo - else - Odoc_messages.modul + bs b + ( + if Module.module_is_functor modu then + Odoc_messages.functo + else + Odoc_messages.modul + ); + bp b " <a href=\"%s\">%s</a>" type_file modu.m_name; + ( + match modu.m_code with + None -> () + | Some _ -> bp b " (<a href=\"%s\">.ml</a>)" code_file + ) ); - bp b " <a href=\"%s\">%s</a>" type_file modu.m_name; - ( - match modu.m_code with - None -> () - | Some _ -> bp b " (<a href=\"%s\">.ml</a>)" code_file - ); bs b "</h1></center>\n<br>\n"; - self#html_of_module b ~with_link: false modu; + if not modu.m_text_only then self#html_of_module b ~with_link: false modu; (* parameters for functors *) self#html_of_module_parameter_list b - (Name.father modu.m_name) - (Module.module_parameters modu); + (Name.father modu.m_name) + (Module.module_parameters modu); (* a horizontal line *) - bs b "<hr width=\"100%\">\n"; + if not modu.m_text_only then bs b "<hr width=\"100%\">\n"; (* module elements *) List.iter @@ -2219,7 +2246,7 @@ class html = (Module.module_elements modu); bs b "</body></html>"; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout; (* generate html files for submodules *) @@ -2237,43 +2264,45 @@ class html = (Filename.concat !Args.target_dir type_file) modu.m_type; - match modu.m_code with - None -> () - | Some code -> - self#output_code - modu.m_name - (Filename.concat !Args.target_dir code_file) - code + match modu.m_code with + None -> () + | Some code -> + self#output_code + modu.m_name + (Filename.concat !Args.target_dir code_file) + code with Sys_error s -> raise (Failure s) - (** Generate the [index.html] file corresponding to the given module list. + (** Generate the [<index_prefix>.html] file corresponding to the given module list. @raise Failure if an error occurs.*) method generate_index module_list = try let chanout = open_out (Filename.concat !Args.target_dir self#index) in - let b = new_buf () in + let b = new_buf () in let title = match !Args.title with None -> "" | Some t -> self#escape t in - bs b "<html>\n"; + bs b doctype ; + bs b "<html>\n"; self#print_header b self#title; bs b "<body>\n"; bs b "<center><h1>"; - bs b title; - bs b "</h1></center>\n" ; - let info = Odoc_info.apply_opt - Odoc_info.info_of_comment_file !Odoc_info.Args.intro_file - in - ( - match info with - None -> - self#html_of_Index_list b; - bs b "<br/>"; - self#html_of_Module_list b - (List.map (fun m -> m.m_name) module_list) - | Some i -> self#html_of_info ~indent: false b info - ); - Buffer.output_buffer chanout b; + bs b title; + bs b "</h1></center>\n" ; + let info = Odoc_info.apply_opt + Odoc_info.info_of_comment_file !Odoc_info.Args.intro_file + in + ( + match info with + None -> + self#html_of_Index_list b; + bs b "<br/>"; + self#html_of_Module_list b + (List.map (fun m -> m.m_name) module_list); + bs b "</body>\n</html>" + | Some i -> self#html_of_info ~indent: false b info + ); + Buffer.output_buffer chanout b; close_out chanout with Sys_error s -> @@ -2370,7 +2399,7 @@ class html = self#index_module_types (** Generate all the html files from a module list. The main - file is [index.html]. *) + file is [<index_prefix>.html]. *) method generate module_list = (* init the style *) self#init_style ; @@ -2390,36 +2419,36 @@ class html = (* Get the names of all known types. *) let types = Odoc_info.Search.types module_list in known_types_names <- - List.fold_left - (fun acc t -> StringSet.add t.ty_name acc) - known_types_names - types ; + List.fold_left + (fun acc t -> StringSet.add t.ty_name acc) + known_types_names + types ; (* Get the names of all class and class types. *) let classes = Odoc_info.Search.classes module_list in let class_types = Odoc_info.Search.class_types module_list in known_classes_names <- - List.fold_left - (fun acc c -> StringSet.add c.cl_name acc) - known_classes_names - classes ; + List.fold_left + (fun acc c -> StringSet.add c.cl_name acc) + known_classes_names + classes ; known_classes_names <- - List.fold_left - (fun acc ct -> StringSet.add ct.clt_name acc) - known_classes_names - class_types ; + List.fold_left + (fun acc ct -> StringSet.add ct.clt_name acc) + known_classes_names + class_types ; (* Get the names of all known modules and module types. *) let module_types = Odoc_info.Search.module_types module_list in let modules = Odoc_info.Search.modules module_list in known_modules_names <- - List.fold_left - (fun acc m -> StringSet.add m.m_name acc) - known_modules_names - modules ; + List.fold_left + (fun acc m -> StringSet.add m.m_name acc) + known_modules_names + modules ; known_modules_names <- - List.fold_left - (fun acc mt -> StringSet.add mt.mt_name acc) - known_modules_names - module_types ; + List.fold_left + (fun acc mt -> StringSet.add mt.mt_name acc) + known_modules_names + module_types ; (* generate html for each module *) if not !Args.index_only then self#generate_elements self#generate_for_module module_list ; @@ -2443,10 +2472,8 @@ class html = initializer Odoc_ocamlhtml.html_of_comment := (fun s -> - let b = new_buf () in - self#html_of_text b (Odoc_text.Texter.text_of_string s); - Buffer.contents b - ) + let b = new_buf () in + self#html_of_text b (Odoc_text.Texter.text_of_string s); + Buffer.contents b + ) end - -(* eof $Id$ *) diff --git a/ocamldoc/odoc_info.ml b/ocamldoc/odoc_info.ml index 48801bb96..d7454c1aa 100644 --- a/ocamldoc/odoc_info.ml +++ b/ocamldoc/odoc_info.ml @@ -48,6 +48,7 @@ and text_element = Odoc_types.text_element = | Subscript of text | Module_list of string list | Index_list + | Custom of string * text and text = text_element list @@ -226,8 +227,8 @@ let info_string_of_info i = List.iter (fun (sref, t) -> p b "\n@see %s %s" - (escape_arobas (f_see_ref sref)) - (escape_arobas (text_string_of_text t)) + (escape_arobas (f_see_ref sref)) + (escape_arobas (text_string_of_text t)) ) i.i_sees ); @@ -241,20 +242,20 @@ let info_string_of_info i = None -> () | Some t -> p b "\n@deprecated %s" - (escape_arobas (text_string_of_text t)) + (escape_arobas (text_string_of_text t)) ); List.iter (fun (s, t) -> p b "\n@param %s %s" - (escape_arobas s) - (escape_arobas (text_string_of_text t)) + (escape_arobas s) + (escape_arobas (text_string_of_text t)) ) i.i_params; List.iter (fun (s, t) -> p b "\n@raise %s %s" - (escape_arobas s) - (escape_arobas (text_string_of_text t)) + (escape_arobas s) + (escape_arobas (text_string_of_text t)) ) i.i_raised_exceptions; ( @@ -262,45 +263,19 @@ let info_string_of_info i = None -> () | Some t -> p b "\n@return %s" - (escape_arobas (text_string_of_text t)) + (escape_arobas (text_string_of_text t)) ); List.iter (fun (s, t) -> p b "\n@%s %s" s - (escape_arobas (text_string_of_text t)) + (escape_arobas (text_string_of_text t)) ) i.i_custom; Buffer.contents b -let info_of_string s = - let dummy = - { - i_desc = None ; - i_authors = [] ; - i_version = None ; - i_sees = [] ; - i_since = None ; - i_deprecated = None ; - i_params = [] ; - i_raised_exceptions = [] ; - i_return_value = None ; - i_custom = [] ; - } - in - let s2 = Printf.sprintf "(** %s *)" s in - let (_, i_opt) = Odoc_comments.Basic_info_retriever.first_special "-" s2 in - match i_opt with - None -> dummy - | Some i -> i - -let info_of_comment_file f = - try - let s = Odoc_misc.input_file_as_string f in - info_of_string s - with - Sys_error s -> - failwith s +let info_of_string = Odoc_comments.info_of_string +let info_of_comment_file = Odoc_comments.info_of_comment_file module Search = struct diff --git a/ocamldoc/odoc_info.mli b/ocamldoc/odoc_info.mli index b6eb967c5..ae849fa56 100644 --- a/ocamldoc/odoc_info.mli +++ b/ocamldoc/odoc_info.mli @@ -52,6 +52,7 @@ and text_element = Odoc_types.text_element = | Module_list of string list (** The table of the given modules with their abstract. *) | Index_list (** The links to the various indexes (values, types, ...) *) + | Custom of string * text (** to extend \{foo syntax *) (** A text is a list of [text_element]. The order matters. *) and text = text_element list @@ -452,6 +453,7 @@ module Module : mutable m_top_deps : Name.t list ; (** The toplevels module names this module depends on. *) mutable m_code : string option ; (** The whole code of the module *) mutable m_code_intf : string option ; (** The whole code of the interface of the module *) + m_text_only : bool ; (** [true] if the module comes from a text file *) } and module_type_alias = Odoc_module.module_type_alias = @@ -919,6 +921,7 @@ module Args : type source_file = Impl_file of string | Intf_file of string + | Text_file of string (** The class type of documentation generators. *) class type doc_generator = diff --git a/ocamldoc/odoc_latex.ml b/ocamldoc/odoc_latex.ml index 09f73dac2..26dfb667f 100644 --- a/ocamldoc/odoc_latex.ml +++ b/ocamldoc/odoc_latex.ml @@ -15,12 +15,12 @@ let print_DEBUG s = print_string s ; print_newline () -open Odoc_info +open Odoc_info open Parameter open Value open Type open Exception -open Class +open Class open Module let new_buf () = Buffer.create 1024 @@ -28,7 +28,7 @@ let new_fmt () = let b = new_buf () in let fmt = Format.formatter_of_buffer b in (fmt, - fun () -> + fun () -> Format.pp_print_flush fmt (); let s = Buffer.contents b in Buffer.reset b; @@ -47,9 +47,9 @@ let print_concat fmt sep f = [] -> () | [c] -> f c | c :: q -> - f c; - ps fmt sep; - iter q + f c; + ps fmt sep; + iter q in iter @@ -59,7 +59,7 @@ class text = (** Return latex code to make a sectionning according to the given level, and with the given latex code. *) method section_style level s = - try + try let sec = List.assoc level !Args.latex_titles in "\\"^sec^"{"^s^"}\n" with Not_found -> s @@ -103,15 +103,15 @@ class text = ("\\\\", "MAXENCE"^"XXX") ; ("&", "MAXENCE"^"YYY") ; ("\\$", "MAXENCE"^"ZZZ") - ] + ] - val mutable subst_strings_simple = - [ + val mutable subst_strings_simple = + [ ("MAXENCE"^"XXX", "{\\textbackslash}") ; "}", "\\}" ; "{", "\\{" ; ("\\\\", "MAXENCE"^"XXX") ; - ] + ] val mutable subst_strings_code = [ ("MAXENCE"^"ZZZ", "\\$"); @@ -128,7 +128,7 @@ class text = ("&", "MAXENCE"^"YYY") ; ("\\$", "MAXENCE"^"ZZZ") ; ("\\\\", "MAXENCE"^"XXX") ; - ] + ] method subst l s = List.fold_right @@ -144,7 +144,7 @@ class text = (** Escape some characters for the code style. *) method escape_code s = self#subst subst_strings_code s - + (** Make a correct latex label from a name. *) (* The following characters are forbidden in LaTeX \index: \ { } $ & # ^ _ % ~ ! " @ | (" to close the double quote) @@ -157,14 +157,14 @@ class text = let buf = Buffer.create len in for i = 0 to len - 1 do let (s_no_, s) = - match name.[i] with + match name.[i] with '_' -> ("-underscore", "_") | '~' -> ("-tilde", "~") - | '%' -> ("-percent", "%") + | '%' -> ("-percent", "%") | '@' -> ("-at", "\"@") | '!' -> ("-bang", "\"!") | '|' -> ("-pipe", "\"|") - | '<' -> ("-lt", "<") + | '<' -> ("-lt", "<") | '>' -> ("-gt", ">") | '^' -> ("-exp", "^") | '&' -> ("-ampersand", "&") @@ -176,8 +176,8 @@ class text = | '=' -> ("-equal", "=") | ':' -> ("-colon", ":") | c -> (String.make 1 c, String.make 1 c) - in - Buffer.add_string buf (if no_ then s_no_ else s) + in + Buffer.add_string buf (if no_ then s_no_ else s) done; Buffer.contents buf @@ -215,9 +215,9 @@ class text = method make_ref label = "\\ref{"^label^"}" (** Print the LaTeX code corresponding to the [text] parameter.*) - method latex_of_text fmt t = + method latex_of_text fmt t = List.iter (self#latex_of_text_element fmt) t - + (** Print the LaTeX code for the [text_element] in parameter. *) method latex_of_text_element fmt te = match te with @@ -226,7 +226,7 @@ class text = | Odoc_info.CodePre s -> self#latex_of_CodePre fmt s | Odoc_info.Verbatim s -> self#latex_of_Verbatim fmt s | Odoc_info.Bold t -> self#latex_of_Bold fmt t - | Odoc_info.Italic t -> self#latex_of_Italic fmt t + | Odoc_info.Italic t -> self#latex_of_Italic fmt t | Odoc_info.Emphasize t -> self#latex_of_Emphasize fmt t | Odoc_info.Center t -> self#latex_of_Center fmt t | Odoc_info.Left t -> self#latex_of_Left fmt t @@ -241,13 +241,16 @@ class text = | Odoc_info.Ref (name, ref_opt) -> self#latex_of_Ref fmt name ref_opt | Odoc_info.Superscript t -> self#latex_of_Superscript fmt t | Odoc_info.Subscript t -> self#latex_of_Subscript fmt t - | Odoc_info.Module_list _ -> () - | Odoc_info.Index_list -> () + | Odoc_info.Module_list _ -> () + | Odoc_info.Index_list -> () + | Odoc_info.Custom (s,t) -> self#latex_of_custom_text fmt s t + + method latex_of_custom_text fmt s t = () - method latex_of_Raw fmt s = + method latex_of_Raw fmt s = ps fmt (self#escape s) - method latex_of_Code fmt s = + method latex_of_Code fmt s = let s2 = self#escape_code s in let s3 = Str.global_replace (Str.regexp "\n") ("\\\\\n") s2 in p fmt "{\\tt{%s}}" s3 @@ -257,7 +260,7 @@ class text = ps fmt (self#escape_simple s); ps fmt "\n\\end{ocamldoccode}\n" - method latex_of_Verbatim fmt s = + method latex_of_Verbatim fmt s = ps fmt "\\begin{verbatim}"; ps fmt s; ps fmt "\\end{verbatim}" @@ -267,7 +270,7 @@ class text = self#latex_of_text fmt t; ps fmt "}" - method latex_of_Italic fmt t = + method latex_of_Italic fmt t = ps fmt "{\\it "; self#latex_of_text fmt t; ps fmt "}" @@ -294,24 +297,24 @@ class text = method latex_of_List fmt tl = ps fmt "\\begin{itemize}\n"; - List.iter - (fun t -> - ps fmt "\\item "; - self#latex_of_text fmt t; - ps fmt "\n" - ) - tl; + List.iter + (fun t -> + ps fmt "\\item "; + self#latex_of_text fmt t; + ps fmt "\n" + ) + tl; ps fmt "\\end{itemize}\n" method latex_of_Enum fmt tl = ps fmt "\\begin{enumerate}\n"; - List.iter - (fun t -> - ps fmt "\\item "; - self#latex_of_text fmt t; - ps fmt "\n" - ) - tl; + List.iter + (fun t -> + ps fmt "\\item "; + self#latex_of_text fmt t; + ps fmt "\n" + ) + tl; ps fmt "\\end{enumerate}\n" method latex_of_Newline fmt = ps fmt "\n\n" @@ -330,7 +333,7 @@ class text = match label_opt with None -> () | Some l -> - ps fmt (self#make_label (self#label ~no_: false l)) + ps fmt (self#make_label (self#label ~no_: false l)) ) method latex_of_Latex fmt s = ps fmt s @@ -343,14 +346,14 @@ class text = method latex_of_Ref fmt name ref_opt = match ref_opt with - None -> + None -> self#latex_of_text_element fmt (Odoc_info.Code (Odoc_info.use_hidden_modules name)) - | Some (RK_section _) -> + | Some (RK_section _) -> self#latex_of_text_element fmt (Latex ("["^(self#make_ref (self#label ~no_:false (Name.simple name)))^"]")) | Some kind -> - let f_label = + let f_label = match kind with Odoc_info.RK_module -> self#module_label | Odoc_info.RK_module_type -> self#module_type_label @@ -367,14 +370,14 @@ class text = [ Odoc_info.Code (Odoc_info.use_hidden_modules name) ; Latex ("["^(self#make_ref (f_label name))^"]") - ] + ] - method latex_of_Superscript fmt t = + method latex_of_Superscript fmt t = ps fmt "$^{"; self#latex_of_text fmt t; ps fmt "}$" - method latex_of_Subscript fmt t = + method latex_of_Subscript fmt t = ps fmt "$_{"; self#latex_of_text fmt t; ps fmt "}$" @@ -388,11 +391,11 @@ class virtual info = method virtual latex_of_text : Format.formatter -> Odoc_info.text -> unit (** The method used to get a [text] from an optionel info structure. *) - method virtual text_of_info : ?block: bool -> Odoc_info.info option -> Odoc_info.text + method virtual text_of_info : ?block: bool -> Odoc_info.info option -> Odoc_info.text (** Print LaTeX code for a description, except for the [i_params] field. *) - method latex_of_info fmt ?(block=false) info_opt = - self#latex_of_text fmt + method latex_of_info fmt ?(block=false) info_opt = + self#latex_of_text fmt (self#text_of_info ~block info_opt) end @@ -413,111 +416,111 @@ class latex = method first_and_rest_of_info i_opt = match i_opt with None -> ([], []) - | Some i -> + | Some i -> match i.Odoc_info.i_desc with None -> ([], self#text_of_info ~block: true i_opt) - | Some t -> + | Some t -> let (first,_) = Odoc_info.first_sentence_and_rest_of_text t in let (_, rest) = Odoc_info.first_sentence_and_rest_of_text (self#text_of_info ~block: false i_opt) in (Odoc_info.text_no_title_no_list first, rest) (** Print LaTeX code for a value. *) - method latex_of_value fmt v = + method latex_of_value fmt v = Odoc_info.reset_type_names () ; let label = self#value_label v.val_name in let latex = self#make_label label in self#latex_of_text fmt - ((Latex latex) :: + ((Latex latex) :: (to_text#text_of_value v)) (** Print LaTeX code for a class attribute. *) method latex_of_attribute fmt a = self#latex_of_text fmt - ((Latex (self#make_label (self#attribute_label a.att_value.val_name))) :: + ((Latex (self#make_label (self#attribute_label a.att_value.val_name))) :: (to_text#text_of_attribute a)) (** Print LaTeX code for a class method. *) - method latex_of_method fmt m = + method latex_of_method fmt m = self#latex_of_text fmt - ((Latex (self#make_label (self#method_label m.met_value.val_name))) :: + ((Latex (self#make_label (self#method_label m.met_value.val_name))) :: (to_text#text_of_method m)) (** Print LaTeX code for the parameters of a type. *) method latex_of_type_params fmt m_name t = let print_one (p, co, cn) = - ps fmt (Odoc_info.string_of_variance t (co,cn)); - ps fmt (self#normal_type m_name p) + ps fmt (Odoc_info.string_of_variance t (co,cn)); + ps fmt (self#normal_type m_name p) in match t.ty_parameters with [] -> () | [(p,co,cn)] -> print_one (p, co, cn) - | l -> - ps fmt "("; - print_concat fmt ", " print_one t.ty_parameters; - ps fmt ")" + | l -> + ps fmt "("; + print_concat fmt ", " print_one t.ty_parameters; + ps fmt ")" method latex_of_class_parameter_list fmt father c = - self#latex_of_text fmt - (self#text_of_class_params father c) + self#latex_of_text fmt + (self#text_of_class_params father c) (** Print LaTeX code for a type. *) method latex_of_type fmt t = let s_name = Name.simple t.ty_name in - let text = - let (fmt2, flush2) = new_fmt () in + let text = + let (fmt2, flush2) = new_fmt () in Odoc_info.reset_type_names () ; let mod_name = Name.father t.ty_name in Format.fprintf fmt2 "@[<h 2>type "; - self#latex_of_type_params fmt2 mod_name t; - (match t.ty_parameters with [] -> () | _ -> ps fmt2 " "); + self#latex_of_type_params fmt2 mod_name t; + (match t.ty_parameters with [] -> () | _ -> ps fmt2 " "); ps fmt2 s_name; - ( + ( match t.ty_manifest with None -> () - | Some typ -> + | Some typ -> p fmt2 " = %s" (self#normal_type mod_name typ) - ); - let s_type3 = + ); + let s_type3 = p fmt2 " %s" ( - match t.ty_kind with + match t.ty_kind with Type_abstract -> "" | Type_variant (_, priv) -> "="^(if priv then " private" else "") - | Type_record (_, priv) -> "= "^(if priv then "private " else "")^"{" - ) ; + | Type_record (_, priv) -> "= "^(if priv then "private " else "")^"{" + ) ; flush2 () in - - let defs = + + let defs = match t.ty_kind with Type_abstract -> [] | Type_variant (l, _) -> (List.flatten (List.map (fun constr -> - let s_cons = + let s_cons = p fmt2 "@[<h 6> | %s" constr.vc_name; ( - match constr.vc_args with + match constr.vc_args with [] -> () - | l -> - p fmt2 " %s@ %s" - "of" + | l -> + p fmt2 " %s@ %s" + "of" (self#normal_type_list ~par: false mod_name " * " l) - ); - flush2 () + ); + flush2 () in [ CodePre s_cons ] @ (match constr.vc_text with None -> [] - | Some t -> - let s = - ps fmt2 "\\begin{ocamldoccomment}\n"; - self#latex_of_text fmt2 t; - ps fmt2 "\n\\end{ocamldoccomment}\n"; - flush2 () - in + | Some t -> + let s = + ps fmt2 "\\begin{ocamldoccomment}\n"; + self#latex_of_text fmt2 t; + ps fmt2 "\n\\end{ocamldoccomment}\n"; + flush2 () + in [ Latex s] ) ) @@ -528,24 +531,24 @@ class latex = (List.flatten (List.map (fun r -> - let s_field = + let s_field = p fmt2 - "@[<h 6> %s%s :@ %s ;" + "@[<h 6> %s%s :@ %s ;" (if r.rf_mutable then "mutable " else "") r.rf_name (self#normal_type mod_name r.rf_type); - flush2 () + flush2 () in [ CodePre s_field ] @ (match r.rf_text with None -> [] - | Some t -> - let s = - ps fmt2 "\\begin{ocamldoccomment}\n"; - self#latex_of_text fmt2 t; - ps fmt2 "\n\\end{ocamldoccomment}\n"; - flush2 () - in + | Some t -> + let s = + ps fmt2 "\\begin{ocamldoccomment}\n"; + self#latex_of_text fmt2 t; + ps fmt2 "\n\\end{ocamldoccomment}\n"; + flush2 () + in [ Latex s] ) ) @@ -574,95 +577,95 @@ class latex = method latex_of_exception fmt e = Odoc_info.reset_type_names () ; self#latex_of_text fmt - ((Latex (self#make_label (self#exception_label e.ex_name))) :: + ((Latex (self#make_label (self#exception_label e.ex_name))) :: (to_text#text_of_exception e)) method latex_of_module_parameter fmt m_name p = - self#latex_of_text fmt - [ - Code "functor ("; - Code p.mp_name ; - Code " : "; - ] ; + self#latex_of_text fmt + [ + Code "functor ("; + Code p.mp_name ; + Code " : "; + ] ; self#latex_of_module_type_kind fmt m_name p.mp_kind; self#latex_of_text fmt [ Code ") -> "] method latex_of_module_type_kind fmt father kind = match kind with - Module_type_struct eles -> - self#latex_of_text fmt [Latex "\\begin{ocamldocsigend}\n"]; - List.iter (self#latex_of_module_element fmt father) eles; - self#latex_of_text fmt [Latex "\\end{ocamldocsigend}\n"] + Module_type_struct eles -> + self#latex_of_text fmt [Latex "\\begin{ocamldocsigend}\n"]; + List.iter (self#latex_of_module_element fmt father) eles; + self#latex_of_text fmt [Latex "\\end{ocamldocsigend}\n"] | Module_type_functor (p, k) -> - self#latex_of_module_parameter fmt father p; - self#latex_of_module_type_kind fmt father k + self#latex_of_module_parameter fmt father p; + self#latex_of_module_type_kind fmt father k | Module_type_alias a -> - self#latex_of_text fmt - [Code (self#relative_module_idents father a.mta_name)] + self#latex_of_text fmt + [Code (self#relative_module_idents father a.mta_name)] | Module_type_with (k, s) -> - self#latex_of_module_type_kind fmt father k; - self#latex_of_text fmt - [ Code " "; - Code (self#relative_idents father s); - ] - + self#latex_of_module_type_kind fmt father k; + self#latex_of_text fmt + [ Code " "; + Code (self#relative_idents father s); + ] + method latex_of_module_kind fmt father kind = match kind with - Module_struct eles -> - self#latex_of_text fmt [Latex "\\begin{ocamldocsigend}\n"]; - List.iter (self#latex_of_module_element fmt father) eles; - self#latex_of_text fmt [Latex "\\end{ocamldocsigend}\n"] + Module_struct eles -> + self#latex_of_text fmt [Latex "\\begin{ocamldocsigend}\n"]; + List.iter (self#latex_of_module_element fmt father) eles; + self#latex_of_text fmt [Latex "\\end{ocamldocsigend}\n"] | Module_alias a -> - self#latex_of_text fmt - [Code (self#relative_module_idents father a.ma_name)] + self#latex_of_text fmt + [Code (self#relative_module_idents father a.ma_name)] | Module_functor (p, k) -> - self#latex_of_module_parameter fmt father p; - self#latex_of_module_kind fmt father k + self#latex_of_module_parameter fmt father p; + self#latex_of_module_kind fmt father k | Module_apply (k1, k2) -> - (* TODO: l'application n'est pas correcte dans un .mli. - Que faire ? -> afficher le module_type du typedtree *) - self#latex_of_module_kind fmt father k1; - self#latex_of_text fmt [Code "("]; - self#latex_of_module_kind fmt father k2; - self#latex_of_text fmt [Code ")"] + (* TODO: l'application n'est pas correcte dans un .mli. + Que faire ? -> afficher le module_type du typedtree *) + self#latex_of_module_kind fmt father k1; + self#latex_of_text fmt [Code "("]; + self#latex_of_module_kind fmt father k2; + self#latex_of_text fmt [Code ")"] | Module_with (k, s) -> - (* TODO: à modifier quand Module_with sera plus détaillé *) - self#latex_of_module_type_kind fmt father k; - self#latex_of_text fmt - [ Code " "; - Code (self#relative_idents father s) ; - ] + (* TODO: à modifier quand Module_with sera plus détaillé *) + self#latex_of_module_type_kind fmt father k; + self#latex_of_text fmt + [ Code " "; + Code (self#relative_idents father s) ; + ] | Module_constraint (k, tk) -> - (* TODO: on affiche quoi ? *) - self#latex_of_module_kind fmt father k + (* TODO: on affiche quoi ? *) + self#latex_of_module_kind fmt father k method latex_of_class_kind fmt father kind = match kind with - Class_structure (inh, eles) -> - self#latex_of_text fmt [Latex "\\begin{ocamldocobjectend}\n"]; - self#generate_inheritance_info fmt inh; - List.iter (self#latex_of_class_element fmt father) eles; - self#latex_of_text fmt [Latex "\\end{ocamldocobjectend}\n"] + Class_structure (inh, eles) -> + self#latex_of_text fmt [Latex "\\begin{ocamldocobjectend}\n"]; + self#generate_inheritance_info fmt inh; + List.iter (self#latex_of_class_element fmt father) eles; + self#latex_of_text fmt [Latex "\\end{ocamldocobjectend}\n"] | Class_apply capp -> - (* TODO: afficher le type final à partir du typedtree *) - self#latex_of_text fmt [Raw "class application not handled yet"] - + (* TODO: afficher le type final à partir du typedtree *) + self#latex_of_text fmt [Raw "class application not handled yet"] + | Class_constr cco -> - ( + ( match cco.cco_type_parameters with [] -> () - | l -> + | l -> self#latex_of_text fmt - ( - Code "[" :: - (self#text_of_class_type_param_expr_list father l) @ - [Code "] "] - ) - ); - self#latex_of_text fmt - [Code (self#relative_idents father cco.cco_name)] + ( + Code "[" :: + (self#text_of_class_type_param_expr_list father l) @ + [Code "] "] + ) + ); + self#latex_of_text fmt + [Code (self#relative_idents father cco.cco_name)] | Class_constraint (ck, ctk) -> self#latex_of_text fmt [Code "( "] ; @@ -673,41 +676,41 @@ class latex = method latex_of_class_type_kind fmt father kind = match kind with - Class_type cta -> + Class_type cta -> ( match cta.cta_type_parameters with [] -> () - | l -> - self#latex_of_text fmt - (Code "[" :: - (self#text_of_class_type_param_expr_list father l) @ - [Code "] "] - ) + | l -> + self#latex_of_text fmt + (Code "[" :: + (self#text_of_class_type_param_expr_list father l) @ + [Code "] "] + ) ); self#latex_of_text fmt - [Code (self#relative_idents father cta.cta_name)] + [Code (self#relative_idents father cta.cta_name)] - | Class_signature (inh, eles) -> - self#latex_of_text fmt [Latex "\\begin{ocamldocobjectend}\n"]; - self#generate_inheritance_info fmt inh; - List.iter (self#latex_of_class_element fmt father) eles; - self#latex_of_text fmt [Latex "\\end{ocamldocobjectend}\n"] + | Class_signature (inh, eles) -> + self#latex_of_text fmt [Latex "\\begin{ocamldocobjectend}\n"]; + self#generate_inheritance_info fmt inh; + List.iter (self#latex_of_class_element fmt father) eles; + self#latex_of_text fmt [Latex "\\end{ocamldocobjectend}\n"] method latex_for_module_index fmt m = let s_name = Name.simple m.m_name in - self#latex_of_text fmt - [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ - (self#label ~no_:false s_name)^"`}\n" - ) - ] + self#latex_of_text fmt + [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ + (self#label ~no_:false s_name)^"`}\n" + ) + ] method latex_for_module_type_index fmt mt = let s_name = Name.simple mt.mt_name in - self#latex_of_text fmt - [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ - (self#label ~no_:false (Name.simple s_name))^"`}\n" - ) - ] + self#latex_of_text fmt + [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ + (self#label ~no_:false (Name.simple s_name))^"`}\n" + ) + ] method latex_for_module_label fmt m = ps fmt (self#make_label (self#module_label m.m_name)) @@ -718,19 +721,19 @@ class latex = method latex_for_class_index fmt c = let s_name = Name.simple c.cl_name in - self#latex_of_text fmt - [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ - (self#label ~no_:false s_name)^"`}\n" - ) - ] + self#latex_of_text fmt + [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ + (self#label ~no_:false s_name)^"`}\n" + ) + ] method latex_for_class_type_index fmt ct = let s_name = Name.simple ct.clt_name in - self#latex_of_text fmt - [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ - (self#label ~no_:false s_name)^"`}\n" - ) - ] + self#latex_of_text fmt + [Latex ("\\index{"^(self#label s_name)^"@\\verb`"^ + (self#label ~no_:false s_name)^"`}\n" + ) + ] method latex_for_class_label fmt c = ps fmt (self#make_label (self#class_label c.cl_name)) @@ -741,13 +744,13 @@ class latex = (** Print the LaTeX code for the given module. *) method latex_of_module fmt m = let father = Name.father m.m_name in - let t = + let t = [ - Latex "\\begin{ocamldoccode}\n" ; - Code "module "; - Code (Name.simple m.m_name); + Latex "\\begin{ocamldoccode}\n" ; + Code "module "; + Code (Name.simple m.m_name); Code " : "; - ] + ] in self#latex_of_text fmt t; self#latex_of_text fmt [ Latex "\\end{ocamldoccode}\n" ]; @@ -757,29 +760,29 @@ class latex = self#latex_of_module_kind fmt father m.m_kind; ( match Module.module_is_functor m with - false -> () + false -> () | true -> - self#latex_of_text fmt [Newline]; - ( - match List.filter (fun (_,d) -> d <> None) - (module_parameters ~trans: false m) - with - [] -> () - | l -> - let t = - [ Bold [Raw "Parameters: "]; - List - (List.map - (fun (p,text_opt) -> - let t = match text_opt with None -> [] | Some t -> t in - ( Raw p.mp_name :: Raw ": " :: t) - ) - l - ) - ] - in - self#latex_of_text fmt t - ); + self#latex_of_text fmt [Newline]; + ( + match List.filter (fun (_,d) -> d <> None) + (module_parameters ~trans: false m) + with + [] -> () + | l -> + let t = + [ Bold [Raw "Parameters: "]; + List + (List.map + (fun (p,text_opt) -> + let t = match text_opt with None -> [] | Some t -> t in + ( Raw p.mp_name :: Raw ": " :: t) + ) + l + ) + ] + in + self#latex_of_text fmt t + ); ); self#latex_of_text fmt [Newline]; self#latex_of_info fmt ~block: true m.m_info; @@ -789,53 +792,53 @@ class latex = (** Print the LaTeX code for the given module type. *) method latex_of_module_type fmt mt = let father = Name.father mt.mt_name in - let t = + let t = [ - Latex "\\begin{ocamldoccode}\n" ; - Code "module type " ; - Code (Name.simple mt.mt_name); - ] + Latex "\\begin{ocamldoccode}\n" ; + Code "module type " ; + Code (Name.simple mt.mt_name); + ] in self#latex_of_text fmt t; ( match mt.mt_type, mt.mt_kind with - | Some mtyp, Some kind -> + | Some mtyp, Some kind -> self#latex_of_text fmt [ Code " = " ]; - self#latex_of_text fmt [ Latex "\\end{ocamldoccode}\n" ]; - self#latex_for_module_type_label fmt mt; - self#latex_for_module_type_index fmt mt; - p fmt "@[<h 4>"; - self#latex_of_module_type_kind fmt father kind + self#latex_of_text fmt [ Latex "\\end{ocamldoccode}\n" ]; + self#latex_for_module_type_label fmt mt; + self#latex_for_module_type_index fmt mt; + p fmt "@[<h 4>"; + self#latex_of_module_type_kind fmt father kind | _ -> - self#latex_of_text fmt [ Latex "\\end{ocamldoccode}\n" ]; - self#latex_for_module_type_index fmt mt; - p fmt "@[<h 4>"; + self#latex_of_text fmt [ Latex "\\end{ocamldoccode}\n" ]; + self#latex_for_module_type_index fmt mt; + p fmt "@[<h 4>"; ); ( match Module.module_type_is_functor mt with - false -> () + false -> () | true -> - self#latex_of_text fmt [Newline]; - ( - match List.filter (fun (_,d) -> d <> None) - (module_type_parameters ~trans: false mt) - with - [] -> () - | l -> - let t = - [ Bold [Raw "Parameters: "]; - List - (List.map - (fun (p,text_opt) -> - let t = match text_opt with None -> [] | Some t -> t in - ( Raw p.mp_name :: Raw ": " :: t) - ) - l - ) - ] - in - self#latex_of_text fmt t - ); + self#latex_of_text fmt [Newline]; + ( + match List.filter (fun (_,d) -> d <> None) + (module_type_parameters ~trans: false mt) + with + [] -> () + | l -> + let t = + [ Bold [Raw "Parameters: "]; + List + (List.map + (fun (p,text_opt) -> + let t = match text_opt with None -> [] | Some t -> t in + ( Raw p.mp_name :: Raw ": " :: t) + ) + l + ) + ] + in + self#latex_of_text fmt t + ); ); self#latex_of_text fmt [Newline]; self#latex_of_info fmt ~block: true mt.mt_info; @@ -844,14 +847,14 @@ class latex = (** Print the LaTeX code for the given included module. *) method latex_of_included_module fmt im = self#latex_of_text fmt - ((Code "include ") :: - (Code + ((Code "include ") :: + (Code (match im.im_module with None -> im.im_name | Some (Mod m) -> m.m_name | Some (Modtype mt) -> mt.mt_name) - ) :: - (self#text_of_info im.im_info) + ) :: + (self#text_of_info im.im_info) ) (** Print the LaTeX code for the given class. *) @@ -863,34 +866,34 @@ class latex = [] -> "" | l -> (self#normal_class_type_param_list father l)^" " in - let t = - [ - Latex "\\begin{ocamldoccode}\n" ; - Code (Printf.sprintf - "class %s%s%s : " - (if c.cl_virtual then "virtual " else "") - type_params - (Name.simple c.cl_name) - ) - ] + let t = + [ + Latex "\\begin{ocamldoccode}\n" ; + Code (Printf.sprintf + "class %s%s%s : " + (if c.cl_virtual then "virtual " else "") + type_params + (Name.simple c.cl_name) + ) + ] in self#latex_of_text fmt t; self#latex_of_class_parameter_list fmt father c; (* avoid a big gap if the kind is a consrt *) ( match c.cl_kind with - Class.Class_constr _ -> - self#latex_of_class_kind fmt father c.cl_kind + Class.Class_constr _ -> + self#latex_of_class_kind fmt father c.cl_kind | _ -> - () + () ); self#latex_of_text fmt [ Latex "\\end{ocamldoccode}\n" ]; self#latex_for_class_label fmt c; self#latex_for_class_index fmt c; p fmt "@[<h 4>"; (match c.cl_kind with - Class.Class_constr _ -> () - | _ -> self#latex_of_class_kind fmt father c.cl_kind + Class.Class_constr _ -> () + | _ -> self#latex_of_class_kind fmt father c.cl_kind ); self#latex_of_text fmt [Newline]; self#latex_of_info fmt ~block: true c.cl_info; @@ -905,16 +908,16 @@ class latex = [] -> "" | l -> (self#normal_class_type_param_list father l)^" " in - let t = - [ - Latex "\\begin{ocamldoccode}\n" ; - Code (Printf.sprintf - "class type %s%s%s = " - (if ct.clt_virtual then "virtual " else "") - type_params - (Name.simple ct.clt_name) - ) - ] + let t = + [ + Latex "\\begin{ocamldoccode}\n" ; + Code (Printf.sprintf + "class type %s%s%s = " + (if ct.clt_virtual then "virtual " else "") + type_params + (Name.simple ct.clt_name) + ) + ] in self#latex_of_text fmt t; @@ -958,22 +961,22 @@ class latex = let f inh = match inh.ic_class with None -> (* we can't make the reference *) - Newline :: + Newline :: Code ("inherit "^inh.ic_name) :: (match inh.ic_text with None -> [] | Some t -> Newline :: t ) | Some cct -> - let label = + let label = match cct with Cl _ -> self#class_label inh.ic_name | Cltype _ -> self#class_type_label inh.ic_name in (* we can create the reference *) - Newline :: + Newline :: Odoc_info.Code ("inherit "^inh.ic_name) :: - (Odoc_info.Latex (" ["^(self#make_ref label)^"]")) :: + (Odoc_info.Latex (" ["^(self#make_ref label)^"]")) :: (match inh.ic_text with None -> [] | Some t -> Newline :: t @@ -983,7 +986,7 @@ class latex = (** Generate the LaTeX code for the inherited classes of the given class. *) method generate_class_inheritance_info fmt cl = - let rec iter_kind k = + let rec iter_kind k = match k with Class_structure ([], _) -> () @@ -1010,12 +1013,21 @@ class latex = (** Generate the LaTeX code for the given top module, in the given buffer. *) method generate_for_top_module fmt m = let (first_t, rest_t) = self#first_and_rest_of_info m.m_info in - let text = [ Title (1, None, - [ Raw (Odoc_messages.modul^" ") ; Code m.m_name ] @ - (match first_t with - [] -> [] - | t -> (Raw " : ") :: t)) ; - ] + let text = + if m.m_text_only then + [ Title (1, None, [Raw m.m_name] @ + (match first_t with + [] -> [] + | t -> (Raw " : ") :: t) + ) ; + ] + else + [ Title (1, None, + [ Raw (Odoc_messages.modul^" ") ; Code m.m_name ] @ + (match first_t with + [] -> [] + | t -> (Raw " : ") :: t)) ; + ] in self#latex_of_text fmt text; self#latex_for_module_label fmt m; @@ -1023,12 +1035,12 @@ class latex = self#latex_of_text fmt rest_t ; self#latex_of_text fmt [ Newline ] ; - ps fmt "\\ocamldocvspace{0.5cm}\n\n"; - List.iter - (fun ele -> - self#latex_of_module_element fmt m.m_name ele; - ps fmt "\n\n" - ) + if not m.m_text_only then ps fmt "\\ocamldocvspace{0.5cm}\n\n"; + List.iter + (fun ele -> + self#latex_of_module_element fmt m.m_name ele; + ps fmt "\n\n" + ) (Module.module_elements ~trans: false m) (** Print the header of the TeX document. *) @@ -1040,44 +1052,44 @@ class latex = ps fmt "\\usepackage{url} \n"; ps fmt "\\usepackage{ocamldoc}\n"; ( - match !Args.title with + match !Args.title with None -> () - | Some s -> - ps fmt "\\title{"; - ps fmt (self#escape s); - ps fmt "}\n" + | Some s -> + ps fmt "\\title{"; + ps fmt (self#escape s); + ps fmt "}\n" ); ps fmt "\\begin{document}\n"; - (match !Args.title with - None -> () | - Some _ -> ps fmt "\\maketitle\n" + (match !Args.title with + None -> () | + Some _ -> ps fmt "\\maketitle\n" ); if !Args.with_toc then ps fmt "\\tableofcontents\n"; ( let info = Odoc_info.apply_opt - Odoc_info.info_of_comment_file !Odoc_info.Args.intro_file + Odoc_info.info_of_comment_file !Odoc_info.Args.intro_file in (match info with None -> () | Some _ -> ps fmt "\\vspace{0.2cm}"); self#latex_of_info fmt info; (match info with None -> () | Some _ -> ps fmt "\n\n") ) - + (** Generate the LaTeX style file, if it does not exists. *) method generate_style_file = try - let dir = Filename.dirname !Args.out_file in - let file = Filename.concat dir "ocamldoc.sty" in - if Sys.file_exists file then - Odoc_info.verbose (Odoc_messages.file_exists_dont_generate file) - else - ( - let chanout = open_out file in - output_string chanout Odoc_latex_style.content ; - flush chanout ; - close_out chanout; - Odoc_info.verbose (Odoc_messages.file_generated file) - ) + let dir = Filename.dirname !Args.out_file in + let file = Filename.concat dir "ocamldoc.sty" in + if Sys.file_exists file then + Odoc_info.verbose (Odoc_messages.file_exists_dont_generate file) + else + ( + let chanout = open_out file in + output_string chanout Odoc_latex_style.content ; + flush chanout ; + close_out chanout; + Odoc_info.verbose (Odoc_messages.file_generated file) + ) with Sys_error s -> prerr_endline s ; @@ -1092,40 +1104,40 @@ class latex = ( let f m = try - let chanout = + let chanout = open_out ((Filename.concat dir (Name.simple m.m_name))^".tex") in - let fmt = Format.formatter_of_out_channel chanout in + let fmt = Format.formatter_of_out_channel chanout in self#generate_for_top_module fmt m ; - Format.pp_print_flush fmt (); + Format.pp_print_flush fmt (); close_out chanout with Failure s | Sys_error s -> prerr_endline s ; - incr Odoc_info.errors + incr Odoc_info.errors in List.iter f module_list ); - + try let chanout = open_out main_file in - let fmt = Format.formatter_of_out_channel chanout in + let fmt = Format.formatter_of_out_channel chanout in if !Args.with_header then self#latex_header fmt; - List.iter - (fun m -> - if !Args.separate_files then + List.iter + (fun m -> + if !Args.separate_files then ps fmt ("\\input{"^((Name.simple m.m_name))^".tex}\n") else self#generate_for_top_module fmt m - ) + ) module_list ; if !Args.with_trailer then ps fmt "\\end{document}"; - Format.pp_print_flush fmt (); + Format.pp_print_flush fmt (); close_out chanout with Failure s | Sys_error s -> prerr_endline s ; - incr Odoc_info.errors + incr Odoc_info.errors end diff --git a/ocamldoc/odoc_man.ml b/ocamldoc/odoc_man.ml index 2acff68a1..b77439f6e 100644 --- a/ocamldoc/odoc_man.ml +++ b/ocamldoc/odoc_man.ml @@ -42,8 +42,8 @@ class virtual info = [] -> () | _ -> bs b ".B \""; - bs b Odoc_messages.authors; - bs b "\"\n:\n"; + bs b Odoc_messages.authors; + bs b "\"\n:\n"; bs b (String.concat ", " l); bs b "\n.sp\n" @@ -52,47 +52,47 @@ class virtual info = match v_opt with None -> () | Some v -> - bs b ".B \""; - bs b Odoc_messages.version; - bs b "\"\n:\n"; - bs b v; - bs b "\n.sp\n" + bs b ".B \""; + bs b Odoc_messages.version; + bs b "\"\n:\n"; + bs b v; + bs b "\n.sp\n" (** Print groff string for the given optional since information.*) method man_of_since_opt b s_opt = match s_opt with None -> () | Some s -> - bs b ".B \""; - bs b Odoc_messages.since; - bs b "\"\n"; - bs b s; - bs b "\n.sp\n" + bs b ".B \""; + bs b Odoc_messages.since; + bs b "\"\n"; + bs b s; + bs b "\n.sp\n" (** Print groff string for the given list of raised exceptions.*) method man_of_raised_exceptions b l = match l with [] -> () | (s, t) :: [] -> - bs b ".B \""; - bs b Odoc_messages.raises; - bs b (" "^s^"\"\n"); - self#man_of_text b t; - bs b "\n.sp\n" + bs b ".B \""; + bs b Odoc_messages.raises; + bs b (" "^s^"\"\n"); + self#man_of_text b t; + bs b "\n.sp\n" | _ -> bs b ".B \""; - bs b Odoc_messages.raises; - bs b "\"\n"; + bs b Odoc_messages.raises; + bs b "\"\n"; List.iter (fun (ex, desc) -> - bs b ".TP\n.B \""; - bs b ex; - bs b "\"\n"; - self#man_of_text b desc; - bs b "\n" - ) + bs b ".sp\n.B \""; + bs b ex; + bs b "\"\n"; + self#man_of_text b desc; + bs b "\n" + ) l; - bs b "\n.sp\n" + bs b "\n.sp\n" (** Print groff string for the given "see also" reference. *) method man_of_see b (see_ref, t) = @@ -109,21 +109,21 @@ class virtual info = match l with [] -> () | see :: [] -> - bs b ".B \""; - bs b Odoc_messages.see_also; - bs b "\"\n"; - self#man_of_see b see; - bs b "\n.sp\n" + bs b ".B \""; + bs b Odoc_messages.see_also; + bs b "\"\n"; + self#man_of_see b see; + bs b "\n.sp\n" | _ -> bs b ".B \""; - bs b Odoc_messages.see_also; - bs b "\"\n"; - List.iter + bs b Odoc_messages.see_also; + bs b "\"\n"; + List.iter (fun see -> - bs b ".TP\n \"\"\n"; - self#man_of_see b see; - bs b "\n" - ) + bs b ".sp\n"; + self#man_of_see b see; + bs b "\n" + ) l; bs b "\n.sp\n" @@ -132,11 +132,11 @@ class virtual info = match return_opt with None -> () | Some s -> - bs b ".B "; - bs b Odoc_messages.returns; - bs b "\n"; - self#man_of_text b s; - bs b "\n.sp\n" + bs b ".B "; + bs b Odoc_messages.returns; + bs b "\n"; + self#man_of_text b s; + bs b "\n.sp\n" (** Print man code for the given list of custom tagged texts. *) method man_of_custom b l = @@ -159,22 +159,22 @@ class virtual info = | Some info -> let module M = Odoc_info in ( - match info.M.i_deprecated with + match info.M.i_deprecated with None -> () | Some d -> - bs b ".B \""; - bs b Odoc_messages.deprecated; - bs b "\"\n"; - self#man_of_text b d; - bs b "\n.sp\n" - ); + bs b ".B \""; + bs b Odoc_messages.deprecated; + bs b "\"\n"; + self#man_of_text b d; + bs b "\n.sp\n" + ); ( - match info.M.i_desc with + match info.M.i_desc with None -> () | Some d when d = [Odoc_info.Raw ""] -> () | Some d -> - self#man_of_text b d; - bs b "\n.sp\n" + self#man_of_text b d; + bs b "\n.sp\n" ); self#man_of_author_list b info.M.i_authors; self#man_of_version_opt b info.M.i_version; @@ -201,10 +201,10 @@ class man = let len = String.length s in let b = Buffer.create len in for i = 0 to len - 1 do - match s.[i] with - '\\' -> Buffer.add_string b "\\(rs" - | '.' -> Buffer.add_string b "\\&." - | c -> Buffer.add_char b c + match s.[i] with + '\\' -> Buffer.add_string b "\\(rs" + | '.' -> Buffer.add_string b "\\&." + | c -> Buffer.add_char b c done; Buffer.contents b @@ -235,35 +235,35 @@ class man = | Odoc_info.Raw s -> bs b (self#escape s) | Odoc_info.Code s -> bs b "\n.B "; - bs b ((Str.global_replace (Str.regexp "\n") "\n.B " (self#escape s))^"\n") + bs b ((Str.global_replace (Str.regexp "\n") "\n.B " (self#escape s))^"\n") | Odoc_info.CodePre s -> bs b "\n.B "; - bs b ((Str.global_replace (Str.regexp "\n") "\n.B " (self#escape s))^"\n") + bs b ((Str.global_replace (Str.regexp "\n") "\n.B " (self#escape s))^"\n") | Odoc_info.Verbatim s -> - bs b (self#escape s) + bs b (self#escape s) | Odoc_info.Bold t | Odoc_info.Italic t | Odoc_info.Emphasize t | Odoc_info.Center t | Odoc_info.Left t | Odoc_info.Right t -> - self#man_of_text2 b t + self#man_of_text2 b t | Odoc_info.List tl -> List.iter - (fun t -> bs b ".TP\n \"\"\n"; self#man_of_text2 b t; bs b "\n") + (fun t -> bs b "\n.sp\n \\-"; self#man_of_text2 b t; bs b "\n") tl; bs b "\n" | Odoc_info.Enum tl -> List.iter - (fun t -> bs b ".TP\n \"\"\n"; self#man_of_text2 b t; bs b "\n") + (fun t -> bs b "\n.sp\n \\-"; self#man_of_text2 b t; bs b "\n") tl; bs b "\n" | Odoc_info.Newline -> bs b "\n.sp\n" | Odoc_info.Block t -> bs b "\n.sp\n"; - self#man_of_text2 b t; - bs b "\n.sp\n" + self#man_of_text2 b t; + bs b "\n.sp\n" | Odoc_info.Title (n, l_opt, t) -> self#man_of_text2 b [Odoc_info.Code (Odoc_info.string_of_text t)] | Odoc_info.Latex _ -> @@ -278,10 +278,13 @@ class man = bs b "^{"; self#man_of_text2 b t | Odoc_info.Subscript t -> bs b "_{"; self#man_of_text2 b t - | Odoc_info.Module_list _ -> - () - | Odoc_info.Index_list -> - () + | Odoc_info.Module_list _ -> + () + | Odoc_info.Index_list -> + () + | Odoc_info.Custom (s,t) -> self#man_of_custom_text b s t + + method man_of_custom_text b s t = () (** Print groff string to display code. *) method man_of_code b s = self#man_of_text b [ Code s ] @@ -336,11 +339,11 @@ class man = match t.ty_parameters with [] -> () | l -> - let s = Odoc_str.string_of_type_param_list t in - let s2 = Str.global_replace (Str.regexp "\n") "\n.B " s in - bs b "\n.B "; - bs b (self#relative_idents m_name s2); - bs b "\n" + let s = Odoc_str.string_of_type_param_list t in + let s2 = Str.global_replace (Str.regexp "\n") "\n.B " s in + bs b "\n.B "; + bs b (self#relative_idents m_name s2); + bs b "\n" (** Print groff string to display a [Types.module_type]. *) method man_of_module_type b m_name t = @@ -375,18 +378,18 @@ class man = | _ -> bs b ".B of "; self#man_of_type_expr_list - ~par: false - b (Name.father e.ex_name) " * " e.ex_args + ~par: false + b (Name.father e.ex_name) " * " e.ex_args ); ( match e.ex_alias with None -> () | Some ea -> - bs b " = "; + bs b " = "; bs b - ( + ( match ea.ea_ex with - None -> ea.ea_name + None -> ea.ea_name | Some e -> e.ex_name ) ); @@ -402,66 +405,66 @@ class man = self#man_of_type_expr_param_list b father t; ( match t.ty_parameters with - [] -> () + [] -> () | _ -> bs b ".I " ); bs b (Name.simple t.ty_name); bs b " \n"; ( match t.ty_manifest with - None -> () + None -> () | Some typ -> - bs b "= "; - self#man_of_type_expr b father typ + bs b "= "; + self#man_of_type_expr b father typ ); ( match t.ty_kind with Type_abstract -> () | Type_variant (l, priv) -> bs b "="; - if priv then bs b " private"; - bs b "\n "; + if priv then bs b " private"; + bs b "\n "; List.iter (fun constr -> bs b ("| "^constr.vc_name); ( - match constr.vc_args, constr.vc_text with + match constr.vc_args, constr.vc_text with [], None -> bs b "\n " | [], (Some t) -> - bs b " (* "; - self#man_of_text b t; - bs b " *)\n " + bs b " (* "; + self#man_of_text b t; + bs b " *)\n " | l, None -> bs b "\n.B of "; - self#man_of_type_expr_list ~par: false b father " * " l; - bs b " " + self#man_of_type_expr_list ~par: false b father " * " l; + bs b " " | l, (Some t) -> bs b "\n.B of "; - self#man_of_type_expr_list ~par: false b father " * " l; + self#man_of_type_expr_list ~par: false b father " * " l; bs b ".I \" \"\n"; bs b "(* "; - self#man_of_text b t; - bs b " *)\n " + self#man_of_text b t; + bs b " *)\n " ) - ) + ) l | Type_record (l, priv) -> bs b "= "; - if priv then bs b "private "; - bs b "{"; + if priv then bs b "private "; + bs b "{"; List.iter (fun r -> bs b (if r.rf_mutable then "\n\n.B mutable \n" else "\n "); bs b (r.rf_name^" : "); - self#man_of_type_expr b father r.rf_type; - bs b ";"; + self#man_of_type_expr b father r.rf_type; + bs b ";"; ( - match r.rf_text with + match r.rf_text with None -> () | Some t -> bs b " (* "; - self#man_of_text b t; - bs b " *) " + self#man_of_text b t; + bs b " *) " ); ) l; @@ -488,7 +491,7 @@ class man = if m.met_virtual then bs b "virtual "; bs b ((Name.simple m.met_value.val_name)^" : "); self#man_of_type_expr b - (Name.father m.met_value.val_name) m.met_value.val_type; + (Name.father m.met_value.val_name) m.met_value.val_type; bs b "\n.sp\n"; self#man_of_info b m.met_value.val_info; bs b "\n.sp\n" @@ -499,18 +502,18 @@ class man = [] -> () | _ -> bs b "\n.B "; - bs b Odoc_messages.parameters; - bs b ": \n"; - List.iter + bs b Odoc_messages.parameters; + bs b ": \n"; + List.iter (fun p -> - bs b ".TP\n"; + bs b ".sp\n"; bs b "\""; - bs b (Parameter.complete_name p); - bs b "\"\n"; + bs b (Parameter.complete_name p); + bs b "\"\n"; self#man_of_type_expr b m_name (Parameter.typ p); - bs b "\n"; + bs b "\n"; self#man_of_parameter_description b p; - bs b "\n" + bs b "\n" ) l; bs b "\n" @@ -528,13 +531,13 @@ class man = ) | l -> (* A list of names, we display those with a description. *) - List.iter + List.iter (fun n -> match Parameter.desc_by_name p n with None -> () | Some t -> - self#man_of_code b (n^" : "); - self#man_of_text b t + self#man_of_code b (n^" : "); + self#man_of_text b t ) l @@ -544,19 +547,19 @@ class man = [] -> () | _ -> bs b ".B \""; - bs b Odoc_messages.parameters; - bs b ":\"\n"; + bs b Odoc_messages.parameters; + bs b ":\"\n"; List.iter (fun (p, desc_opt) -> - bs b ".TP\n"; + bs b ".sp\n"; bs b ("\""^p.mp_name^"\"\n"); self#man_of_module_type b m_name p.mp_type; - bs b "\n"; + bs b "\n"; ( - match desc_opt with + match desc_opt with None -> () | Some t -> self#man_of_text b t - ); + ); bs b "\n" ) l; @@ -572,8 +575,8 @@ class man = match c.cl_type_parameters with [] -> () | l -> - bs b (Odoc_str.string_of_class_type_param_list l); - bs b " " + bs b (Odoc_str.string_of_class_type_param_list l); + bs b " " ); bs b (Name.simple c.cl_name); bs b " : " ; @@ -591,8 +594,8 @@ class man = match ct.clt_type_parameters with [] -> () | l -> - bs b (Odoc_str.string_of_class_type_param_list l); - bs b " " + bs b (Odoc_str.string_of_class_type_param_list l); + bs b " " ); bs b (Name.simple ct.clt_name); bs b " = " ; @@ -619,7 +622,7 @@ class man = (match mt.mt_type with None -> () | Some t -> - self#man_of_module_type b (Name.father mt.mt_name) t + self#man_of_module_type b (Name.father mt.mt_name) t ); bs b "\n.sp\n"; self#man_of_info b mt.mt_info; @@ -662,23 +665,23 @@ class man = let file = self#file_name cl.cl_name in try let chanout = self#open_out file in - let b = new_buf () in - bs b (".TH \""^cl.cl_name^"\" "); + let b = new_buf () in + bs b (".TH \""^cl.cl_name^"\" "); bs b !Odoc_args.man_section ; - bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^"\" "); + bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" "); bs b "OCamldoc "; bs b ("\""^(match !Args.title with Some t -> t | None -> "")^"\"\n"); - let abstract = - match cl.cl_info with - None | Some { i_desc = None } -> "no description" - | Some { i_desc = Some t } -> - let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in - self#remove_newlines s - in + let abstract = + match cl.cl_info with + None | Some { i_desc = None } -> "no description" + | Some { i_desc = Some t } -> + let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in + self#remove_newlines s + in - bs b ".SH NAME\n"; - bs b (cl.cl_name^" \\- "^abstract^"\n"); + bs b ".SH NAME\n"; + bs b (cl.cl_name^" \\- "^abstract^"\n"); bs b (".SH "^Odoc_messages.clas^"\n"); bs b (Odoc_messages.clas^" "^cl.cl_name^"\n"); bs b (".SH "^Odoc_messages.documentation^"\n"); @@ -707,7 +710,7 @@ class man = ) (Class.class_elements cl); - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with Sys_error s -> @@ -721,29 +724,29 @@ class man = let file = self#file_name ct.clt_name in try let chanout = self#open_out file in - let b = new_buf () in - bs b (".TH \""^ct.clt_name^"\" "); + let b = new_buf () in + bs b (".TH \""^ct.clt_name^"\" "); bs b !Odoc_args.man_section ; - bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^"\" "); + bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" "); bs b "OCamldoc "; bs b ("\""^(match !Args.title with Some t -> t | None -> "")^"\"\n"); - let abstract = - match ct.clt_info with - None | Some { i_desc = None } -> "no description" - | Some { i_desc = Some t } -> - let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in - self#remove_newlines s - in + let abstract = + match ct.clt_info with + None | Some { i_desc = None } -> "no description" + | Some { i_desc = Some t } -> + let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in + self#remove_newlines s + in bs b ".SH NAME\n"; - bs b (ct.clt_name^" \\- "^abstract^"\n"); + bs b (ct.clt_name^" \\- "^abstract^"\n"); bs b (".SH "^Odoc_messages.class_type^"\n"); bs b (Odoc_messages.class_type^" "^ct.clt_name^"\n"); bs b (".SH "^Odoc_messages.documentation^"\n"); bs b ".sp\n"; - self#man_of_class_type b ct; + self#man_of_class_type b ct; (* a large blank *) bs b "\n.sp\n.sp\n"; @@ -764,7 +767,7 @@ class man = ) (Class.class_type_elements ct); - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with Sys_error s -> @@ -778,22 +781,22 @@ class man = let file = self#file_name mt.mt_name in try let chanout = self#open_out file in - let b = new_buf () in - bs b (".TH \""^mt.mt_name^"\" "); + let b = new_buf () in + bs b (".TH \""^mt.mt_name^"\" "); bs b !Odoc_args.man_section ; - bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^"\" "); + bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" "); bs b "OCamldoc "; bs b ("\""^(match !Args.title with Some t -> t | None -> "")^"\"\n"); - let abstract = - match mt.mt_info with - None | Some { i_desc = None } -> "no description" - | Some { i_desc = Some t } -> - let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in - self#remove_newlines s - in - bs b ".SH NAME\n"; - bs b (mt.mt_name^" \\- "^abstract^"\n"); + let abstract = + match mt.mt_info with + None | Some { i_desc = None } -> "no description" + | Some { i_desc = Some t } -> + let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in + self#remove_newlines s + in + bs b ".SH NAME\n"; + bs b (mt.mt_name^" \\- "^abstract^"\n"); bs b (".SH "^Odoc_messages.module_type^"\n"); bs b (Odoc_messages.module_type^" "^mt.mt_name^"\n"); bs b (".SH "^Odoc_messages.documentation^"\n"); @@ -802,14 +805,14 @@ class man = bs b (".BI \""^(Name.simple mt.mt_name)^"\"\n"); bs b " = "; ( - match mt.mt_type with + match mt.mt_type with None -> () | Some t -> - self#man_of_module_type b (Name.father mt.mt_name) t + self#man_of_module_type b (Name.father mt.mt_name) t ); bs b "\n.sp\n"; self#man_of_info b mt.mt_info; - bs b "\n.sp\n"; + bs b "\n.sp\n"; (* parameters for functors *) self#man_of_module_parameter_list b "" (Module.module_type_parameters mt); @@ -841,7 +844,7 @@ class man = ) (Module.module_type_elements mt); - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with @@ -856,23 +859,23 @@ class man = let file = self#file_name m.m_name in try let chanout = self#open_out file in - let b = new_buf () in - bs b (".TH \""^m.m_name^"\" "); + let b = new_buf () in + bs b (".TH \""^m.m_name^"\" "); bs b !Odoc_args.man_section ; - bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^"\" "); + bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" "); bs b "OCamldoc "; bs b ("\""^(match !Args.title with Some t -> t | None -> "")^"\"\n"); - let abstract = - match m.m_info with - None | Some { i_desc = None } -> "no description" - | Some { i_desc = Some t } -> - let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in - self#remove_newlines s - in + let abstract = + match m.m_info with + None | Some { i_desc = None } -> "no description" + | Some { i_desc = Some t } -> + let s = Odoc_info.string_of_text (Odoc_info.first_sentence_of_text t) in + self#remove_newlines s + in - bs b ".SH NAME\n"; - bs b (m.m_name^" \\- "^abstract^"\n"); + bs b ".SH NAME\n"; + bs b (m.m_name^" \\- "^abstract^"\n"); bs b (".SH "^Odoc_messages.modul^"\n"); bs b (Odoc_messages.modul^" "^m.m_name^"\n"); bs b (".SH "^Odoc_messages.documentation^"\n"); @@ -880,10 +883,10 @@ class man = bs b (Odoc_messages.modul^"\n"); bs b (".BI \""^(Name.simple m.m_name)^"\"\n"); bs b " : "; - self#man_of_module_type b (Name.father m.m_name) m.m_type; + self#man_of_module_type b (Name.father m.m_name) m.m_type; bs b "\n.sp\n"; self#man_of_info b m.m_info; - bs b "\n.sp\n"; + bs b "\n.sp\n"; (* parameters for functors *) self#man_of_module_parameter_list b "" (Module.module_parameters m); @@ -915,7 +918,7 @@ class man = ) (Module.module_elements m); - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with @@ -983,14 +986,14 @@ class man = let file = self#file_name name in try let chanout = self#open_out file in - let b = new_buf () in - bs b (".TH \""^name^"\" "); + let b = new_buf () in + bs b (".TH \""^name^"\" "); bs b !Odoc_args.man_section ; - bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^"\" "); + bs b (" "^(Odoc_misc.string_of_date ~hour: false date)^" "); bs b "OCamldoc "; bs b ("\""^(match !Args.title with Some t -> t | None -> "")^"\"\n"); - bs b ".SH NAME\n"; - bs b (name^" \\- all "^name^" elements\n\n"); + bs b ".SH NAME\n"; + bs b (name^" \\- all "^name^" elements\n\n"); let f ele = match ele with @@ -1020,7 +1023,7 @@ class man = () in List.iter f l; - Buffer.output_buffer chanout b; + Buffer.output_buffer chanout b; close_out chanout with Sys_error s -> diff --git a/ocamldoc/odoc_messages.ml b/ocamldoc/odoc_messages.ml index 98f6deff0..66c4fa5fd 100644 --- a/ocamldoc/odoc_messages.ml +++ b/ocamldoc/odoc_messages.ml @@ -38,6 +38,7 @@ let rectypes = "\tAllow arbitrary recursive types" let preprocess = "<command>\tPipe sources through preprocessor <command>" let option_impl ="<file>\tConsider <file> as a .ml file" let option_intf ="<file>\tConsider <file> as a .mli file" +let option_text ="<file>\tConsider <file> as a .txt file" let display_custom_generators_dir = "\tDisplay custom generators standard directory and exit" let add_load_dir = "<dir>\tAdd the given directory to the search path for custom\n"^ "\t\tgenerators "^bytecode_only @@ -62,7 +63,9 @@ let option_not_in_native_code op = "Option "^op^" not available in native code v let default_out_file = "ocamldoc.out" let out_file = "<file>\tSet the ouput file name, used by texi, latex and dot generators\n"^ - "\t\t(default is "^default_out_file^")" + "\t\t(default is "^default_out_file^")\n"^ + "\t\tor the prefix of index files for the HTML generator\n"^ + "\t\t(default is index)" let dot_include_all = "\n\t\tInclude all modules in the dot output, not only the\n"^ diff --git a/ocamldoc/odoc_misc.ml b/ocamldoc/odoc_misc.ml index d3d970490..34d390035 100644 --- a/ocamldoc/odoc_misc.ml +++ b/ocamldoc/odoc_misc.ml @@ -11,6 +11,16 @@ (* $Id$ *) +let no_blanks s = + let len = String.length s in + let buf = Buffer.create len in + for i = 0 to len - 1 do + match s.[i] with + ' ' | '\n' | '\t' | '\r' -> () + | c -> Buffer.add_char buf c + done; + Buffer.contents buf + let input_file_as_string nom = let chanin = open_in_bin nom in let len = 1024 in @@ -38,15 +48,15 @@ let split_string s chars = let rec iter acc pos = if pos >= len then match acc with - "" -> [] - | _ -> [acc] + "" -> [] + | _ -> [acc] else if List.mem s.[pos] chars then - match acc with - "" -> iter "" (pos + 1) - | _ -> acc :: (iter "" (pos + 1)) + match acc with + "" -> iter "" (pos + 1) + | _ -> acc :: (iter "" (pos + 1)) else - iter (Printf.sprintf "%s%c" acc s.[pos]) (pos + 1) + iter (Printf.sprintf "%s%c" acc s.[pos]) (pos + 1) in iter "" 0 @@ -115,13 +125,14 @@ let rec string_of_text t = "^{"^(string_of_text t)^"}" | Odoc_types.Subscript t -> "^{"^(string_of_text t)^"}" - | Odoc_types.Module_list l -> - string_of_text - (list_concat (Odoc_types.Raw ", ") - (List.map (fun s -> Odoc_types.Code s) l) - ) - | Odoc_types.Index_list -> - "" + | Odoc_types.Module_list l -> + string_of_text + (list_concat (Odoc_types.Raw ", ") + (List.map (fun s -> Odoc_types.Code s) l) + ) + | Odoc_types.Index_list -> + "" + | Odoc_types.Custom (_, t) -> string_of_text t in String.concat "" (List.map iter t) @@ -256,12 +267,13 @@ let rec text_no_title_no_list t = | Odoc_types.Superscript t -> [Odoc_types.Superscript (text_no_title_no_list t)] | Odoc_types.Subscript t -> [Odoc_types.Subscript (text_no_title_no_list t)] | Odoc_types.Module_list l -> - list_concat (Odoc_types.Raw ", ") - (List.map - (fun s -> Odoc_types.Ref (s, Some Odoc_types.RK_module)) - l - ) + list_concat (Odoc_types.Raw ", ") + (List.map + (fun s -> Odoc_types.Ref (s, Some Odoc_types.RK_module)) + l + ) | Odoc_types.Index_list -> [] + | Odoc_types.Custom (s,t) -> [Odoc_types.Custom (s, text_no_title_no_list t)] in List.flatten (List.map iter t) @@ -291,6 +303,7 @@ let get_titles_in_text t = | Odoc_types.Subscript t -> iter_text t | Odoc_types.Module_list _ -> () | Odoc_types.Index_list -> () + | Odoc_types.Custom (_, t) -> iter_text t and iter_text te = List.iter iter_ele te in @@ -382,6 +395,7 @@ and first_sentence_text_ele text_ele = | Odoc_types.Subscript _ | Odoc_types.Module_list _ | Odoc_types.Index_list -> (false, text_ele, None) + | Odoc_types.Custom _ -> (false, text_ele, None) let first_sentence_of_text t = let (_,t2,_) = first_sentence_text t in @@ -408,12 +422,12 @@ let search_string_backward ~pat = -1 -> raise Not_found | 0 -> if pat = s then 0 else raise Not_found | _ -> - let pos = len - lenp in - let s2 = String.sub s pos lenp in - if s2 = pat then - pos - else - iter (String.sub s 0 pos) + let pos = len - lenp in + let s2 = String.sub s pos lenp in + if s2 = pat then + pos + else + iter (String.sub s 0 pos) in fun ~s -> iter s @@ -465,5 +479,3 @@ let remove_option typ = | Types.Tsubst t2 -> iter t2.Types.desc in { typ with Types.desc = iter typ.Types.desc } - -(* eof $Id$ *) diff --git a/ocamldoc/odoc_misc.mli b/ocamldoc/odoc_misc.mli index d3037519b..4fc83fe89 100644 --- a/ocamldoc/odoc_misc.mli +++ b/ocamldoc/odoc_misc.mli @@ -13,6 +13,11 @@ (** Miscelaneous functions *) +(** [no_blanks s] returns the given string without any blank + characters, i.e. '\n' '\r' ' ' '\t'. +*) +val no_blanks : string -> string + (** This function returns a file in the form of one string.*) val input_file_as_string : string -> string diff --git a/ocamldoc/odoc_module.ml b/ocamldoc/odoc_module.ml index f2f457299..756ccf86b 100644 --- a/ocamldoc/odoc_module.ml +++ b/ocamldoc/odoc_module.ml @@ -38,33 +38,33 @@ and included_module = { im_name : Name.t ; (** the name of the included module *) mutable im_module : mmt option ; (** the included module or module type *) mutable im_info : Odoc_types.info option ; (** comment associated to the includ directive *) - } + } and module_alias = { ma_name : Name.t ; mutable ma_module : mmt option ; (** the real module or module type if we could associate it *) - } + } and module_parameter = { mp_name : string ; (** the name *) mp_type : Types.module_type ; (** the type *) mp_type_code : string ; (** the original code *) mp_kind : module_type_kind ; (** the way the parameter was built *) - } + } (** Different kinds of module. *) and module_kind = - | Module_struct of module_element list + | Module_struct of module_element list | Module_alias of module_alias (** complete name and corresponding module if we found it *) | Module_functor of module_parameter * module_kind | Module_apply of module_kind * module_kind | Module_with of module_type_kind * string | Module_constraint of module_kind * module_type_kind - + (** Representation of a module. *) and t_module = { - m_name : Name.t ; - m_type : Types.module_type ; + m_name : Name.t ; + m_type : Types.module_type ; mutable m_info : Odoc_types.info option ; m_is_interface : bool ; (** true for modules read from interface files *) m_file : string ; (** the file the module is defined in. *) @@ -73,40 +73,41 @@ and t_module = { mutable m_top_deps : Name.t list ; (** The toplevels module names this module depends on. *) mutable m_code : string option ; (** The whole code of the module *) mutable m_code_intf : string option ; (** The whole code of the interface of the module *) - } + m_text_only : bool ; (** [true] if the module comes from a text file *) + } and module_type_alias = { mta_name : Name.t ; mutable mta_module : t_module_type option ; (** the real module type if we could associate it *) - } + } (** Different kinds of module type. *) and module_type_kind = - | Module_type_struct of module_element list + | Module_type_struct of module_element list | Module_type_functor of module_parameter * module_type_kind | Module_type_alias of module_type_alias (** complete name and corresponding module type if we found it *) | Module_type_with of module_type_kind * string (** the module type kind and the code of the with constraint *) (** Representation of a module type. *) and t_module_type = { - mt_name : Name.t ; + mt_name : Name.t ; mutable mt_info : Odoc_types.info option ; mt_type : Types.module_type option ; (** [None] = abstract module type *) mt_is_interface : bool ; (** true for modules read from interface files *) mt_file : string ; (** the file the module type is defined in. *) mutable mt_kind : module_type_kind option ; (** [None] = abstract module type if mt_type = None ; Always [None] when the module type was extracted from the implementation file. *) - mutable mt_loc : Odoc_types.location ; - } + mutable mt_loc : Odoc_types.location ; + } (** {2 Functions} *) (** Returns the list of values from a list of module_element. *) let values l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_value v -> acc @ [v] | _ -> acc ) @@ -115,9 +116,9 @@ let values l = (** Returns the list of types from a list of module_element. *) let types l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_type t -> acc @ [t] | _ -> acc ) @@ -126,9 +127,9 @@ let types l = (** Returns the list of exceptions from a list of module_element. *) let exceptions l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_exception e -> acc @ [e] | _ -> acc ) @@ -137,9 +138,9 @@ let exceptions l = (** Returns the list of classes from a list of module_element. *) let classes l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_class c -> acc @ [c] | _ -> acc ) @@ -148,9 +149,9 @@ let classes l = (** Returns the list of class types from a list of module_element. *) let class_types l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_class_type ct -> acc @ [ct] | _ -> acc ) @@ -159,9 +160,9 @@ let class_types l = (** Returns the list of modules from a list of module_element. *) let modules l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_module m -> acc @ [m] | _ -> acc ) @@ -170,9 +171,9 @@ let modules l = (** Returns the list of module types from a list of module_element. *) let mod_types l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_module_type mt -> acc @ [mt] | _ -> acc ) @@ -181,9 +182,9 @@ let mod_types l = (** Returns the list of module comment from a list of module_element. *) let comments l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_module_comment t -> acc @ [t] | _ -> acc ) @@ -192,23 +193,23 @@ let comments l = (** Returns the list of included modules from a list of module_element. *) let included_modules l = - List.fold_left + List.fold_left (fun acc -> fun ele -> - match ele with + match ele with Element_included_module m -> acc @ [m] | _ -> acc ) [] l -(** Returns the list of elements of a module. +(** Returns the list of elements of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let rec module_elements ?(trans=true) m = let rec iter_kind = function - Module_struct l -> + Module_struct l -> print_DEBUG "Odoc_module.module_element: Module_struct"; l - | Module_alias ma -> + | Module_alias ma -> print_DEBUG "Odoc_module.module_element: Module_alias"; if trans then match ma.ma_module with @@ -217,8 +218,8 @@ let rec module_elements ?(trans=true) m = | Some (Modtype mt) -> module_type_elements mt else [] - | Module_functor (_, k) - | Module_apply (k, _) -> + | Module_functor (_, k) + | Module_apply (k, _) -> print_DEBUG "Odoc_module.module_element: Module_functor ou Module_apply"; iter_kind k | Module_with (tk,_) -> @@ -232,14 +233,15 @@ let rec module_elements ?(trans=true) m = print_DEBUG "Odoc_module.module_element: Module_constraint"; (* A VOIR : utiliser k ou tk ? *) module_elements ~trans: trans - { m_name = "" ; - m_info = None ; + { m_name = "" ; + m_info = None ; m_type = Types.Tmty_signature [] ; m_is_interface = false ; m_file = "" ; m_kind = k ; m_loc = Odoc_types.dummy_loc ; m_top_deps = [] ; m_code = None ; m_code_intf = None ; + m_text_only = false ; } (* module_type_elements ~trans: trans @@ -248,9 +250,9 @@ let rec module_elements ?(trans=true) m = mt_loc = Odoc_types.dummy_loc } *) in - iter_kind m.m_kind + iter_kind m.m_kind -(** Returns the list of elements of a module type. +(** Returns the list of elements of a module type. @param trans indicates if, for aliased modules, we must perform a transitive search.*) and module_type_elements ?(trans=true) mt = let rec iter_kind = function @@ -262,7 +264,7 @@ and module_type_elements ?(trans=true) mt = iter_kind (Some k) else [] - | Some (Module_type_alias mta) -> + | Some (Module_type_alias mta) -> if trans then match mta.mta_module with None -> [] @@ -280,21 +282,21 @@ let module_values ?(trans=true) m = values (module_elements ~trans m) @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_functions ?(trans=true) m = List.filter - (fun v -> Odoc_value.is_function v) + (fun v -> Odoc_value.is_function v) (values (module_elements ~trans m)) (** Returns the list of non-functional values of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_simple_values ?(trans=true) m = List.filter - (fun v -> not (Odoc_value.is_function v)) + (fun v -> not (Odoc_value.is_function v)) (values (module_elements ~trans m)) - + (** Returns the list of types of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_types ?(trans=true) m = types (module_elements ~trans m) -(** Returns the list of excptions of a module. +(** Returns the list of excptions of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_exceptions ?(trans=true) m = exceptions (module_elements ~trans m) @@ -306,7 +308,7 @@ let module_classes ?(trans=true) m = classes (module_elements ~trans m) @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_class_types ?(trans=true) m = class_types (module_elements ~trans m) -(** Returns the list of modules of a module. +(** Returns the list of modules of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_modules ?(trans=true) m = modules (module_elements ~trans m) @@ -322,12 +324,12 @@ let module_included_modules ?(trans=true) m = included_modules (module_elements @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_comments ?(trans=true) m = comments (module_elements ~trans m) -(** Access to the parameters, for a functor type. +(** Access to the parameters, for a functor type. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let rec module_type_parameters ?(trans=true) mt = let rec iter k = match k with - Some (Module_type_functor (p, k2)) -> + Some (Module_type_functor (p, k2)) -> let param = (* we create the couple (parameter, description opt), using the description of the parameter if we can find it in the comment.*) @@ -358,15 +360,15 @@ let rec module_type_parameters ?(trans=true) mt = [] | None -> [] - in + in iter mt.mt_kind (** Access to the parameters, for a functor. @param trans indicates if, for aliased modules, we must perform a transitive search.*) and module_parameters ?(trans=true) m = let rec iter = function - Module_functor (p, k) -> - let param = + Module_functor (p, k) -> + let param = (* we create the couple (parameter, description opt), using the description of the parameter if we can find it in the comment.*) match m.m_info with @@ -394,8 +396,8 @@ and module_parameters ?(trans=true) m = { mt_name = "" ; mt_info = None ; mt_type = None ; mt_is_interface = false ; mt_file = "" ; mt_kind = Some tk ; mt_loc = Odoc_types.dummy_loc } - | Module_struct _ - | Module_apply _ + | Module_struct _ + | Module_apply _ | Module_with _ -> [] in @@ -411,31 +413,31 @@ let rec module_all_submodules ?(trans=true) m = l (** The module type is a functor if is defined as a functor or if it is an alias for a functor. *) -let rec module_type_is_functor mt = +let rec module_type_is_functor mt = let rec iter k = match k with Some (Module_type_functor _) -> true | Some (Module_type_alias mta) -> ( match mta.mta_module with - None -> false + None -> false | Some mtyp -> module_type_is_functor mtyp ) | Some (Module_type_with (k, _)) -> iter (Some k) - | Some (Module_type_struct _) + | Some (Module_type_struct _) | None -> false in iter mt.mt_kind (** The module is a functor if is defined as a functor or if it is an alias for a functor. *) -let module_is_functor m = +let module_is_functor m = let rec iter = function Module_functor _ -> true | Module_alias ma -> ( match ma.ma_module with - None -> false + None -> false | Some (Mod mo) -> iter mo.m_kind | Some (Modtype mt) -> module_type_is_functor mt ) @@ -445,11 +447,11 @@ let module_is_functor m = in iter m.m_kind -(** Returns the list of values of a module type. +(** Returns the list of values of a module type. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_type_values ?(trans=true) m = values (module_type_elements ~trans m) - -(** Returns the list of types of a module. + +(** Returns the list of types of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_type_types ?(trans=true) m = types (module_type_elements ~trans m) @@ -477,7 +479,7 @@ let module_type_module_types ?(trans=true) m = mod_types (module_type_elements ~ @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_type_included_modules ?(trans=true) m = included_modules (module_type_elements ~trans m) -(** Returns the list of comments of a module. +(** Returns the list of comments of a module. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_type_comments ?(trans=true) m = comments (module_type_elements ~trans m) @@ -485,21 +487,21 @@ let module_type_comments ?(trans=true) m = comments (module_type_elements ~trans @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_type_functions ?(trans=true) mt = List.filter - (fun v -> Odoc_value.is_function v) + (fun v -> Odoc_value.is_function v) (values (module_type_elements ~trans mt)) -(** Returns the list of non-functional values of a module type. +(** Returns the list of non-functional values of a module type. @param trans indicates if, for aliased modules, we must perform a transitive search.*) let module_type_simple_values ?(trans=true) mt = List.filter - (fun v -> not (Odoc_value.is_function v)) + (fun v -> not (Odoc_value.is_function v)) (values (module_type_elements ~trans mt)) (** {2 Functions for modules and module types} *) -(** The list of classes defined in this module and all its modules, functors, .... +(** The list of classes defined in this module and all its modules, functors, .... @param trans indicates if, for aliased modules, we must perform a transitive search.*) -let rec module_all_classes ?(trans=true) m = +let rec module_all_classes ?(trans=true) m = List.fold_left (fun acc -> fun m -> acc @ (module_all_classes ~trans m)) ( @@ -510,7 +512,7 @@ let rec module_all_classes ?(trans=true) m = ) (module_modules ~trans m) -(** The list of classes defined in this module type and all its modules, functors, .... +(** The list of classes defined in this module type and all its modules, functors, .... @param trans indicates if, for aliased modules, we must perform a transitive search.*) and module_type_all_classes ?(trans=true) mt = List.fold_left diff --git a/ocamldoc/odoc_search.ml b/ocamldoc/odoc_search.ml index d25aee63d..3329475d5 100644 --- a/ocamldoc/odoc_search.ml +++ b/ocamldoc/odoc_search.ml @@ -43,7 +43,7 @@ module type Predicates = val p_class : t_class -> t -> bool * bool val p_class_type : t_class_type -> t -> bool * bool val p_value : t_value -> t -> bool - val p_type : t_type -> t -> bool + val p_type : t_type -> t -> bool val p_exception : t_exception -> t -> bool val p_attribute : t_attribute -> t -> bool val p_method : t_method -> t -> bool @@ -65,7 +65,7 @@ module Search = | T.Code _ | T.CodePre _ | T.Latex _ - | T.Verbatim _ + | T.Verbatim _ | T.Ref (_, _) -> [] | T.Bold t | T.Italic t @@ -76,13 +76,14 @@ module Search = | T.Block t | T.Superscript t | T.Subscript t + | T.Custom (_,t) | T.Link (_, t) -> search_text root t v - | T.List l + | T.List l | T.Enum l -> List.flatten (List.map (fun t -> search_text root t v) l) - | T.Newline + | T.Newline | T.Module_list _ | T.Index_list -> [] - | T.Title (n, l_opt, t) -> + | T.Title (n, l_opt, t) -> (match l_opt with None -> [] | Some s -> search_section t (Name.concat root s) v) @ @@ -100,21 +101,21 @@ module Search = let search_class c v = let (go_deeper, ok) = P.p_class c v in - let l = + let l = if go_deeper then - let res_att = + let res_att = List.fold_left (fun acc -> fun att -> acc @ (search_attribute att v)) [] (Odoc_class.class_attributes c) in - let res_met = + let res_met = List.fold_left (fun acc -> fun m -> acc @ (search_method m v)) [] (Odoc_class.class_methods c) in - let res_sec = + let res_sec = List.fold_left (fun acc -> fun t -> acc @ (search_text c.cl_name t v)) [] @@ -132,21 +133,21 @@ module Search = let search_class_type ct v = let (go_deeper, ok) = P.p_class_type ct v in - let l = + let l = if go_deeper then - let res_att = + let res_att = List.fold_left (fun acc -> fun att -> acc @ (search_attribute att v)) [] (Odoc_class.class_type_attributes ct) in - let res_met = + let res_met = List.fold_left (fun acc -> fun m -> acc @ (search_method m v)) [] (Odoc_class.class_type_methods ct) in - let res_sec = + let res_sec = List.fold_left (fun acc -> fun t -> acc @ (search_text ct.clt_name t v)) [] @@ -166,57 +167,57 @@ module Search = let (go_deeper, ok) = P.p_module_type mt v in let l = if go_deeper then - let res_val = + let res_val = List.fold_left (fun acc -> fun va -> acc @ (search_value va v)) [] (Odoc_module.module_type_values mt) in - let res_typ = + let res_typ = List.fold_left (fun acc -> fun t -> acc @ (search_type t v)) [] (Odoc_module.module_type_types mt) in - let res_exc = + let res_exc = List.fold_left (fun acc -> fun e -> acc @ (search_exception e v)) [] (Odoc_module.module_type_exceptions mt) in let res_mod = search (Odoc_module.module_type_modules mt) v in - let res_modtyp = + let res_modtyp = List.fold_left (fun acc -> fun mt -> acc @ (search_module_type mt v)) [] (Odoc_module.module_type_module_types mt) - in - let res_cl = + in + let res_cl = List.fold_left (fun acc -> fun cl -> acc @ (search_class cl v)) [] (Odoc_module.module_type_classes mt) in - let res_cltyp = + let res_cltyp = List.fold_left (fun acc -> fun clt -> acc @ (search_class_type clt v)) [] (Odoc_module.module_type_class_types mt) in - let res_sec = + let res_sec = List.fold_left (fun acc -> fun t -> acc @ (search_text mt.mt_name t v)) [] (Odoc_module.module_type_comments mt) in - let l = res_val @ res_typ @ res_exc @ res_mod @ - res_modtyp @ res_cl @ res_cltyp @ res_sec + let l = res_val @ res_typ @ res_exc @ res_mod @ + res_modtyp @ res_cl @ res_cltyp @ res_sec in l else [] in - if ok then + if ok then (Res_module_type mt) :: l else l @@ -225,64 +226,64 @@ module Search = let (go_deeper, ok) = P.p_module m v in let l = if go_deeper then - let res_val = + let res_val = List.fold_left (fun acc -> fun va -> acc @ (search_value va v)) [] (Odoc_module.module_values m) in - let res_typ = + let res_typ = List.fold_left (fun acc -> fun t -> acc @ (search_type t v)) [] (Odoc_module.module_types m) in - let res_exc = + let res_exc = List.fold_left (fun acc -> fun e -> acc @ (search_exception e v)) [] (Odoc_module.module_exceptions m) in let res_mod = search (Odoc_module.module_modules m) v in - let res_modtyp = + let res_modtyp = List.fold_left (fun acc -> fun mt -> acc @ (search_module_type mt v)) [] (Odoc_module.module_module_types m) in - let res_cl = + let res_cl = List.fold_left (fun acc -> fun cl -> acc @ (search_class cl v)) [] (Odoc_module.module_classes m) in - let res_cltyp = + let res_cltyp = List.fold_left (fun acc -> fun clt -> acc @ (search_class_type clt v)) [] (Odoc_module.module_class_types m) in - let res_sec = + let res_sec = List.fold_left (fun acc -> fun t -> acc @ (search_text m.m_name t v)) [] (Odoc_module.module_comments m) in - let l = res_val @ res_typ @ res_exc @ res_mod @ + let l = res_val @ res_typ @ res_exc @ res_mod @ res_modtyp @ res_cl @ res_cltyp @ res_sec in l else [] in - if ok then + if ok then (Res_module m) :: l else l and search module_list v = List.fold_left - (fun acc -> fun m -> + (fun acc -> fun m -> List.fold_left (fun acc2 -> fun ele -> if List.mem ele acc2 then acc2 else acc2 @ [ele] @@ -294,8 +295,8 @@ module Search = module_list end -module P_name = - struct +module P_name = + struct type t = Str.regexp let (=~) name regexp = Str.string_match regexp name 0 let p_module m r = (true, m.m_name =~ r) @@ -309,11 +310,11 @@ module P_name = let p_method m r = m.met_value.val_name =~ r let p_section s r = s =~ r end - + module Search_by_name = Search ( P_name ) module P_values = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -327,7 +328,7 @@ module P_values = let p_section _ _ = false end module Search_values = Search ( P_values ) -let values l = +let values l = let l_ele = Search_values.search l () in let p v1 v2 = v1.val_name = v2.val_name in let rec iter acc = function @@ -336,9 +337,9 @@ let values l = | [] -> acc in iter [] l_ele - + module P_exceptions = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -352,7 +353,7 @@ module P_exceptions = let p_section _ _ = false end module Search_exceptions = Search ( P_exceptions ) -let exceptions l = +let exceptions l = let l_ele = Search_exceptions.search l () in let p e1 e2 = e1.ex_name = e2.ex_name in let rec iter acc = function @@ -361,9 +362,9 @@ let exceptions l = | [] -> acc in iter [] l_ele - + module P_types = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -377,7 +378,7 @@ module P_types = let p_section _ _ = false end module Search_types = Search ( P_types ) -let types l = +let types l = let l_ele = Search_types.search l () in let p t1 t2 = t1.ty_name = t2.ty_name in let rec iter acc = function @@ -386,9 +387,9 @@ let types l = | [] -> acc in iter [] l_ele - + module P_attributes = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -402,7 +403,7 @@ module P_attributes = let p_section _ _ = false end module Search_attributes = Search ( P_attributes ) -let attributes l = +let attributes l = let l_ele = Search_attributes.search l () in let p a1 a2 = a1.att_value.val_name = a2.att_value.val_name in let rec iter acc = function @@ -413,7 +414,7 @@ let attributes l = iter [] l_ele module P_methods = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -427,7 +428,7 @@ module P_methods = let p_section _ _ = true end module Search_methods = Search ( P_methods ) -let methods l = +let methods l = let l_ele = Search_methods.search l () in let p m1 m2 = m1.met_value.val_name = m2.met_value.val_name in let rec iter acc = function @@ -438,7 +439,7 @@ let methods l = iter [] l_ele module P_classes = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -452,7 +453,7 @@ module P_classes = let p_section _ _ = false end module Search_classes = Search ( P_classes ) -let classes l = +let classes l = let l_ele = Search_classes.search l () in let p c1 c2 = c1.cl_name = c2.cl_name in let rec iter acc = function @@ -463,7 +464,7 @@ let classes l = iter [] l_ele module P_class_types = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, false) @@ -477,7 +478,7 @@ module P_class_types = let p_section _ _ = false end module Search_class_types = Search ( P_class_types ) -let class_types l = +let class_types l = let l_ele = Search_class_types.search l () in let p c1 c2 = c1.clt_name = c2.clt_name in let rec iter acc = function @@ -488,7 +489,7 @@ let class_types l = iter [] l_ele module P_modules = - struct + struct type t = unit let p_module _ _ = (true, true) let p_module_type _ _ = (true, false) @@ -502,7 +503,7 @@ module P_modules = let p_section _ _ = false end module Search_modules = Search ( P_modules ) -let modules l = +let modules l = let l_ele = Search_modules.search l () in let p m1 m2 = m1.m_name = m2.m_name in let rec iter acc = function @@ -513,7 +514,7 @@ let modules l = iter [] l_ele module P_module_types = - struct + struct type t = unit let p_module _ _ = (true, false) let p_module_type _ _ = (true, true) @@ -527,7 +528,7 @@ module P_module_types = let p_section _ _ = false end module Search_module_types = Search ( P_module_types ) -let module_types l = +let module_types l = let l_ele = Search_module_types.search l () in let p m1 m2 = m1.mt_name = m2.mt_name in let rec iter acc = function @@ -620,7 +621,7 @@ let method_exists mods regexp = let find_section mods regexp = let l = Search_by_name.search mods regexp in - match + match List.find (function Res_section _ -> true diff --git a/ocamldoc/odoc_sig.ml b/ocamldoc/odoc_sig.ml index 0fbc946ab..4df35e03a 100644 --- a/ocamldoc/odoc_sig.ml +++ b/ocamldoc/odoc_sig.ml @@ -683,6 +683,7 @@ module Analyser = m_top_deps = [] ; m_code = None ; m_code_intf = code_intf ; + m_text_only = false ; } in let (maybe_more, info_after_opt) = @@ -773,6 +774,7 @@ module Analyser = m_top_deps = [] ; m_code = None ; m_code_intf = code_intf ; + m_text_only = false ; } in let (maybe_more, info_after_opt) = @@ -1318,6 +1320,7 @@ module Analyser = m_top_deps = [] ; m_code = None ; m_code_intf = code_intf ; + m_text_only = false ; } end diff --git a/ocamldoc/odoc_texi.ml b/ocamldoc/odoc_texi.ml index b2670a85b..b934f8576 100644 --- a/ocamldoc/odoc_texi.ml +++ b/ocamldoc/odoc_texi.ml @@ -12,29 +12,29 @@ (** Generation of Texinfo documentation. *) -open Odoc_info +open Odoc_info open Parameter open Value open Type open Exception -open Class +open Class open Module (** {2 Some small helper functions} *) -let puts_nl chan s = +let puts_nl chan s = output_string chan s ; output_char chan '\n' -let puts chan s = +let puts chan s = output_string chan s -let nl chan = +let nl chan = output_char chan '\n' let is = function | None -> false | Some _ -> true -let pad_to n s = +let pad_to n s = let len = String.length s in if len < n then @@ -42,28 +42,28 @@ let pad_to n s = String.blit s 0 s' 0 len ; s' else s -let indent nb_sp s = +let indent nb_sp s = let c = ref 0 in let len = pred (String.length s) in for i = 0 to len do if s.[i] = '\n' then incr c done ; let s' = String.make (succ len + (succ !c) * nb_sp ) ' ' in c := nb_sp ; - for i = 0 to len do - s'.[!c] <- s.[i] ; + for i = 0 to len do + s'.[!c] <- s.[i] ; if s.[i] = '\n' then c := !c + nb_sp ; incr c done ; s' -type subparts = [ +type subparts = [ | `Module of Odoc_info.Module.t_module | `Module_type of Odoc_info.Module.t_module_type | `Class of Odoc_info.Class.t_class | `Class_type of Odoc_info.Class.t_class_type ] -type menu_data = [ - | subparts +type menu_data = [ + | subparts | `Blank | `Comment of string | `Texi of string @@ -72,22 +72,22 @@ type menu_data = [ let nothing = Verbatim "" -let module_subparts = +let module_subparts = let rec iter acc = function | [] -> List.rev acc - (* skip aliases *) - | Element_module { m_kind = Module_alias _ } :: n -> + (* skip aliases *) + | Element_module { m_kind = Module_alias _ } :: n -> iter acc n - | Element_module_type { mt_kind = Some (Module_type_alias _) } :: n -> + | Element_module_type { mt_kind = Some (Module_type_alias _) } :: n -> iter acc n (* keep modules, module types, classes and class types *) - | Element_module m :: n -> - iter (`Module m :: acc) n - | Element_module_type mt :: n -> + | Element_module m :: n -> + iter (`Module m :: acc) n + | Element_module_type mt :: n -> iter (`Module_type mt :: acc) n - | Element_class c :: n -> + | Element_class c :: n -> iter (`Class c :: acc) n - | Element_class_type ct :: n -> + | Element_class_type ct :: n -> iter (`Class_type ct :: acc) n (* forget the rest *) | _ :: n -> iter acc n @@ -95,14 +95,14 @@ let module_subparts = iter [] type indices = [ - | `Type - | `Exception - | `Value - | `Class_att - | `Method - | `Class - | `Class_type - | `Module + | `Type + | `Exception + | `Value + | `Class_att + | `Method + | `Class + | `Class_type + | `Module | `Module_type ] @@ -130,8 +130,8 @@ let indices_names = [ -(** Module for generating various Texinfo things (menus, xrefs, ...) *) -module Texi = +(** Module for generating various Texinfo things (menus, xrefs, ...) *) +module Texi = struct (** Associations of strings to subsitute in Texinfo code. *) let subst_strings = [ @@ -140,12 +140,12 @@ struct (Str.regexp "}", "@}") ; (Str.regexp "\\.\\.\\.", "@dots{}") ; ] @ - (if !Args.esc_8bits + (if !Args.esc_8bits then [ (Str.regexp "à", "@`a") ; (Str.regexp "â", "@^a") ; (Str.regexp "é", "@'e") ; - (Str.regexp "è", "@`e") ; + (Str.regexp "è", "@`e") ; (Str.regexp "ê", "@^e") ; (Str.regexp "ë", "@\"e") ; (Str.regexp "ç", "@,{c}") ; @@ -163,43 +163,43 @@ struct else []) (** Escape the strings which would clash with Texinfo syntax. *) - let escape s = + let escape s = List.fold_left (fun acc (p, r) -> Str.global_replace p r acc) s subst_strings (** Removes dots (no good for a node name). *) - let fix_nodename s = + let fix_nodename s = Str.global_replace (Str.regexp "\\.") "/" (escape s) (** Generates a Texinfo menu. *) - let generate_menu chan subpart_list = + let generate_menu chan subpart_list = if subpart_list <> [] then begin - let menu_line part_qual name = + let menu_line part_qual name = let sname = Name.simple name in if sname = name then ( - puts chan (pad_to 35 + puts chan (pad_to 35 ("* " ^ sname ^ ":: ")) ; puts_nl chan part_qual ) else ( - puts chan (pad_to 35 + puts chan (pad_to 35 ("* " ^ sname ^ ": " ^ (fix_nodename name) ^ ". " )) ; puts_nl chan part_qual ) in puts_nl chan "@menu" ; List.iter (function - | `Module { m_name = name } -> + | `Module { m_name = name } -> menu_line Odoc_messages.modul name | `Module_type { mt_name = name } -> menu_line Odoc_messages.module_type name | `Class { cl_name = name } -> menu_line Odoc_messages.clas name | `Class_type { clt_name = name } -> - menu_line Odoc_messages.class_type name - | `Blank -> nl chan + menu_line Odoc_messages.class_type name + | `Blank -> nl chan | `Comment c -> puts_nl chan (escape c) | `Texi t -> puts_nl chan t | `Index ind -> Printf.fprintf chan "* %s::\n" ind) @@ -209,22 +209,22 @@ struct (** cross reference to node [name] *) let xref ?xname name = - "@xref{" ^ (fix_nodename name) ^ - (match xname with | None -> "" | Some s -> "," ^ s) ^ + "@xref{" ^ (fix_nodename name) ^ + (match xname with | None -> "" | Some s -> "," ^ s) ^ "}." (** enclose the string between [\@ifinfo] tags *) - let ifinfo s = + let ifinfo s = String.concat "\n" [ "@ifinfo" ; s ; "@end ifinfo" ; "" ] - (** [install-info] informations *) + (** [install-info] informations *) let dirsection sec = "@dircategory " ^ (escape sec) let direntry ent = - [ "@direntry" ] @ - (List.map escape ent) @ + [ "@direntry" ] @ + (List.map escape ent) @ [ "@end direntry" ] end @@ -235,7 +235,7 @@ end (** {2 Generation of Texinfo code} *) (** This class generates Texinfo code from text structures *) -class text = +class text = object(self) (** Associations between a title number and texinfo code. *) @@ -246,7 +246,7 @@ class text = 4, "@subsubsection " ; ] - val fallback_title = + val fallback_title = "@unnumberedsubsubsec " val headings = [ @@ -254,24 +254,24 @@ class text = 2, "@heading " ; 3, "@subheading " ; 4, "@subsubheading " ; - ] - - val fallback_heading = - "@subsubheading " + ] + + val fallback_heading = + "@subsubheading " - method escape = - Texi.escape + method escape = + Texi.escape (** this method is not used here but is virtual in a class we will inherit later *) - method label ?(no_ : bool option) (_ : string) : string = + method label ?(no_ : bool option) (_ : string) : string = failwith "gni" (** Return the Texinfo code corresponding to the [text] parameter.*) method texi_of_text t = String.concat "" (List.map self#texi_of_text_element t) - + (** {3 Conversion methods} [texi_of_????] converts a [text_element] to a Texinfo string. *) @@ -297,36 +297,39 @@ class text = | Ref (name, kind) ->self#texi_of_Ref name kind | Superscript t -> self#texi_of_Superscript t | Subscript t -> self#texi_of_Subscript t - | Odoc_info.Module_list _ -> "" - | Odoc_info.Index_list -> "" + | Odoc_info.Module_list _ -> "" + | Odoc_info.Index_list -> "" + | Odoc_info.Custom (s,t) -> self#texi_of_custom_text s t + + method texi_of_custom_text s t = "" method texi_of_Verbatim s = s method texi_of_Raw s = self#escape s method texi_of_Code s = "@code{" ^ (self#escape s) ^ "}" - method texi_of_CodePre s = + method texi_of_CodePre s = String.concat "\n" [ "" ; "@example" ; self#escape s ; "@end example" ; "" ] method texi_of_Bold t = "@strong{" ^ (self#texi_of_text t) ^ "}" method texi_of_Italic t = "@i{" ^ (self#texi_of_text t) ^ "}" method texi_of_Emphasize t = "@emph{" ^ (self#texi_of_text t) ^ "}" - method texi_of_Center t = + method texi_of_Center t = let sl = Str.split (Str.regexp "\n") (self#texi_of_text t) in String.concat "" ((List.map (fun s -> "\n@center "^s) sl) @ [ "\n" ]) method texi_of_Left t = - String.concat "\n" + String.concat "\n" [ "" ; "@flushleft" ; self#texi_of_text t ; "@end flushleft" ; "" ] - method texi_of_Right t = - String.concat "\n" + method texi_of_Right t = + String.concat "\n" [ "" ; "@flushright" ; self#texi_of_text t ; "@end flushright"; "" ] - method texi_of_List tl = + method texi_of_List tl = String.concat "\n" - ( [ "" ; "@itemize" ] @ + ( [ "" ; "@itemize" ] @ (List.map (fun t -> "@item\n" ^ (self#texi_of_text t)) tl) @ [ "@end itemize"; "" ] ) - method texi_of_Enum tl = + method texi_of_Enum tl = String.concat "\n" - ( [ "" ; "@enumerate" ] @ + ( [ "" ; "@enumerate" ] @ (List.map (fun t -> "@item\n" ^ (self#texi_of_text t)) tl) @ [ "@end enumerate"; "" ] ) method texi_of_Newline = "\n" @@ -334,23 +337,23 @@ class text = String.concat "\n" [ "@format" ; self#texi_of_text t ; "@end format" ; "" ] method texi_of_Title n t = - let t_begin = - try List.assoc n titles + let t_begin = + try List.assoc n titles with Not_found -> fallback_title in t_begin ^ (self#texi_of_text t) ^ "\n" method texi_of_Link s t = String.concat "" [ "@uref{" ; s ; "," ; self#texi_of_text t ; "}" ] method texi_of_Ref name kind = - let xname = + let xname = match kind with - | Some RK_module -> + | Some RK_module -> Odoc_messages.modul ^ " " ^ (Name.simple name) - | Some RK_module_type -> + | Some RK_module_type -> Odoc_messages.module_type ^ " " ^ (Name.simple name) - | Some RK_class -> + | Some RK_class -> Odoc_messages.clas ^ " " ^ (Name.simple name) - | Some RK_class_type -> + | Some RK_class_type -> Odoc_messages.class_type ^ " " ^ (Name.simple name) | _ -> "" in @@ -361,13 +364,13 @@ class text = "_@{" ^ (self#texi_of_text t) ^ "@}" method heading n t = - let f = + let f = try List.assoc n headings with Not_found -> fallback_heading in f ^ (self#texi_of_text t) ^ "\n" - method fixedblock t = + method fixedblock t = Block ( ( Verbatim "@t{" :: t ) @ [ Verbatim "}" ] ) end @@ -396,29 +399,29 @@ class texi = don't do it, just link to the previous one *) val node_tbl = Hashtbl.create 37 - method node depth name = + method node depth name = if Hashtbl.mem node_tbl name then raise Aliased_node ; Hashtbl.add node_tbl name () ; - if depth <= maxdepth + if depth <= maxdepth then Verbatim ("@node " ^ (Texi.fix_nodename name) ^ ",\n") else nothing - method index (ind : indices) ent = - Verbatim - (if !Args.with_index + method index (ind : indices) ent = + Verbatim + (if !Args.with_index then (assert(List.mem ind indices_to_build) ; - String.concat "" - [ "@" ; indices ind ; "index " ; - Texi.escape (Name.simple ent) ; "\n" ]) + String.concat "" + [ "@" ; indices ind ; "index " ; + Texi.escape (Name.simple ent) ; "\n" ]) else "") - + (** Two hacks to fix linebreaks in the descriptions.*) - method private fix_linebreaks = + method private fix_linebreaks = let re = Str.regexp "\n[ \t]*" in fun t -> - List.map + List.map (function | Newline -> Raw "\n" | Raw s -> Raw (Str.global_replace re "\n" s) @@ -426,7 +429,7 @@ class texi = | Enum tel -> Enum (List.map self#fix_linebreaks tel) | te -> te) t - method private soft_fix_linebreaks = + method private soft_fix_linebreaks = let re = Str.regexp "\n[ \t]*" in fun ind t -> let rep = String.make (succ ind) ' ' in @@ -443,16 +446,16 @@ class texi = method text_of_desc = function | None -> [] | Some [ Raw "" ] -> [] - | Some t -> (self#fix_linebreaks t) @ [ Newline ] + | Some t -> (self#fix_linebreaks t) @ [ Newline ] - method text_of_sees_opt see_l = + method text_of_sees_opt see_l = List.concat (List.map (function | (See_url s, t) -> [ linebreak ; Bold [ Raw Odoc_messages.see_also ] ; Raw " " ; Link (s, t) ; Newline ] - | (See_file s, t) + | (See_file s, t) | (See_doc s, t) -> [ linebreak ; Bold [ Raw Odoc_messages.see_also ] ; Raw " " ; Raw s ] @ t @ [ Newline ]) @@ -462,17 +465,17 @@ class texi = List.concat (List.map (fun (s, t) -> - [ linebreak ; + [ linebreak ; Bold [ Raw Odoc_messages.parameters ] ; Raw " " ; Raw s ; Raw ": " ] @ t @ [ Newline ] ) params_list) method text_of_raised_exceptions = function | [] -> [] - | (s, t) :: [] -> + | (s, t) :: [] -> [ linebreak ; Bold [ Raw Odoc_messages.raises ] ; - Raw " " ; Code s ; Raw " " ] + Raw " " ; Code s ; Raw " " ] @ t @ [ Newline ] | l -> [ linebreak ; @@ -481,17 +484,17 @@ class texi = List (List.map (fun (ex, desc) ->(Code ex) :: (Raw " ") :: desc ) l ) ; - Newline ] + Newline ] method text_of_return_opt = function | None -> [] - | Some t -> + | Some t -> (Bold [Raw Odoc_messages.returns ]) :: Raw " " :: t @ [ Newline ] method text_of_custom c_l = - List.flatten - (List.rev - (List.fold_left + List.flatten + (List.rev + (List.fold_left (fun acc -> fun (tag, text) -> try let f = List.assoc tag tag_functions in @@ -504,22 +507,22 @@ class texi = method text_of_info ?(block=false) = function | None -> [] - | Some info -> - let t = + | Some info -> + let t = List.concat [ ( match info.i_deprecated with | None -> [] - | Some t -> - (Raw (Odoc_messages.deprecated ^ " ")) :: - (self#fix_linebreaks t) + | Some t -> + (Raw (Odoc_messages.deprecated ^ " ")) :: + (self#fix_linebreaks t) @ [ Newline ; Newline ] ) ; self#text_of_desc info.i_desc ; - if info.i_authors <> [] + if info.i_authors <> [] then ( linebreak :: self#text_of_author_list info.i_authors ) else [] ; - if is info.i_version - then ( linebreak :: + if is info.i_version + then ( linebreak :: self#text_of_version_opt info.i_version ) else [] ; self#text_of_sees_opt info.i_sees ; @@ -530,38 +533,38 @@ class texi = self#text_of_params info.i_params ; self#text_of_raised_exceptions info.i_raised_exceptions ; if is info.i_return_value - then ( linebreak :: + then ( linebreak :: self#text_of_return_opt info.i_return_value ) else [] ; self#text_of_custom info.i_custom ; ] in - if block - then [ Block t ] + if block + then [ Block t ] else (t @ [ Newline ] ) method texi_of_info i = self#texi_of_text (self#text_of_info i) (** {3 Conversion of [module_elements] into Texinfo strings} - The following functions convert [module_elements] and their + The following functions convert [module_elements] and their description to [text] values then to Texinfo strings using the functions above. *) - method text_el_of_type_expr m_name typ = + method text_el_of_type_expr m_name typ = Raw (indent 5 - (self#relative_idents m_name + (self#relative_idents m_name (Odoc_info.string_of_type_expr typ))) method text_of_short_type_expr m_name typ = [ Raw (self#normal_type m_name typ) ] (** Return Texinfo code for a value. *) - method texi_of_value v = + method texi_of_value v = Odoc_info.reset_type_names () ; - let t = [ self#fixedblock - [ Newline ; minus ; - Raw ("val " ^ (Name.simple v.val_name) ^ " :\n") ; - self#text_el_of_type_expr + let t = [ self#fixedblock + [ Newline ; minus ; + Raw ("val " ^ (Name.simple v.val_name) ^ " :\n") ; + self#text_el_of_type_expr (Name.father v.val_name) v.val_type ] ; self#index `Value v.val_name ; Newline ] @ (self#text_of_info v.val_info) in @@ -572,13 +575,13 @@ class texi = method texi_of_attribute a = Odoc_info.reset_type_names () ; let t = [ self#fixedblock - [ Newline ; minus ; + [ Newline ; minus ; Raw "val " ; Raw (if a.att_mutable then "mutable " else "") ; Raw (Name.simple a.att_value.val_name) ; - Raw " :\n" ; - self#text_el_of_type_expr - (Name.father a.att_value.val_name) + Raw " :\n" ; + self#text_el_of_type_expr + (Name.father a.att_value.val_name) a.att_value.val_type ] ; self#index `Class_att a.att_value.val_name ; Newline ] @ (self#text_of_info a.att_value.val_info) in @@ -586,15 +589,15 @@ class texi = (** Return Texinfo code for a class method. *) - method texi_of_method m = + method texi_of_method m = Odoc_info.reset_type_names () ; let t = [ self#fixedblock [ Newline ; minus ; Raw "method " ; Raw (if m.met_private then "private " else "") ; Raw (if m.met_virtual then "virtual " else "") ; Raw (Name.simple m.met_value.val_name) ; - Raw " :\n" ; - self#text_el_of_type_expr + Raw " :\n" ; + self#text_el_of_type_expr (Name.father m.met_value.val_name) m.met_value.val_type ] ; self#index `Method m.met_value.val_name ; Newline ] @ @@ -602,81 +605,81 @@ class texi = self#texi_of_text t - method string_of_type_parameters t = + method string_of_type_parameters t = let f (tp, co, cn) = - Printf.sprintf "%s%s" - (Odoc_info.string_of_variance t (co, cn)) - (Odoc_info.string_of_type_expr tp) + Printf.sprintf "%s%s" + (Odoc_info.string_of_variance t (co, cn)) + (Odoc_info.string_of_type_expr tp) in match t.ty_parameters with | [] -> "" - | [ (tp, co, cn) ] -> - (f (tp, co, cn))^" " - | l -> - Printf.sprintf "(%s) " - (String.concat ", " (List.map f l)) + | [ (tp, co, cn) ] -> + (f (tp, co, cn))^" " + | l -> + Printf.sprintf "(%s) " + (String.concat ", " (List.map f l)) method string_of_type_args = function | [] -> "" | args -> " of " ^ (Odoc_info.string_of_type_list " * " args) (** Return Texinfo code for a type. *) - method texi_of_type ty = + method texi_of_type ty = Odoc_info.reset_type_names () ; - let t = - [ self#fixedblock ( + let t = + [ self#fixedblock ( [ Newline ; minus ; Raw "type " ; Raw (self#string_of_type_parameters ty) ; Raw (Name.simple ty.ty_name) ] @ ( match ty.ty_manifest with - | None -> [] - | Some typ -> - (Raw " = ") :: (self#text_of_short_type_expr + | None -> [] + | Some typ -> + (Raw " = ") :: (self#text_of_short_type_expr (Name.father ty.ty_name) typ) ) @ - ( - match ty.ty_kind with + ( + match ty.ty_kind with | Type_abstract -> [ Newline ] | Type_variant (l, priv) -> (Raw (" ="^(if priv then " private" else "")^"\n")) :: - (List.flatten - (List.map + (List.flatten + (List.map (fun constr -> (Raw (" | " ^ constr.vc_name)) :: (Raw (self#string_of_type_args constr.vc_args)) :: (match constr.vc_text with | None -> [ Newline ] - | Some t -> - ((Raw (indent 5 "\n(* ")) :: (self#soft_fix_linebreaks 8 t)) @ + | Some t -> + ((Raw (indent 5 "\n(* ")) :: (self#soft_fix_linebreaks 8 t)) @ [ Raw " *)" ; Newline ] ) ) l ) ) | Type_record (l, priv) -> (Raw (" = "^(if priv then "private " else "")^"{\n")) :: - (List.flatten - (List.map - (fun r -> + (List.flatten + (List.map + (fun r -> [ Raw (" " ^ r.rf_name ^ " : ") ] @ - (self#text_of_short_type_expr + (self#text_of_short_type_expr (Name.father r.rf_name) - r.rf_type) @ + r.rf_type) @ [ Raw " ;" ] @ (match r.rf_text with | None -> [ Newline ] - | Some t -> - ((Raw (indent 5 "\n(* ")) :: (self#soft_fix_linebreaks 8 t)) @ - [ Raw " *)" ; Newline ] ) ) + | Some t -> + ((Raw (indent 5 "\n(* ")) :: (self#soft_fix_linebreaks 8 t)) @ + [ Raw " *)" ; Newline ] ) ) l ) ) - @ [ Raw " }" ] - ) ) ; + @ [ Raw " }" ] + ) ) ; self#index `Type ty.ty_name ; Newline ] @ (self#text_of_info ty.ty_info) in self#texi_of_text t (** Return Texinfo code for an exception. *) - method texi_of_exception e = + method texi_of_exception e = Odoc_info.reset_type_names () ; - let t = + let t = [ self#fixedblock - ( [ Newline ; minus ; Raw "exception " ; + ( [ Newline ; minus ; Raw "exception " ; Raw (Name.simple e.ex_name) ; Raw (self#string_of_type_args e.ex_args) ] @ (match e.ex_alias with @@ -702,18 +705,18 @@ class texi = let resolve_alias_name = function | { m_kind = Module_alias { ma_name = name } } -> name | { m_name = name } -> name in - let t = - [ [ self#fixedblock - [ Newline ; minus ; Raw "module " ; + let t = + [ [ self#fixedblock + [ Newline ; minus ; Raw "module " ; Raw (Name.simple m.m_name) ; - Raw (if is_alias m - then " = " ^ (resolve_alias_name m) + Raw (if is_alias m + then " = " ^ (resolve_alias_name m) else "" ) ] ] ; ( if is_alias_there m - then [ Ref (resolve_alias_name m, Some RK_module) ; + then [ Ref (resolve_alias_name m, Some RK_module) ; Newline ; ] else [] ) ; - ( if is_alias m + ( if is_alias m then [ self#index `Module m.m_name ; Newline ] else [ Newline ] ) ; self#text_of_info m.m_info ] @@ -731,15 +734,15 @@ class texi = let resolve_alias_name = function | { mt_kind = Some (Module_type_alias { mta_name = name }) } -> name | { mt_name = name } -> name in - let t = - [ [ self#fixedblock - [ Newline ; minus ; Raw "module type" ; + let t = + [ [ self#fixedblock + [ Newline ; minus ; Raw "module type" ; Raw (Name.simple mt.mt_name) ; Raw (if is_alias mt - then " = " ^ (resolve_alias_name mt) + then " = " ^ (resolve_alias_name mt) else "" ) ] ] ; ( if is_alias_there mt - then [ Ref (resolve_alias_name mt, Some RK_module_type) ; + then [ Ref (resolve_alias_name mt, Some RK_module_type) ; Newline ; ] else [] ) ; ( if is_alias mt @@ -754,28 +757,28 @@ class texi = let t = [ self#fixedblock ( Newline :: minus :: (Raw "include ") :: ( match im.im_module with - | None -> + | None -> [ Raw im.im_name ] - | Some (Mod { m_name = name }) -> - [ Raw name ; Raw "\n " ; + | Some (Mod { m_name = name }) -> + [ Raw name ; Raw "\n " ; Ref (name, Some RK_module) ] | Some (Modtype { mt_name = name }) -> - [ Raw name ; Raw "\n " ; + [ Raw name ; Raw "\n " ; Ref (name, Some RK_module_type) ] - ) @ - [ Newline ] @ - (self#text_of_info im.im_info) - ) - ] + ) @ + [ Newline ] @ + (self#text_of_info im.im_info) + ) + ] in self#texi_of_text t (** Return the Texinfo code for the given class. *) method texi_of_class c = Odoc_info.reset_type_names () ; - let t = [ self#fixedblock - [ Newline ; minus ; Raw "class " ; - Raw (Name.simple c.cl_name) ] ; + let t = [ self#fixedblock + [ Newline ; minus ; Raw "class " ; + Raw (Name.simple c.cl_name) ] ; Ref (c.cl_name, Some RK_class) ; Newline ; Newline ] @ (self#text_of_info c.cl_info) in self#texi_of_text t @@ -783,9 +786,9 @@ class texi = (** Return the Texinfo code for the given class type. *) method texi_of_class_type ct = Odoc_info.reset_type_names () ; - let t = [ self#fixedblock - [ Newline ; minus ; Raw "class type " ; - Raw (Name.simple ct.clt_name) ] ; + let t = [ self#fixedblock + [ Newline ; minus ; Raw "class type " ; + Raw (Name.simple ct.clt_name) ] ; Ref (ct.clt_name, Some RK_class_type) ; Newline ; Newline ] @ (self#text_of_info ct.clt_info) in self#texi_of_text t @@ -808,7 +811,7 @@ class texi = | Element_value v -> self#texi_of_value v | Element_exception e -> self#texi_of_exception e | Element_type t -> self#texi_of_type t - | Element_module_comment t -> + | Element_module_comment t -> self#texi_of_text (Newline :: t @ [Newline]) ) @@ -825,9 +828,9 @@ class texi = | None -> [] | Some t -> Newline :: t) | Some cct -> (* we can create the reference *) - let kind = + let kind = match cct with - | Cl _ -> Some RK_class + | Cl _ -> Some RK_class | Cltype _ -> Some RK_class_type in (Code inh.ic_name) :: (Ref (inh.ic_name, kind)) :: @@ -837,13 +840,13 @@ class texi = in let text = [ Bold [ Raw Odoc_messages.inherits ] ; - List (List.map f inher_l) ; Newline ] + List (List.map f inher_l) ; Newline ] in puts chanout (self#texi_of_text text) - (** Generate the Texinfo code for the inherited classes + (** Generate the Texinfo code for the inherited classes of the given class. *) method generate_class_inheritance_info chanout cl = let rec iter_kind = function @@ -858,7 +861,7 @@ class texi = - (** Generate the Texinfo code for the inherited classes + (** Generate the Texinfo code for the inherited classes of the given class type. *) method generate_class_type_inheritance_info chanout clt = match clt.clt_kind with @@ -869,16 +872,16 @@ class texi = | Class_type _ -> () - (** Generate the Texinfo code for the given class, + (** Generate the Texinfo code for the given class, in the given out channel. *) method generate_for_class chanout c = try Odoc_info.reset_type_names () ; let depth = Name.depth c.cl_name in - let title = [ + let title = [ self#node depth c.cl_name ; Title (depth, None, [ Raw (Odoc_messages.clas ^ " ") ; - Code c.cl_name ]) ; + Code c.cl_name ]) ; self#index `Class c.cl_name ] in puts chanout (self#texi_of_text title) ; @@ -887,10 +890,10 @@ class texi = let descr = [ Title (succ depth, None, [ Raw Odoc_messages.description ]) ] in puts chanout (self#texi_of_text descr) ; - puts chanout (self#texi_of_info c.cl_info) + puts chanout (self#texi_of_info c.cl_info) end ; - - let intf = [ Title (succ depth, None, + + let intf = [ Title (succ depth, None, [ Raw Odoc_messages.interface]) ] in puts chanout (self#texi_of_text intf); self#generate_class_inheritance_info chanout c ; @@ -901,19 +904,19 @@ class texi = with Aliased_node -> () - (** Generate the Texinfo code for the given class type, + (** Generate the Texinfo code for the given class type, in the given out channel. *) method generate_for_class_type chanout ct = try Odoc_info.reset_type_names () ; let depth = Name.depth ct.clt_name in - let title = [ + let title = [ self#node depth ct.clt_name ; - Title (depth, None, [ Raw (Odoc_messages.class_type ^ " ") ; - Code ct.clt_name ]) ; + Title (depth, None, [ Raw (Odoc_messages.class_type ^ " ") ; + Code ct.clt_name ]) ; self#index `Class_type ct.clt_name ] in puts chanout (self#texi_of_text title) ; - + if is ct.clt_info then begin let descr = [ Title (succ depth, None, @@ -922,29 +925,29 @@ class texi = puts chanout (self#texi_of_info ct.clt_info) end ; - let intf = [ Title (succ depth, None, + let intf = [ Title (succ depth, None, [ Raw Odoc_messages.interface ]) ] in puts chanout (self#texi_of_text intf) ; self#generate_class_type_inheritance_info chanout ct; - List.iter + List.iter (fun ele -> puts chanout (self#texi_of_class_element ct.clt_name ele)) (Class.class_type_elements ~trans:false ct) with Aliased_node -> () - (** Generate the Texinfo code for the given module type, + (** Generate the Texinfo code for the given module type, in the given out channel. *) method generate_for_module_type chanout mt = try let depth = Name.depth mt.mt_name in - let title = [ + let title = [ self#node depth mt.mt_name ; - Title (depth, None, [ Raw (Odoc_messages.module_type ^ " ") ; - Code mt.mt_name ]) ; + Title (depth, None, [ Raw (Odoc_messages.module_type ^ " ") ; + Code mt.mt_name ]) ; self#index `Module_type mt.mt_name ; Newline ] in puts chanout (self#texi_of_text title) ; - + if is mt.mt_info then begin let descr = [ Title (succ depth, None, @@ -957,13 +960,13 @@ class texi = let subparts = module_subparts mt_ele in if depth < maxdepth && subparts <> [] then begin - let menu = Texi.ifinfo + let menu = Texi.ifinfo ( self#heading (succ depth) [ Raw "Subparts" ]) in puts chanout menu ; Texi.generate_menu chanout (subparts :> menu_data) end ; - let intf = [ Title (succ depth, None, + let intf = [ Title (succ depth, None, [ Raw Odoc_messages.interface ]) ] in puts chanout (self#texi_of_text intf) ; List.iter @@ -981,19 +984,24 @@ class texi = subparts with Aliased_node -> () - (** Generate the Texinfo code for the given module, + (** Generate the Texinfo code for the given module, in the given out channel. *) method generate_for_module chanout m = try Odoc_info.verbose ("Generate for module " ^ m.m_name) ; let depth = Name.depth m.m_name in - let title = [ + let title = [ self#node depth m.m_name ; - Title (depth, None, [ Raw (Odoc_messages.modul ^ " ") ; - Code m.m_name ]) ; + Title (depth, None, + if m.m_text_only then + [ Raw m.m_name ] + else + [ Raw (Odoc_messages.modul ^ " ") ; + Code m.m_name ] + ) ; self#index `Module m.m_name ; Newline ] in puts chanout (self#texi_of_text title) ; - + if is m.m_info then begin let descr = [ Title (succ depth, None, @@ -1001,18 +1009,18 @@ class texi = puts chanout (self#texi_of_text descr) ; puts chanout (self#texi_of_info m.m_info) end ; - + let m_ele = Module.module_elements ~trans:true m in let subparts = module_subparts m_ele in if depth < maxdepth && subparts <> [] then begin - let menu = Texi.ifinfo + let menu = Texi.ifinfo ( self#heading (succ depth) [ Raw "Subparts" ]) in puts chanout menu ; Texi.generate_menu chanout (subparts :> menu_data) end ; - let intf = [ Title (succ depth, None, + let intf = [ Title (succ depth, None, [ Raw Odoc_messages.interface]) ] in puts chanout (self#texi_of_text intf) ; @@ -1038,47 +1046,47 @@ class texi = | None -> "" | Some s -> self#escape s in let filename = - if texi_filename <> "ocamldoc.texi" - then - let fn = Filename.basename texi_filename in - (if Filename.check_suffix fn ".texi" - then Filename.chop_suffix fn ".texi" - else fn) ^ ".info" - else - if title <> "" - then title ^ ".info" - else "doc.info" + if texi_filename <> "ocamldoc.texi" + then + let fn = Filename.basename texi_filename in + (if Filename.check_suffix fn ".texi" + then Filename.chop_suffix fn ".texi" + else fn) ^ ".info" + else + if title <> "" + then title ^ ".info" + else "doc.info" in (* write a standard Texinfo header *) List.iter (puts_nl chan) - (List.flatten + (List.flatten [ [ "\\input texinfo @c -*-texinfo-*-" ; "@c %**start of header" ; "@setfilename " ^ filename ; "@settitle " ^ title ; "@c %**end of header" ; ] ; - + (if !Args.with_index then - List.map + List.map (fun ind -> "@defcodeindex " ^ (indices ind)) indices_to_build else []) ; - [ Texi.dirsection !Args.info_section ] ; + [ Texi.dirsection !Args.info_section ] ; - Texi.direntry - (if !Args.info_entry <> [] - then !Args.info_entry - else [ Printf.sprintf "* %s: (%s)." - title - (Filename.chop_suffix filename ".info") ]) ; + Texi.direntry + (if !Args.info_entry <> [] + then !Args.info_entry + else [ Printf.sprintf "* %s: (%s)." + title + (Filename.chop_suffix filename ".info") ]) ; [ "@ifinfo" ; "This file was generated by Ocamldoc using the Texinfo generator." ; "@end ifinfo" ; - + "@c no titlepage." ; "@node Top, , , (dir)" ; @@ -1087,53 +1095,53 @@ class texi = (* insert the intro file *) begin - match !Odoc_info.Args.intro_file with - | None when title <> "" -> - puts_nl chan "@ifinfo" ; - puts_nl chan ("Documentation for " ^ title) ; + match !Odoc_info.Args.intro_file with + | None when title <> "" -> + puts_nl chan "@ifinfo" ; + puts_nl chan ("Documentation for " ^ title) ; puts_nl chan "@end ifinfo" - | None -> - puts_nl chan "@c no title given" - | Some f -> - nl chan ; - puts_nl chan - (self#texi_of_info (Some (Odoc_info.info_of_comment_file f))) + | None -> + puts_nl chan "@c no title given" + | Some f -> + nl chan ; + puts_nl chan + (self#texi_of_info (Some (Odoc_info.info_of_comment_file f))) end ; (* write a top menu *) - Texi.generate_menu chan + Texi.generate_menu chan ((List.map (fun m -> `Module m) m_list) @ (if !Args.with_index then - let indices_names_to_build = List.map indices indices_to_build in - List.rev - (List.fold_left - (fun acc -> - function (longname, shortname) - when List.mem shortname indices_names_to_build -> - (`Index (longname ^ " index")) :: acc - | _ -> acc) - [ `Comment "Indices :" ; `Blank ] + let indices_names_to_build = List.map indices indices_to_build in + List.rev + (List.fold_left + (fun acc -> + function (longname, shortname) + when List.mem shortname indices_names_to_build -> + (`Index (longname ^ " index")) :: acc + | _ -> acc) + [ `Comment "Indices :" ; `Blank ] indices_names ) else [] )) - + (** Writes the trailer of the TeXinfo document. *) - method generate_texi_trailer chan = - nl chan ; + method generate_texi_trailer chan = + nl chan ; if !Args.with_index - then - let indices_names_to_build = List.map indices indices_to_build in + then + let indices_names_to_build = List.map indices indices_to_build in List.iter (puts_nl chan) (List.flatten - (List.map + (List.map (fun (longname, shortname) -> - if List.mem shortname indices_names_to_build - then [ "@node " ^ longname ^ " index," ; - "@unnumbered " ^ longname ^ " index" ; - "@printindex " ^ shortname ; ] - else []) + if List.mem shortname indices_names_to_build + then [ "@node " ^ longname ^ " index," ; + "@unnumbered " ^ longname ^ " index" ; + "@printindex " ^ shortname ; ] + else []) indices_names )) ; - if !Args.with_toc + if !Args.with_toc then puts_nl chan "@contents" ; puts_nl chan "@bye" @@ -1141,38 +1149,38 @@ class texi = method do_index it = if not (List.mem it indices_to_build) then indices_to_build <- it :: indices_to_build - + (** Scan the whole module information to know which indices need to be build *) method scan_for_index : subparts -> unit = function | `Module m -> let m_ele = Module.module_elements ~trans:true m in - List.iter self#scan_for_index_in_mod m_ele - | `Module_type mt -> + List.iter self#scan_for_index_in_mod m_ele + | `Module_type mt -> let m_ele = Module.module_type_elements ~trans:true mt in - List.iter self#scan_for_index_in_mod m_ele + List.iter self#scan_for_index_in_mod m_ele | `Class c -> let c_ele = Class.class_elements ~trans:true c in - List.iter self#scan_for_index_in_class c_ele + List.iter self#scan_for_index_in_class c_ele | `Class_type ct -> let c_ele = Class.class_type_elements ~trans:true ct in - List.iter self#scan_for_index_in_class c_ele - + List.iter self#scan_for_index_in_class c_ele + method scan_for_index_in_mod = function - (* no recursion *) + (* no recursion *) | Element_value _ -> self#do_index `Value | Element_exception _ -> self#do_index `Exception | Element_type _ -> self#do_index `Type | Element_included_module _ | Element_module_comment _ -> () - (* recursion *) + (* recursion *) | Element_module m -> self#do_index `Module ; - self#scan_for_index (`Module m) + self#scan_for_index (`Module m) | Element_module_type mt -> self#do_index `Module_type ; - self#scan_for_index (`Module_type mt) + self#scan_for_index (`Module_type mt) | Element_class c -> self#do_index `Class ; - self#scan_for_index (`Class c) + self#scan_for_index (`Class c) | Element_class_type ct -> self#do_index `Class_type ; - self#scan_for_index (`Class_type ct) + self#scan_for_index (`Class_type ct) method scan_for_index_in_class = function | Class_attribute _ -> self#do_index `Class_att @@ -1180,31 +1188,31 @@ class texi = | Class_comment _ -> () - (** Generate the Texinfo file from a module list, + (** Generate the Texinfo file from a module list, in the {!Odoc_info.Args.out_file} file. *) method generate module_list = Hashtbl.clear node_tbl ; - let filename = - if !Args.out_file = Odoc_messages.default_out_file - then "ocamldoc.texi" - else !Args.out_file in + let filename = + if !Args.out_file = Odoc_messages.default_out_file + then "ocamldoc.texi" + else !Args.out_file in if !Args.with_index - then List.iter self#scan_for_index - (List.map (fun m -> `Module m) module_list) ; + then List.iter self#scan_for_index + (List.map (fun m -> `Module m) module_list) ; try - let chanout = open_out + let chanout = open_out (Filename.concat !Args.target_dir filename) in - if !Args.with_header + if !Args.with_header then self#generate_texi_header chanout filename module_list ; - List.iter - (self#generate_for_module chanout) + List.iter + (self#generate_for_module chanout) module_list ; - if !Args.with_trailer + if !Args.with_trailer then self#generate_texi_trailer chanout ; close_out chanout with | Failure s | Sys_error s -> prerr_endline s ; - incr Odoc_info.errors + incr Odoc_info.errors end diff --git a/ocamldoc/odoc_text.ml b/ocamldoc/odoc_text.ml index 85578098b..656321326 100644 --- a/ocamldoc/odoc_text.ml +++ b/ocamldoc/odoc_text.ml @@ -25,8 +25,8 @@ module Texter = Odoc_text_parser.main Odoc_text_lexer.main lexbuf with _ -> - raise (Text_syntax (!Odoc_text_lexer.line_number, - !Odoc_text_lexer.char_number, + raise (Text_syntax (!Odoc_text_lexer.line_number, + !Odoc_text_lexer.char_number, s) ) @@ -59,7 +59,7 @@ module Texter = escape_n s '[' (open_brackets - close_brackets) else if close_brackets > open_brackets then - escape_n s ']' (close_brackets - open_brackets) + escape_n s ']' (close_brackets - open_brackets) else s @@ -98,16 +98,16 @@ module Texter = | Right t -> p b "{R " ; p_text b t ; p b "}" | List l -> p b "{ul\n"; p_list b l; p b "}" | Enum l -> p b "{ol\n"; p_list b l; p b "}" - | Newline -> p b "\n" + | Newline -> p b "\n" | Block t -> p_text b t | Title (n, l_opt, t) -> - p b "{%d%s " + p b "{%d%s " n (match l_opt with None -> "" | Some s -> ":"^s ); - p_text b t ; + p_text b t ; p b "}" | Latex s -> p b "{%% %s%%}" s | Link (s,t) -> @@ -130,21 +130,24 @@ module Texter = | RK_method -> "method" | RK_section _ -> "section" in - p b "{!%s:%s}" sk s + p b "{!%s:%s}" sk s ) | Superscript t -> p b "{^" ; p_text b t ; p b "}" | Subscript t -> p b "{_" ; p_text b t ; p b "}" - | Module_list l -> + | Module_list l -> p b "{!modules:"; List.iter (fun s -> p b " %s" s) l; p b "}" | Index_list -> p b "{!indexlist}" - + | Custom (s,t) -> + p b "{%s " s; + p_text b t; + p b "}" + let string_of_text s = let b = Buffer.create 256 in p_text b s; Buffer.contents b - + end - diff --git a/ocamldoc/odoc_text_lexer.mll b/ocamldoc/odoc_text_lexer.mll index f0c3738a6..d7dba4c30 100644 --- a/ocamldoc/odoc_text_lexer.mll +++ b/ocamldoc/odoc_text_lexer.mll @@ -34,7 +34,7 @@ let ajout_string = Buffer.add_string string_buffer let lecture_string () = Buffer.contents string_buffer -(** the variable which will contain the description string. +(** the variable which will contain the description string. Is initialized when we encounter the start of a special comment. *) let description = ref "" @@ -44,7 +44,7 @@ let blank = "[ \013\009\012]" let print_DEBUG s = print_string s; print_newline () -(** this flag indicates whether we're in a string between begin_code and end_code tokens, to +(** this flag indicates whether we're in a string between begin_code and end_code tokens, to remember the number of open '[' and handle ']' correctly. *) let open_brackets = ref 0 @@ -80,13 +80,13 @@ let incr_cpts lexbuf = let l = Str.split_delim (Str.regexp_string "\n") s in match List.rev l with [] -> () (* should not occur *) - | [s2] -> (* no newline *) + | [s2] -> (* no newline *) char_number := !char_number + (String.length s2) | s2 :: _ -> line_number := !line_number + ((List.length l) - 1) ; char_number := String.length s2 -} +} (** html marks, to use as alternative possible special strings *) @@ -118,15 +118,15 @@ let label = ['a'-'z']+['a'-'z' 'A'-'Z' '0'-'9' '_']* (** special strings *) -let end = "}" - | html_end_bold +let end = "}" + | html_end_bold | html_end_italic - | html_end_title + | html_end_title | html_end_list | html_end_enum | html_end_item | html_end_center -let begin_title = +let begin_title = ("{" ['0'-'9']+(":"label)? blank_nl) | html_title @@ -136,16 +136,16 @@ let begin_center = "{C"blank_nl | html_center let begin_left = "{L"blank_nl let begin_right = "{R"blank_nl let begin_italic = "{i"blank_nl | html_italic -let begin_list = "{ul" | html_list -let begin_enum = "{ol" | html_enum +let begin_list = "{ul"blank_nl? | html_list +let begin_enum = "{ol"blank_nl? | html_enum let begin_item = "{li"blank_nl | "{- " | html_item -let begin_link = "{{:" +let begin_link = "{{:" let begin_latex = "{%"blank_nl let end_latex = "%}" let begin_code = "[" | html_code let end_code = "]" | html_end_code let begin_code_pre = "{[" -let end_code_pre = "]}" +let end_code_pre = "]}" let begin_verb = "{v"blank_nl let end_verb = blank_nl"v}" @@ -162,6 +162,7 @@ let begin_met_ref = "{!method:"blank_nl | "{!method:" let begin_sec_ref = "{!section:"blank_nl | "{!section:" let begin_mod_list_ref = "{!modules:"blank_nl | "{!modules:" let index_list = "{!indexlist}" +let begin_custom = "{"['a'-'z''A'-'Z']['a'-'z''A'-'Z''0'-'9']* let begin_superscript = "{^"blank_nl | "{^" let begin_subscript = "{_"blank_nl | "{_" @@ -170,31 +171,33 @@ let shortcut_enum_item = '\n'blank*"+ " let end_shortcut_list = '\n'(blank*'\n')+ rule main = parse -| "\\{" -| "\\}" -| "\\[" +| "\\{" +| "\\}" +| "\\[" | "\\]" - { + { incr_cpts lexbuf ; let s = Lexing.lexeme lexbuf in - Char (String.sub s 1 1) + Char (String.sub s 1 1) } | end { + print_DEBUG "end"; incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) then Char (Lexing.lexeme lexbuf) else - let _ = + let _ = if !ele_ref_mode then - ele_ref_mode := false + ele_ref_mode := false in END } | begin_title { + print_DEBUG "begin_title"; incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then @@ -210,7 +213,7 @@ rule main = parse else let (n, l) = (1, (String.length s - 2)) in let s2 = String.sub s n l in - try + try let i = String.index s2 ':' in let s_n = String.sub s2 0 i in let s_label = String.sub s2 (i+1) (l-i-1) in @@ -221,34 +224,34 @@ rule main = parse with _ -> Title (1, None) - } + } | begin_bold - { + { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - BOLD - } + BOLD + } | begin_italic - { + { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode or + if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else ITALIC - } + } | begin_link - { + { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - LINK - } + LINK + } | begin_emp { incr_cpts lexbuf ; @@ -256,7 +259,7 @@ rule main = parse (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - EMP + EMP } | begin_superscript { @@ -265,7 +268,7 @@ rule main = parse (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - SUPERSCRIPT + SUPERSCRIPT } | begin_subscript { @@ -274,7 +277,7 @@ rule main = parse (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - SUBSCRIPT + SUBSCRIPT } | begin_center { @@ -297,23 +300,24 @@ rule main = parse | begin_right { incr_cpts lexbuf ; - if !verb_mode or !latex_mode or !code_pre_mode + if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else RIGHT } | begin_list - { + { + print_DEBUG "LIST"; incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - LIST + LIST } | begin_enum - { + { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then @@ -323,12 +327,13 @@ rule main = parse } | begin_item { + print_DEBUG "ITEM"; incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or (!open_brackets >= 1) or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - ITEM + ITEM } | begin_latex { @@ -358,7 +363,7 @@ rule main = parse { incr_cpts lexbuf ; Char (Lexing.lexeme lexbuf) - } + } | begin_code { @@ -369,7 +374,7 @@ rule main = parse if !open_brackets <= 0 then ( open_brackets := 1; - CODE + CODE ) else ( @@ -378,7 +383,7 @@ rule main = parse ) } | end_code - { + { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) @@ -391,7 +396,7 @@ rule main = parse else ( open_brackets := 0; - END_CODE + END_CODE ) } @@ -399,8 +404,8 @@ rule main = parse { incr_cpts lexbuf ; Char (Lexing.lexeme lexbuf) - } - + } + | begin_code_pre { incr_cpts lexbuf ; @@ -421,7 +426,7 @@ rule main = parse if !open_brackets >= 1 then ( lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - 1; - lexbuf.Lexing.lex_curr_p <- + lexbuf.Lexing.lex_curr_p <- { lexbuf.Lexing.lex_curr_p with pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 } ; @@ -434,14 +439,14 @@ rule main = parse else ( open_brackets := 0; - END_CODE + END_CODE ) ) else - if !code_pre_mode then + if !code_pre_mode then ( code_pre_mode := false; - END_CODE_PRE + END_CODE_PRE ) else Char (Lexing.lexeme lexbuf) @@ -451,9 +456,9 @@ rule main = parse { incr_cpts lexbuf ; Char (Lexing.lexeme lexbuf) - } + } -| begin_ele_ref +| begin_ele_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -469,9 +474,9 @@ rule main = parse Char (Lexing.lexeme lexbuf) ) } - -| begin_val_ref + +| begin_val_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -488,7 +493,7 @@ rule main = parse ) } -| begin_typ_ref +| begin_typ_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -505,7 +510,7 @@ rule main = parse ) } -| begin_exc_ref +| begin_exc_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -522,7 +527,7 @@ rule main = parse ) } -| begin_mod_ref +| begin_mod_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -539,7 +544,7 @@ rule main = parse ) } -| begin_modt_ref +| begin_modt_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -556,7 +561,7 @@ rule main = parse ) } -| begin_cla_ref +| begin_cla_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -573,7 +578,7 @@ rule main = parse ) } -| begin_clt_ref +| begin_clt_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -590,7 +595,7 @@ rule main = parse ) } -| begin_att_ref +| begin_att_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -607,7 +612,7 @@ rule main = parse ) } -| begin_met_ref +| begin_met_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -624,7 +629,7 @@ rule main = parse ) } -| begin_sec_ref +| begin_sec_ref { incr_cpts lexbuf ; if !verb_mode or !latex_mode or !code_pre_mode or !open_brackets >= 1 then @@ -668,9 +673,9 @@ rule main = parse INDEX_LIST else Char (Lexing.lexeme lexbuf) - } + } -| begin_verb +| begin_verb { incr_cpts lexbuf ; if !latex_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then @@ -693,7 +698,7 @@ rule main = parse ) } -| shortcut_list_item +| shortcut_list_item { incr_cpts lexbuf ; if !shortcut_list_mode then @@ -722,7 +727,7 @@ rule main = parse { incr_cpts lexbuf ; lexbuf.Lexing.lex_curr_pos <- lexbuf.Lexing.lex_curr_pos - 1; - lexbuf.Lexing.lex_curr_p <- + lexbuf.Lexing.lex_curr_p <- { lexbuf.Lexing.lex_curr_p with pos_cnum = lexbuf.Lexing.lex_curr_p.pos_cnum - 1 ; } ; @@ -730,8 +735,8 @@ rule main = parse if !shortcut_list_mode then ( shortcut_list_mode := false; - (* go back one char to re-use the last '\n', so we can - restart another shortcut-list with a single blank line, + (* go back one char to re-use the last '\n', so we can + restart another shortcut-list with a single blank line, and not two.*) END_SHORTCUT_LIST ) @@ -740,22 +745,33 @@ rule main = parse Char (Lexing.lexeme lexbuf) else BLANK_LINE - } - + } + | eof { EOF } -| "{" - { +| begin_custom + { + print_DEBUG "begin_custom"; + incr_cpts lexbuf ; + if !verb_mode or !latex_mode or !code_pre_mode or + (!open_brackets >= 1) or !ele_ref_mode then + Char (Lexing.lexeme lexbuf) + else + let s = Lexing.lexeme lexbuf in + let tag = Odoc_misc.no_blanks s in + CUSTOM tag + } + +| "{" + { incr_cpts lexbuf ; if !latex_mode or (!open_brackets >= 1) or !code_pre_mode or !ele_ref_mode then Char (Lexing.lexeme lexbuf) else - ERROR + ERROR } | _ - { + { incr_cpts lexbuf ; Char (Lexing.lexeme lexbuf) } - - diff --git a/ocamldoc/odoc_text_parser.mly b/ocamldoc/odoc_text_parser.mly index 8711ca05f..41bebea6f 100644 --- a/ocamldoc/odoc_text_parser.mly +++ b/ocamldoc/odoc_text_parser.mly @@ -14,7 +14,7 @@ open Odoc_types -let identchar = +let identchar = "[A-Z a-z_\192-\214\216-\246\248-\255'0-9]" let blank = "[ \010\013\009\012]" @@ -36,6 +36,7 @@ let print_DEBUG s = print_string s; print_newline () %token LEFT %token RIGHT %token ITALIC +%token <string> CUSTOM %token LIST %token ENUM %token ITEM @@ -78,7 +79,7 @@ let print_DEBUG s = print_string s; print_newline () %token <string> Char /* Start Symbols */ -%start main +%start main %type <Odoc_types.text> main %% @@ -100,6 +101,7 @@ text_element: Title text END { let n, l_opt = $1 in Title (n, l_opt, $2) } | BOLD text END { Bold $2 } | ITALIC text END { Italic $2 } +| CUSTOM text END { Custom ($1, $2) } | EMP text END { Emphasize $2 } | SUPERSCRIPT text END { Superscript $2 } | SUBSCRIPT text END { Subscript $2 } @@ -110,68 +112,68 @@ text_element: | ENUM list END { Enum $2 } | CODE string END_CODE { Code $2 } | CODE_PRE string END_CODE_PRE { CodePre $2 } -| ELE_REF string END { +| ELE_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, None) + Ref (s3, None) } -| VAL_REF string END { +| VAL_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_value) + Ref (s3, Some RK_value) } -| TYP_REF string END { +| TYP_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_type) + Ref (s3, Some RK_type) } -| EXC_REF string END { +| EXC_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_exception) + Ref (s3, Some RK_exception) } -| MOD_REF string END { +| MOD_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_module) + Ref (s3, Some RK_module) } -| MODT_REF string END { +| MODT_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_module_type) + Ref (s3, Some RK_module_type) } -| CLA_REF string END { +| CLA_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_class) + Ref (s3, Some RK_class) } -| CLT_REF string END { +| CLT_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_class_type) + Ref (s3, Some RK_class_type) } -| ATT_REF string END { +| ATT_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_attribute) + Ref (s3, Some RK_attribute) } -| MET_REF string END { +| MET_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in - Ref (s3, Some RK_method) + Ref (s3, Some RK_method) } -| SEC_REF string END { +| SEC_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in Ref (s3, Some (RK_section [])) } -| MOD_LIST_REF string END { +| MOD_LIST_REF string END { let s2 = remove_beginning_blanks $2 in let s3 = remove_trailing_blanks s2 in let l = Odoc_misc.split_with_blanks s3 in Module_list l } -| INDEX_LIST { Index_list } +| INDEX_LIST { Index_list } | VERB string END_VERB { Verbatim $2 } | LATEX string END_LATEX { Latex $2 } | LINK string END text END { Link ($2, $4) } @@ -184,7 +186,7 @@ text_element: ; list: -| string { [] (* A VOIR : un test pour voir qu'il n'y a que des blancs *) } +| string { [] (* A VOIR : un test pour voir qu'il n'y a que des blancs *) } | string list { $2 } | list string { $1 } | item { [ $1 ] } @@ -220,4 +222,4 @@ string: | Char string { $1^$2 } ; -%% +%% diff --git a/ocamldoc/odoc_types.ml b/ocamldoc/odoc_types.ml index 3710a7845..68b3c4c9c 100644 --- a/ocamldoc/odoc_types.ml +++ b/ocamldoc/odoc_types.ml @@ -46,6 +46,7 @@ and text_element = | Subscript of text | Module_list of string list | Index_list + | Custom of string * text and text = text_element list diff --git a/ocamldoc/odoc_types.mli b/ocamldoc/odoc_types.mli index 17eee7490..f5b416ae5 100644 --- a/ocamldoc/odoc_types.mli +++ b/ocamldoc/odoc_types.mli @@ -14,7 +14,7 @@ (** Types for the information collected in comments. *) (** The differents kinds of element references. *) -type ref_kind = +type ref_kind = RK_module | RK_module_type | RK_class @@ -26,7 +26,7 @@ type ref_kind = | RK_method | RK_section of text -and text_element = +and text_element = | Raw of string (** Raw text. *) | Code of string (** The string is source code. *) | CodePre of string (** The string is pre-formatted source code. *) @@ -49,15 +49,16 @@ and text_element = (** A reference to an element. Complete name and kind. *) | Superscript of text (** Superscripts. *) | Subscript of text (** Subscripts. *) - | Module_list of string list + | Module_list of string list (** The table of the given modules with their abstract; *) | Index_list (** The links to the various indexes (values, types, ...) *) + | Custom of string * text (** to extend \{foo syntax *) (** [text] is a list of text_elements. The order matters. *) and text = text_element list (** The different forms of references in \@see tags. *) -type see_ref = +type see_ref = See_url of string | See_file of string | See_doc of string @@ -83,7 +84,7 @@ type info = { i_raised_exceptions : raised_exception list; (** The list of raised exceptions. *) i_return_value : text option ; (** The description text of the return value. *) i_custom : (string * text) list ; (** A text associated to a custom @-tag. *) - } + } (** An empty info structure. *) val dummy_info : info @@ -92,7 +93,7 @@ val dummy_info : info type location = { loc_impl : (string * int) option ; (** implementation file name and position *) loc_inter : (string * int) option ; (** interface file name and position *) - } + } (** A dummy location. *) val dummy_loc : location @@ -111,7 +112,7 @@ type merge_option = and all raised exceptions are kept. *) | Merge_return_value (** Information on return value are concatenated. *) | Merge_custom (** Merge custom tags (all pairs (tag, text) are kept). *) - + (** The list with all merge options. *) val all_merge_options : merge_option list @@ -130,4 +131,3 @@ val make_dump : 'a -> 'a dump (** Verify that a dump has the correct magic number and return its content. *) val open_dump : 'a dump -> 'a - diff --git a/otherlibs/labltk/browser/editor.ml b/otherlibs/labltk/browser/editor.ml index 1e6e3c0ee..617cdfa85 100644 --- a/otherlibs/labltk/browser/editor.ml +++ b/otherlibs/labltk/browser/editor.ml @@ -287,8 +287,8 @@ class editor ~top ~menus = object (self) val compiler_menu = new Jg_menu.c "Compiler" ~parent:menus val module_menu = new Jg_menu.c "Modules" ~parent:menus val window_menu = new Jg_menu.c "Windows" ~parent:menus - val label = - Checkbutton.create menus ~state:`Disabled + initializer + Menu.add_checkbutton menus ~state:`Disabled ~onvalue:"modified" ~offvalue:"unchanged" val mutable current_dir = Unix.getcwd () val mutable error_messages = [] @@ -314,14 +314,18 @@ class editor ~top ~menus = object (self) ~command:(fun () -> self#set_edit txt) end + method set_file_name txt = + Menu.configure_checkbutton menus `Last + ~label:(Filename.basename txt.name) + ~variable:txt.modified + method set_edit txt = if windows <> [] then Pack.forget [(List.hd windows).frame]; windows <- txt :: exclude txt windows; self#reset_window_menu; current_tw <- txt.tw; - Checkbutton.configure label ~text:(Filename.basename txt.name) - ~variable:txt.modified; + self#set_file_name txt; Textvariable.set vwindow txt.number; Text.yview txt.tw ~scroll:(`Page 0); pack [txt.frame] ~fill:`Both ~expand:true ~side:`Bottom @@ -381,7 +385,7 @@ class editor ~top ~menus = object (self) pack [sb] ~fill:`Y ~side:`Right; pack [tw] ~fill:`Both ~expand:true ~side:`Left; self#set_edit txt; - Checkbutton.deselect label; + Textvariable.set txt.modified "unchanged"; Lexical.init_tags txt.tw method clear_errors () = @@ -429,9 +433,8 @@ class editor ~top ~menus = object (self) let text = Text.get txt.tw ~start:tstart ~stop:(tposend 1) in output_string file text; close_out file; - Checkbutton.configure label ~text:(Filename.basename name); - Checkbutton.deselect label; - txt.name <- name + txt.name <- name; + self#set_file_name txt with Sys_error _ -> Jg_message.info ~master:top ~title:"Error" @@ -453,7 +456,7 @@ class editor ~top ~menus = object (self) | `No -> () | `Cancel -> raise Exit end; - Checkbutton.deselect label; + Textvariable.set txt.modified "unchanged"; (Text.index current_tw ~index:(`Mark"insert", []), []) with Not_found -> self#new_window name; tstart in @@ -629,13 +632,6 @@ class editor ~top ~menus = object (self) ~command:Viewer.search_symbol; module_menu#add_command "Close all" ~command:Viewer.close_all_views; - - (* pack everything *) - pack (List.map ~f:(fun m -> coe m#button) - [file_menu; edit_menu; compiler_menu; module_menu; window_menu] - @ [coe label]) - ~side:`Left ~ipadx:5 ~anchor:`W; - pack [menus] ~before:(List.hd windows).frame ~side:`Top ~fill:`X end (* The main function starts here ! *) @@ -658,7 +654,7 @@ let editor ?file ?(pos=0) ?(reuse=false) () = false then () else let top = Jg_toplevel.titled "OCamlBrowser Editor" in - let menus = Frame.create top ~name:"menubar" in + let menus = Jg_menu.menubar top in let ed = new editor ~top ~menus in already_open := !already_open @ [ed]; if file <> None then ed#reopen ~file ~pos diff --git a/otherlibs/labltk/browser/jg_menu.ml b/otherlibs/labltk/browser/jg_menu.ml index 62712f36d..b399d10d8 100644 --- a/otherlibs/labltk/browser/jg_menu.ml +++ b/otherlibs/labltk/browser/jg_menu.ml @@ -16,15 +16,12 @@ open Tk -class c ~parent ?underline:(n=0) text = object (self) - val pair = - let button = - Menubutton.create parent ~text ~underline:n in - let menu = Menu.create button in - Menubutton.configure button ~menu; - button, menu - method button = fst pair - method menu = snd pair +class c ~parent ?(underline=0) label = object (self) + val menu = + let menu = Menu.create parent in + Menu.add_cascade parent ~menu ~label ~underline; + menu + method menu = menu method virtual add_command : ?underline:int -> ?accelerator:string -> ?activebackground:color -> @@ -33,10 +30,15 @@ class c ~parent ?underline:(n=0) text = object (self) ?font:string -> ?foreground:color -> ?image:image -> ?state:state -> string -> unit - method add_command ?underline:(n=0) ?accelerator ?activebackground + method add_command ?(underline=0) ?accelerator ?activebackground ?activeforeground ?background ?bitmap ?command ?font ?foreground ?image ?state label = - Menu.add_command (self#menu) ~label ~underline:n ?accelerator + Menu.add_command menu ~label ~underline ?accelerator ?activebackground ?activeforeground ?background ?bitmap ?command ?font ?foreground ?image ?state end + +let menubar tl = + let menu = Menu.create tl ~name:"menubar" ~typ:`Menubar in + Toplevel.configure tl ~menu; + menu diff --git a/otherlibs/labltk/browser/main.ml b/otherlibs/labltk/browser/main.ml index 2bc122fe9..8866f8d0e 100644 --- a/otherlibs/labltk/browser/main.ml +++ b/otherlibs/labltk/browser/main.ml @@ -67,7 +67,7 @@ let _ = let path = ref [] in let st = ref true in - let spec = + (*let spec = [ "-I", Arg.String (fun s -> path := s :: !path), "<dir> Add <dir> to the list of include directories"; "-labels", Arg.Clear Clflags.classic, " <obsolete>"; @@ -100,7 +100,7 @@ let _ = if not (check ~spec Sys.argv) then fatal_error (usage ~spec errmsg); Arg.parse spec (fun name -> raise(Arg.Bad("don't know what to do with " ^ name))) - errmsg; + errmsg;*) Config.load_path := Sys.getcwd () :: List.rev_map ~f:(Misc.expand_directory Config.standard_library) !path @@ -135,5 +135,6 @@ let _ = try if is_win32 then mainLoop () else Printexc.print mainLoop () - with Protocol.TkError _ -> () + with Protocol.TkError _ -> + if not is_win32 then flush stderr done diff --git a/otherlibs/labltk/browser/shell.ml b/otherlibs/labltk/browser/shell.ml index 18e1f3494..ec0a61868 100644 --- a/otherlibs/labltk/browser/shell.ml +++ b/otherlibs/labltk/browser/shell.ml @@ -279,13 +279,11 @@ let f ~prog ~title = if res = "" then may_exec (Filename.concat dir prog) else res) in if progpath = "" then program_not_found prog else let tl = Jg_toplevel.titled title in - let menus = Frame.create tl ~name:"menubar" in + let menus = Menu.create tl ~name:"menubar" ~typ:`Menubar in + Toplevel.configure tl ~menu:menus; let file_menu = new Jg_menu.c "File" ~parent:menus and history_menu = new Jg_menu.c "History" ~parent:menus and signal_menu = new Jg_menu.c "Signal" ~parent:menus in - pack [menus] ~side:`Top ~fill:`X; - pack [file_menu#button; history_menu#button; signal_menu#button] - ~side:`Left ~ipadx:5 ~anchor:`W; let frame, tw, sb = Jg_text.create_with_scrollbar tl in Text.configure tw ~background:`White; pack [sb] ~fill:`Y ~side:`Right; diff --git a/otherlibs/labltk/browser/viewer.ml b/otherlibs/labltk/browser/viewer.ml index 17c3ba584..41353d8c1 100644 --- a/otherlibs/labltk/browser/viewer.ml +++ b/otherlibs/labltk/browser/viewer.ml @@ -316,19 +316,19 @@ let show_help () = (* Launch the classical viewer *) let f ?(dir=Unix.getcwd()) ?on () = - let tl = match on with + let (top, tl) = match on with None -> let tl = Jg_toplevel.titled "Module viewer" in - ignore (Jg_bind.escape_destroy tl); coe tl + ignore (Jg_bind.escape_destroy tl); (tl, coe tl) | Some top -> Wm.title_set top "OCamlBrowser"; Wm.iconname_set top "OCamlBrowser"; let tl = Frame.create top in bind tl ~events:[`Destroy] ~action:(fun _ -> exit 0); pack [tl] ~expand:true ~fill:`Both; - coe tl + (top, coe tl) in - let menus = Frame.create tl ~name:"menubar" in + let menus = Jg_menu.menubar top in let filemenu = new Jg_menu.c "File" ~parent:menus and modmenu = new Jg_menu.c "Modules" ~parent:menus in let fmbox, mbox, msb = Jg_box.create_with_scrollbar tl in @@ -366,8 +366,6 @@ let f ?(dir=Unix.getcwd()) ?on () = ~command:(fun () -> reset_modules mbox; Env.reset_cache ()); modmenu#add_command "Search symbol..." ~command:search_symbol; - pack [filemenu#button; modmenu#button] ~side:`Left ~ipadx:5 ~anchor:`W; - pack [menus] ~side:`Top ~fill:`X; pack [close; search] ~fill:`X ~side:`Right ~expand:true; pack [coe buttons; coe ew] ~fill:`X ~side:`Bottom; pack [msb] ~side:`Right ~fill:`Y; @@ -378,19 +376,20 @@ let f ?(dir=Unix.getcwd()) ?on () = (* Smalltalk-like version *) class st_viewer ?(dir=Unix.getcwd()) ?on () = - let tl = match on with + let (top, tl) = match on with None -> let tl = Jg_toplevel.titled "Module viewer" in - ignore (Jg_bind.escape_destroy tl); coe tl + ignore (Jg_bind.escape_destroy tl); (tl, coe tl) | Some top -> Wm.title_set top "OCamlBrowser"; Wm.iconname_set top "OCamlBrowser"; let tl = Frame.create top in bind tl ~events:[`Destroy] ~action:(fun _ -> exit 0); - pack [tl] ~expand:true ~fill:`Both; - coe tl + pack [tl] ~side:`Bottom ~expand:true ~fill:`Both; + (top, coe tl) in - let menus = Frame.create tl ~name:"menubar" in + let menus = Menu.create top ~name:"menubar" ~typ:`Menubar in + let () = Toplevel.configure top ~menu:menus in let filemenu = new Jg_menu.c "File" ~parent:menus and modmenu = new Jg_menu.c "Modules" ~parent:menus and viewmenu = new Jg_menu.c "View" ~parent:menus @@ -490,10 +489,6 @@ object (self) (* Help menu *) helpmenu#add_command "Manual..." ~command:show_help; - pack [filemenu#button; viewmenu#button; modmenu#button] - ~side:`Left ~ipadx:5 ~anchor:`W; - pack [helpmenu#button] ~side:`Right ~anchor:`E ~ipadx:5; - pack [menus] ~fill:`X; pack [search_frame] ~fill:`X; pack [boxes_frame] ~fill:`Both ~expand:true; pack [buttons] ~fill:`X ~side:`Bottom; diff --git a/otherlibs/labltk/examples_camltk/fileopen.ml b/otherlibs/labltk/examples_camltk/fileopen.ml index b7bd163f3..927c24851 100644 --- a/otherlibs/labltk/examples_camltk/fileopen.ml +++ b/otherlibs/labltk/examples_camltk/fileopen.ml @@ -25,7 +25,7 @@ let b = Button.create cvs [Text "Save"; Command - (function _ -> + (function _ -> let s = getSaveFile [Title "SAVE FILE TEST"; @@ -33,7 +33,7 @@ let b = FileTypes [ { typename= "just test"; extensions= [".foo"; ".test"]; mactypes= ["FOOO"; "BARR"] } ]; - InitialDir "/tmp"; + InitialDir Filename.temp_dir_name; InitialFile "hogehoge" ] in Label.configure t [Text s])];; diff --git a/otherlibs/labltk/tkanim/tkanim.ml b/otherlibs/labltk/tkanim/tkanim.ml index cc859e1cf..d4d693f67 100644 --- a/otherlibs/labltk/tkanim/tkanim.ml +++ b/otherlibs/labltk/tkanim/tkanim.ml @@ -65,7 +65,7 @@ let cTKtoCAMLanimatedGif s = (* check Tkanim package is in the interpreter *) let available () = - let packages = + let packages = splitlist (Protocol.tkEval [| TkToken "package"; TkToken "names" |]) in @@ -96,22 +96,22 @@ let image_existence_check img = (* But just do some operation. And sometimes it causes Seg-fault. *) (* So, before using Imagephoto.copy, I should check the source image *) (* really exists. *) - try ignore (Imagephoto.height img) with + try ignore (Imagephoto.height img) with TkError s -> prerr_endline ("tkanim: " ^ s); raise (TkError s) let imagephoto_copy dst src opts = image_existence_check src; Imagephoto.copy dst src opts -let animate_gen w i anim = +let animate_gen w i anim = let length = List.length anim.frames in let frames = Array.of_list anim.frames in let current = ref 0 in let loop = ref anim.loop in let f = frames.(!current) in - imagephoto_copy i f.imagephoto - [ImgTo (f.left, f.top, f.left + f.frameWidth, - f.top + f.frameHeight)]; + imagephoto_copy i f.imagephoto + [ImgTo (f.left, f.top, f.left + f.frameWidth, + f.top + f.frameHeight)]; let visible = ref true in let animated = ref false in let timer = ref None in @@ -208,9 +208,9 @@ let animate_canvas_item canvas tag anim = animate_gen canvas i anim let gifdata s = - let tmp_dir = ref "/tmp" in + let tmp_dir = ref Filename.temp_dir_name in let mktemp = - let cnter = ref 0 + let cnter = ref 0 and pid = Unix.getpid() in (function prefx -> incr cnter; @@ -227,4 +227,4 @@ let gifdata s = anim with e -> begin Unix.unlink fname; raise e end - + diff --git a/otherlibs/str/str.ml b/otherlibs/str/str.ml index f443c503f..31b623284 100644 --- a/otherlibs/str/str.ml +++ b/otherlibs/str/str.ml @@ -227,7 +227,9 @@ let compile fold_case re = (* Add a new instruction *) let emit_instr opc arg = if !progpos >= Array.length !prog then begin - let nprog = Array.make (2 * Array.length !prog) 0 in + let newlen = ref (Array.length !prog) in + while !progpos >= !newlen do newlen := !newlen * 2 done; + let nprog = Array.make !newlen 0 in Array.blit !prog 0 nprog 0 (Array.length !prog); prog := nprog end; diff --git a/otherlibs/systhreads/win32.c b/otherlibs/systhreads/win32.c index 67901875d..7ef5f49ce 100644 --- a/otherlibs/systhreads/win32.c +++ b/otherlibs/systhreads/win32.c @@ -252,7 +252,7 @@ static void caml_io_mutex_unlock_exn(void) /* The "tick" thread fakes a signal at regular intervals. */ -static void caml_thread_tick(void * arg) +static DWORD WINAPI caml_thread_tick(void * arg) { while(1) { Sleep(Thread_timeout); @@ -277,7 +277,7 @@ CAMLprim value caml_thread_initialize(value unit) value vthread = Val_unit; value descr; HANDLE tick_thread; - uintnat tick_id; + DWORD th_id; /* Protect against repeated initialization (PR#1325) */ if (curr_thread != NULL) return Val_unit; @@ -324,8 +324,8 @@ CAMLprim value caml_thread_initialize(value unit) caml_channel_mutex_unlock = caml_io_mutex_unlock; caml_channel_mutex_unlock_exn = caml_io_mutex_unlock_exn; /* Fork the tick thread */ - tick_thread = (HANDLE) _beginthread(caml_thread_tick, 0, NULL); - if (tick_thread == (HANDLE)(-1)) caml_wthread_error("Thread.init"); + tick_thread = CreateThread(NULL, 0, caml_thread_tick, NULL, 0, &th_id); + if (tick_thread == NULL) caml_wthread_error("Thread.init"); CloseHandle(tick_thread); End_roots(); return Val_unit; @@ -333,7 +333,7 @@ CAMLprim value caml_thread_initialize(value unit) /* Create a thread */ -static void caml_thread_start(void * arg) +static DWORD WINAPI caml_thread_start(void * arg) { caml_thread_t th = (caml_thread_t) arg; value clos; @@ -360,6 +360,7 @@ static void caml_thread_start(void * arg) /* Free the thread descriptor */ stat_free(th); /* The thread now stops running */ + return 0; } CAMLprim value caml_thread_new(value clos) @@ -367,7 +368,7 @@ CAMLprim value caml_thread_new(value clos) caml_thread_t th; value vthread = Val_unit; value descr; - uintnat th_id; + DWORD th_id; Begin_roots2 (clos, vthread) /* Create a finalized value to hold thread handle */ @@ -406,14 +407,9 @@ CAMLprim value caml_thread_new(value clos) curr_thread->next->prev = th; curr_thread->next = th; /* Fork the new thread */ -#if 0 th->wthread = - CreateThread(NULL,0, (LPTHREAD_START_ROUTINE) caml_thread_start, - (void *) th, 0, &th_id); + CreateThread(NULL, 0, caml_thread_start, (void *) th, 0, &th_id); if (th->wthread == NULL) { -#endif - th->wthread = (HANDLE) _beginthread(caml_thread_start, 0, (void *) th); - if (th->wthread == (HANDLE)(-1)) { /* Fork failed, remove thread info block from list of threads */ th->next->prev = curr_thread; curr_thread->next = th->next; @@ -473,6 +469,7 @@ CAMLprim value caml_thread_yield(value unit) CAMLprim value caml_thread_join(value th) { HANDLE h; + Begin_root(th) /* prevent deallocation of handle */ h = Threadhandle(th)->handle; enter_blocking_section(); diff --git a/otherlibs/threads/Tests/testio.ml b/otherlibs/threads/Tests/testio.ml index 3ed08a88f..95064a64e 100644 --- a/otherlibs/threads/Tests/testio.ml +++ b/otherlibs/threads/Tests/testio.ml @@ -87,7 +87,7 @@ let test_trunc_line ofile = let main() = let ifile = Sys.argv.(1) in - let ofile = "/tmp/testio" in + let ofile = Filename.temp_file "testio" "" in test "256-byte chunks, 256-byte chunks" (copy_file 256) (copy_file 256) ifile ofile; test "4096-byte chunks, 4096-byte chunks" @@ -108,11 +108,12 @@ let main() = (copy_random 8192) (copy_random 8192) ifile ofile; test "line per line, short lines" copy_line copy_line "/etc/hosts" ofile; - make_lines "/tmp/lines"; + let linesfile = Filename.temp_file "lines" "" in + make_lines linesfile; test "line per line, short and long lines" - copy_line copy_line "/tmp/lines" ofile; + copy_line copy_line linesfile ofile; test_trunc_line ofile; - Sys.remove "/tmp/lines"; + Sys.remove linesfiles; Sys.remove ofile; exit 0 diff --git a/otherlibs/unix/unix.mli b/otherlibs/unix/unix.mli index ead724eb9..eeb5411de 100644 --- a/otherlibs/unix/unix.mli +++ b/otherlibs/unix/unix.mli @@ -90,7 +90,7 @@ type error = | EOVERFLOW (** File size or position not representable *) | EUNKNOWNERR of int (** Unknown error *) -(** The type of error codes. +(** The type of error codes. Errors defined in the POSIX standard and additional errors from UNIX98 and BSD. All other errors are mapped to EUNKNOWNERR. @@ -118,7 +118,7 @@ val handle_unix_error : ('a -> 'b) -> 'a -> 'b val environment : unit -> string array (** Return the process environment, as an array of strings with the format ``variable=value''. *) - + val getenv : string -> string (** Return the value associated to a variable in the process environment. Raise [Not_found] if the variable is unbound. @@ -135,8 +135,8 @@ val putenv : string -> string -> unit type process_status = - WEXITED of int - (** The process terminated normally by [exit]; + WEXITED of int + (** The process terminated normally by [exit]; the argument is the return code. *) | WSIGNALED of int (** The process was killed by a signal; @@ -155,9 +155,9 @@ type wait_flag = val execv : string -> string array -> 'a (** [execv prog args] execute the program in file [prog], with - the arguments [args], and the current process environment. - These [execv*] functions never return: on success, the current - program is replaced by the new one; + the arguments [args], and the current process environment. + These [execv*] functions never return: on success, the current + program is replaced by the new one; on failure, a {!Unix.Unix_error} exception is raised. *) val execve : string -> string array -> string array -> 'a @@ -240,7 +240,7 @@ type open_flag = type file_perm = int -(** The type of file access rights, e.g. [0o640] is read and write for user, +(** The type of file access rights, e.g. [0o640] is read and write for user, read for group, none for others *) val openfile : string -> open_flag list -> file_perm -> file_descr @@ -310,7 +310,7 @@ val ftruncate : file_descr -> int -> unit to the given size. *) -(** {6 File statistics} *) +(** {6 File status} *) type file_kind = @@ -334,7 +334,7 @@ type stats = st_size : int; (** Size in bytes *) st_atime : float; (** Last access time *) st_mtime : float; (** Last modification time *) - st_ctime : float; (** Last status change time *) + st_ctime : float; (** Last status change time *) } (** The informations returned by the {!Unix.stat} calls. *) @@ -369,7 +369,7 @@ module LargeFile : st_size : int64; (** Size in bytes *) st_atime : float; (** Last access time *) st_mtime : float; (** Last modification time *) - st_ctime : float; (** Last status change time *) + st_ctime : float; (** Last status change time *) } val stat : string -> stats val lstat : string -> stats @@ -569,23 +569,23 @@ val open_process_full : and standard error of the command. *) val close_process_in : in_channel -> process_status -(** Close channels opened by {!Unix.open_process_in}, +(** Close channels opened by {!Unix.open_process_in}, wait for the associated command to terminate, and return its termination status. *) val close_process_out : out_channel -> process_status -(** Close channels opened by {!Unix.open_process_out}, +(** Close channels opened by {!Unix.open_process_out}, wait for the associated command to terminate, and return its termination status. *) val close_process : in_channel * out_channel -> process_status -(** Close channels opened by {!Unix.open_process}, +(** Close channels opened by {!Unix.open_process}, wait for the associated command to terminate, and return its termination status. *) val close_process_full : in_channel * out_channel * in_channel -> process_status -(** Close channels opened by {!Unix.open_process_full}, +(** Close channels opened by {!Unix.open_process_full}, wait for the associated command to terminate, and return its termination status. *) @@ -659,14 +659,14 @@ val lockf : file_descr -> lock_command -> int -> unit (** {6 Signals} Note: installation of signal handlers is performed via - the functions {!Sys.signal} and {!Sys.set_signal}. + the functions {!Sys.signal} and {!Sys.set_signal}. *) val kill : int -> int -> unit (** [kill pid sig] sends signal number [sig] to the process with id [pid]. *) -type sigprocmask_command = +type sigprocmask_command = SIG_SETMASK | SIG_BLOCK | SIG_UNBLOCK @@ -700,7 +700,7 @@ type process_times = { tms_utime : float; (** User time for the process *) tms_stime : float; (** System time for the process *) tms_cutime : float; (** User time for the children processes *) - tms_cstime : float; (** System time for the children processes *) + tms_cstime : float; (** System time for the children processes *) } (** The execution times (CPU times) of a process. *) @@ -713,7 +713,7 @@ type tm = tm_year : int; (** Year - 1900 *) tm_wday : int; (** Day of week (Sunday is 0) *) tm_yday : int; (** Day of year 0..365 *) - tm_isdst : bool; (** Daylight time savings in effect *) + tm_isdst : bool; (** Daylight time savings in effect *) } (** The type representing wallclock time and calendar date. *) @@ -758,7 +758,7 @@ val utimes : string -> float -> float -> unit 00:00:00 GMT, Jan. 1, 1970. *) type interval_timer = - ITIMER_REAL + ITIMER_REAL (** decrements in real time, and sends the signal [SIGALRM] when expired.*) | ITIMER_VIRTUAL (** decrements in process virtual time, and sends [SIGVTALRM] when expired. *) @@ -770,7 +770,7 @@ type interval_timer = type interval_timer_status = { it_interval : float; (** Period *) - it_value : float; (** Current value of the timer *) + it_value : float; (** Current value of the timer *) } (** The type describing the status of an interval timer *) @@ -821,7 +821,7 @@ type passwd_entry = pw_gid : int; pw_gecos : string; pw_dir : string; - pw_shell : string + pw_shell : string } (** Structure of entries in the [passwd] database. *) @@ -829,7 +829,7 @@ type group_entry = { gr_name : string; gr_passwd : string; gr_gid : int; - gr_mem : string array + gr_mem : string array } (** Structure of entries in the [groups] database. *) @@ -958,11 +958,11 @@ val getsockname : file_descr -> sockaddr val getpeername : file_descr -> sockaddr (** Return the address of the host connected to the given socket. *) -type msg_flag = +type msg_flag = MSG_OOB | MSG_DONTROUTE | MSG_PEEK -(** The flags for {!Unix.recv}, {!Unix.recvfrom}, +(** The flags for {!Unix.recv}, {!Unix.recvfrom}, {!Unix.send} and {!Unix.sendto}. *) val recv : file_descr -> string -> int -> int -> msg_flag list -> int @@ -1014,7 +1014,7 @@ type socket_optint_option = (** The socket options that can be consulted with {!Unix.getsockopt_optint} and modified with {!Unix.setsockopt_optint}. These options have a value of type [int option], with [None] meaning ``disabled''. *) - + type socket_float_option = SO_RCVTIMEO (** Timeout for input operations *) | SO_SNDTIMEO (** Timeout for output operations *) @@ -1084,14 +1084,14 @@ type host_entry = { h_name : string; h_aliases : string array; h_addrtype : socket_domain; - h_addr_list : inet_addr array + h_addr_list : inet_addr array } (** Structure of entries in the [hosts] database. *) type protocol_entry = - { p_name : string; - p_aliases : string array; - p_proto : int + { p_name : string; + p_aliases : string array; + p_proto : int } (** Structure of entries in the [protocols] database. *) @@ -1099,7 +1099,7 @@ type service_entry = { s_name : string; s_aliases : string array; s_port : int; - s_proto : string + s_proto : string } (** Structure of entries in the [services] database. *) @@ -1143,7 +1143,7 @@ type getaddrinfo_option = AI_FAMILY of socket_domain (** Impose the given socket domain *) | AI_SOCKTYPE of socket_type (** Impose the given socket type *) | AI_PROTOCOL of int (** Impose the given protocol *) - | AI_NUMERICHOST (** Do not call name resolver, + | AI_NUMERICHOST (** Do not call name resolver, expect numeric IP address *) | AI_CANONNAME (** Fill the [ai_canonname] field of the result *) @@ -1151,7 +1151,7 @@ type getaddrinfo_option = for use with {!Unix.bind} *) (** Options to {!Unix.getaddrinfo}. *) -val getaddrinfo: +val getaddrinfo: string -> string -> getaddrinfo_option list -> addr_info list (** [getaddrinfo host service opts] returns a list of {!Unix.addr_info} records describing socket parameters and addresses suitable for @@ -1200,7 +1200,7 @@ val getnameinfo : sockaddr -> getnameinfo_option list -> name_info complete description. *) type terminal_io = - { + { (* input modes *) mutable c_ignbrk : bool; (** Ignore the break condition. *) mutable c_brkint : bool; (** Signal interrupt on break condition. *) @@ -1245,14 +1245,14 @@ type terminal_io = before the read request is satisfied. *) mutable c_vtime : int; (** Maximum read wait (in 0.1s units). *) mutable c_vstart : char; (** Start character (usually ctrl-Q). *) - mutable c_vstop : char; (** Stop character (usually ctrl-S). *) + mutable c_vstop : char; (** Stop character (usually ctrl-S). *) } val tcgetattr : file_descr -> terminal_io (** Return the status of the terminal referred to by the given file descriptor. *) -type setattr_when = +type setattr_when = TCSANOW | TCSADRAIN | TCSAFLUSH @@ -1276,7 +1276,7 @@ val tcdrain : file_descr -> unit (** Waits until all output written on the given file descriptor has been transmitted. *) -type flush_queue = +type flush_queue = TCIFLUSH | TCOFLUSH | TCIOFLUSH @@ -1288,7 +1288,7 @@ val tcflush : file_descr -> flush_queue -> unit [TCOFLUSH] flushes data written but not transmitted, and [TCIOFLUSH] flushes both. *) -type flow_action = +type flow_action = TCOOFF | TCOON | TCIOFF diff --git a/parsing/printast.ml b/parsing/printast.ml index 986cb0f15..ffc966a02 100644 --- a/parsing/printast.ml +++ b/parsing/printast.ml @@ -425,7 +425,7 @@ and class_structure i ppf (p, l) = and class_field i ppf x = match x with | Pcf_inher (ce, so) -> - printf "Pcf_inher\n"; + line i ppf "Pcf_inher\n"; class_expr (i+1) ppf ce; option (i+1) string ppf so; | Pcf_val (s, mf, e, loc) -> diff --git a/stdlib/filename.ml b/stdlib/filename.ml index 62cb63951..d6c24fc1b 100644 --- a/stdlib/filename.ml +++ b/stdlib/filename.ml @@ -40,7 +40,7 @@ module Unix = struct String.length name >= String.length suff && String.sub name (String.length name - String.length suff) (String.length suff) = suff - let temporary_directory = + let temp_dir_name = try Sys.getenv "TMPDIR" with Not_found -> "/tmp" let quote = generic_quote "'\\''" end @@ -71,7 +71,7 @@ module Win32 = struct (let s = String.sub name (String.length name - String.length suff) (String.length suff) in String.lowercase s = String.lowercase suff) - let temporary_directory = + let temp_dir_name = try Sys.getenv "TEMP" with Not_found -> "." let quote s = let l = String.length s in @@ -98,28 +98,28 @@ module Cygwin = struct let is_relative = Win32.is_relative let is_implicit = Win32.is_implicit let check_suffix = Win32.check_suffix - let temporary_directory = Unix.temporary_directory + let temp_dir_name = Unix.temp_dir_name let quote = Unix.quote end let (current_dir_name, parent_dir_name, dir_sep, is_dir_sep, rindex_dir_sep, - is_relative, is_implicit, check_suffix, temporary_directory, quote) = + is_relative, is_implicit, check_suffix, temp_dir_name, quote) = match Sys.os_type with "Unix" -> (Unix.current_dir_name, Unix.parent_dir_name, Unix.dir_sep, Unix.is_dir_sep, Unix.rindex_dir_sep, Unix.is_relative, Unix.is_implicit, Unix.check_suffix, - Unix.temporary_directory, Unix.quote) + Unix.temp_dir_name, Unix.quote) | "Win32" -> (Win32.current_dir_name, Win32.parent_dir_name, Win32.dir_sep, Win32.is_dir_sep, Win32.rindex_dir_sep, Win32.is_relative, Win32.is_implicit, Win32.check_suffix, - Win32.temporary_directory, Win32.quote) + Win32.temp_dir_name, Win32.quote) | "Cygwin" -> (Cygwin.current_dir_name, Cygwin.parent_dir_name, Cygwin.dir_sep, Cygwin.is_dir_sep, Cygwin.rindex_dir_sep, Cygwin.is_relative, Cygwin.is_implicit, Cygwin.check_suffix, - Cygwin.temporary_directory, Cygwin.quote) + Cygwin.temp_dir_name, Cygwin.quote) | _ -> assert false let concat dirname filename = @@ -164,7 +164,7 @@ let prng = Random.State.make_self_init ();; let temp_file_name prefix suffix = let rnd = (Random.State.bits prng) land 0xFFFFFF in - concat temporary_directory (Printf.sprintf "%s%06x%s" prefix rnd suffix) + concat temp_dir_name (Printf.sprintf "%s%06x%s" prefix rnd suffix) ;; let temp_file prefix suffix = diff --git a/stdlib/filename.mli b/stdlib/filename.mli index 9b98bc74f..b379352c1 100644 --- a/stdlib/filename.mli +++ b/stdlib/filename.mli @@ -77,10 +77,7 @@ val temp_file : string -> string -> string (readable and writable only by the file owner). The file is guaranteed to be different from any other file that existed when [temp_file] was called. - Under Unix, the temporary directory is [/tmp] by default; if set, - the value of the environment variable [TMPDIR] is used instead. - Under Windows, the name of the temporary directory is the - value of the environment variable [TEMP], or [C:\temp] by default. *) +*) val open_temp_file : ?mode: open_flag list -> string -> string -> string * out_channel @@ -93,6 +90,14 @@ val open_temp_file : It can contain one or several of [Open_append], [Open_binary], and [Open_text]. The default is [[Open_text]] (open in text mode). *) +val temp_dir_name : string +(** The name of the temporary directory: + Under Unix, the value of the [TMPDIR] environment variable, or "/tmp" + if the variable is not set. + Under Windows, the value of the [TEMP] environment variable, or "." + if the variable is not set. +*) + val quote : string -> string (** Return a quoted version of a file name, suitable for use as one argument in a shell command line, escaping all shell diff --git a/stdlib/printf.mli b/stdlib/printf.mli index ecf15a2b5..fe4b8b2f8 100644 --- a/stdlib/printf.mli +++ b/stdlib/printf.mli @@ -72,7 +72,7 @@ val fprintf : out_channel -> ('a, out_channel, unit) format -> 'a [out_channel -> unit]) and apply it to [outchan]. - [\{ fmt %\}]: convert a format string argument. The argument must have the same type as the internal format string [fmt]. - - [\( fmt %\)]: format string substitution. Takes a format string + - [( fmt %)]: format string substitution. Takes a format string argument and substitutes it to the internal format string [fmt] to print following arguments. The argument must have the same type as [fmt]. diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 17e014219..95b925563 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -958,18 +958,17 @@ let kscanf ib ef fmt f = | 'B' | 'b' -> let _x = scan_bool max ib in scan_fmt (stack f (token_bool ib)) (i + 1) - | 'l' | 'n' | 'L' as conv -> + | 'l' | 'n' | 'L' as typ -> let i = i + 1 in - if i > lim then scan_fmt (stack f (get_count conv ib)) i else begin - let ty = conv in + if i > lim then scan_fmt (stack f (get_count typ ib)) i else begin match fmt.[i] with | 'd' | 'i' | 'o' | 'u' | 'x' | 'X' as conv -> let _x = scan_int_conv conv max ib in - begin match ty with + begin match typ with | 'l' -> scan_fmt (stack f (token_int32 conv ib)) (i + 1) | 'n' -> scan_fmt (stack f (token_nativeint conv ib)) (i + 1) | _ -> scan_fmt (stack f (token_int64 conv ib)) (i + 1) end - | _ -> scan_fmt (stack f (get_count conv ib)) i end + | _ -> scan_fmt (stack f (get_count typ ib)) i end | 'N' as conv -> scan_fmt (stack f (get_count conv ib)) (i + 1) | '!' -> diff --git a/stdlib/sys.ml b/stdlib/sys.ml index 2b8144709..7c6f42298 100644 --- a/stdlib/sys.ml +++ b/stdlib/sys.ml @@ -78,4 +78,4 @@ let catch_break on = (* OCaml version string, must be in the format described in sys.mli. *) -let ocaml_version = "3.10+dev1 (2005-10-26)";; +let ocaml_version = "3.10+dev2 (2006-01-04)";; diff --git a/test/Moretest/io.ml b/test/Moretest/io.ml index 2fb2c9993..f843e7084 100644 --- a/test/Moretest/io.ml +++ b/test/Moretest/io.ml @@ -83,19 +83,21 @@ let make_lines ofile = let _ = let src = Sys.argv.(1) in - test "16-byte chunks" (copy_file 16) src "/tmp/testio"; - test "256-byte chunks" (copy_file 256) src "/tmp/testio"; - test "4096-byte chunks" (copy_file 4096) src "/tmp/testio"; - test "65536-byte chunks" (copy_file 65536) src "/tmp/testio"; - test "19-byte chunks" (copy_file 19) src "/tmp/testio"; - test "263-byte chunks" (copy_file 263) src "/tmp/testio"; - test "4011-byte chunks" (copy_file 4011) src "/tmp/testio"; - test "0...8192 byte chunks" (copy_random 8192) src "/tmp/testio"; - test "line per line, short lines" copy_line "/etc/hosts" "/tmp/testio"; - make_lines "/tmp/lines"; - test "line per line, short and long lines" copy_line "/tmp/lines" "/tmp/testio"; - test "backwards, 4096-byte chunks" (copy_seek 4096) src "/tmp/testio"; - test "backwards, 64-byte chunks" (copy_seek 64) src "/tmp/testio"; - Sys.remove "/tmp/lines"; - Sys.remove "/tmp/testio"; + let testio = Filename.temp_file "testio" "" in + let lines = Filename.temp_file "lines" "" in + test "16-byte chunks" (copy_file 16) src testio; + test "256-byte chunks" (copy_file 256) src testio; + test "4096-byte chunks" (copy_file 4096) src testio; + test "65536-byte chunks" (copy_file 65536) src testio; + test "19-byte chunks" (copy_file 19) src testio; + test "263-byte chunks" (copy_file 263) src testio; + test "4011-byte chunks" (copy_file 4011) src testio; + test "0...8192 byte chunks" (copy_random 8192) src testio; + test "line per line, short lines" copy_line "/etc/hosts" testio; + make_lines lines; + test "line per line, short and long lines" copy_line lines testio; + test "backwards, 4096-byte chunks" (copy_seek 4096) src testio; + test "backwards, 64-byte chunks" (copy_seek 64) src testio; + Sys.remove lines; + Sys.remove testio; exit 0 diff --git a/tools/Makefile b/tools/Makefile index 9bc1646ef..68f904956 100644 --- a/tools/Makefile +++ b/tools/Makefile @@ -23,7 +23,8 @@ INCLUDES=-I ../utils -I ../parsing -I ../typing -I ../bytecomp -I ../asmcomp \ COMPFLAGS= -warn-error A $(INCLUDES) LINKFLAGS=$(INCLUDES) -all: ocamldep ocamlprof ocamlcp ocamlmktop ocamlmklib scrapelabels addlabels +all: ocamldep ocamlprof ocamlcp ocamlmktop ocamlmklib scrapelabels addlabels \ + dumpobj opt.opt: ocamldep.opt diff --git a/tools/dumpobj.ml b/tools/dumpobj.ml index c52942a12..3f3968702 100644 --- a/tools/dumpobj.ml +++ b/tools/dumpobj.ml @@ -14,15 +14,16 @@ (* Disassembler for executable and .cmo object files *) -open Obj -open Printf -open Config open Asttypes -open Lambda +open Config open Emitcode -open Opcodes open Instruct +open Lambda +open Location +open Obj +open Opcodes open Opnames +open Printf (* Read signed and unsigned integers *) @@ -107,6 +108,9 @@ let rec print_struct_const = function (* Print an obj *) +let same_custom x y = + Obj.field x 0 = Obj.field (Obj.repr y) 0 + let rec print_obj x = if Obj.is_block x then begin let tag = Obj.tag x in @@ -122,7 +126,13 @@ let rec print_obj x = printf "%.12g" a.(i) done; printf "|]" - end else if tag < Obj.no_scan_tag then begin + end else if tag = Obj.custom_tag && same_custom x 0l then + printf "%ldl" (Obj.magic x : int32) + else if tag = Obj.custom_tag && same_custom x 0n then + printf "%ndn" (Obj.magic x : nativeint) + else if tag = Obj.custom_tag && same_custom x 0L then + printf "%LdL" (Obj.magic x : int64) + else if tag < Obj.no_scan_tag then begin printf "<%d>" (Obj.tag x); match Obj.size x with 0 -> () @@ -388,9 +398,11 @@ let op_shapes = [ ];; let print_event ev = - printf "File \"%s\", line %d, character %d:\n" ev.ev_char.Lexing.pos_fname - ev.ev_char.Lexing.pos_lnum - (ev.ev_char.Lexing.pos_cnum - ev.ev_char.Lexing.pos_bol) + let ls = ev.ev_loc.loc_start in + let le = ev.ev_loc.loc_end in + printf "File \"%s\", line %d, characters %d-%d:\n" ls.Lexing.pos_fname + ls.Lexing.pos_lnum (ls.Lexing.pos_cnum - ls.Lexing.pos_bol) + (le.Lexing.pos_cnum - ls.Lexing.pos_bol) let print_instr ic = let pos = currpos ic in diff --git a/tools/make-package-macosx b/tools/make-package-macosx index 8822871d7..7dd79175a 100755 --- a/tools/make-package-macosx +++ b/tools/make-package-macosx @@ -103,8 +103,8 @@ mkdir -p resources # stop here -> | cat >resources/ReadMe.txt <<EOF This package installs Objective Caml version ${VERSION}. -You need Mac OS X 10.3 (panther), with X11 and the -XCode tools installed. +You need Mac OS X 10.4.x (Tiger), with X11 and the +XCode tools (v2.2) installed. Files will be installed in the following directories: diff --git a/tools/ocaml-objcopy-macosx b/tools/ocaml-objcopy-macosx index 31070f54b..cb2f703b4 100755 --- a/tools/ocaml-objcopy-macosx +++ b/tools/ocaml-objcopy-macosx @@ -15,8 +15,9 @@ # $Id$ -TEMP=/tmp/ocaml-objcopy-$$.o -UNDEF=/tmp/ocaml-objcopy-$$.sym +TMP="${TMPDIR=/tmp}" +TEMP="${TMP}"/ocaml-objcopy-$$.o +UNDEF="${TMP}"/ocaml-objcopy-$$.sym usage () { echo "usage: objcopy {--redefine-sym <old>=<new>} file.o" >&2 diff --git a/toplevel/toploop.ml b/toplevel/toploop.ml index e0a51ddd2..7502fa020 100644 --- a/toplevel/toploop.ml +++ b/toplevel/toploop.ml @@ -132,14 +132,14 @@ let load_lambda ppf lam = may_trace := true; let retval = (Meta.reify_bytecode code code_size) () in may_trace := false; - if can_free then begin + if can_free then begin Meta.static_release_bytecode code code_size; Meta.static_free code; end; Result retval with x -> may_trace := false; - if can_free then begin + if can_free then begin Meta.static_release_bytecode code code_size; Meta.static_free code; end; @@ -205,7 +205,7 @@ let print_exception_outcome ppf exn = let outv = outval_of_value !toplevel_env (Obj.repr exn) Predef.type_exn in print_out_exception ppf exn outv -(* The table of toplevel directives. +(* The table of toplevel directives. Filled by functions from module topdirs. *) let directive_table = (Hashtbl.create 13 : (string, directive_fun) Hashtbl.t) @@ -216,6 +216,7 @@ let execute_phrase print_outcome ppf phr = match phr with | Ptop_def sstr -> let oldenv = !toplevel_env in + let _ = Unused_var.warn ppf sstr in Typecore.reset_delayed_checks (); let (str, sg, newenv) = Typemod.type_structure oldenv sstr in Typecore.force_delayed_checks (); @@ -252,7 +253,7 @@ let execute_phrase print_outcome ppf phr = end with x -> toplevel_env := oldenv; raise x - end + end | Ptop_dir(dir_name, dir_arg) -> try match (Hashtbl.find directive_table dir_name, dir_arg) with @@ -273,7 +274,7 @@ let execute_phrase print_outcome ppf phr = let protect r newval body = let oldval = !r in try - r := newval; + r := newval; let res = body() in r := oldval; res diff --git a/typing/btype.ml b/typing/btype.ml index 90e9d83b9..76ec1c4c1 100644 --- a/typing/btype.ml +++ b/typing/btype.ml @@ -252,10 +252,9 @@ let rec copy_type_desc f = function | Tobject(ty, {contents = Some (p, tl)}) -> Tobject (f ty, ref (Some(p, List.map f tl))) | Tobject (ty, _) -> Tobject (f ty, ref None) - | Tvariant row -> - let row = row_repr row in - Tvariant (copy_row f true row false (f row.row_more)) - | Tfield (p, k, ty1, ty2) -> Tfield (p, copy_kind k, f ty1, f ty2) + | Tvariant row -> assert false (* too ambiguous *) + | Tfield (p, k, ty1, ty2) -> (* the kind is kept shared *) + Tfield (p, field_kind_repr k, f ty1, f ty2) | Tnil -> Tnil | Tlink ty -> copy_type_desc f ty.desc | Tsubst ty -> assert false @@ -273,10 +272,22 @@ let saved_desc = ref [] let save_desc ty desc = saved_desc := (ty, desc)::!saved_desc +let saved_kinds = ref [] (* duplicated kind variables *) +let new_kinds = ref [] (* new kind variables *) +let dup_kind r = + (match !r with None -> () | Some _ -> assert false); + if not (List.memq r !new_kinds) then begin + saved_kinds := r :: !saved_kinds; + let r' = ref None in + new_kinds := r' :: !new_kinds; + r := Some (Fvar r') + end + (* Restored type descriptions. *) let cleanup_types () = List.iter (fun (ty, desc) -> ty.desc <- desc) !saved_desc; - saved_desc := [] + List.iter (fun r -> r := None) !saved_kinds; + saved_desc := []; saved_kinds := []; new_kinds := [] (* Mark a type. *) let rec mark_type ty = diff --git a/typing/btype.mli b/typing/btype.mli index 251bc1ef5..6e1f2f215 100644 --- a/typing/btype.mli +++ b/typing/btype.mli @@ -81,6 +81,8 @@ val copy_kind: field_kind -> field_kind val save_desc: type_expr -> type_desc -> unit (* Save a type description *) +val dup_kind: field_kind option ref -> unit + (* Save a None field_kind, and make it point to a fresh Fvar *) val cleanup_types: unit -> unit (* Restore type descriptions *) diff --git a/typing/ctype.ml b/typing/ctype.ml index 2e583fad8..89d69bf12 100644 --- a/typing/ctype.ml +++ b/typing/ctype.ml @@ -805,6 +805,14 @@ let rec copy ty = (* Return a new copy *) Tvariant (copy_row copy true row keep more') end + | Tfield (p, k, ty1, ty2) -> + begin match field_kind_repr k with + Fabsent -> Tlink (copy ty2) + | Fpresent -> copy_type_desc copy desc + | Fvar r -> + dup_kind r; + copy_type_desc copy desc + end | _ -> copy_type_desc copy desc end; t @@ -1097,8 +1105,9 @@ let expand_abbrev env ty = | _ -> assert false -(* Fully expand the head of a type. Raise an exception if the type - cannot be expanded. *) +(* Fully expand the head of a type. + Raise Cannot_expand if the type cannot be expanded. + May raise Unify, if a recursion was hidden in the type. *) let rec try_expand_head env ty = let ty = repr ty in match ty.desc with @@ -1120,7 +1129,11 @@ let expand_head_once env ty = (* Fully expand the head of a type. *) let rec expand_head env ty = - try try_expand_head env ty with Cannot_expand -> repr ty + let snap = Btype.snapshot () in + try try_expand_head env ty + with Cannot_expand | Unify _ -> (* expand_head shall never fail *) + Btype.backtrack snap; + repr ty (* Make sure that the type parameters of the type constructor [ty] respect the type constraints *) @@ -1591,7 +1604,7 @@ and unify3 env t1 t1' t2 t2' = if not (closed_parameterized_type tl t2'') then link_type (repr t2) (repr t2') | _ -> - assert false + () (* t2 has already been expanded by update_level *) end (* diff --git a/typing/printtyp.ml b/typing/printtyp.ml index f48da4bfb..5f320b3d9 100644 --- a/typing/printtyp.ml +++ b/typing/printtyp.ml @@ -96,7 +96,7 @@ let rec safe_repr v = function let rec list_of_memo = function Mnil -> [] - | Mcons (p, t1, t2, rem) -> (p,t1,t2) :: list_of_memo rem + | Mcons (p, t1, t2, rem) -> p :: list_of_memo rem | Mlink rem -> list_of_memo !rem let visited = ref [] @@ -119,9 +119,7 @@ and raw_type_desc ppf = function | Tconstr (p, tl, abbrev) -> fprintf ppf "@[<hov1>Tconstr(@,%a,@,%a,@,%a)@]" path p raw_type_list tl - (raw_list (fun ppf (p,t1,t2) -> - fprintf ppf "@[%a,@ %a,@ %a@]" path p raw_type t1 raw_type t2)) - (list_of_memo !abbrev) + (raw_list path) (list_of_memo !abbrev) | Tobject (t, nm) -> fprintf ppf "@[<hov1>Tobject(@,%a,@,@[<1>ref%t@])@]" raw_type t (fun ppf -> @@ -591,6 +589,7 @@ let type_declaration id ppf decl = (* Print an exception declaration *) let tree_of_exception_declaration id decl = + reset_and_mark_loops_list decl; let tyl = tree_of_typlist false decl in Osig_exception (Ident.name id, tyl) @@ -796,8 +795,7 @@ and tree_of_signature = function Osig_type(tree_of_type_decl id decl, tree_of_rec rs) :: tree_of_signature rem | Tsig_exception(id, decl) :: rem -> - Osig_exception (Ident.name id, tree_of_typlist false decl) :: - tree_of_signature rem + tree_of_exception_declaration id decl :: tree_of_signature rem | Tsig_module(id, mty, rs) :: rem -> Osig_module (Ident.name id, tree_of_modtype mty, tree_of_rec rs) :: tree_of_signature rem diff --git a/typing/subst.ml b/typing/subst.ml index 809393e3b..c5c3efe9d 100644 --- a/typing/subst.ml +++ b/typing/subst.ml @@ -132,16 +132,8 @@ let rec typexp s ty = | None -> Tvariant row end - | Tfield(label, kind, t1, t2) -> - begin match field_kind_repr kind with - Fpresent -> - Tfield(label, Fpresent, typexp s t1, typexp s t2) - | Fabsent -> - Tlink (typexp s t2) - | Fvar _ (* {contents = None} *) as k -> - let k = if s.for_saving then Fvar(ref None) else k in - Tfield(label, k, typexp s t1, typexp s t2) - end + | Tfield(label, kind, t1, t2) when field_kind_repr kind = Fabsent -> + Tlink (typexp s t2) | _ -> copy_type_desc (typexp s) desc end; ty' diff --git a/typing/unused_var.ml b/typing/unused_var.ml index 53ea0883a..9bf13e429 100644 --- a/typing/unused_var.ml +++ b/typing/unused_var.ml @@ -152,7 +152,7 @@ and expression ppf tbl e = | Pexp_for (id, e1, e2, _, e3) -> expression ppf tbl e1; expression ppf tbl e2; - let defined = ([ (id, e.pexp_loc, ref false) ], []) in + let defined = ([ (id, e.pexp_loc, ref true) ], []) in add_vars tbl defined; expression ppf tbl e3; check_rm_vars ppf tbl defined; @@ -226,9 +226,11 @@ and class_declaration ppf tbl cd = class_expr ppf tbl cd.pci_expr and class_expr ppf tbl ce = match ce.pcl_desc with | Pcl_constr _ -> () - | Pcl_structure cs -> class_structure ppf tbl cs - | Pcl_fun (_, _, _, ce) -> class_expr ppf tbl ce - | Pcl_apply (ce, _) -> class_expr ppf tbl ce + | Pcl_structure cs -> class_structure ppf tbl cs; + | Pcl_fun (_, _, _, ce) -> class_expr ppf tbl ce; + | Pcl_apply (ce, lel) -> + class_expr ppf tbl ce; + List.iter (fun (_, e) -> expression ppf tbl e) lel; | Pcl_let (recflag, pel, ce) -> let_pel ppf tbl recflag pel (Some (fun ppf tbl -> class_expr ppf tbl ce)); | Pcl_constraint (ce, _) -> class_expr ppf tbl ce; diff --git a/typing/unused_var.mli b/typing/unused_var.mli index 14edcfddb..be36fccad 100644 --- a/typing/unused_var.mli +++ b/typing/unused_var.mli @@ -13,3 +13,4 @@ (* $Id$ *) val warn : Format.formatter -> Parsetree.structure -> Parsetree.structure;; +(* Warn on unused variables; return the second argument. *) |