// File: srajangarg[P]raytracer/src/core/SceneLoader.cpp
// Function: SceneLoader::getValue(std::istream&)
ParametricValue * SceneLoader::getValue(istream & str)
{
  char temp;
  str >> temp;

  if (temp == '{') // time-varying expression
  {
    int start = str.tellg();
    string expr;

    while (str.get(temp))
    {
      if (temp == '}') // completed expr
      {
        ParametricValue * v = new ExprValue(expr.c_str());

        if (!v->good())
        {
          *err << "Error: couldn't parse expression \"" << expr << "\" at ";
          curPos(*err, str.tellg());
          *err << endl;
          delete v;
          return NULL;
        }
        else
        {
          return v;
        }
      }
      else if (temp == '#')
      {
        string no;
        getline(str, no);
      }
      else
      {
        expr += temp;
      }
    }

    *err << "Error: No closing brace for expr at ";
    curPos(*err, start);
    *err << endl;
    return NULL;
  }
  else if (temp == ')')
  {
    str.putback(temp);
    return NULL;
  }
  else if (temp == '#')
  {
    string no;
    getline(str, no);
    return getValue(str);
  }
  else
  {
    str.putback(temp);
    double val;
    str.peek();
    str >> val;

    if (str.fail())
    {
      str.clear();
      *err << "Failed to extract a numeric value at ";
      curPos(*err, str.tellg());
      *err << endl;
      str.peek();
      return NULL;
    }
    else
    {
      return new ConstValue(val);
    }
  }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x160, %rsp            # imm = 0x160
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq -0x18(%rbp), %rdi
leaq -0x19(%rbp), %rsi
callq 0x5530
movsbl -0x19(%rbp), %eax
cmpl $0x7b, %eax
jne 0xd6e1
movq -0x18(%rbp), %rdi
callq 0x5700
movq %rax, -0x30(%rbp)
movq %rdx, -0x28(%rbp)
leaq -0x30(%rbp), %rdi
callq 0x12bc0
movl %eax, -0x20(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x55a0
movq -0x18(%rbp), %rdi
leaq -0x19(%rbp), %rsi
callq 0x5590
movq %rax, -0xe8(%rbp)
jmp 0xd404
movq -0xe8(%rbp), %rdi
movq (%rdi), %rax
movq -0x18(%rax), %rax
addq %rax, %rdi
callq 0x5500
movb %al, -0xe9(%rbp)
jmp 0xd422
movb -0xe9(%rbp), %al
testb $0x1, %al
jne 0xd431
jmp 0xd666
movsbl -0x19(%rbp), %eax
cmpl $0x7d, %eax
jne 0xd5f5
movl $0xc0, %edi
callq 0x5400
movq %rax, -0xf8(%rbp)
jmp 0xd451
leaq -0x50(%rbp), %rdi
callq 0x51a0
movq -0xf8(%rbp), %rdi
movq %rax, %rsi
callq 0x12d50
jmp 0xd46b
movq -0xf8(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rdi
movq (%rdi), %rax
movq 0x10(%rax), %rax
callq *%rax
movb %al, -0xf9(%rbp)
jmp 0xd48b
movb -0xf9(%rbp), %al
testb $0x1, %al
jne 0xd5e1
jmp 0xd49b
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rdi
leaq 0x39d98(%rip), %rsi     # 0x47248
callq 0x53e0
movq %rax, -0x108(%rbp)
jmp 0xd4be
movq -0x108(%rbp), %rdi
leaq -0x50(%rbp), %rsi
callq 0x53c0
movq %rax, -0x110(%rbp)
jmp 0xd4d7
movq -0x110(%rbp), %rdi
leaq 0x39d14(%rip), %rsi     # 0x471f9
callq 0x53e0
jmp 0xd4ec
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0x128(%rbp)
movq -0x18(%rbp), %rdi
callq 0x5700
movq %rdx, -0x120(%rbp)
movq %rax, -0x118(%rbp)
jmp 0xd51a
movq -0x120(%rbp), %rax
movq -0x118(%rbp), %rcx
movq %rcx, -0x78(%rbp)
movq %rax, -0x70(%rbp)
leaq -0x78(%rbp), %rdi
callq 0x12bc0
movq %rax, -0x130(%rbp)
jmp 0xd542
movq -0x128(%rbp), %rsi
movq -0xe0(%rbp), %rdi
movq -0x130(%rbp), %rax
movl %eax, %edx
callq 0xc990
jmp 0xd560
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rdi
movq 0x4ea3b(%rip), %rsi     # 0x5bfb0
callq 0x5440
jmp 0xd57c
movq -0x68(%rbp), %rax
movq %rax, -0x138(%rbp)
cmpq $0x0, %rax
je 0xd59a
movq -0x138(%rbp), %rdi
movq (%rdi), %rax
callq *0x20(%rax)
movq $0x0, -0x8(%rbp)
movl $0x1, -0x7c(%rbp)
jmp 0xd6c5
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
jmp 0xd6d3
movq -0xf8(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0xc0, %esi
callq 0x5410
jmp 0xd6d3
movq -0x68(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x7c(%rbp)
jmp 0xd6c5
movsbl -0x19(%rbp), %eax
cmpl $0x23, %eax
jne 0xd64e
leaq -0xa0(%rbp), %rdi
movq %rdi, -0x140(%rbp)
callq 0x55a0
movq -0x140(%rbp), %rsi
movq -0x18(%rbp), %rdi
callq 0x50e0
jmp 0xd623
leaq -0xa0(%rbp), %rdi
callq 0x5290
jmp 0xd65f
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0xa0(%rbp), %rdi
callq 0x5290
jmp 0xd6d3
movsbl -0x19(%rbp), %esi
leaq -0x50(%rbp), %rdi
callq 0x52a0
jmp 0xd65d
jmp 0xd65f
jmp 0xd661
jmp 0xd3ee
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rdi
leaq 0x39bf0(%rip), %rsi     # 0x4726b
callq 0x53e0
jmp 0xd682
movq -0xe0(%rbp), %rdi
movq 0x90(%rdi), %rsi
movl -0x20(%rbp), %edx
callq 0xc990
jmp 0xd69a
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rdi
movq 0x4e901(%rip), %rsi     # 0x5bfb0
callq 0x5440
jmp 0xd6b6
movq $0x0, -0x8(%rbp)
movl $0x1, -0x7c(%rbp)
leaq -0x50(%rbp), %rdi
callq 0x5290
jmp 0xd8c2
leaq -0x50(%rbp), %rdi
callq 0x5290
jmp 0xd8cf
movsbl -0x19(%rbp), %eax
cmpl $0x29, %eax
jne 0xd704
movq -0x18(%rbp), %rdi
movsbl -0x19(%rbp), %esi
callq 0x5790
movq $0x0, -0x8(%rbp)
jmp 0xd8c2
movsbl -0x19(%rbp), %eax
cmpl $0x23, %eax
jne 0xd78b
leaq -0xc0(%rbp), %rdi
movq %rdi, -0x148(%rbp)
callq 0x55a0
movq -0x148(%rbp), %rsi
movq -0x18(%rbp), %rdi
callq 0x50e0
jmp 0xd732
movq -0xe0(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xd390
movq %rax, -0x150(%rbp)
jmp 0xd74b
movq -0x150(%rbp), %rax
movq %rax, -0x8(%rbp)
movl $0x1, -0x7c(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0x5290
jmp 0xd8c2
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
leaq -0xc0(%rbp), %rdi
callq 0x5290
jmp 0xd8cf
movq -0x18(%rbp), %rdi
movsbl -0x19(%rbp), %esi
callq 0x5790
movq -0x18(%rbp), %rdi
callq 0x5170
movq -0x18(%rbp), %rdi
leaq -0xc8(%rbp), %rsi
callq 0x5360
movq -0x18(%rbp), %rdi
movq (%rdi), %rax
addq -0x18(%rax), %rdi
callq 0x5040
testb $0x1, %al
jne 0xd7ca
jmp 0xd870
movq -0x18(%rbp), %rdi
movq (%rdi), %rax
addq -0x18(%rax), %rdi
xorl %esi, %esi
callq 0x56c0
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rdi
leaq 0x39a9f(%rip), %rsi     # 0x47290
callq 0x53e0
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0x158(%rbp)
movq -0x18(%rbp), %rdi
callq 0x5700
movq %rax, -0xd8(%rbp)
movq %rdx, -0xd0(%rbp)
leaq -0xd8(%rbp), %rdi
callq 0x12bc0
movq -0x158(%rbp), %rsi
movq -0xe0(%rbp), %rdi
movl %eax, %edx
callq 0xc990
movq -0xe0(%rbp), %rax
movq 0x90(%rax), %rdi
movq 0x4e758(%rip), %rsi     # 0x5bfb0
callq 0x5440
movq -0x18(%rbp), %rdi
callq 0x5170
movq $0x0, -0x8(%rbp)
jmp 0xd8c2
movl $0x10, %edi
callq 0x5400
movq %rax, %rdi
movq %rdi, %rax
movq %rax, -0x160(%rbp)
movsd -0xc8(%rbp), %xmm0
callq 0x12f80
jmp 0xd896
movq -0x160(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xd8c2
movq -0x160(%rbp), %rdi
movq %rax, %rcx
movl %edx, %eax
movq %rcx, -0x58(%rbp)
movl %eax, -0x5c(%rbp)
movl $0x10, %esi
callq 0x5410
jmp 0xd8cf
movq -0x8(%rbp), %rax
addq $0x160, %rsp            # imm = 0x160
popq %rbp
retq
movq -0x58(%rbp), %rdi
callq 0x5720
nopl (%rax,%rax)