summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--stdlib/scanf.ml26
1 files changed, 15 insertions, 11 deletions
diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml
index 5070e30ba..17e014219 100644
--- a/stdlib/scanf.ml
+++ b/stdlib/scanf.ml
@@ -961,14 +961,15 @@ let kscanf ib ef fmt f =
| 'l' | 'n' | 'L' as conv ->
let i = i + 1 in
if i > lim then scan_fmt (stack f (get_count conv ib)) i else begin
+ let ty = conv in
match fmt.[i] with
| 'd' | 'i' | 'o' | 'u' | 'x' | 'X' as conv ->
let _x = scan_int_conv conv max ib in
- begin match conv with
+ begin match ty 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
- | c -> scan_fmt (stack f (get_count conv ib)) i end
+ | _ -> scan_fmt (stack f (get_count conv ib)) i end
| 'N' as conv ->
scan_fmt (stack f (get_count conv ib)) (i + 1)
| '!' ->
@@ -1000,7 +1001,7 @@ let kscanf ib ef fmt f =
let _x = scan_String max ib in
let rf = token_string ib in
if not (compatible_format_type mf rf)
- then format_mismatch rf mf ib else
+ then format_mismatch rf mf ib else
if conv = '{' then scan_fmt (stack f rf) j else
let nf = scan_fmt (Obj.magic rf) 0 in
scan_fmt (stack f nf) j
@@ -1029,15 +1030,18 @@ let sscanf s = bscanf (Scanning.from_string s);;
let scanf fmt = bscanf Scanning.stdib fmt;;
-let bscanf_format ib fmt2 f =
+let bscanf_format ib fmt f =
+ let fmt = format_to_string fmt in
let fmt1 = ignore (scan_String max_int ib); token_string ib in
- let fmt2 = format_to_string fmt2 in
- if compatible_format_type fmt1 fmt2
- then let fresh_fmt = String.copy fmt1 in f (string_to_format fresh_fmt)
- else format_mismatch fmt1 fmt2 ib;;
+ if not (compatible_format_type fmt1 fmt) then
+ format_mismatch fmt1 fmt ib else
+ let fresh_fmt1 = String.copy fmt1 in
+ f (string_to_format fresh_fmt1);;
let sscanf_format s fmt =
let fmt = format_to_string fmt in
- if compatible_format_type s fmt
- then let fresh_fmt = String.copy s in string_to_format fresh_fmt
- else bad_input (format_mismatch_err s fmt);;
+ let fmt1 = s in
+ if not (compatible_format_type fmt1 fmt) then
+ bad_input (format_mismatch_err fmt1 fmt) else
+ let fresh_fmt1 = String.copy fmt1 in
+ string_to_format fresh_fmt1;;