Used of cpdfcommand as a service with -stay-on-error

This commit is contained in:
John Whitington 2015-01-11 18:39:35 +00:00
parent d45df220d4
commit cacc55c2bf
1 changed files with 23 additions and 12 deletions

View File

@ -39,16 +39,20 @@ let _ =
set_binary_mode_in stdin true; set_binary_mode_in stdin true;
set_binary_mode_out stdout true set_binary_mode_out stdout true
let stay_on_error = ref false
exception StayOnError
(* Fatal error reporting. *) (* Fatal error reporting. *)
let error s = let error s =
prerr_string (s ^ "\nUse -help for help.\n"); prerr_string (s ^ "\nUse -help for help.\n");
flush stderr; flush stderr;
exit 2 if not !stay_on_error then exit 2 else raise StayOnError
let soft_error s = let soft_error s =
Printf.eprintf "%s\n" s; Printf.eprintf "%s\n" s;
flush stderr; flush stderr;
exit 1 if not !stay_on_error then exit 1 else raise StayOnError
let parse_pagespec pdf spec = let parse_pagespec pdf spec =
try Cpdf.parse_pagespec pdf spec with try Cpdf.parse_pagespec pdf spec with
@ -1331,6 +1335,9 @@ let logto = ref None
let setsqueezelogto s = let setsqueezelogto s =
logto := Some s logto := Some s
let setstayonerror () =
set stay_on_error
(* Parse a control file, make an argv, and then make Arg parse it. *) (* Parse a control file, make an argv, and then make Arg parse it. *)
let rec make_control_argv_and_parse filename = let rec make_control_argv_and_parse filename =
control_args := !control_args @ parse_control_file filename control_args := !control_args @ parse_control_file filename
@ -1835,6 +1842,7 @@ and specs =
Arg.String setremovedictentry, Arg.String setremovedictentry,
" Remove an entry from all dictionaries"); " Remove an entry from all dictionaries");
(*These items are undocumented *) (*These items are undocumented *)
("-stay-on-error", Arg.Unit setstayonerror, "");
("-extract-fontfile", Arg.Unit (setop ExtractFontFile), ""); ("-extract-fontfile", Arg.Unit (setop ExtractFontFile), "");
("-extract-images", Arg.Unit setextractimages, ""); ("-extract-images", Arg.Unit setextractimages, "");
("-csp1", Arg.Unit (setop CSP1), ""); ("-csp1", Arg.Unit (setop CSP1), "");
@ -1894,7 +1902,7 @@ let get_pdf_from_input_kind ((_, _, u, o, _, revision) as input) op = function
begin begin
let size = filesize s in let size = filesize s in
initial_file_size := size; initial_file_size := size;
Printf.printf "Initial file size is %i bytes\n" size if !logto = None then Printf.printf "Initial file size is %i bytes\n" size
end; end;
begin try Hashtbl.find filenames s with begin try Hashtbl.find filenames s with
Not_found -> Not_found ->
@ -2010,10 +2018,11 @@ let really_write_pdf ?(encryption = None) ?(is_decompress=false) mk_id pdf outna
end; end;
if args.squeeze then if args.squeeze then
let s = filesize outname in let s = filesize outname in
Printf.printf if !logto = None then
"Final file size is %i bytes, %.2f%% of original.\n" Printf.printf
s "Final file size is %i bytes, %.2f%% of original.\n"
((float s /. float !initial_file_size) *. 100.) s
((float s /. float !initial_file_size) *. 100.)
let write_pdf ?(encryption = None) ?(is_decompress=false) mk_id pdf = let write_pdf ?(encryption = None) ?(is_decompress=false) mk_id pdf =
if args.debugcrypt then Printf.printf "write_pdf\n"; if args.debugcrypt then Printf.printf "write_pdf\n";
@ -3664,21 +3673,23 @@ let go_withargv argv =
prerr_string prerr_string
(implode (takewhile (neq '\n') (explode s)) ^ " Use -help for help.\n\n"); (implode (takewhile (neq '\n') (explode s)) ^ " Use -help for help.\n\n");
flush stderr; flush stderr;
exit 2 if not !stay_on_error then exit 2
| Arg.Help _ -> | Arg.Help _ ->
Arg.usage (align_specs specs) usage_msg; Arg.usage (align_specs specs) usage_msg;
flush stderr (*r for Windows *) flush stderr (*r for Windows *)
| Sys_error s as e -> | Sys_error s as e ->
prerr_string (s ^ "\n\n"); prerr_string (s ^ "\n\n");
flush stderr; flush stderr;
if args.debug then raise e else exit 2 if not !stay_on_error then
if args.debug then raise e else exit 2
| Pdf.PDFError s as e -> | Pdf.PDFError s as e ->
prerr_string prerr_string
("cpdf encountered an error. Technical details follow:\n\n" ^ s ^ "\n\n"); ("cpdf encountered an error. Technical details follow:\n\n" ^ s ^ "\n\n");
flush stderr; flush stderr;
if args.debug then raise e else exit 2 if not !stay_on_error then
| Cpdf.SoftError s -> soft_error s if args.debug then raise e else exit 2
| Cpdf.HardError s -> error s | Cpdf.SoftError s -> try soft_error s with StayOnError -> ()
| Cpdf.HardError s -> try error s with StayOnError -> ()
| e -> | e ->
prerr_string prerr_string
("cpdf encountered an unexpected error. Technical Details follow:\n" ^ ("cpdf encountered an unexpected error. Technical Details follow:\n" ^