// File: nilnilnil[P]autocomplete/deps/mongoose/mongoose.c
// Function: compare_dir_entries
static int WINCDECL compare_dir_entries(const void *p1, const void *p2) {
  const struct de *a = (const struct de *) p1, *b = (const struct de *) p2;
  const char *query_string = a->conn->request_info.query_string;
  int cmp_result = 0;

  if (query_string == NULL) {
    query_string = "na";
  }

  if (a->st.is_directory && !b->st.is_directory) {
    return -1;  // Always put directories on top
  } else if (!a->st.is_directory && b->st.is_directory) {
    return 1;   // Always put directories on top
  } else if (*query_string == 'n') {
    cmp_result = strcmp(a->file_name, b->file_name);
  } else if (*query_string == 's') {
    cmp_result = a->st.size == b->st.size ? 0 :
      a->st.size > b->st.size ? 1 : -1;
  } else if (*query_string == 'd') {
    cmp_result = a->st.mtime == b->st.mtime ? 0 :
      a->st.mtime > b->st.mtime ? 1 : -1;
  }

  return query_string[1] == 'd' ? -cmp_result : cmp_result;
}

// Assembly:
subq $0x48, %rsp
movq %rdi, 0x38(%rsp)
movq %rsi, 0x30(%rsp)
movq 0x38(%rsp), %rax
movq %rax, 0x28(%rsp)
movq 0x30(%rsp), %rax
movq %rax, 0x20(%rsp)
movq 0x28(%rsp), %rax
movq (%rax), %rax
movq 0x28(%rax), %rax
movq %rax, 0x18(%rsp)
movl $0x0, 0x14(%rsp)
cmpq $0x0, 0x18(%rsp)
jne 0x1f9cf
leaq 0x3af2(%rip), %rax      # 0x234bc
movq %rax, 0x18(%rsp)
movq 0x28(%rsp), %rax
cmpl $0x0, 0x10(%rax)
je 0x1f9f2
movq 0x20(%rsp), %rax
cmpl $0x0, 0x10(%rax)
jne 0x1f9f2
movl $0xffffffff, 0x44(%rsp) # imm = 0xFFFFFFFF
jmp 0x1fb24
movq 0x28(%rsp), %rax
cmpl $0x0, 0x10(%rax)
jne 0x1fa15
movq 0x20(%rsp), %rax
cmpl $0x0, 0x10(%rax)
je 0x1fa15
movl $0x1, 0x44(%rsp)
jmp 0x1fb24
movq 0x18(%rsp), %rax
movsbl (%rax), %eax
cmpl $0x6e, %eax
jne 0x1fa42
movq 0x28(%rsp), %rax
movq 0x8(%rax), %rdi
movq 0x20(%rsp), %rax
movq 0x8(%rax), %rsi
callq 0x5810
movl %eax, 0x14(%rsp)
jmp 0x1faf6
movq 0x18(%rsp), %rax
movsbl (%rax), %eax
cmpl $0x73, %eax
jne 0x1fa9b
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rax
movq 0x20(%rsp), %rcx
cmpq 0x18(%rcx), %rax
jne 0x1fa6b
xorl %eax, %eax
movl %eax, 0x10(%rsp)
jmp 0x1fa91
movq 0x28(%rsp), %rax
movq 0x18(%rax), %rdx
movq 0x20(%rsp), %rax
movq 0x18(%rax), %rsi
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl $0x1, %ecx
cmpq %rsi, %rdx
cmovgl %ecx, %eax
movl %eax, 0x10(%rsp)
movl 0x10(%rsp), %eax
movl %eax, 0x14(%rsp)
jmp 0x1faf4
movq 0x18(%rsp), %rax
movsbl (%rax), %eax
cmpl $0x64, %eax
jne 0x1faf2
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rax
movq 0x20(%rsp), %rcx
cmpq 0x20(%rcx), %rax
jne 0x1fac4
xorl %eax, %eax
movl %eax, 0xc(%rsp)
jmp 0x1faea
movq 0x28(%rsp), %rax
movq 0x20(%rax), %rdx
movq 0x20(%rsp), %rax
movq 0x20(%rax), %rsi
movl $0xffffffff, %eax       # imm = 0xFFFFFFFF
movl $0x1, %ecx
cmpq %rsi, %rdx
cmovgl %ecx, %eax
movl %eax, 0xc(%rsp)
movl 0xc(%rsp), %eax
movl %eax, 0x14(%rsp)
jmp 0x1faf4
jmp 0x1faf6
jmp 0x1faf8
jmp 0x1fafa
movq 0x18(%rsp), %rax
movsbl 0x1(%rax), %eax
cmpl $0x64, %eax
jne 0x1fb14
xorl %eax, %eax
subl 0x14(%rsp), %eax
movl %eax, 0x8(%rsp)
jmp 0x1fb1c
movl 0x14(%rsp), %eax
movl %eax, 0x8(%rsp)
movl 0x8(%rsp), %eax
movl %eax, 0x44(%rsp)
movl 0x44(%rsp), %eax
addq $0x48, %rsp
retq
nopl (%rax)