// File: /workspace/github_c_makefile_star2_O0/canboat[P]canboat/analyzer/print.c
// Function: fieldPrintStringLAU
extern bool fieldPrintStringLAU(const Field   *field,
                                const char    *fieldName,
                                const uint8_t *data,
                                size_t         dataLen,
                                size_t         startBit,
                                size_t        *bits)
{
  // STRINGLAU format is <len> <control> [ <data> ... ]
  // where <control> == 0 = UTF16
  //       <control> == 1 = ASCII(?) or maybe UTF8?
  int     control;
  size_t  len;
  size_t  utf8_len;
  utf8_t *utf8 = NULL;
  bool    r;

  if (!adjustDataLenStart(&data, &dataLen, &startBit))
  {
    return false;
  }
  logDebug("fieldPrintStringLAU: <%s> data=%p len=%zu startBit=%zu bits=%zu\n", fieldName, data, dataLen, startBit, *bits);

  len     = *data++;
  control = *data++;
  if (len < 2 || dataLen < 2)
  {
    logError("field '%s': Invalid string length %u in STRING_LAU field\n", fieldName, len);
    return false;
  }
  len = CB_MIN(len, dataLen) - 2;

  *bits = BYTES(len + 2);

  if (control == 0)
  {
    utf8_len = utf16_to_utf8((const utf16_t *) data, len / 2, NULL, 0);
    utf8     = malloc(utf8_len + 1);

    if (utf8 == NULL)
    {
      die("Out of memory");
    }
    logDebug("fieldprintStringLAU: UTF16 len %zu requires %zu utf8 bytes\n", len / 2, utf8_len);
    len  = utf16_to_utf8((const utf16_t *) data, len / 2, utf8, utf8_len + 1);
    data = utf8;
  }
  else if (control > 1)
  {
    logError("Unhandled string type %d in PGN\n", control);
    return false;
  }

  r = printString(fieldName, data, len);
  if (utf8 != NULL)
  {
    free(utf8);
  }
  return r;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movq $0x0, -0x58(%rbp)
leaq -0x20(%rbp), %rdi
leaq -0x28(%rbp), %rsi
leaq -0x30(%rbp), %rdx
callq 0x1b0e0
testb $0x1, %al
jne 0x1d7b6
movb $0x0, -0x1(%rbp)
jmp 0x1d947
movq -0x18(%rbp), %rsi
movq -0x20(%rbp), %rdx
movq -0x28(%rbp), %rcx
movq -0x30(%rbp), %r8
movq -0x38(%rbp), %rax
movq (%rax), %r9
leaq 0x13804(%rip), %rdi     # 0x30fd8
movb $0x0, %al
callq 0x1f670
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, -0x20(%rbp)
movzbl (%rax), %eax
movq %rax, -0x48(%rbp)
movq -0x20(%rbp), %rax
movq %rax, %rcx
addq $0x1, %rcx
movq %rcx, -0x20(%rbp)
movzbl (%rax), %eax
movl %eax, -0x3c(%rbp)
cmpq $0x2, -0x48(%rbp)
jb 0x1d814
cmpq $0x2, -0x28(%rbp)
jae 0x1d833
movq -0x18(%rbp), %rsi
movq -0x48(%rbp), %rdx
leaq 0x137f6(%rip), %rdi     # 0x31019
movb $0x0, %al
callq 0x1f720
movb $0x0, -0x1(%rbp)
jmp 0x1d947
movq -0x48(%rbp), %rax
cmpq -0x28(%rbp), %rax
jae 0x1d847
movq -0x48(%rbp), %rax
movq %rax, -0x68(%rbp)
jmp 0x1d84f
movq -0x28(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
subq $0x2, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rcx
addq $0x2, %rcx
shlq $0x3, %rcx
movq -0x38(%rbp), %rax
movq %rcx, (%rax)
cmpl $0x0, -0x3c(%rbp)
jne 0x1d8fa
movq -0x20(%rbp), %rdi
movq -0x48(%rbp), %rsi
shrq %rsi
xorl %eax, %eax
movl %eax, %ecx
movq %rcx, %rdx
callq 0x22d70
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
addq $0x1, %rdi
callq 0xd200
movq %rax, -0x58(%rbp)
cmpq $0x0, -0x58(%rbp)
jne 0x1d8b7
leaq 0x137a1(%rip), %rdi     # 0x31053
callq 0x1f890
movq -0x48(%rbp), %rsi
shrq %rsi
movq -0x50(%rbp), %rdx
leaq 0x13798(%rip), %rdi     # 0x31061
movb $0x0, %al
callq 0x1f670
movq -0x20(%rbp), %rdi
movq -0x48(%rbp), %rsi
shrq %rsi
movq -0x58(%rbp), %rdx
movq -0x50(%rbp), %rcx
addq $0x1, %rcx
callq 0x22d70
movq %rax, -0x48(%rbp)
movq -0x58(%rbp), %rax
movq %rax, -0x20(%rbp)
jmp 0x1d919
cmpl $0x1, -0x3c(%rbp)
jle 0x1d917
movl -0x3c(%rbp), %esi
leaq 0x13793(%rip), %rdi     # 0x3109d
movb $0x0, %al
callq 0x1f720
movb $0x0, -0x1(%rbp)
jmp 0x1d947
jmp 0x1d919
movq -0x18(%rbp), %rdi
movq -0x20(%rbp), %rsi
movq -0x48(%rbp), %rdx
callq 0x1d510
andb $0x1, %al
movb %al, -0x59(%rbp)
cmpq $0x0, -0x58(%rbp)
je 0x1d93f
movq -0x58(%rbp), %rdi
callq 0xd030
movb -0x59(%rbp), %al
andb $0x1, %al
movb %al, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0x70, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)