diff options
-rw-r--r-- | stdlib/scanf.ml | 26 |
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;; |