// File: /workspace/github_c_makefile_star2_O0/pocari[P]compilerbook-9cc/parser.c
// Function: local_var_initializer_sub
static Node *local_var_initializer_sub(Node *cur, Var *var, Type *ty, Designator *desg) {
  if (ty->kind == TY_ARRAY && ty->ptr_to->kind == TY_CHAR && peek_kind(TK_STR)) {
    // char hoge[3] = "abc" のような場合
    // hoge[0] = 'a';
    // hoge[1] = 'b';
    // hoge[2] = 'c';
    // のようなコードを生成する
    // gccでためしたところ
    // char hoge[10] = "01234";
    // みたいに配列の長さに満たない分は0で初期化されていいるっぽい
    // 初期化敷なしで宣言だけの(char hoge[10];)場合は値は不定
    Token *str = consume_kind(TK_STR);

    int len = ty->array_size > str->content_length ? str->content_length : ty->array_size;
    for (int i = 0; i < len; i++) {
      Designator desg2 = {desg, i};
      cur->next = new_desg_node(var, &desg2, new_num_node(str->contents[i], str));
      cur = cur->next;
    }

    for (int i = len; i < ty->array_size; i++) {
      Designator desg2 = {desg, i};
      cur = lvar_init_zero(cur, var, ty->ptr_to, &desg2);
    }
    // 不完全型(配列のサイズが省略されている場合)の場合、初期化した文字列の長さに合わせる
    if (ty->is_incomplete) {
      array_size_completed(ty, str->content_length);
    }

    return cur;
  }


  // static int count = 0;
  // fprintf(stdout, "count: %d, type: %d\n", count++, ty->kind);
  if (ty->kind == TY_ARRAY) {
    bool has_open_brace = consume("{");
    int i = 0;

    if (!peek_token("}")) {
      do {
        Designator desg2 = {desg, i++};
        cur = local_var_initializer_sub(cur, var, ty->ptr_to, &desg2);
      } while(!is_array_limit_over(ty, i) && !peek_end() && consume(","));
    }

    if (has_open_brace && !consume_end()) {
      // "{" で始まってるのに、配列のサイズ個の初期化式を読んでもなおまだ初期化式が残っている場合、無視する
      skip_excess_elements();
    }

    // 初期化子が配列のサイズに満たない場合は、0で初期化する
    for (; i < ty->array_size; i++) {
      Designator dseg2 = {desg, i};
      cur = lvar_init_zero(cur, var, ty->ptr_to, &dseg2);
    }

    // 不完全型(配列のサイズが省略されている場合)の場合、初期化した文字列の長さに合わせる
    if (ty->is_incomplete) {
      array_size_completed(ty, i);
    }

    return cur;
  }

  if (ty->kind == TY_STRUCT) {
    bool has_open_brace = consume("{");
    Member *mem = ty->members;

    if (!peek_token("}")) {
      do {
        assert(mem);
        Designator desg2 = {desg, 0, mem};
        cur = local_var_initializer_sub(cur, var, mem->ty, &desg2);
        mem = mem->next;
      } while(mem && !peek_end() && consume(","));
    }

    if (has_open_brace && !consume_end()) {
      // "{" で始まってるのに、配列のサイズ個の初期化式を読んでもなおまだ初期化式が残っている場合、無視する
      skip_excess_elements();
    }

    // 残りのメンバーがまだあったらゼロ初期化する
    for (; mem; mem = mem->next) {
      Designator dseg2 = {desg, 0, mem};
      cur = lvar_init_zero(cur, var, mem->ty, &dseg2);
    }

    return cur;
  }

  // compound-literal で "{" 初期化式 "}" で初期化する場合に "{" が存在する
  // (int) { 1 } とか
  bool has_open_brace = consume("{");
  Node *e = assign();
  // fprintf(stdout, "val: %d\n", e->val);
  cur->next = new_desg_node(var, desg, e);
  if (has_open_brace) {
    expect_end();
  }
  return cur->next;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x110, %rsp            # imm = 0x110
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x20(%rbp), %rax
cmpl $0x8, (%rax)
jne 0xa281
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
cmpl $0x4, (%rax)
jne 0xa281
movl $0x14, %edi
callq 0x7030
testb $0x1, %al
jne 0xa13c
jmp 0xa281
movl $0x14, %edi
callq 0x7060
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rax
movq -0x30(%rbp), %rcx
movslq 0x30(%rcx), %rcx
cmpq %rcx, %rax
jle 0xa170
movq -0x30(%rbp), %rax
movslq 0x30(%rax), %rax
movq %rax, -0x100(%rbp)
jmp 0xa17f
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x100(%rbp)
movq -0x100(%rbp), %rax
movl %eax, -0x34(%rbp)
movl $0x0, -0x38(%rbp)
movl -0x38(%rbp), %eax
cmpl -0x34(%rbp), %eax
jge 0xa208
movq -0x28(%rbp), %rax
movq %rax, -0x50(%rbp)
movl -0x38(%rbp), %eax
movl %eax, -0x48(%rbp)
movq $0x0, -0x40(%rbp)
movq -0x18(%rbp), %rax
movq %rax, -0x108(%rbp)
movq -0x30(%rbp), %rax
movq 0x28(%rax), %rax
movslq -0x38(%rbp), %rcx
movsbq (%rax,%rcx), %rdi
movq -0x30(%rbp), %rsi
callq 0x8f90
movq -0x108(%rbp), %rdi
movq %rax, %rdx
leaq -0x50(%rbp), %rsi
callq 0xa610
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x30(%rax)
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x10(%rbp)
movl -0x38(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x38(%rbp)
jmp 0xa190
movl -0x34(%rbp), %eax
movl %eax, -0x54(%rbp)
movslq -0x54(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jge 0xa25a
movq -0x28(%rbp), %rax
movq %rax, -0x70(%rbp)
movl -0x54(%rbp), %eax
movl %eax, -0x68(%rbp)
movq $0x0, -0x60(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdx
leaq -0x70(%rbp), %rcx
callq 0xa680
movq %rax, -0x10(%rbp)
movl -0x54(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x54(%rbp)
jmp 0xa20e
movq -0x20(%rbp), %rax
testb $0x1, 0xc(%rax)
je 0xa274
movq -0x20(%rbp), %rdi
movq -0x30(%rbp), %rax
movl 0x30(%rax), %esi
callq 0xa760
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xa5f4
movq -0x20(%rbp), %rax
cmpl $0x8, (%rax)
jne 0xa3f0
leaq 0x5ffb(%rip), %rdi      # 0x10290
callq 0x6780
cmpq $0x0, %rax
setne %al
andb $0x1, %al
movb %al, -0x71(%rbp)
movl $0x0, -0x78(%rbp)
leaq 0x5fee(%rip), %rdi      # 0x102a2
callq 0x69d0
testb $0x1, %al
jne 0xa35f
jmp 0xa2c3
movq -0x28(%rbp), %rax
movq %rax, -0x90(%rbp)
movl -0x78(%rbp), %eax
movl %eax, %ecx
addl $0x1, %ecx
movl %ecx, -0x78(%rbp)
movl %eax, -0x88(%rbp)
movq $0x0, -0x80(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdx
leaq -0x90(%rbp), %rcx
callq 0xa0f0
movq %rax, -0x10(%rbp)
movq -0x20(%rbp), %rdi
movl -0x78(%rbp), %esi
callq 0x9b20
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x109(%rbp)
jne 0xa34f
callq 0x67e0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x109(%rbp)
jne 0xa34f
leaq 0x62b4(%rip), %rdi      # 0x105f1
callq 0x6780
cmpq $0x0, %rax
setne %al
movb %al, -0x109(%rbp)
movb -0x109(%rbp), %al
testb $0x1, %al
jne 0xa2c3
jmp 0xa35f
testb $0x1, -0x71(%rbp)
je 0xa373
callq 0x6700
testb $0x1, %al
jne 0xa373
callq 0x9b60
jmp 0xa375
movslq -0x78(%rbp), %rax
movq -0x20(%rbp), %rcx
cmpq 0x18(%rcx), %rax
jge 0xa3cd
movq -0x28(%rbp), %rax
movq %rax, -0xa8(%rbp)
movl -0x78(%rbp), %eax
movl %eax, -0xa0(%rbp)
movq $0x0, -0x98(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdx
leaq -0xa8(%rbp), %rcx
callq 0xa680
movq %rax, -0x10(%rbp)
movl -0x78(%rbp), %eax
addl $0x1, %eax
movl %eax, -0x78(%rbp)
jmp 0xa375
movq -0x20(%rbp), %rax
testb $0x1, 0xc(%rax)
je 0xa3e3
movq -0x20(%rbp), %rdi
movl -0x78(%rbp), %esi
callq 0xa760
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xa5f4
movq -0x20(%rbp), %rax
cmpl $0x9, (%rax)
jne 0xa594
leaq 0x5e8c(%rip), %rdi      # 0x10290
callq 0x6780
cmpq $0x0, %rax
setne %al
andb $0x1, %al
movb %al, -0xa9(%rbp)
movq -0x20(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0xb8(%rbp)
leaq 0x5e74(%rip), %rdi      # 0x102a2
callq 0x69d0
testb $0x1, %al
jne 0xa50e
jmp 0xa43d
cmpq $0x0, -0xb8(%rbp)
je 0xa449
jmp 0xa468
leaq 0x64dc(%rip), %rdi      # 0x1092c
leaq 0x619c(%rip), %rsi      # 0x105f3
movl $0x6f2, %edx            # imm = 0x6F2
leaq 0x64cd(%rip), %rcx      # 0x10930
callq 0x20b0
movq -0x28(%rbp), %rax
movq %rax, -0xd0(%rbp)
movl $0x0, -0xc8(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0xb8(%rbp), %rax
movq 0x8(%rax), %rdx
leaq -0xd0(%rbp), %rcx
callq 0xa0f0
movq %rax, -0x10(%rbp)
movq -0xb8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xb8(%rbp)
xorl %eax, %eax
cmpq $0x0, -0xb8(%rbp)
movb %al, -0x10a(%rbp)
je 0xa4fe
callq 0x67e0
movb %al, %cl
xorl %eax, %eax
testb $0x1, %cl
movb %al, -0x10a(%rbp)
jne 0xa4fe
leaq 0x6105(%rip), %rdi      # 0x105f1
callq 0x6780
cmpq $0x0, %rax
setne %al
movb %al, -0x10a(%rbp)
movb -0x10a(%rbp), %al
testb $0x1, %al
jne 0xa43d
jmp 0xa50e
testb $0x1, -0xa9(%rbp)
je 0xa525
callq 0x6700
testb $0x1, %al
jne 0xa525
callq 0x9b60
jmp 0xa527
cmpq $0x0, -0xb8(%rbp)
je 0xa58a
movq -0x28(%rbp), %rax
movq %rax, -0xe8(%rbp)
movl $0x0, -0xe0(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0xb8(%rbp), %rax
movq 0x8(%rax), %rdx
leaq -0xe8(%rbp), %rcx
callq 0xa680
movq %rax, -0x10(%rbp)
movq -0xb8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xb8(%rbp)
jmp 0xa527
movq -0x10(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0xa5f4
leaq 0x5cf5(%rip), %rdi      # 0x10290
callq 0x6780
cmpq $0x0, %rax
setne %al
andb $0x1, %al
movb %al, -0xe9(%rbp)
callq 0x9d00
movq %rax, -0xf8(%rbp)
movq -0x18(%rbp), %rdi
movq -0x28(%rbp), %rsi
movq -0xf8(%rbp), %rdx
callq 0xa610
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x30(%rax)
testb $0x1, -0xe9(%rbp)
je 0xa5e8
callq 0xa0d0
movq -0x10(%rbp), %rax
movq 0x30(%rax), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x110, %rsp            # imm = 0x110
popq %rbp
retq
nopw %cs:(%rax,%rax)