static void parse_bool_json(const ndt::type &tp, const char *arrmeta, char *out_data, const char *&rbegin, const char *end, bool option, const eval::eval_context *ectx) { const char *begin = rbegin; char value = 3; const char *nbegin, *nend; bool escaped; if (parse_token(begin, end, "true")) { value = 1; } else if (parse_token(begin, end, "false")) { value = 0; } else if (parse_token(begin, end, "null")) { if (option || ectx->errmode != assign_error_nocheck) { value = 2; } else { value = 0; } } else if (parse::parse_json_number_no_ws(begin, end, nbegin, nend)) { if (nend - nbegin == 1) { if (*nbegin == '0') { value = 0; } else if (*nbegin == '1' || ectx->errmode == assign_error_nocheck) { value = 1; } } } else if (parse::parse_doublequote_string_no_ws(begin, end, nbegin, nend, escaped)) { if (!escaped) { parse::string_to_bool(&value, nbegin, nend, option, ectx->errmode); } else { string s; parse::unescape_string(nbegin, nend, s); parse::string_to_bool(&value, s.data(), s.data() + s.size(), option, ectx->errmode); } } if (value < 2) { if (tp.get_type_id() == bool_type_id) { *out_data = value; } else { typed_data_assign(tp, arrmeta, out_data, ndt::type::make<bool1>(), NULL, &value); } rbegin = begin; } else if (value == 2 && option) { if (!tp.is_expression()) { *out_data = value; } else { typed_data_assign(tp, arrmeta, out_data, ndt::option_type::make(ndt::type::make<bool1>()), NULL, &value); } rbegin = begin; } else { throw json_parse_error(rbegin, "expected a boolean true or false", tp); } }