UNPKG

bs-platform

Version:

bucklescript compiler, ocaml standard libary by bucklescript and its required runtime support

1,733 lines (1,648 loc) 62.9 kB
'use strict'; var List = require("./list.js"); var Block = require("./block.js"); var Curry = require("./curry.js"); var $$Buffer = require("./buffer.js"); var Printf = require("./printf.js"); var $$String = require("./string.js"); var Caml_bytes = require("./caml_bytes.js"); var Caml_int32 = require("./caml_int32.js"); var Pervasives = require("./pervasives.js"); var Caml_format = require("./caml_format.js"); var Caml_string = require("./caml_string.js"); var Caml_exceptions = require("./caml_exceptions.js"); var Caml_js_exceptions = require("./caml_js_exceptions.js"); var CamlinternalFormat = require("./camlinternalFormat.js"); var Caml_external_polyfill = require("./caml_external_polyfill.js"); var Caml_builtin_exceptions = require("./caml_builtin_exceptions.js"); var CamlinternalFormatBasics = require("./camlinternalFormatBasics.js"); function next_char(ib) { try { var c = Curry._1(ib[/* ic_get_next_char */6], /* () */0); ib[/* ic_current_char */1] = c; ib[/* ic_current_char_is_valid */2] = true; ib[/* ic_char_count */3] = ib[/* ic_char_count */3] + 1 | 0; if (c === /* "\n" */10) { ib[/* ic_line_count */4] = ib[/* ic_line_count */4] + 1 | 0; } return c; } catch (exn){ if (exn === Caml_builtin_exceptions.end_of_file) { ib[/* ic_current_char */1] = /* "\000" */0; ib[/* ic_current_char_is_valid */2] = false; ib[/* ic_eof */0] = true; return /* "\000" */0; } else { throw exn; } } } function peek_char(ib) { if (ib[/* ic_current_char_is_valid */2]) { return ib[/* ic_current_char */1]; } else { return next_char(ib); } } function checked_peek_char(ib) { var c = peek_char(ib); if (ib[/* ic_eof */0]) { throw Caml_builtin_exceptions.end_of_file; } return c; } function end_of_input(ib) { peek_char(ib); return ib[/* ic_eof */0]; } function beginning_of_input(ib) { return ib[/* ic_char_count */3] === 0; } function name_of_input(ib) { var match = ib[/* ic_input_name */8]; if (typeof match === "number") { if (match === /* From_function */0) { return "unnamed function"; } else { return "unnamed character string"; } } else if (match.tag) { return match[0]; } else { return "unnamed Pervasives input channel"; } } function char_count(ib) { if (ib[/* ic_current_char_is_valid */2]) { return ib[/* ic_char_count */3] - 1 | 0; } else { return ib[/* ic_char_count */3]; } } function token(ib) { var token_buffer = ib[/* ic_token_buffer */7]; var tok = $$Buffer.contents(token_buffer); token_buffer[/* position */1] = 0; ib[/* ic_token_count */5] = ib[/* ic_token_count */5] + 1 | 0; return tok; } function ignore_char(width, ib) { var width$1 = width - 1 | 0; ib[/* ic_current_char_is_valid */2] = false; return width$1; } function store_char(width, ib, c) { $$Buffer.add_char(ib[/* ic_token_buffer */7], c); return ignore_char(width, ib); } function create(iname, next) { return /* record */[ /* ic_eof */false, /* ic_current_char : "\000" */0, /* ic_current_char_is_valid */false, /* ic_char_count */0, /* ic_line_count */0, /* ic_token_count */0, /* ic_get_next_char */next, /* ic_token_buffer */$$Buffer.create(1024), /* ic_input_name */iname ]; } function from_string(s) { var i = /* record */[/* contents */0]; var len = s.length; var next = function (param) { if (i[0] >= len) { throw Caml_builtin_exceptions.end_of_file; } var c = Caml_string.get(s, i[0]); i[0] = i[0] + 1 | 0; return c; }; return create(/* From_string */1, next); } function from_function(param) { return create(/* From_function */0, param); } var file_buffer_size = /* record */[/* contents */1024]; function scan_close_at_end(ic) { Caml_external_polyfill.resolve("caml_ml_close_channel")(ic); throw Caml_builtin_exceptions.end_of_file; } function scan_raise_at_end(_ic) { throw Caml_builtin_exceptions.end_of_file; } function from_ic(scan_close_ic, iname, ic) { var len = file_buffer_size[0]; var buf = Caml_bytes.caml_create_bytes(len); var i = /* record */[/* contents */0]; var lim = /* record */[/* contents */0]; var eof = /* record */[/* contents */false]; var next = function (param) { if (i[0] < lim[0]) { var c = Caml_bytes.get(buf, i[0]); i[0] = i[0] + 1 | 0; return c; } else { if (eof[0]) { throw Caml_builtin_exceptions.end_of_file; } lim[0] = Pervasives.input(ic, buf, 0, len); if (lim[0] === 0) { eof[0] = true; return Curry._1(scan_close_ic, ic); } else { i[0] = 1; return Caml_bytes.get(buf, 0); } } }; return create(iname, next); } var stdin = from_ic(scan_raise_at_end, /* From_file */Block.__(1, [ "-", Pervasives.stdin ]), Pervasives.stdin); function open_in_file(open_in, fname) { if (fname === "-") { return stdin; } else { var ic = Curry._1(open_in, fname); return from_ic(scan_close_at_end, /* From_file */Block.__(1, [ fname, ic ]), ic); } } function open_in(param) { return open_in_file(Pervasives.open_in, param); } function open_in_bin(param) { return open_in_file(Pervasives.open_in_bin, param); } function from_channel(ic) { return from_ic(scan_raise_at_end, /* From_channel */Block.__(0, [ic]), ic); } function close_in(ib) { var match = ib[/* ic_input_name */8]; if (typeof match === "number") { return /* () */0; } else if (match.tag) { return Caml_external_polyfill.resolve("caml_ml_close_channel")(match[1]); } else { return Caml_external_polyfill.resolve("caml_ml_close_channel")(match[0]); } } var memo = /* record */[/* contents : [] */0]; function memo_from_ic(scan_close_ic, ic) { try { return List.assq(ic, memo[0]); } catch (exn){ if (exn === Caml_builtin_exceptions.not_found) { var ib = from_ic(scan_close_ic, /* From_channel */Block.__(0, [ic]), ic); memo[0] = /* :: */[ /* tuple */[ ic, ib ], memo[0] ]; return ib; } else { throw exn; } } } var Scan_failure = Caml_exceptions.create("Scanf.Scan_failure"); function bad_input_escape(c) { var s = Curry._1(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "illegal escape character ", /* Caml_char */Block.__(1, [/* End_of_format */0]) ]), "illegal escape character %C" ]), c); throw [ Scan_failure, s ]; } function bad_token_length(message) { var s = Curry._1(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "scanning of ", /* String */Block.__(2, [ /* No_padding */0, /* String_literal */Block.__(11, [ " failed: the specified length was too short for token", /* End_of_format */0 ]) ]) ]), "scanning of %s failed: the specified length was too short for token" ]), message); throw [ Scan_failure, s ]; } function bad_hex_float(param) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } function character_mismatch_err(c, ci) { return Curry._2(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "looking for ", /* Caml_char */Block.__(1, [/* String_literal */Block.__(11, [ ", found ", /* Caml_char */Block.__(1, [/* End_of_format */0]) ])]) ]), "looking for %C, found %C" ]), c, ci); } function check_this_char(ib, c) { var ci = checked_peek_char(ib); if (ci === c) { ib[/* ic_current_char_is_valid */2] = false; return /* () */0; } else { var s = character_mismatch_err(c, ci); throw [ Scan_failure, s ]; } } function check_char(ib, c) { if (c !== 10) { if (c !== 32) { return check_this_char(ib, c); } else { var ib$1 = ib; while(true) { var c$1 = peek_char(ib$1); if (ib$1[/* ic_eof */0]) { return 0; } else { var switcher = c$1 - 9 | 0; if (switcher > 4 || switcher < 0) { if (switcher !== 23) { return /* () */0; } else { ib$1[/* ic_current_char_is_valid */2] = false; continue ; } } else if (switcher === 3 || switcher === 2) { return /* () */0; } else { ib$1[/* ic_current_char_is_valid */2] = false; continue ; } } }; } } else { var ib$2 = ib; var ci = checked_peek_char(ib$2); if (ci !== 10) { if (ci !== 13) { var s = character_mismatch_err(/* "\n" */10, ci); throw [ Scan_failure, s ]; } else { ib$2[/* ic_current_char_is_valid */2] = false; return check_this_char(ib$2, /* "\n" */10); } } else { ib$2[/* ic_current_char_is_valid */2] = false; return /* () */0; } } } function token_bool(ib) { var s = token(ib); switch (s) { case "false" : return false; case "true" : return true; default: var s$1 = Curry._1(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "invalid boolean '", /* String */Block.__(2, [ /* No_padding */0, /* Char_literal */Block.__(12, [ /* "'" */39, /* End_of_format */0 ]) ]) ]), "invalid boolean '%s'" ]), s); throw [ Scan_failure, s$1 ]; } } function integer_conversion_of_char(param) { switch (param) { case 98 : return /* B_conversion */0; case 100 : return /* D_conversion */1; case 105 : return /* I_conversion */2; case 111 : return /* O_conversion */3; case 117 : return /* U_conversion */4; case 89 : case 90 : case 91 : case 92 : case 93 : case 94 : case 95 : case 96 : case 97 : case 99 : case 101 : case 102 : case 103 : case 104 : case 106 : case 107 : case 108 : case 109 : case 110 : case 112 : case 113 : case 114 : case 115 : case 116 : case 118 : case 119 : break; case 88 : case 120 : return /* X_conversion */5; default: } throw [ Caml_builtin_exceptions.assert_failure, /* tuple */[ "scanf.ml", 555, 9 ] ]; } function token_int_literal(conv, ib) { var tok; switch (conv) { case /* B_conversion */0 : tok = "0b" + token(ib); break; case /* D_conversion */1 : case /* I_conversion */2 : tok = token(ib); break; case /* O_conversion */3 : tok = "0o" + token(ib); break; case /* U_conversion */4 : tok = "0u" + token(ib); break; case /* X_conversion */5 : tok = "0x" + token(ib); break; } var l = tok.length; if (l === 0 || Caml_string.get(tok, 0) !== /* "+" */43) { return tok; } else { return $$String.sub(tok, 1, l - 1 | 0); } } function token_float(ib) { return Caml_format.caml_float_of_string(token(ib)); } function scan_decimal_digit_star(_width, ib) { while(true) { var width = _width; if (width === 0) { return width; } else { var c = peek_char(ib); if (ib[/* ic_eof */0]) { return width; } else if (c >= 58) { if (c !== 95) { return width; } else { var width$1 = ignore_char(width, ib); _width = width$1; continue ; } } else if (c >= 48) { var width$2 = store_char(width, ib, c); _width = width$2; continue ; } else { return width; } } }; } function scan_decimal_digit_plus(width, ib) { if (width === 0) { return bad_token_length("decimal digits"); } else { var c = checked_peek_char(ib); if (c > 57 || c < 48) { var s = Curry._1(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "character ", /* Caml_char */Block.__(1, [/* String_literal */Block.__(11, [ " is not a decimal digit", /* End_of_format */0 ])]) ]), "character %C is not a decimal digit" ]), c); throw [ Scan_failure, s ]; } else { var width$1 = store_char(width, ib, c); return scan_decimal_digit_star(width$1, ib); } } } function scan_digit_plus(basis, digitp, width, ib) { if (width === 0) { return bad_token_length("digits"); } else { var c = checked_peek_char(ib); if (Curry._1(digitp, c)) { var width$1 = store_char(width, ib, c); var digitp$1 = digitp; var width$2 = width$1; var ib$1 = ib; var _width = width$2; var ib$2 = ib$1; while(true) { var width$3 = _width; if (width$3 === 0) { return width$3; } else { var c$1 = peek_char(ib$2); if (ib$2[/* ic_eof */0]) { return width$3; } else if (Curry._1(digitp$1, c$1)) { var width$4 = store_char(width$3, ib$2, c$1); _width = width$4; continue ; } else if (c$1 !== 95) { return width$3; } else { var width$5 = ignore_char(width$3, ib$2); _width = width$5; continue ; } } }; } else { var s = Curry._2(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "character ", /* Caml_char */Block.__(1, [/* String_literal */Block.__(11, [ " is not a valid ", /* String */Block.__(2, [ /* No_padding */0, /* String_literal */Block.__(11, [ " digit", /* End_of_format */0 ]) ]) ])]) ]), "character %C is not a valid %s digit" ]), c, basis); throw [ Scan_failure, s ]; } } } function is_binary_digit(param) { return param === 49 || param === 48; } function scan_binary_int(param, param$1) { return scan_digit_plus("binary", is_binary_digit, param, param$1); } function is_octal_digit(param) { return !(param > 55 || param < 48); } function scan_octal_int(param, param$1) { return scan_digit_plus("octal", is_octal_digit, param, param$1); } function is_hexa_digit(param) { var switcher = param - 48 | 0; if (switcher > 22 || switcher < 0) { return !(switcher > 54 || switcher < 49); } else { return switcher > 16 || switcher < 10; } } function scan_hexadecimal_int(param, param$1) { return scan_digit_plus("hexadecimal", is_hexa_digit, param, param$1); } function scan_sign(width, ib) { var c = checked_peek_char(ib); if (c !== 43 && c !== 45) { return width; } else { return store_char(width, ib, c); } } function scan_optionally_signed_decimal_int(width, ib) { var width$1 = scan_sign(width, ib); return scan_decimal_digit_plus(width$1, ib); } function scan_int_conversion(conv, width, ib) { switch (conv) { case /* B_conversion */0 : return scan_binary_int(width, ib); case /* D_conversion */1 : return scan_optionally_signed_decimal_int(width, ib); case /* I_conversion */2 : var width$1 = width; var ib$1 = ib; var width$2 = scan_sign(width$1, ib$1); var width$3 = width$2; var ib$2 = ib$1; var c = checked_peek_char(ib$2); if (c !== 48) { return scan_decimal_digit_plus(width$3, ib$2); } else { var width$4 = store_char(width$3, ib$2, c); if (width$4 === 0) { return width$4; } else { var c$1 = peek_char(ib$2); if (ib$2[/* ic_eof */0]) { return width$4; } else if (c$1 >= 99) { if (c$1 !== 111) { if (c$1 !== 120) { return scan_decimal_digit_star(width$4, ib$2); } else { return scan_hexadecimal_int(store_char(width$4, ib$2, c$1), ib$2); } } else { return scan_octal_int(store_char(width$4, ib$2, c$1), ib$2); } } else if (c$1 !== 88) { if (c$1 >= 98) { return scan_binary_int(store_char(width$4, ib$2, c$1), ib$2); } else { return scan_decimal_digit_star(width$4, ib$2); } } else { return scan_hexadecimal_int(store_char(width$4, ib$2, c$1), ib$2); } } } case /* O_conversion */3 : return scan_octal_int(width, ib); case /* U_conversion */4 : return scan_decimal_digit_plus(width, ib); case /* X_conversion */5 : return scan_hexadecimal_int(width, ib); } } function scan_fractional_part(width, ib) { if (width === 0) { return width; } else { var c = peek_char(ib); if (ib[/* ic_eof */0] || c > 57 || c < 48) { return width; } else { return scan_decimal_digit_star(store_char(width, ib, c), ib); } } } function scan_exponent_part(width, ib) { if (width === 0) { return width; } else { var c = peek_char(ib); if (ib[/* ic_eof */0] || c !== 69 && c !== 101) { return width; } else { return scan_optionally_signed_decimal_int(store_char(width, ib, c), ib); } } } function scan_integer_part(width, ib) { var width$1 = scan_sign(width, ib); return scan_decimal_digit_star(width$1, ib); } function scan_float(width, precision, ib) { var width$1 = scan_integer_part(width, ib); if (width$1 === 0) { return /* tuple */[ width$1, precision ]; } else { var c = peek_char(ib); if (ib[/* ic_eof */0]) { return /* tuple */[ width$1, precision ]; } else if (c !== 46) { return /* tuple */[ scan_exponent_part(width$1, ib), precision ]; } else { var width$2 = store_char(width$1, ib, c); var precision$1 = width$2 < precision ? width$2 : precision; var width$3 = width$2 - (precision$1 - scan_fractional_part(precision$1, ib) | 0) | 0; return /* tuple */[ scan_exponent_part(width$3, ib), precision$1 ]; } } } function check_case_insensitive_string(width, ib, error, str) { var lowercase = function (c) { if (c > 90 || c < 65) { return c; } else { return Pervasives.char_of_int((c - /* "A" */65 | 0) + /* "a" */97 | 0); } }; var len = str.length; var width$1 = width; for(var i = 0 ,i_finish = len - 1 | 0; i <= i_finish; ++i){ var c = peek_char(ib); if (lowercase(c) !== lowercase(Caml_string.get(str, i))) { Curry._1(error, /* () */0); } if (width$1 === 0) { Curry._1(error, /* () */0); } width$1 = store_char(width$1, ib, c); } return width$1; } function scan_hex_float(width, precision, ib) { if (width === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } var width$1 = scan_sign(width, ib); if (width$1 === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } var c = peek_char(ib); if (c >= 78) { var switcher = c - 79 | 0; if (switcher > 30 || switcher < 0) { if (switcher >= 32) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } else { var width$2 = store_char(width$1, ib, c); if (width$2 === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } return check_case_insensitive_string(width$2, ib, bad_hex_float, "an"); } } else if (switcher !== 26) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } } else if (c !== 48) { if (c !== 73) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } } else { var width$3 = store_char(width$1, ib, c); if (width$3 === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } var width$4 = check_case_insensitive_string(width$3, ib, bad_hex_float, "x"); if (width$4 === 0 || end_of_input(ib)) { return width$4; } else { var match = peek_char(ib); var switcher$1 = match - 46 | 0; var width$5 = switcher$1 > 34 || switcher$1 < 0 ? ( switcher$1 !== 66 ? scan_hexadecimal_int(width$4, ib) : width$4 ) : ( switcher$1 > 33 || switcher$1 < 1 ? width$4 : scan_hexadecimal_int(width$4, ib) ); if (width$5 === 0 || end_of_input(ib)) { return width$5; } else { var c$1 = peek_char(ib); var width$6; if (c$1 !== 46) { width$6 = width$5; } else { var width$7 = store_char(width$5, ib, c$1); if (width$7 === 0 || end_of_input(ib)) { width$6 = width$7; } else { var match$1 = peek_char(ib); if (match$1 !== 80 && match$1 !== 112) { var precision$1 = width$7 < precision ? width$7 : precision; width$6 = width$7 - (precision$1 - scan_hexadecimal_int(precision$1, ib) | 0) | 0; } else { width$6 = width$7; } } } if (width$6 === 0 || end_of_input(ib)) { return width$6; } else { var c$2 = peek_char(ib); var exit = 0; if (c$2 !== 80 && c$2 !== 112) { return width$6; } else { exit = 2; } if (exit === 2) { var width$8 = store_char(width$6, ib, c$2); if (width$8 === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } return scan_optionally_signed_decimal_int(width$8, ib); } } } } } var width$9 = store_char(width$1, ib, c); if (width$9 === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } return check_case_insensitive_string(width$9, ib, bad_hex_float, "nfinity"); } function scan_caml_float_rest(width, precision, ib) { if (width === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var width$1 = scan_decimal_digit_star(width, ib); if (width$1 === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var c = peek_char(ib); var switcher = c - 69 | 0; if (switcher > 32 || switcher < 0) { if (switcher !== -23) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } else { var width$2 = store_char(width$1, ib, c); var precision$1 = width$2 < precision ? width$2 : precision; var width_precision = scan_fractional_part(precision$1, ib); var frac_width = precision$1 - width_precision | 0; var width$3 = width$2 - frac_width | 0; return scan_exponent_part(width$3, ib); } } else if (switcher > 31 || switcher < 1) { return scan_exponent_part(width$1, ib); } else { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } } function scan_caml_float(width, precision, ib) { if (width === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var width$1 = scan_sign(width, ib); if (width$1 === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var c = peek_char(ib); if (c >= 49) { if (c >= 58) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } else { var width$2 = store_char(width$1, ib, c); if (width$2 === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } return scan_caml_float_rest(width$2, precision, ib); } } else if (c >= 48) { var width$3 = store_char(width$1, ib, c); if (width$3 === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var c$1 = peek_char(ib); if (c$1 !== 88 && c$1 !== 120) { return scan_caml_float_rest(width$3, precision, ib); } var width$4 = store_char(width$3, ib, c$1); if (width$4 === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var width$5 = scan_hexadecimal_int(width$4, ib); if (width$5 === 0 || end_of_input(ib)) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } var c$2 = peek_char(ib); var switcher = c$2 - 80 | 0; var width$6; if (switcher > 32 || switcher < 0) { if (switcher !== -34) { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } else { var width$7 = store_char(width$5, ib, c$2); if (width$7 === 0 || end_of_input(ib)) { width$6 = width$7; } else { var match = peek_char(ib); if (match !== 80 && match !== 112) { var precision$1 = width$7 < precision ? width$7 : precision; width$6 = width$7 - (precision$1 - scan_hexadecimal_int(precision$1, ib) | 0) | 0; } else { width$6 = width$7; } } } } else if (switcher > 31 || switcher < 1) { width$6 = width$5; } else { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } if (width$6 === 0 || end_of_input(ib)) { return width$6; } else { var c$3 = peek_char(ib); if (c$3 !== 80 && c$3 !== 112) { return width$6; } var width$8 = store_char(width$6, ib, c$3); if (width$8 === 0 || end_of_input(ib)) { throw [ Scan_failure, "not a valid float in hexadecimal notation" ]; } return scan_optionally_signed_decimal_int(width$8, ib); } } else { throw [ Scan_failure, "no dot or exponent part found in float token" ]; } } function scan_string(stp, width, ib) { var _width = width; while(true) { var width$1 = _width; if (width$1 === 0) { return width$1; } else { var c = peek_char(ib); if (ib[/* ic_eof */0]) { return width$1; } else if (stp !== undefined) { if (c === stp) { ib[/* ic_current_char_is_valid */2] = false; return width$1; } else { _width = store_char(width$1, ib, c); continue ; } } else { var switcher = c - 9 | 0; if (switcher > 4 || switcher < 0) { if (switcher !== 23) { _width = store_char(width$1, ib, c); continue ; } else { return width$1; } } else if (switcher === 3 || switcher === 2) { _width = store_char(width$1, ib, c); continue ; } else { return width$1; } } } }; } function scan_char(width, ib) { return store_char(width, ib, checked_peek_char(ib)); } function char_for_backslash(c) { if (c >= 110) { if (c >= 117) { return c; } else { switch (c - 110 | 0) { case 0 : return /* "\n" */10; case 4 : return /* "\r" */13; case 1 : case 2 : case 3 : case 5 : return c; case 6 : return /* "\t" */9; } } } else if (c !== 98) { return c; } else { return /* "\b" */8; } } function char_for_decimal_code(c0, c1, c2) { var c = (Caml_int32.imul(100, c0 - /* "0" */48 | 0) + Caml_int32.imul(10, c1 - /* "0" */48 | 0) | 0) + (c2 - /* "0" */48 | 0) | 0; if (c < 0 || c > 255) { var s = Curry._3(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "bad character decimal encoding \\", /* Char */Block.__(0, [/* Char */Block.__(0, [/* Char */Block.__(0, [/* End_of_format */0])])]) ]), "bad character decimal encoding \\%c%c%c" ]), c0, c1, c2); throw [ Scan_failure, s ]; } else { return Pervasives.char_of_int(c); } } function hexadecimal_value_of_char(c) { if (c >= /* "a" */97) { return c - 87 | 0; } else if (c >= /* "A" */65) { return c - 55 | 0; } else { return c - /* "0" */48 | 0; } } function char_for_hexadecimal_code(c1, c2) { var c = (hexadecimal_value_of_char(c1) << 4) + hexadecimal_value_of_char(c2) | 0; if (c < 0 || c > 255) { var s = Curry._2(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "bad character hexadecimal encoding \\", /* Char */Block.__(0, [/* Char */Block.__(0, [/* End_of_format */0])]) ]), "bad character hexadecimal encoding \\%c%c" ]), c1, c2); throw [ Scan_failure, s ]; } else { return Pervasives.char_of_int(c); } } function check_next_char(message, width, ib) { if (width === 0) { return bad_token_length(message); } else { var c = peek_char(ib); if (ib[/* ic_eof */0]) { var message$1 = message; var s = Curry._1(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "scanning of ", /* String */Block.__(2, [ /* No_padding */0, /* String_literal */Block.__(11, [ " failed: premature end of file occurred before end of token", /* End_of_format */0 ]) ]) ]), "scanning of %s failed: premature end of file occurred before end of token" ]), message$1); throw [ Scan_failure, s ]; } else { return c; } } } function scan_backslash_char(width, ib) { var c = check_next_char("a Char", width, ib); if (c >= 40) { if (c >= 58) { switch (c) { case 92 : case 98 : case 110 : case 114 : case 116 : break; case 93 : case 94 : case 95 : case 96 : case 97 : case 99 : case 100 : case 101 : case 102 : case 103 : case 104 : case 105 : case 106 : case 107 : case 108 : case 109 : case 111 : case 112 : case 113 : case 115 : case 117 : case 118 : case 119 : return bad_input_escape(c); case 120 : var get_digit = function (param) { var c = next_char(ib); var switcher = c - 48 | 0; if (switcher > 22 || switcher < 0) { if (switcher > 54 || switcher < 49) { return bad_input_escape(c); } else { return c; } } else if (switcher > 16 || switcher < 10) { return c; } else { return bad_input_escape(c); } }; var c1 = get_digit(/* () */0); var c2 = get_digit(/* () */0); return store_char(width - 2 | 0, ib, char_for_hexadecimal_code(c1, c2)); default: return bad_input_escape(c); } } else if (c >= 48) { var get_digit$1 = function (param) { var c = next_char(ib); if (c > 57 || c < 48) { return bad_input_escape(c); } else { return c; } }; var c1$1 = get_digit$1(/* () */0); var c2$1 = get_digit$1(/* () */0); return store_char(width - 2 | 0, ib, char_for_decimal_code(c, c1$1, c2$1)); } else { return bad_input_escape(c); } } else if (c !== 34 && c < 39) { return bad_input_escape(c); } return store_char(width, ib, char_for_backslash(c)); } function scan_caml_char(width, ib) { var find_stop = function (width) { var c = check_next_char("a Char", width, ib); if (c !== 39) { var s = character_mismatch_err(/* "'" */39, c); throw [ Scan_failure, s ]; } else { return ignore_char(width, ib); } }; var width$1 = width; var c = checked_peek_char(ib); if (c !== 39) { var s = character_mismatch_err(/* "'" */39, c); throw [ Scan_failure, s ]; } else { var width$2 = ignore_char(width$1, ib); var c$1 = check_next_char("a Char", width$2, ib); if (c$1 !== 92) { return find_stop(store_char(width$2, ib, c$1)); } else { return find_stop(scan_backslash_char(ignore_char(width$2, ib), ib)); } } } function scan_caml_string(width, ib) { var find_stop = function (_width) { while(true) { var width = _width; var c = check_next_char("a String", width, ib); if (c !== 34) { if (c !== 92) { _width = store_char(width, ib, c); continue ; } else { var width$1 = ignore_char(width, ib); var match = check_next_char("a String", width$1, ib); if (match !== 10) { if (match !== 13) { return find_stop(scan_backslash_char(width$1, ib)); } else { var width$2 = ignore_char(width$1, ib); var match$1 = check_next_char("a String", width$2, ib); if (match$1 !== 10) { return find_stop(store_char(width$2, ib, /* "\r" */13)); } else { return skip_spaces(ignore_char(width$2, ib)); } } } else { return skip_spaces(ignore_char(width$1, ib)); } } } else { return ignore_char(width, ib); } }; }; var skip_spaces = function (_width) { while(true) { var width = _width; var match = check_next_char("a String", width, ib); if (match !== 32) { return find_stop(width); } else { _width = ignore_char(width, ib); continue ; } }; }; var width$1 = width; var c = checked_peek_char(ib); if (c !== 34) { var s = character_mismatch_err(/* "\"" */34, c); throw [ Scan_failure, s ]; } else { return find_stop(ignore_char(width$1, ib)); } } function scan_chars_in_char_set(char_set, scan_indic, width, ib) { var scan_chars = function (_i, stp) { while(true) { var i = _i; var c = peek_char(ib); if (i > 0 && !ib[/* ic_eof */0] && CamlinternalFormat.is_in_char_set(char_set, c) && c !== stp) { store_char(Pervasives.max_int, ib, c); _i = i - 1 | 0; continue ; } else { return 0; } }; }; if (scan_indic !== undefined) { var c = scan_indic; scan_chars(width, c); if (ib[/* ic_eof */0]) { return 0; } else { var ci = peek_char(ib); if (c === ci) { ib[/* ic_current_char_is_valid */2] = false; return /* () */0; } else { var s = character_mismatch_err(c, ci); throw [ Scan_failure, s ]; } } } else { return scan_chars(width, -1); } } function scanf_bad_input(ib, x) { var s; if (x[0] === Scan_failure || x[0] === Caml_builtin_exceptions.failure) { s = x[1]; } else { throw x; } var i = char_count(ib); var s$1 = Curry._2(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "scanf: bad input at char number ", /* Int */Block.__(4, [ /* Int_i */3, /* No_padding */0, /* No_precision */0, /* String_literal */Block.__(11, [ ": ", /* String */Block.__(2, [ /* No_padding */0, /* End_of_format */0 ]) ]) ]) ]), "scanf: bad input at char number %i: %s" ]), i, s); throw [ Scan_failure, s$1 ]; } function get_counter(ib, counter) { switch (counter) { case /* Line_counter */0 : return ib[/* ic_line_count */4]; case /* Char_counter */1 : return char_count(ib); case /* Token_counter */2 : return ib[/* ic_token_count */5]; } } function width_of_pad_opt(pad_opt) { if (pad_opt !== undefined) { return pad_opt; } else { return Pervasives.max_int; } } function stopper_of_formatting_lit(fmting) { if (fmting === /* Escaped_percent */6) { return /* tuple */[ /* "%" */37, "" ]; } else { var str = CamlinternalFormat.string_of_formatting_lit(fmting); var stp = Caml_string.get(str, 1); var sub_str = $$String.sub(str, 2, str.length - 2 | 0); return /* tuple */[ stp, sub_str ]; } } function take_format_readers(k, _fmt) { while(true) { var fmt = _fmt; if (typeof fmt === "number") { return Curry._1(k, /* Nil */0); } else { switch (fmt.tag | 0) { case /* Int */4 : case /* Int32 */5 : case /* Nativeint */6 : case /* Int64 */7 : case /* Float */8 : _fmt = fmt[3]; continue ; case /* Format_subst */14 : return take_fmtty_format_readers(k, CamlinternalFormatBasics.erase_rel(CamlinternalFormat.symm(fmt[1])), fmt[2]); case /* Formatting_gen */18 : _fmt = CamlinternalFormatBasics.concat_fmt(fmt[0][0][0], fmt[1]); continue ; case /* Reader */19 : var fmt_rest = fmt[0]; return (function(fmt_rest){ return function (reader) { var new_k = function (readers_rest) { return Curry._1(k, /* Cons */[ reader, readers_rest ]); }; return take_format_readers(new_k, fmt_rest); } }(fmt_rest)); case /* Char */0 : case /* Caml_char */1 : case /* Flush */10 : case /* Alpha */15 : case /* Theta */16 : case /* Scan_next_char */22 : _fmt = fmt[0]; continue ; case /* Ignored_param */23 : var k$1 = k; var ign = fmt[0]; var fmt$1 = fmt[1]; if (typeof ign === "number") { if (ign === /* Ignored_reader */2) { return (function(k$1,fmt$1){ return function (reader) { var new_k = function (readers_rest) { return Curry._1(k$1, /* Cons */[ reader, readers_rest ]); }; return take_format_readers(new_k, fmt$1); } }(k$1,fmt$1)); } else { return take_format_readers(k$1, fmt$1); } } else if (ign.tag === /* Ignored_format_subst */9) { return take_fmtty_format_readers(k$1, ign[1], fmt$1); } else { return take_format_readers(k$1, fmt$1); } case /* Format_arg */13 : case /* Scan_char_set */20 : case /* Custom */24 : _fmt = fmt[2]; continue ; default: _fmt = fmt[1]; continue ; } } }; } function take_fmtty_format_readers(k, _fmtty, fmt) { while(true) { var fmtty = _fmtty; if (typeof fmtty === "number") { return take_format_readers(k, fmt); } else { switch (fmtty.tag | 0) { case /* Format_arg_ty */8 : _fmtty = fmtty[1]; continue ; case /* Format_subst_ty */9 : var ty = CamlinternalFormat.trans(CamlinternalFormat.symm(fmtty[0]), fmtty[1]); _fmtty = CamlinternalFormatBasics.concat_fmtty(ty, fmtty[2]); continue ; case /* Reader_ty */13 : var fmt_rest = fmtty[0]; return (function(fmt_rest){ return function (reader) { var new_k = function (readers_rest) { return Curry._1(k, /* Cons */[ reader, readers_rest ]); }; return take_fmtty_format_readers(new_k, fmt_rest, fmt); } }(fmt_rest)); case /* Ignored_reader_ty */14 : var fmt_rest$1 = fmtty[0]; return (function(fmt_rest$1){ return function (reader) { var new_k = function (readers_rest) { return Curry._1(k, /* Cons */[ reader, readers_rest ]); }; return take_fmtty_format_readers(new_k, fmt_rest$1, fmt); } }(fmt_rest$1)); default: _fmtty = fmtty[0]; continue ; } } }; } function make_scanf(ib, _fmt, readers) { while(true) { var fmt = _fmt; if (typeof fmt === "number") { return /* Nil */0; } else { switch (fmt.tag | 0) { case /* Char */0 : scan_char(0, ib); var c = Caml_string.get(token(ib), 0); return /* Cons */[ c, make_scanf(ib, fmt[0], readers) ]; case /* Caml_char */1 : scan_caml_char(0, ib); var c$1 = Caml_string.get(token(ib), 0); return /* Cons */[ c$1, make_scanf(ib, fmt[0], readers) ]; case /* String */2 : var rest = fmt[1]; var pad = fmt[0]; if (typeof rest !== "number") { switch (rest.tag | 0) { case /* Formatting_lit */17 : var match = stopper_of_formatting_lit(rest[0]); var stp = match[0]; var scan = (function(stp){ return function scan(width, param, ib) { return scan_string(stp, width, ib); } }(stp)); var str_rest_000 = match[1]; var str_rest_001 = rest[1]; var str_rest = /* String_literal */Block.__(11, [ str_rest_000, str_rest_001 ]); return pad_prec_scanf(ib, str_rest, readers, pad, /* No_precision */0, scan, token); case /* Formatting_gen */18 : var match$1 = rest[0]; if (match$1.tag) { var scan$1 = function (width, param, ib) { return scan_string(/* "[" */91, width, ib); }; return pad_prec_scanf(ib, CamlinternalFormatBasics.concat_fmt(match$1[0][0], rest[1]), readers, pad, /* No_precision */0, scan$1, token); } else { var scan$2 = function (width, param, ib) { return scan_string(/* "{" */123, width, ib); }; return pad_prec_scanf(ib, CamlinternalFormatBasics.concat_fmt(match$1[0][0], rest[1]), readers, pad, /* No_precision */0, scan$2, token); } default: } } var scan$3 = function (width, param, ib) { return scan_string(undefined, width, ib); }; return pad_prec_scanf(ib, rest, readers, pad, /* No_precision */0, scan$3, token); case /* Caml_string */3 : var scan$4 = function (width, param, ib) { return scan_caml_string(width, ib); }; return pad_prec_scanf(ib, fmt[1], readers, fmt[0], /* No_precision */0, scan$4, token); case /* Int */4 : var c$2 = integer_conversion_of_char(CamlinternalFormat.char_of_iconv(fmt[0])); var scan$5 = (function(c$2){ return function scan$5(width, param, ib) { return scan_int_conversion(c$2, width, ib); } }(c$2)); return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan$5, (function(c$2){ return function (param) { return Caml_format.caml_int_of_string(token_int_literal(c$2, param)); } }(c$2))); case /* Int32 */5 : var c$3 = integer_conversion_of_char(CamlinternalFormat.char_of_iconv(fmt[0])); var scan$6 = (function(c$3){ return function scan$6(width, param, ib) { return scan_int_conversion(c$3, width, ib); } }(c$3)); return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan$6, (function(c$3){ return function (param) { return Caml_format.caml_int32_of_string(token_int_literal(c$3, param)); } }(c$3))); case /* Nativeint */6 : var c$4 = integer_conversion_of_char(CamlinternalFormat.char_of_iconv(fmt[0])); var scan$7 = (function(c$4){ return function scan$7(width, param, ib) { return scan_int_conversion(c$4, width, ib); } }(c$4)); return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan$7, (function(c$4){ return function (param) { return Caml_format.caml_nativeint_of_string(token_int_literal(c$4, param)); } }(c$4))); case /* Int64 */7 : var c$5 = integer_conversion_of_char(CamlinternalFormat.char_of_iconv(fmt[0])); var scan$8 = (function(c$5){ return function scan$8(width, param, ib) { return scan_int_conversion(c$5, width, ib); } }(c$5)); return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan$8, (function(c$5){ return function (param) { return Caml_format.caml_int64_of_string(token_int_literal(c$5, param)); } }(c$5))); case /* Float */8 : var match$2 = fmt[0]; if (match$2 !== 15) { if (match$2 >= 16) { return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan_hex_float, token_float); } else { return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan_float, token_float); } } else { return pad_prec_scanf(ib, fmt[3], readers, fmt[1], fmt[2], scan_caml_float, token_float); } case /* Bool */9 : var scan$9 = function (param, param$1, ib) { var ib$1 = ib; var c = checked_peek_char(ib$1); var m; if (c !== 102) { if (c !== 116) { var s = Curry._1(Printf.sprintf(/* Format */[ /* String_literal */Block.__(11, [ "the character ",