diff options
author | Jun FURUSE / 古瀬 淳 <jun.furuse@gmail.com> | 2008-01-28 05:29:20 +0000 |
---|---|---|
committer | Jun FURUSE / 古瀬 淳 <jun.furuse@gmail.com> | 2008-01-28 05:29:20 +0000 |
commit | 3f4a98da0fbf8a87c674d6737d8c6cec7e8567e5 (patch) | |
tree | f5aa13505824d708414ece1f00219b811315c44a /stdlib/scanf.ml | |
parent | 30f3fa2c5bc27f8c59930741aa1b6dd5a34a6b40 (diff) | |
download | ocaml-gcaml3090.tar.gz |
3.09.1 updategcaml3090
git-svn-id: http://caml.inria.fr/svn/ocaml/branches/gcaml3090@8792 f963ae5c-01c2-4b8c-9fe0-0dff7051ff02
Diffstat (limited to 'stdlib/scanf.ml')
-rw-r--r-- | stdlib/scanf.ml | 29 |
1 files changed, 16 insertions, 13 deletions
diff --git a/stdlib/scanf.ml b/stdlib/scanf.ml index 5070e30baf..eda801c2bc 100644 --- a/stdlib/scanf.ml +++ b/stdlib/scanf.ml @@ -958,17 +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 + 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 conv 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 - | c -> scan_fmt (stack f (get_count conv ib)) i end + | c -> scan_fmt (stack f (get_count typ ib)) i end | 'N' as conv -> scan_fmt (stack f (get_count conv ib)) (i + 1) | '!' -> @@ -1000,7 +1000,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 +1029,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;; |