module JSON::TruffleRuby::Generator

def self.utf8_to_json(string, script_safe = false) # :nodoc:

:nodoc:
UTF16 big endian characters as \u????, and return it.
Convert a UTF8 encoded Ruby string _string_ to a JSON string, encoded with
def self.utf8_to_json(string, script_safe = false) # :nodoc:
  if script_safe
    if SCRIPT_SAFE_ESCAPE_PATTERN.match?(string)
      string.gsub(SCRIPT_SAFE_ESCAPE_PATTERN, SCRIPT_SAFE_MAP)
    else
      string
    end
  else
    if /["\\\x0-\x1f]/.match?(string)
      string.gsub(/["\\\x0-\x1f]/, MAP)
    else
      string
    end
  end
end

def self.utf8_to_json_ascii(original_string, script_safe = false) # :nodoc:

:nodoc:
def self.utf8_to_json_ascii(original_string, script_safe = false) # :nodoc:
  string = original_string.b
  map = script_safe ? SCRIPT_SAFE_MAP : MAP
  string.gsub!(/[\/"\\\x0-\x1f]/n) { map[$&] || $& }
  string.gsub!(/(
    (?:
     [\xc2-\xdf][\x80-\xbf]    |
     [\xe0-\xef][\x80-\xbf]{2} |
     [\xf0-\xf4][\x80-\xbf]{3}
    )+ |
    [\x80-\xc1\xf5-\xff]       # invalid
  )/nx) { |c|
    c.size == 1 and raise GeneratorError.new("invalid utf8 byte: '#{c}'", original_string)
    s = c.encode(::Encoding::UTF_16BE, ::Encoding::UTF_8).unpack('H*')[0]
    s.force_encoding(::Encoding::BINARY)
    s.gsub!(/.{4}/n, '\\\\u\&')
    s.force_encoding(::Encoding::UTF_8)
  }
  string.force_encoding(::Encoding::UTF_8)
  string
rescue => e
  raise GeneratorError.new(e.message, original_string)
end

def self.valid_utf8?(string)

def self.valid_utf8?(string)
  encoding = string.encoding
  (encoding == Encoding::UTF_8 || encoding == Encoding::ASCII) &&
    string.valid_encoding?
end