class Haxe::Format::JsonParser

Attributes

pos[RW]
str[RW]

protected - in ruby this doesn't play well with static/inline methods

Public Class Methods

new(str) click to toggle source
# File lib/lib/haxe/format/json_parser.rb, line 8
def initialize(str)
  @str = str
  @pos = 0
end

Public Instance Methods

invalid_char() click to toggle source
# File lib/lib/haxe/format/json_parser.rb, line 252
def invalid_char 
  @pos-=1
  raise hx_raise("Invalid char " + _hx_str((@str[@pos] || 0).ord) + " at position " + _hx_str(@pos))
end
invalid_number(start) click to toggle source
# File lib/lib/haxe/format/json_parser.rb, line 257
def invalid_number(start)
  raise hx_raise("Invalid number at position " + _hx_str(start) + ": " + _hx_str(@str[start,@pos - start]))
end
parse_rec() click to toggle source
# File lib/lib/haxe/format/json_parser.rb, line 18
def parse_rec 
  while(true) 
    c = nil
    begin
      index = @pos
      @pos+=1
      c = (@str[index] || 0).ord
    end
    case(c)
    when 32,13,10,9
    when 123
      obj = { }
      field = nil
      comma = nil
      while(true) 
        c1 = nil
        begin
          index1 = @pos
          @pos+=1
          c1 = (@str[index1] || 0).ord
        end
        case(c1)
        when 32,13,10,9
        when 125
          self.invalid_char if field != nil || comma == false
          return obj
        when 58
          self.invalid_char if field == nil
          begin
            value = self.parse_rec
            obj[field] = value
          end
          field = nil
          comma = true
        when 44
          if comma 
            comma = false
          else 
            self.invalid_char
          end
        when 34
          self.invalid_char if comma
          field = self.parse_string
        else
          self.invalid_char
        end
      end
    when 91
      arr = []
      comma1 = nil
      while(true) 
        c2 = nil
        begin
          index2 = @pos
          @pos+=1
          c2 = (@str[index2] || 0).ord
        end
        case(c2)
        when 32,13,10,9
        when 93
          self.invalid_char if comma1 == false
          return arr
        when 44
          if comma1 
            comma1 = false
          else 
            self.invalid_char
          end
        else
          self.invalid_char if comma1
          @pos-=1
          arr.push(self.parse_rec)
          comma1 = true
        end
      end
    when 116
      save = @pos
      if lambda{|_this_| index3 = @pos
      @pos+=1
      _r = (@str[index3] || 0).ord}.call(self) != 114 || lambda{|_this_| index4 = @pos
      @pos+=1
      _r2 = (@str[index4] || 0).ord}.call(self) != 117 || lambda{|_this_| index5 = @pos
      @pos+=1
      _r3 = (@str[index5] || 0).ord}.call(self) != 101 
        @pos = save
        self.invalid_char
      end
      return true
    when 102
      save1 = @pos
      if lambda{|_this_| index6 = @pos
      @pos+=1
      _r4 = (@str[index6] || 0).ord}.call(self) != 97 || lambda{|_this_| index7 = @pos
      @pos+=1
      _r5 = (@str[index7] || 0).ord}.call(self) != 108 || lambda{|_this_| index8 = @pos
      @pos+=1
      _r6 = (@str[index8] || 0).ord}.call(self) != 115 || lambda{|_this_| index9 = @pos
      @pos+=1
      _r7 = (@str[index9] || 0).ord}.call(self) != 101 
        @pos = save1
        self.invalid_char
      end
      return false
    when 110
      save2 = @pos
      if lambda{|_this_| index10 = @pos
      @pos+=1
      _r8 = (@str[index10] || 0).ord}.call(self) != 117 || lambda{|_this_| index11 = @pos
      @pos+=1
      _r9 = (@str[index11] || 0).ord}.call(self) != 108 || lambda{|_this_| index12 = @pos
      @pos+=1
      _r10 = (@str[index12] || 0).ord}.call(self) != 108 
        @pos = save2
        self.invalid_char
      end
      return nil
    when 34
      return self.parse_string
    when 48,49,50,51,52,53,54,55,56,57,45
      c3 = c
      start = @pos - 1
      minus = c3 == 45
      digit = !minus
      zero = c3 == 48
      point = false
      e = false
      pm = false
      _end = false
      while(true) 
        begin
          index13 = @pos
          @pos+=1
          c3 = (@str[index13] || 0).ord
        end
        case(c3)
        when 48
          self.invalid_number(start) if zero && !point
          if minus 
            minus = false
            zero = true
          end
          digit = true
        when 49,50,51,52,53,54,55,56,57
          self.invalid_number(start) if zero && !point
          minus = false if minus
          digit = true
          zero = false
        when 46
          self.invalid_number(start) if minus || point
          digit = false
          point = true
        when 101,69
          self.invalid_number(start) if minus || zero || e
          digit = false
          e = true
        when 43,45
          self.invalid_number(start) if !e || pm
          digit = false
          pm = true
        else
          self.invalid_number(start) if !digit
          @pos-=1
          _end = true
        end
        break if _end
      end
      f = nil
      begin
        x = @str[start,@pos - start]
        f = x.to_f
      end
      i = f.to_i
      if i == f 
        return i
      else 
        return f
      end
    else
      self.invalid_char
    end
  end
end
parse_string() click to toggle source
# File lib/lib/haxe/format/json_parser.rb, line 201
def parse_string 
  start = @pos
  buf_b = ""
  while(true) 
    c = nil
    begin
      index = @pos
      @pos+=1
      c = (@str[index] || 0).ord
    end
    break if c == 34
    if c == 92 
      buf_b += @str[start,@pos - start - 1]
      begin
        index1 = @pos
        @pos+=1
        c = (@str[index1] || 0).ord
      end
      case(c)
      when 114
        buf_b += [13].pack("U")
      when 110
        buf_b += [10].pack("U")
      when 116
        buf_b += [9].pack("U")
      when 98
        buf_b += [8].pack("U")
      when 102
        buf_b += [12].pack("U")
      when 47,92,34
        buf_b += [c].pack("U")
      when 117
        uc = nil
        begin
          x = "0x" + _hx_str(@str[@pos,4])
          uc = x.to_i
        end
        @pos += 4
        buf_b += [uc].pack("U")
      else
        raise hx_raise("Invalid escape sequence \\" + _hx_str([c].pack("U")) + " at position " + _hx_str((@pos - 1)))
      end
      start = @pos
    elsif c == 0 
      raise hx_raise("Unclosed string")
    end
  end
  buf_b += @str[start,@pos - start - 1]
  buf_b
end