// File: /workspace/github_c_makefile_star2_O0/sasairc[P]clangsay/src/libbenly/src/typestring.c
// Function: substr
static
int substr(STRING* self, size_t pos, size_t n, STRING** dest)
{
    if (n == 0)
        n = self->size(self) - pos;

    if (!is_in_range(self, pos) ||
            !is_in_range(self, pos + n)) {
        status = EOUTOFRANGE; goto ERR;
    }

    if ((*dest = new_string(NULL)) == NULL) {
        status = EMEMORYALLOC; goto ERR;
    } else {
        (*dest)->length = n;
    }
    if ((*dest)->reserve(dest, (*dest)->size(*dest)) < 0) {
        status = EMEMORYALLOC; goto ERR;
    } else {
        memcpy((*dest)->c_str(*dest),
                self->c_str(self) + pos, (*dest)->size(*dest));
        *((*dest)->string + (*dest)->size(*dest)) = '\0';
    }

    return 0;

ERR:
    switch (status) {
        case    ESTRISEMPTY:
        case    EOUTOFRANGE:
            break;
        case    EMEMORYALLOC:
            if (*dest != NULL) {
                (*dest)->release(*dest);
                *dest = NULL;
            }
            break;
    }

    return status;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
cmpq $0x0, -0x20(%rbp)
jne 0xa7d5
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rax
movq -0x10(%rbp), %rdi
callq *%rax
subq -0x18(%rbp), %rax
movq %rax, -0x20(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0xf2a0
cmpl $0x0, %eax
je 0xa7fd
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
addq -0x20(%rbp), %rsi
callq 0xf2a0
cmpl $0x0, %eax
jne 0xa80f
leaq 0xca44(%rip), %rax      # 0x17248
movl $0xffffffff, (%rax)     # imm = 0xFFFFFFFF
jmp 0xa924
xorl %eax, %eax
movl %eax, %edi
callq 0x8fd0
movq -0x28(%rbp), %rcx
movq %rax, (%rcx)
cmpq $0x0, %rax
jne 0xa837
leaq 0xca1c(%rip), %rax      # 0x17248
movl $0xfffffffd, (%rax)     # imm = 0xFFFFFFFD
jmp 0xa924
movq -0x20(%rbp), %rcx
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rcx, 0x8(%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x40(%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
callq *%rax
movq -0x38(%rbp), %rdi
movq %rax, %rsi
movq -0x30(%rbp), %rax
callq *%rax
cmpl $0x0, %eax
jge 0xa895
leaq 0xc9be(%rip), %rax      # 0x17248
movl $0xfffffffd, (%rax)     # imm = 0xFFFFFFFD
jmp 0xa924
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0xc8(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
callq *%rax
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rax
movq 0xc8(%rax), %rax
movq -0x10(%rbp), %rdi
callq *%rax
addq -0x18(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
callq *%rax
movq -0x50(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq %rax, %rdx
callq 0x2410
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x10(%rax), %rax
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x18(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
callq *%rax
movq %rax, %rcx
movq -0x40(%rbp), %rax
movb $0x0, (%rax,%rcx)
movl $0x0, -0x4(%rbp)
jmp 0xa987
leaq 0xc91d(%rip), %rax      # 0x17248
movl (%rax), %eax
movl %eax, -0x54(%rbp)
subl $-0x4, %eax
je 0xa94b
jmp 0xa937
movl -0x54(%rbp), %eax
subl $-0x3, %eax
je 0xa94d
jmp 0xa941
movl -0x54(%rbp), %eax
subl $-0x1, %eax
jne 0xa97b
jmp 0xa94b
jmp 0xa97b
movq -0x28(%rbp), %rax
cmpq $0x0, (%rax)
je 0xa979
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq 0x268(%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
callq *%rax
movq -0x28(%rbp), %rax
movq $0x0, (%rax)
jmp 0xa97b
leaq 0xc8c6(%rip), %rax      # 0x17248
movl (%rax), %eax
movl %eax, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x60, %rsp
popq %rbp
retq