// File: cjxgm[P]libgpp/src/libgpp.cpp
// Function: (anonymous namespace)::add_comment((anonymous namespace)::Specs*, char const*, char*, char*, char, char)
void add_comment(Specs *S, const char *specif, char *start, char *end, char quote, char warn) {
        Comment *p;

        if (*start == 0)
            bug("comment/string start delimiter must be non-empty");
        for (p = S->comments; p != nullptr ; p = p->next)
            if (!strcmp(p->start, start)) {
                if (strcmp(p->end, end)) // already exists with a different end
                    bug("conflicting comment/string delimiter specifications");
                free(p->start);
                free(p->end);
                break;
            }

        if (p == nullptr ) {
            p = XX malloc(sizeof *p);
            p->next = S->comments;
            S->comments = p;
        }
        p->start = start;
        p->end = end;
        p->quote = quote;
        p->warn = warn;
        if (strlen(specif) != 3)
            bug("invalid comment/string modifier");
        p->flags[FLAG_META] = parse_comment_specif(specif[0]);
        p->flags[FLAG_USER] = parse_comment_specif(specif[1]);
        p->flags[FLAG_TEXT] = parse_comment_specif(specif[2]);
    }

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movl %r8d, -0x5c(%rbp)
movq %rcx, %rax
movl -0x5c(%rbp), %ecx
movq %rax, -0x58(%rbp)
movq %rdx, %rax
movq -0x58(%rbp), %rdx
movq %rax, -0x50(%rbp)
movq %rsi, %rax
movq -0x50(%rbp), %rsi
movq %rax, -0x48(%rbp)
movq %rdi, %r8
movq -0x48(%rbp), %rdi
movb %r9b, %al
movq %r8, -0x8(%rbp)
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movb %cl, -0x21(%rbp)
movb %al, -0x22(%rbp)
movq -0x18(%rbp), %rax
movsbl (%rax), %eax
cmpl $0x0, %eax
jne 0x3384
leaq 0x8321(%rip), %rdi      # 0xb6a0
callq 0x35e0
movq -0x8(%rbp), %rax
movq 0x90(%rax), %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
je 0x33fc
movq -0x30(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rsi
callq 0x21f0
cmpl $0x0, %eax
jne 0x33ec
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0x21f0
cmpl $0x0, %eax
je 0x33d1
leaq 0x8305(%rip), %rdi      # 0xb6d1
callq 0x35e0
movq -0x30(%rbp), %rax
movq (%rax), %rdi
callq 0x2170
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rdi
callq 0x2170
jmp 0x33fc
jmp 0x33ee
movq -0x30(%rbp), %rax
movq 0x20(%rax), %rax
movq %rax, -0x30(%rbp)
jmp 0x3393
cmpq $0x0, -0x30(%rbp)
jne 0x344c
movl $0x28, %edi
callq 0x21a0
movq %rax, %rsi
leaq -0x39(%rbp), %rdi
callq 0x3060
movq %rax, -0x38(%rbp)
leaq -0x38(%rbp), %rdi
callq 0x3680
movq %rax, -0x30(%rbp)
movq -0x8(%rbp), %rax
movq 0x90(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x20(%rax)
movq -0x30(%rbp), %rcx
movq -0x8(%rbp), %rax
movq %rcx, 0x90(%rax)
movq -0x18(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x20(%rbp), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movb -0x21(%rbp), %cl
movq -0x30(%rbp), %rax
movb %cl, 0x10(%rax)
movb -0x22(%rbp), %cl
movq -0x30(%rbp), %rax
movb %cl, 0x11(%rax)
movq -0x10(%rbp), %rdi
callq 0x2070
cmpq $0x3, %rax
je 0x3492
leaq 0x8278(%rip), %rdi      # 0xb705
callq 0x35e0
movq -0x10(%rbp), %rax
movsbl (%rax), %edi
callq 0x36a0
movl %eax, %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x14(%rax)
movq -0x10(%rbp), %rax
movsbl 0x1(%rax), %edi
callq 0x36a0
movl %eax, %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x18(%rax)
movq -0x10(%rbp), %rax
movsbl 0x2(%rax), %edi
callq 0x36a0
movl %eax, %ecx
movq -0x30(%rbp), %rax
movl %ecx, 0x1c(%rax)
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax)