#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ free(char *);
char *malloc(int);
char *realloc(char *, int);
int /*<<< orphan*/ strcpy(char *, char *);
char *string_strndup(char const *, int);
int strlen(char const *);
scalar_t__ strncmp(char const *, char const *, int);
char *stub1(void *, char const *);
char *string_replace_with_callback(const char *string, const char *prefix,
                                   const char *suffix,
                                   const char **list_prefix_no_replace,
                                   char *(*callback)(void *data,
                                                     const char *text),
                                   void *callback_data, int *errors) {
  int length_prefix, length_suffix, length, length_value, index_string;
  int index_result, sub_count, sub_level, sub_errors, replace, i;
  char *result, *result2, *key, *key2, *value;
  const char *pos_end_name;
  if (errors)
    *errors = 0;
  if (!string || !prefix || !prefix[0] || !suffix || !suffix[0] || !callback)
    return NULL;
  length_prefix = strlen(prefix);
  length_suffix = strlen(suffix);
  length = strlen(string) + 1;
  result = malloc(length);
  if (result) {
    index_string = 0;
    index_result = 0;
    while (string[index_string]) {
      if ((string[index_string] == '\\') &&
          (string[index_string + 1] == prefix[0])) {
        index_string++;
        result[index_result++] = string[index_string++];
      } else if (strncmp(string + index_string, prefix, length_prefix) == 0) {
        sub_count = 0;
        sub_level = 0;
        pos_end_name = string + index_string + length_prefix;
        while (pos_end_name[0]) {
          if (strncmp(pos_end_name, suffix, length_suffix) == 0) {
            if (sub_level == 0)
              break;
            sub_level--;
          }
          if ((pos_end_name[0] == '\\') && (pos_end_name[1] == prefix[0])) {
            pos_end_name++;
          } else if (strncmp(pos_end_name, prefix, length_prefix) == 0) {
            sub_count++;
            sub_level++;
          }
          pos_end_name++;
        }
        if (!pos_end_name[0]) {
          result[index_result] = '\0';
          if (errors)
            (*errors)++;
          return result;
        }
        key = string_strndup(string + index_string + length_prefix,
                             pos_end_name -
                                 (string + index_string + length_prefix));
        if (key) {
          if (sub_count > 0) {
            replace = 1;
            if (list_prefix_no_replace) {
              for (i = 0; list_prefix_no_replace[i]; i++) {
                if (strncmp(key, list_prefix_no_replace[i],
                            strlen(list_prefix_no_replace[i])) == 0) {
                  replace = 0;
                  break;
                }
              }
            }
            if (replace) {
              sub_errors = 0;
              key2 = string_replace_with_callback(
                  key, prefix, suffix, list_prefix_no_replace, callback,
                  callback_data, &sub_errors);
              if (errors)
                (*errors) += sub_errors;
              free(key);
              key = key2;
            }
          }
          value = (*callback)(callback_data, (key) ? key : "");
          if (value) {
            length_value = strlen(value);
            if (length_value > 0) {
              length += length_value;
              result2 = realloc(result, length);
              if (!result2) {
                if (result)
                  free(result);
                if (key)
                  free(key);
                free(value);
                return NULL;
              }
              result = result2;
              strcpy(result + index_result, value);
              index_result += length_value;
            }
            index_string = pos_end_name - string + length_suffix;
            free(value);
          } else {
            result[index_result++] = string[index_string++];
            if (errors)
              (*errors)++;
          }
          if (key)
            free(key);
        } else
          result[index_result++] = string[index_string++];
      } else
        result[index_result++] = string[index_string++];
    }
    result[index_result] = '\0';
  }
  return result;
}


x86 assembly (clang, -O0):
<string_replace_with_callback>:
push   %rbp
mov    %rsp,%rbp
sub    $0xd0,%rsp
mov    0x10(%rbp),%rax
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %rcx,-0x28(%rbp)
mov    %r8,-0x30(%rbp)
mov    %r9,-0x38(%rbp)
cmpq   $0x0,0x10(%rbp)
je     11bc <string_replace_with_callback+0x3c>
mov    0x10(%rbp),%rax
movl   $0x0,(%rax)
cmpq   $0x0,-0x10(%rbp)
je     1202 <string_replace_with_callback+0x82>
cmpq   $0x0,-0x18(%rbp)
je     1202 <string_replace_with_callback+0x82>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     1202 <string_replace_with_callback+0x82>
cmpq   $0x0,-0x20(%rbp)
je     1202 <string_replace_with_callback+0x82>
mov    -0x20(%rbp),%rax
cmpb   $0x0,(%rax)
je     1202 <string_replace_with_callback+0x82>
cmpq   $0x0,-0x30(%rbp)
jne    120f <string_replace_with_callback+0x8f>
movq   $0x0,-0x8(%rbp)
jmp    17a1 <string_replace_with_callback+0x621>
mov    -0x18(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,-0x3c(%rbp)
mov    -0x20(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,-0x40(%rbp)
mov    -0x10(%rbp),%rdi
call   1060 <strlen@plt>
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
mov    -0x44(%rbp),%edi
call   1080 <malloc@plt>
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
je     1799 <string_replace_with_callback+0x619>
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     178d <string_replace_with_callback+0x60d>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5c,%eax
jne    12da <string_replace_with_callback+0x15a>
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    12da <string_replace_with_callback+0x15a>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x4c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x70(%rbp),%rax
mov    -0x50(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x50(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1788 <string_replace_with_callback+0x608>
mov    -0x10(%rbp),%rdi
movslq -0x4c(%rbp),%rax
add    %rax,%rdi
mov    -0x18(%rbp),%rsi
mov    -0x3c(%rbp),%edx
call   1040 <strncmp@plt>
cmp    $0x0,%rax
jne    1759 <string_replace_with_callback+0x5d9>
movl   $0x0,-0x54(%rbp)
movl   $0x0,-0x58(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
add    %rcx,%rax
movslq -0x3c(%rbp),%rcx
add    %rcx,%rax
mov    %rax,-0x98(%rbp)
mov    -0x98(%rbp),%rax
cmpb   $0x0,(%rax)
je     13f6 <string_replace_with_callback+0x276>
mov    -0x98(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x40(%rbp),%edx
call   1040 <strncmp@plt>
cmp    $0x0,%rax
jne    1367 <string_replace_with_callback+0x1e7>
cmpl   $0x0,-0x58(%rbp)
jne    135e <string_replace_with_callback+0x1de>
jmp    13f6 <string_replace_with_callback+0x276>
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
mov    -0x98(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    13ab <string_replace_with_callback+0x22b>
mov    -0x98(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    13ab <string_replace_with_callback+0x22b>
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    13df <string_replace_with_callback+0x25f>
mov    -0x98(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x3c(%rbp),%edx
call   1040 <strncmp@plt>
cmp    $0x0,%rax
jne    13da <string_replace_with_callback+0x25a>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    13df <string_replace_with_callback+0x25f>
mov    -0x98(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x98(%rbp)
jmp    1322 <string_replace_with_callback+0x1a2>
mov    -0x98(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1435 <string_replace_with_callback+0x2b5>
mov    -0x70(%rbp),%rax
movslq -0x50(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
cmpq   $0x0,0x10(%rbp)
je     1428 <string_replace_with_callback+0x2a8>
mov    0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x70(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    17a1 <string_replace_with_callback+0x621>
mov    -0x10(%rbp),%rdi
movslq -0x4c(%rbp),%rax
add    %rax,%rdi
movslq -0x3c(%rbp),%rax
add    %rax,%rdi
mov    -0x98(%rbp),%rax
mov    -0x10(%rbp),%rcx
movslq -0x4c(%rbp),%rdx
add    %rdx,%rcx
movslq -0x3c(%rbp),%rdx
add    %rdx,%rcx
sub    %rcx,%rax
mov    %eax,%esi
call   10a0 <string_strndup@plt>
mov    %rax,-0x80(%rbp)
cmpq   $0x0,-0x80(%rbp)
je     172a <string_replace_with_callback+0x5aa>
cmpl   $0x0,-0x54(%rbp)
jle    158d <string_replace_with_callback+0x40d>
movl   $0x1,-0x60(%rbp)
cmpq   $0x0,-0x28(%rbp)
je     1521 <string_replace_with_callback+0x3a1>
movl   $0x0,-0x64(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x64(%rbp),%rcx
cmpq   $0x0,(%rax,%rcx,8)
je     151c <string_replace_with_callback+0x39c>
mov    -0x80(%rbp),%rax
mov    %rax,-0xa8(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x64(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x28(%rbp),%rax
movslq -0x64(%rbp),%rcx
mov    (%rax,%rcx,8),%rdi
call   1060 <strlen@plt>
mov    -0xa8(%rbp),%rdi
mov    -0xa0(%rbp),%rsi
mov    %eax,%edx
call   1040 <strncmp@plt>
cmp    $0x0,%rax
jne    1509 <string_replace_with_callback+0x389>
movl   $0x0,-0x60(%rbp)
jmp    151c <string_replace_with_callback+0x39c>
jmp    150e <string_replace_with_callback+0x38e>
mov    -0x64(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x64(%rbp)
jmp    149c <string_replace_with_callback+0x31c>
jmp    1521 <string_replace_with_callback+0x3a1>
cmpl   $0x0,-0x60(%rbp)
je     1588 <string_replace_with_callback+0x408>
movl   $0x0,-0x5c(%rbp)
mov    -0x80(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%r8
mov    -0x38(%rbp),%r9
lea    -0x5c(%rbp),%rax
mov    %rax,(%rsp)
call   1070 <string_replace_with_callback@plt>
mov    %rax,-0x88(%rbp)
cmpq   $0x0,0x10(%rbp)
je     1574 <string_replace_with_callback+0x3f4>
mov    -0x5c(%rbp),%ecx
mov    0x10(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x80(%rbp),%rdi
call   1030 <free@plt>
mov    -0x88(%rbp),%rax
mov    %rax,-0x80(%rbp)
jmp    158d <string_replace_with_callback+0x40d>
mov    -0x30(%rbp),%rax
mov    %rax,-0xb8(%rbp)
mov    -0x38(%rbp),%rax
mov    %rax,-0xb0(%rbp)
cmpq   $0x0,-0x80(%rbp)
je     15be <string_replace_with_callback+0x43e>
mov    -0x80(%rbp),%rax
mov    %rax,-0xc0(%rbp)
jmp    15d1 <string_replace_with_callback+0x451>
lea    0xa3b(%rip),%rax
mov    %rax,-0xc0(%rbp)
jmp    15d1 <string_replace_with_callback+0x451>
mov    -0xb8(%rbp),%rax
mov    -0xb0(%rbp),%rdi
mov    -0xc0(%rbp),%rsi
call   *%rax
mov    %rax,-0x90(%rbp)
cmpq   $0x0,-0x90(%rbp)
je     16cc <string_replace_with_callback+0x54c>
mov    -0x90(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,-0x48(%rbp)
cmpl   $0x0,-0x48(%rbp)
jle    16a3 <string_replace_with_callback+0x523>
mov    -0x48(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x70(%rbp),%rdi
mov    -0x44(%rbp),%esi
call   1090 <realloc@plt>
mov    %rax,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
jne    167b <string_replace_with_callback+0x4fb>
cmpq   $0x0,-0x70(%rbp)
je     164e <string_replace_with_callback+0x4ce>
mov    -0x70(%rbp),%rdi
call   1030 <free@plt>
cmpq   $0x0,-0x80(%rbp)
je     1662 <string_replace_with_callback+0x4e2>
mov    -0x80(%rbp),%rdi
call   1030 <free@plt>
mov    -0x90(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    17a1 <string_replace_with_callback+0x621>
mov    -0x78(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x70(%rbp),%rdi
movslq -0x50(%rbp),%rax
add    %rax,%rdi
mov    -0x90(%rbp),%rsi
call   1050 <strcpy@plt>
mov    -0x48(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x98(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
movslq -0x40(%rbp),%rcx
add    %rcx,%rax
mov    %eax,-0x4c(%rbp)
mov    -0x90(%rbp),%rdi
call   1030 <free@plt>
jmp    1711 <string_replace_with_callback+0x591>
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x4c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x70(%rbp),%rax
mov    -0x50(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x50(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
cmpq   $0x0,0x10(%rbp)
je     170c <string_replace_with_callback+0x58c>
mov    0x10(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    1711 <string_replace_with_callback+0x591>
cmpq   $0x0,-0x80(%rbp)
je     1725 <string_replace_with_callback+0x5a5>
mov    -0x80(%rbp),%rdi
call   1030 <free@plt>
jmp    1754 <string_replace_with_callback+0x5d4>
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x4c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x70(%rbp),%rax
mov    -0x50(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x50(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1783 <string_replace_with_callback+0x603>
mov    -0x10(%rbp),%rax
mov    -0x4c(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x4c(%rbp)
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x70(%rbp),%rax
mov    -0x50(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x50(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1788 <string_replace_with_callback+0x608>
jmp    125b <string_replace_with_callback+0xdb>
mov    -0x70(%rbp),%rax
movslq -0x50(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x70(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0xd0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<string_replace_with_callback>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
mov    %r9,%r15
mov    %r8,%rbp
mov    %rcx,%r14
mov    %rdx,%r13
mov    %rsi,%r12
mov    %rdi,%rbx
mov    0xc0(%rsp),%rax
test   %rax,%rax
je     11b6 <string_replace_with_callback+0x36>
movl   $0x0,(%rax)
xor    %ecx,%ecx
test   %rbx,%rbx
je     15fe <string_replace_with_callback+0x47e>
test   %r12,%r12
je     15fe <string_replace_with_callback+0x47e>
xor    %ecx,%ecx
test   %r13,%r13
je     15fe <string_replace_with_callback+0x47e>
cmpb   $0x0,(%r12)
je     15fe <string_replace_with_callback+0x47e>
xor    %ecx,%ecx
test   %rbp,%rbp
je     15fe <string_replace_with_callback+0x47e>
cmpb   $0x0,0x0(%r13)
je     15fe <string_replace_with_callback+0x47e>
mov    %r12,%rdi
call   1060 <strlen@plt>
mov    %eax,0x14(%rsp)
mov    %r13,%rdi
call   1060 <strlen@plt>
mov    %eax,0x40(%rsp)
mov    %rbx,0x50(%rsp)
mov    %rbx,%rdi
call   1060 <strlen@plt>
mov    %eax,%ebx
add    $0x1,%ebx
mov    %ebx,%edi
call   1080 <malloc@plt>
xor    %edx,%edx
test   %rax,%rax
je     15fc <string_replace_with_callback+0x47c>
mov    %rax,%rcx
mov    %ebx,0x3c(%rsp)
mov    %rbp,0x60(%rsp)
mov    %r15,0x68(%rsp)
mov    0x14(%rsp),%r8d
movslq %r8d,%rax
mov    %rax,0x70(%rsp)
mov    %r14,0x48(%rsp)
lea    0x8(%r14),%rax
mov    %rax,0x78(%rsp)
xor    %esi,%esi
mov    %r13,0x80(%rsp)
mov    %edx,%ebx
mov    0x50(%rsp),%rbp
mov    %rcx,0x20(%rsp)
jmp    1293 <string_replace_with_callback+0x113>
mov    %r13d,%esi
add    $0x1,%esi
mov    (%r14),%al
movslq %ebx,%rcx
mov    0x20(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    %rdx,%rcx
add    $0x1,%ebx
mov    %r15d,%r8d
movslq %esi,%r14
mov    0x0(%rbp,%r14,1),%al
cmp    $0x5c,%al
je     12a8 <string_replace_with_callback+0x128>
test   %al,%al
jne    12d0 <string_replace_with_callback+0x150>
jmp    15c8 <string_replace_with_callback+0x448>
mov    0x1(%r14,%rbp,1),%al
cmp    (%r12),%al
jne    12d0 <string_replace_with_callback+0x150>
add    $0x2,%esi
movslq %ebx,%rcx
mov    0x20(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    0x20(%rsp),%rcx
add    $0x1,%ebx
jmp    1293 <string_replace_with_callback+0x113>
nopl   0x0(%rax,%rax,1)
mov    %esi,%r13d
add    %rbp,%r14
mov    %r14,%rdi
mov    %r12,%rsi
mov    %r8d,%edx
mov    %r8d,%r15d
call   1040 <strncmp@plt>
test   %rax,%rax
jne    1276 <string_replace_with_callback+0xf6>
mov    %r13d,0x28(%rsp)
mov    %rbx,0x30(%rsp)
mov    0x70(%rsp),%rax
cmpb   $0x0,(%r14,%rax,1)
mov    0x80(%rsp),%r13
je     15a8 <string_replace_with_callback+0x428>
mov    %r14,%rbx
mov    0x70(%rsp),%rax
lea    (%r14,%rax,1),%r15
xor    %r14d,%r14d
mov    %r15,0x18(%rsp)
xor    %ebp,%ebp
jmp    1343 <string_replace_with_callback+0x1c3>
cs nopw 0x0(%rax,%rax,1)
add    $0x1,%r15
cmpb   $0x0,0x1(%r15)
lea    0x1(%r15),%r15
je     15a8 <string_replace_with_callback+0x428>
mov    %r15,%rdi
mov    %r13,%rsi
mov    0x40(%rsp),%edx
call   1040 <strncmp@plt>
test   %rax,%rax
je     1360 <string_replace_with_callback+0x1e0>
cmpb   $0x5c,(%r15)
je     136f <string_replace_with_callback+0x1ef>
jmp    137a <string_replace_with_callback+0x1fa>
nop
test   %r14d,%r14d
je     1397 <string_replace_with_callback+0x217>
add    $0xffffffff,%r14d
cmpb   $0x5c,(%r15)
jne    137a <string_replace_with_callback+0x1fa>
movzbl 0x1(%r15),%eax
cmp    (%r12),%al
je     1330 <string_replace_with_callback+0x1b0>
mov    %r15,%rdi
mov    %r12,%rsi
mov    0x14(%rsp),%edx
call   1040 <strncmp@plt>
test   %rax,%rax
jne    1334 <string_replace_with_callback+0x1b4>
add    $0x1,%ebp
add    $0x1,%r14d
jmp    1334 <string_replace_with_callback+0x1b4>
cmpb   $0x0,(%r15)
je     15a8 <string_replace_with_callback+0x428>
mov    %r15d,%esi
mov    0x18(%rsp),%rdi
sub    %edi,%esi
call   10a0 <string_strndup@plt>
test   %rax,%rax
jne    13e3 <string_replace_with_callback+0x263>
mov    0x28(%rsp),%esi
add    $0x1,%esi
mov    (%rbx),%al
mov    0x30(%rsp),%rbx
movslq %ebx,%rcx
mov    0x20(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    %rdx,%rcx
add    $0x1,%ebx
mov    0x50(%rsp),%rbp
mov    0x14(%rsp),%r8d
jmp    1293 <string_replace_with_callback+0x113>
test   %ebp,%ebp
jle    1489 <string_replace_with_callback+0x309>
cmpq   $0x0,0x48(%rsp)
mov    %rax,0x18(%rsp)
je     1433 <string_replace_with_callback+0x2b3>
mov    0x48(%rsp),%rax
mov    (%rax),%r14
mov    0x78(%rsp),%rbp
test   %r14,%r14
je     1433 <string_replace_with_callback+0x2b3>
mov    %r14,%rdi
call   1060 <strlen@plt>
mov    0x18(%rsp),%rdi
mov    %r14,%rsi
mov    %eax,%edx
call   1040 <strncmp@plt>
test   %rax,%rax
je     1496 <string_replace_with_callback+0x316>
mov    0x0(%rbp),%r14
add    $0x8,%rbp
test   %r14,%r14
jne    140a <string_replace_with_callback+0x28a>
movl   $0x0,0x44(%rsp)
lea    0x44(%rsp),%rax
mov    %rax,(%rsp)
mov    0x18(%rsp),%rdi
mov    %r12,%rsi
mov    %r13,%rdx
mov    0x48(%rsp),%rcx
mov    0x60(%rsp),%r8
mov    0x68(%rsp),%r9
call   1070 <string_replace_with_callback@plt>
mov    %rax,%r14
mov    0xc0(%rsp),%rbp
test   %rbp,%rbp
je     147a <string_replace_with_callback+0x2fa>
mov    0x44(%rsp),%eax
add    %eax,0x0(%rbp)
mov    0x18(%rsp),%rdi
call   1030 <free@plt>
mov    %r14,%rsi
jmp    14a3 <string_replace_with_callback+0x323>
mov    0xc0(%rsp),%rbp
mov    %rax,%rsi
jmp    14a3 <string_replace_with_callback+0x323>
mov    0x18(%rsp),%rsi
mov    0xc0(%rsp),%rbp
test   %rsi,%rsi
mov    %rsi,0x18(%rsp)
lea    0xb4e(%rip),%rax
cmove  %rax,%rsi
mov    0x68(%rsp),%rdi
call   *0x60(%rsp)
test   %rax,%rax
je     1523 <string_replace_with_callback+0x3a3>
mov    %rax,0x28(%rsp)
mov    %rax,%rdi
call   1060 <strlen@plt>
test   %eax,%eax
jle    154d <string_replace_with_callback+0x3cd>
mov    0x3c(%rsp),%esi
mov    %eax,0x5c(%rsp)
add    %eax,%esi
mov    0x20(%rsp),%rbp
mov    %rbp,%rdi
mov    %esi,0x3c(%rsp)
call   1090 <realloc@plt>
test   %rax,%rax
je     15d1 <string_replace_with_callback+0x451>
mov    %rax,%rbx
mov    0x30(%rsp),%rbp
movslq %ebp,%rdi
add    %rax,%rdi
mov    0x28(%rsp),%r14
mov    %r14,%rsi
call   1050 <strcpy@plt>
mov    0x5c(%rsp),%eax
add    %ebp,%eax
mov    %eax,%ebp
mov    %rbx,0x20(%rsp)
jmp    1557 <string_replace_with_callback+0x3d7>
mov    0x28(%rsp),%esi
add    $0x1,%esi
mov    0x30(%rsp),%rcx
lea    0x1(%rcx),%edx
mov    (%rbx),%al
movslq %ecx,%rcx
mov    0x20(%rsp),%rdi
mov    %al,(%rdi,%rcx,1)
mov    %rdi,%rcx
test   %rbp,%rbp
je     1573 <string_replace_with_callback+0x3f3>
addl   $0x1,0x0(%rbp)
jmp    1573 <string_replace_with_callback+0x3f3>
mov    0x30(%rsp),%rbp
mov    0x28(%rsp),%r14
sub    0x50(%rsp),%r15d
add    0x40(%rsp),%r15d
mov    %r14,%rdi
call   1030 <free@plt>
mov    %ebp,%edx
mov    %r15d,%esi
mov    0x20(%rsp),%rcx
mov    0x14(%rsp),%r8d
mov    0x18(%rsp),%rdi
test   %rdi,%rdi
je     1268 <string_replace_with_callback+0xe8>
mov    %rcx,%r15
mov    %r8d,%ebp
mov    %esi,%r14d
mov    %rdx,%rbx
call   1030 <free@plt>
mov    %rbx,%rdx
mov    %r14d,%esi
mov    %ebp,%r8d
mov    %r15,%rcx
jmp    1268 <string_replace_with_callback+0xe8>
movslq 0x30(%rsp),%rax
mov    0x20(%rsp),%rcx
movb   $0x0,(%rcx,%rax,1)
mov    0xc0(%rsp),%rax
test   %rax,%rax
je     15fe <string_replace_with_callback+0x47e>
addl   $0x1,(%rax)
jmp    15fe <string_replace_with_callback+0x47e>
movslq %ebx,%rax
movb   $0x0,(%rcx,%rax,1)
jmp    15fe <string_replace_with_callback+0x47e>
test   %rbp,%rbp
je     15e0 <string_replace_with_callback+0x460>
mov    0x20(%rsp),%rdi
call   1030 <free@plt>
cmpq   $0x0,0x18(%rsp)
je     15f2 <string_replace_with_callback+0x472>
mov    0x18(%rsp),%rdi
call   1030 <free@plt>
mov    0x28(%rsp),%rdi
call   1030 <free@plt>
xor    %ecx,%ecx
mov    %rcx,%rax
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [1 x i8] zeroinitializer
define i8* @string_replace_with_callback(i8* %0, i8* %1, i8* %2, i8** %3, i8* (i8*, i8*)* %4, i8* %5, i32* %6) {
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i8*
%12 = alloca i8**
%13 = alloca i8* (i8*, i8*)*
%14 = alloca i8*
%15 = alloca i32*
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca i32
%23 = alloca i32
%24 = alloca i32
%25 = alloca i32
%26 = alloca i32
%27 = alloca i8*
%28 = alloca i8*
%29 = alloca i8*
%30 = alloca i8*
%31 = alloca i8*
%32 = alloca i8*
store i8* %0, i8** %9
store i8* %1, i8** %10
store i8* %2, i8** %11
store i8** %3, i8*** %12
store i8* (i8*, i8*)* %4, i8* (i8*, i8*)** %13
store i8* %5, i8** %14
store i32* %6, i32** %15
%33 = load i32*, i32** %15
%34 = icmp ne i32* %33, null
br i1 %34, label %35, label %37
35: ; preds = %7
%36 = load i32*, i32** %15
store i32 0, i32* %36
br label %37
37: ; preds = %35, %7
%38 = load i8*, i8** %9
%39 = icmp ne i8* %38, null
br i1 %39, label %40, label %59
40: ; preds = %37
%41 = load i8*, i8** %10
%42 = icmp ne i8* %41, null
br i1 %42, label %43, label %59
43: ; preds = %40
%44 = load i8*, i8** %10
%45 = getelementptr inbounds i8, i8* %44, i64 0
%46 = load i8, i8* %45
%47 = icmp ne i8 %46, 0
br i1 %47, label %48, label %59
48: ; preds = %43
%49 = load i8*, i8** %11
%50 = icmp ne i8* %49, null
br i1 %50, label %51, label %59
51: ; preds = %48
%52 = load i8*, i8** %11
%53 = getelementptr inbounds i8, i8* %52, i64 0
%54 = load i8, i8* %53
%55 = icmp ne i8 %54, 0
br i1 %55, label %56, label %59
56: ; preds = %51
%57 = load i8* (i8*, i8*)*, i8* (i8*, i8*)** %13
%58 = icmp ne i8* (i8*, i8*)* %57, null
br i1 %58, label %60, label %59
59: ; preds = %56, %51, %48, %43, %40, %37
store i8* null, i8** %8
br label %408
60: ; preds = %56
%61 = load i8*, i8** %10
%62 = call i32 @strlen(i8* %61)
store i32 %62, i32* %16
%63 = load i8*, i8** %11
%64 = call i32 @strlen(i8* %63)
store i32 %64, i32* %17
%65 = load i8*, i8** %9
%66 = call i32 @strlen(i8* %65)
%67 = add nsw i32 %66, 1
store i32 %67, i32* %18
%68 = load i32, i32* %18
%69 = call i8* @malloc(i32 %68)
store i8* %69, i8** %27
%70 = load i8*, i8** %27
%71 = icmp ne i8* %70, null
br i1 %71, label %72, label %406
72: ; preds = %60
store i32 0, i32* %20
store i32 0, i32* %21
br label %73
73: ; preds = %400, %72
%74 = load i8*, i8** %9
%75 = load i32, i32* %20
%76 = sext i32 %75 to i64
%77 = getelementptr inbounds i8, i8* %74, i64 %76
%78 = load i8, i8* %77
%79 = icmp ne i8 %78, 0
br i1 %79, label %80, label %401
80: ; preds = %73
%81 = load i8*, i8** %9
%82 = load i32, i32* %20
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds i8, i8* %81, i64 %83
%85 = load i8, i8* %84
%86 = sext i8 %85 to i32
%87 = icmp eq i32 %86, 92
br i1 %87, label %88, label %115
88: ; preds = %80
%89 = load i8*, i8** %9
%90 = load i32, i32* %20
%91 = add nsw i32 %90, 1
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds i8, i8* %89, i64 %92
%94 = load i8, i8* %93
%95 = sext i8 %94 to i32
%96 = load i8*, i8** %10
%97 = getelementptr inbounds i8, i8* %96, i64 0
%98 = load i8, i8* %97
%99 = sext i8 %98 to i32
%100 = icmp eq i32 %95, %99
br i1 %100, label %101, label %115
101: ; preds = %88
%102 = load i32, i32* %20
%103 = add nsw i32 %102, 1
store i32 %103, i32* %20
%104 = load i8*, i8** %9
%105 = load i32, i32* %20
%106 = add nsw i32 %105, 1
store i32 %106, i32* %20
%107 = sext i32 %105 to i64
%108 = getelementptr inbounds i8, i8* %104, i64 %107
%109 = load i8, i8* %108
%110 = load i8*, i8** %27
%111 = load i32, i32* %21
%112 = add nsw i32 %111, 1
store i32 %112, i32* %21
%113 = sext i32 %111 to i64
%114 = getelementptr inbounds i8, i8* %110, i64 %113
store i8 %109, i8* %114
br label %400
115: ; preds = %88, %80
%116 = load i8*, i8** %9
%117 = load i32, i32* %20
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i8, i8* %116, i64 %118
%120 = load i8*, i8** %10
%121 = load i32, i32* %16
%122 = call i64 @strncmp(i8* %119, i8* %120, i32 %121)
%123 = icmp eq i64 %122, 0
br i1 %123, label %124, label %387
124: ; preds = %115
store i32 0, i32* %22
store i32 0, i32* %23
%125 = load i8*, i8** %9
%126 = load i32, i32* %20
%127 = sext i32 %126 to i64
%128 = getelementptr inbounds i8, i8* %125, i64 %127
%129 = load i32, i32* %16
%130 = sext i32 %129 to i64
%131 = getelementptr inbounds i8, i8* %128, i64 %130
store i8* %131, i8** %32
br label %132
132: ; preds = %181, %124
%133 = load i8*, i8** %32
%134 = getelementptr inbounds i8, i8* %133, i64 0
%135 = load i8, i8* %134
%136 = icmp ne i8 %135, 0
br i1 %136, label %137, label %184
137: ; preds = %132
%138 = load i8*, i8** %32
%139 = load i8*, i8** %11
%140 = load i32, i32* %17
%141 = call i64 @strncmp(i8* %138, i8* %139, i32 %140)
%142 = icmp eq i64 %141, 0
br i1 %142, label %143, label %150
143: ; preds = %137
%144 = load i32, i32* %23
%145 = icmp eq i32 %144, 0
br i1 %145, label %146, label %147
146: ; preds = %143
br label %184
147: ; preds = %143
%148 = load i32, i32* %23
%149 = add nsw i32 %148, -1
store i32 %149, i32* %23
br label %150
150: ; preds = %147, %137
%151 = load i8*, i8** %32
%152 = getelementptr inbounds i8, i8* %151, i64 0
%153 = load i8, i8* %152
%154 = sext i8 %153 to i32
%155 = icmp eq i32 %154, 92
br i1 %155, label %156, label %169
156: ; preds = %150
%157 = load i8*, i8** %32
%158 = getelementptr inbounds i8, i8* %157, i64 1
%159 = load i8, i8* %158
%160 = sext i8 %159 to i32
%161 = load i8*, i8** %10
%162 = getelementptr inbounds i8, i8* %161, i64 0
%163 = load i8, i8* %162
%164 = sext i8 %163 to i32
%165 = icmp eq i32 %160, %164
br i1 %165, label %166, label %169
166: ; preds = %156
%167 = load i8*, i8** %32
%168 = getelementptr inbounds i8, i8* %167, i32 1
store i8* %168, i8** %32
br label %181
169: ; preds = %156, %150
%170 = load i8*, i8** %32
%171 = load i8*, i8** %10
%172 = load i32, i32* %16
%173 = call i64 @strncmp(i8* %170, i8* %171, i32 %172)
%174 = icmp eq i64 %173, 0
br i1 %174, label %175, label %180
175: ; preds = %169
%176 = load i32, i32* %22
%177 = add nsw i32 %176, 1
store i32 %177, i32* %22
%178 = load i32, i32* %23
%179 = add nsw i32 %178, 1
store i32 %179, i32* %23
br label %180
180: ; preds = %175, %169
br label %181
181: ; preds = %180, %166
%182 = load i8*, i8** %32
%183 = getelementptr inbounds i8, i8* %182, i32 1
store i8* %183, i8** %32
br label %132
184: ; preds = %146, %132
%185 = load i8*, i8** %32
%186 = getelementptr inbounds i8, i8* %185, i64 0
%187 = load i8, i8* %186
%188 = icmp ne i8 %187, 0
br i1 %188, label %202, label %189
189: ; preds = %184
%190 = load i8*, i8** %27
%191 = load i32, i32* %21
%192 = sext i32 %191 to i64
%193 = getelementptr inbounds i8, i8* %190, i64 %192
store i8 0, i8* %193
%194 = load i32*, i32** %15
%195 = icmp ne i32* %194, null
br i1 %195, label %196, label %200
196: ; preds = %189
%197 = load i32*, i32** %15
%198 = load i32, i32* %197
%199 = add nsw i32 %198, 1
store i32 %199, i32* %197
br label %200
200: ; preds = %196, %189
%201 = load i8*, i8** %27
store i8* %201, i8** %8
br label %408
202: ; preds = %184
%203 = load i8*, i8** %9
%204 = load i32, i32* %20
%205 = sext i32 %204 to i64
%206 = getelementptr inbounds i8, i8* %203, i64 %205
%207 = load i32, i32* %16
%208 = sext i32 %207 to i64
%209 = getelementptr inbounds i8, i8* %206, i64 %208
%210 = load i8*, i8** %32
%211 = load i8*, i8** %9
%212 = load i32, i32* %20
%213 = sext i32 %212 to i64
%214 = getelementptr inbounds i8, i8* %211, i64 %213
%215 = load i32, i32* %16
%216 = sext i32 %215 to i64
%217 = getelementptr inbounds i8, i8* %214, i64 %216
%218 = ptrtoint i8* %210 to i64
%219 = ptrtoint i8* %217 to i64
%220 = sub i64 %218, %219
%221 = trunc i64 %220 to i32
%222 = call i8* @string_strndup(i8* %209, i32 %221)
store i8* %222, i8** %29
%223 = load i8*, i8** %29
%224 = icmp ne i8* %223, null
br i1 %224, label %225, label %374
225: ; preds = %202
%226 = load i32, i32* %22
%227 = icmp sgt i32 %226, 0
br i1 %227, label %228, label %283
228: ; preds = %225
store i32 1, i32* %25
%229 = load i8**, i8*** %12
%230 = icmp ne i8** %229, null
br i1 %230, label %231, label %260
231: ; preds = %228
store i32 0, i32* %26
br label %232
232: ; preds = %256, %231
%233 = load i8**, i8*** %12
%234 = load i32, i32* %26
%235 = sext i32 %234 to i64
%236 = getelementptr inbounds i8*, i8** %233, i64 %235
%237 = load i8*, i8** %236
%238 = icmp ne i8* %237, null
br i1 %238, label %239, label %259
239: ; preds = %232
%240 = load i8*, i8** %29
%241 = load i8**, i8*** %12
%242 = load i32, i32* %26
%243 = sext i32 %242 to i64
%244 = getelementptr inbounds i8*, i8** %241, i64 %243
%245 = load i8*, i8** %244
%246 = load i8**, i8*** %12
%247 = load i32, i32* %26
%248 = sext i32 %247 to i64
%249 = getelementptr inbounds i8*, i8** %246, i64 %248
%250 = load i8*, i8** %249
%251 = call i32 @strlen(i8* %250)
%252 = call i64 @strncmp(i8* %240, i8* %245, i32 %251)
%253 = icmp eq i64 %252, 0
br i1 %253, label %254, label %255
254: ; preds = %239
store i32 0, i32* %25
br label %259
255: ; preds = %239
br label %256
256: ; preds = %255
%257 = load i32, i32* %26
%258 = add nsw i32 %257, 1
store i32 %258, i32* %26
br label %232
259: ; preds = %254, %232
br label %260
260: ; preds = %259, %228
%261 = load i32, i32* %25
%262 = icmp ne i32 %261, 0
br i1 %262, label %263, label %282
263: ; preds = %260
store i32 0, i32* %24
%264 = load i8*, i8** %29
%265 = load i8*, i8** %10
%266 = load i8*, i8** %11
%267 = load i8**, i8*** %12
%268 = load i8* (i8*, i8*)*, i8* (i8*, i8*)** %13
%269 = load i8*, i8** %14
%270 = call i8* @string_replace_with_callback(i8* %264, i8* %265, i8* %266, i8** %267, i8* (i8*, i8*)* %268, i8* %269, i32* %24)
store i8* %270, i8** %30
%271 = load i32*, i32** %15
%272 = icmp ne i32* %271, null
br i1 %272, label %273, label %278
273: ; preds = %263
%274 = load i32, i32* %24
%275 = load i32*, i32** %15
%276 = load i32, i32* %275
%277 = add nsw i32 %276, %274
store i32 %277, i32* %275
br label %278
278: ; preds = %273, %263
%279 = load i8*, i8** %29
%280 = call i32 @free(i8* %279)
%281 = load i8*, i8** %30
store i8* %281, i8** %29
br label %282
282: ; preds = %278, %260
br label %283
283: ; preds = %282, %225
%284 = load i8* (i8*, i8*)*, i8* (i8*, i8*)** %13
%285 = load i8*, i8** %14
%286 = load i8*, i8** %29
%287 = icmp ne i8* %286, null
br i1 %287, label %288, label %290
288: ; preds = %283
%289 = load i8*, i8** %29
br label %291
290: ; preds = %283
br label %291
291: ; preds = %290, %288
%292 = phi i8* [ %289, %288 ], [ getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0), %290 ]
%293 = call i8* %284(i8* %285, i8* %292)
store i8* %293, i8** %31
%294 = load i8*, i8** %31
%295 = icmp ne i8* %294, null
br i1 %295, label %296, label %348
296: ; preds = %291
%297 = load i8*, i8** %31
%298 = call i32 @strlen(i8* %297)
store i32 %298, i32* %19
%299 = load i32, i32* %19
%300 = icmp sgt i32 %299, 0
br i1 %300, label %301, label %336
301: ; preds = %296
%302 = load i32, i32* %19
%303 = load i32, i32* %18
%304 = add nsw i32 %303, %302
store i32 %304, i32* %18
%305 = load i8*, i8** %27
%306 = load i32, i32* %18
%307 = call i8* @realloc(i8* %305, i32 %306)
store i8* %307, i8** %28
%308 = load i8*, i8** %28
%309 = icmp ne i8* %308, null
br i1 %309, label %325, label %310
310: ; preds = %301
%311 = load i8*, i8** %27
%312 = icmp ne i8* %311, null
br i1 %312, label %313, label %316
313: ; preds = %310
%314 = load i8*, i8** %27
%315 = call i32 @free(i8* %314)
br label %316
316: ; preds = %313, %310
%317 = load i8*, i8** %29
%318 = icmp ne i8* %317, null
br i1 %318, label %319, label %322
319: ; preds = %316
%320 = load i8*, i8** %29
%321 = call i32 @free(i8* %320)
br label %322
322: ; preds = %319, %316
%323 = load i8*, i8** %31
%324 = call i32 @free(i8* %323)
store i8* null, i8** %8
br label %408
325: ; preds = %301
%326 = load i8*, i8** %28
store i8* %326, i8** %27
%327 = load i8*, i8** %27
%328 = load i32, i32* %21
%329 = sext i32 %328 to i64
%330 = getelementptr inbounds i8, i8* %327, i64 %329
%331 = load i8*, i8** %31
%332 = call i32 @strcpy(i8* %330, i8* %331)
%333 = load i32, i32* %19
%334 = load i32, i32* %21
%335 = add nsw i32 %334, %333
store i32 %335, i32* %21
br label %336
336: ; preds = %325, %296
%337 = load i8*, i8** %32
%338 = load i8*, i8** %9
%339 = ptrtoint i8* %337 to i64
%340 = ptrtoint i8* %338 to i64
%341 = sub i64 %339, %340
%342 = load i32, i32* %17
%343 = sext i32 %342 to i64
%344 = add nsw i64 %341, %343
%345 = trunc i64 %344 to i32
store i32 %345, i32* %20
%346 = load i8*, i8** %31
%347 = call i32 @free(i8* %346)
br label %367
348: ; preds = %291
%349 = load i8*, i8** %9
%350 = load i32, i32* %20
%351 = add nsw i32 %350, 1
store i32 %351, i32* %20
%352 = sext i32 %350 to i64
%353 = getelementptr inbounds i8, i8* %349, i64 %352
%354 = load i8, i8* %353
%355 = load i8*, i8** %27
%356 = load i32, i32* %21
%357 = add nsw i32 %356, 1
store i32 %357, i32* %21
%358 = sext i32 %356 to i64
%359 = getelementptr inbounds i8, i8* %355, i64 %358
store i8 %354, i8* %359
%360 = load i32*, i32** %15
%361 = icmp ne i32* %360, null
br i1 %361, label %362, label %366
362: ; preds = %348
%363 = load i32*, i32** %15
%364 = load i32, i32* %363
%365 = add nsw i32 %364, 1
store i32 %365, i32* %363
br label %366
366: ; preds = %362, %348
br label %367
367: ; preds = %366, %336
%368 = load i8*, i8** %29
%369 = icmp ne i8* %368, null
br i1 %369, label %370, label %373
370: ; preds = %367
%371 = load i8*, i8** %29
%372 = call i32 @free(i8* %371)
br label %373
373: ; preds = %370, %367
br label %386
374: ; preds = %202
%375 = load i8*, i8** %9
%376 = load i32, i32* %20
%377 = add nsw i32 %376, 1
store i32 %377, i32* %20
%378 = sext i32 %376 to i64
%379 = getelementptr inbounds i8, i8* %375, i64 %378
%380 = load i8, i8* %379
%381 = load i8*, i8** %27
%382 = load i32, i32* %21
%383 = add nsw i32 %382, 1
store i32 %383, i32* %21
%384 = sext i32 %382 to i64
%385 = getelementptr inbounds i8, i8* %381, i64 %384
store i8 %380, i8* %385
br label %386
386: ; preds = %374, %373
br label %399
387: ; preds = %115
%388 = load i8*, i8** %9
%389 = load i32, i32* %20
%390 = add nsw i32 %389, 1
store i32 %390, i32* %20
%391 = sext i32 %389 to i64
%392 = getelementptr inbounds i8, i8* %388, i64 %391
%393 = load i8, i8* %392
%394 = load i8*, i8** %27
%395 = load i32, i32* %21
%396 = add nsw i32 %395, 1
store i32 %396, i32* %21
%397 = sext i32 %395 to i64
%398 = getelementptr inbounds i8, i8* %394, i64 %397
store i8 %393, i8* %398
br label %399
399: ; preds = %387, %386
br label %400
400: ; preds = %399, %101
br label %73
401: ; preds = %73
%402 = load i8*, i8** %27
%403 = load i32, i32* %21
%404 = sext i32 %403 to i64
%405 = getelementptr inbounds i8, i8* %402, i64 %404
store i8 0, i8* %405
br label %406
406: ; preds = %401, %60
%407 = load i8*, i8** %27
store i8* %407, i8** %8
br label %408
408: ; preds = %406, %322, %200, %59
%409 = load i8*, i8** %8
ret i8* %409
}

LLVM IR (-O2):
@.str = [1 x i8] zeroinitializer
define i8* @string_replace_with_callback(i8* %0, i8* %1, i8* %2, i8** %3, i8* (i8*, i8*)* %4, i8* %5, i32* %6) {
%8 = alloca i32
%9 = bitcast i32* %8 to i8*
%10 = icmp eq i32* %6, null
br i1 %10, label %12, label %11
11: ; preds = %7
store i32 0, i32* %6
br label %12
12: ; preds = %11, %7
%13 = icmp ne i8* %0, null
%14 = icmp ne i8* %1, null
%15 = and i1 %13, %14
br i1 %15, label %16, label %208
16: ; preds = %12
%17 = load i8, i8* %1
%18 = icmp ne i8 %17, 0
%19 = icmp ne i8* %2, null
%20 = and i1 %19, %18
br i1 %20, label %21, label %208
21: ; preds = %16
%22 = load i8, i8* %2
%23 = icmp ne i8 %22, 0
%24 = icmp ne i8* (i8*, i8*)* %4, null
%25 = and i1 %24, %23
br i1 %25, label %26, label %208
26: ; preds = %21
%27 = tail call i32 @strlen(i8* %1)
%28 = tail call i32 @strlen(i8* %2)
%29 = tail call i32 @strlen(i8* %0)
%30 = add nsw i32 %29, 1
%31 = tail call i8* @malloc(i32 %30)
%32 = icmp eq i8* %31, null
br i1 %32, label %208, label %33
33: ; preds = %26
%34 = sext i32 %27 to i64
%35 = icmp eq i8** %3, null
%36 = ptrtoint i8* %0 to i64
br label %37
37: ; preds = %191, %33
%38 = phi i32 [ 0, %33 ], [ %185, %191 ]
%39 = phi i8* [ %31, %33 ], [ %186, %191 ]
%40 = phi i32 [ 0, %33 ], [ %187, %191 ]
%41 = phi i32 [ %30, %33 ], [ %188, %191 ]
br label %42
42: ; preds = %202, %37
%43 = phi i32 [ %38, %37 ], [ %204, %202 ]
%44 = phi i32 [ %40, %37 ], [ %203, %202 ]
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds i8, i8* %0, i64 %45
%47 = load i8, i8* %46
switch i8 %47, label %59 [
i8 0, label %205
i8 92, label %48
]
48: ; preds = %42
%49 = add nsw i32 %44, 1
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8, i8* %0, i64 %50
%52 = load i8, i8* %51
%53 = load i8, i8* %1
%54 = icmp eq i8 %52, %53
br i1 %54, label %55, label %59
55: ; preds = %48
%56 = add nsw i32 %44, 2
%57 = sext i32 %43 to i64
%58 = getelementptr inbounds i8, i8* %39, i64 %57
store i8 %52, i8* %58
br label %202
59: ; preds = %42, %48
%60 = call i64 @strncmp(i8* %46, i8* %1, i32 %27)
%61 = icmp eq i64 %60, 0
br i1 %61, label %62, label %197
62: ; preds = %59
%63 = getelementptr inbounds i8, i8* %46, i64 %34
%64 = load i8, i8* %63
%65 = icmp eq i8 %64, 0
br i1 %65, label %101, label %66
66: ; preds = %62, %91
%67 = phi i8* [ %95, %91 ], [ %63, %62 ]
%68 = phi i32 [ %93, %91 ], [ 0, %62 ]
%69 = phi i32 [ %92, %91 ], [ 0, %62 ]
%70 = call i64 @strncmp(i8* %67, i8* %2, i32 %28)
%71 = icmp eq i64 %70, 0
br i1 %71, label %72, label %76
72: ; preds = %66
%73 = icmp eq i32 %68, 0
br i1 %73, label %98, label %74
74: ; preds = %72
%75 = add nsw i32 %68, -1
br label %76
76: ; preds = %74, %66
%77 = phi i32 [ %75, %74 ], [ %68, %66 ]
%78 = load i8, i8* %67
%79 = icmp eq i8 %78, 92
br i1 %79, label %80, label %85
80: ; preds = %76
%81 = getelementptr inbounds i8, i8* %67, i64 1
%82 = load i8, i8* %81
%83 = load i8, i8* %1
%84 = icmp eq i8 %82, %83
br i1 %84, label %91, label %85
85: ; preds = %80, %76
%86 = call i64 @strncmp(i8* %67, i8* %1, i32 %27)
%87 = icmp eq i64 %86, 0
br i1 %87, label %88, label %91
88: ; preds = %85
%89 = add nsw i32 %69, 1
%90 = add nsw i32 %77, 1
br label %91
91: ; preds = %80, %85, %88
%92 = phi i32 [ %89, %88 ], [ %69, %85 ], [ %69, %80 ]
%93 = phi i32 [ %90, %88 ], [ %77, %85 ], [ %77, %80 ]
%94 = phi i8* [ %67, %88 ], [ %67, %85 ], [ %81, %80 ]
%95 = getelementptr inbounds i8, i8* %94, i64 1
%96 = load i8, i8* %95
%97 = icmp eq i8 %96, 0
br i1 %97, label %101, label %66
98: ; preds = %72
%99 = load i8, i8* %67
%100 = icmp eq i8 %99, 0
br i1 %100, label %101, label %107
101: ; preds = %98, %62, %91
%102 = sext i32 %43 to i64
%103 = getelementptr inbounds i8, i8* %39, i64 %102
store i8 0, i8* %103
br i1 %10, label %208, label %104
104: ; preds = %101
%105 = load i32, i32* %6
%106 = add nsw i32 %105, 1
store i32 %106, i32* %6
br label %208
107: ; preds = %98
%108 = ptrtoint i8* %67 to i64
%109 = ptrtoint i8* %63 to i64
%110 = sub i64 %108, %109
%111 = trunc i64 %110 to i32
%112 = call i8* @string_strndup(i8* %63, i32 %111)
%113 = icmp eq i8* %112, null
br i1 %113, label %192, label %114
114: ; preds = %107
%115 = ptrtoint i8* %67 to i64
%116 = icmp sgt i32 %69, 0
br i1 %116, label %117, label %140
117: ; preds = %114
br i1 %35, label %132, label %118
118: ; preds = %117
%119 = load i8*, i8** %3
%120 = icmp eq i8* %119, null
br i1 %120, label %132, label %125
121: ; preds = %125
%122 = getelementptr inbounds i8*, i8** %3, i64 %131
%123 = load i8*, i8** %122
%124 = icmp eq i8* %123, null
br i1 %124, label %132, label %125
125: ; preds = %118, %121
%126 = phi i64 [ %131, %121 ], [ 0, %118 ]
%127 = phi i8* [ %123, %121 ], [ %119, %118 ]
%128 = call i32 @strlen(i8* %127)
%129 = call i64 @strncmp(i8* %112, i8* %127, i32 %128)
%130 = icmp eq i64 %129, 0
%131 = add nuw i64 %126, 1
br i1 %130, label %140, label %121
132: ; preds = %121, %118, %117
store i32 0, i32* %8
%133 = call i8* @string_replace_with_callback(i8* %112, i8* %1, i8* %2, i8** %3, i8* (i8*, i8*)* %4, i8* %5, i32* %8)
br i1 %10, label %138, label %134
134: ; preds = %132
%135 = load i32, i32* %8
%136 = load i32, i32* %6
%137 = add nsw i32 %136, %135
store i32 %137, i32* %6
br label %138
138: ; preds = %134, %132
%139 = call i32 @free(i8* %112)
br label %140
140: ; preds = %125, %138, %114
%141 = phi i8* [ %133, %138 ], [ %112, %114 ], [ %112, %125 ]
%142 = icmp eq i8* %141, null
%143 = select i1 %142, i8* getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0), i8* %141
%144 = call i8* %4(i8* %5, i8* %143)
%145 = icmp eq i8* %144, null
br i1 %145, label %175, label %146
146: ; preds = %140
%147 = call i32 @strlen(i8* %144)
%148 = icmp sgt i32 %147, 0
br i1 %148, label %149, label %167
149: ; preds = %146
%150 = add nsw i32 %147, %41
%151 = call i8* @realloc(i8* %39, i32 %150)
%152 = icmp eq i8* %151, null
br i1 %152, label %153, label %162
153: ; preds = %149
%154 = icmp eq i8* %39, null
br i1 %154, label %157, label %155
155: ; preds = %153
%156 = call i32 @free(i8* %39)
br label %157
157: ; preds = %155, %153
br i1 %142, label %160, label %158
158: ; preds = %157
%159 = call i32 @free(i8* %141)
br label %160
160: ; preds = %158, %157
%161 = call i32 @free(i8* %144)
br label %208
162: ; preds = %149
%163 = sext i32 %43 to i64
%164 = getelementptr inbounds i8, i8* %151, i64 %163
%165 = call i32 @strcpy(i8* %164, i8* %144)
%166 = add nsw i32 %147, %43
br label %167
167: ; preds = %162, %146
%168 = phi i32 [ %166, %162 ], [ %43, %146 ]
%169 = phi i8* [ %151, %162 ], [ %39, %146 ]
%170 = phi i32 [ %150, %162 ], [ %41, %146 ]
%171 = sub i64 %115, %36
%172 = trunc i64 %171 to i32
%173 = add i32 %28, %172
%174 = call i32 @free(i8* %144)
br label %184
175: ; preds = %140
%176 = add nsw i32 %44, 1
%177 = load i8, i8* %46
%178 = add nsw i32 %43, 1
%179 = sext i32 %43 to i64
%180 = getelementptr inbounds i8, i8* %39, i64 %179
store i8 %177, i8* %180
br i1 %10, label %184, label %181
181: ; preds = %175
%182 = load i32, i32* %6
%183 = add nsw i32 %182, 1
store i32 %183, i32* %6
br label %184
184: ; preds = %175, %181, %167
%185 = phi i32 [ %168, %167 ], [ %178, %181 ], [ %178, %175 ]
%186 = phi i8* [ %169, %167 ], [ %39, %181 ], [ %39, %175 ]
%187 = phi i32 [ %173, %167 ], [ %176, %181 ], [ %176, %175 ]
%188 = phi i32 [ %170, %167 ], [ %41, %181 ], [ %41, %175 ]
br i1 %142, label %191, label %189
189: ; preds = %184
%190 = call i32 @free(i8* %141)
br label %191
191: ; preds = %189, %184
br label %37
192: ; preds = %107
%193 = add nsw i32 %44, 1
%194 = load i8, i8* %46
%195 = sext i32 %43 to i64
%196 = getelementptr inbounds i8, i8* %39, i64 %195
store i8 %194, i8* %196
br label %202
197: ; preds = %59
%198 = add nsw i32 %44, 1
%199 = load i8, i8* %46
%200 = sext i32 %43 to i64
%201 = getelementptr inbounds i8, i8* %39, i64 %200
store i8 %199, i8* %201
br label %202
202: ; preds = %197, %192, %55
%203 = phi i32 [ %56, %55 ], [ %193, %192 ], [ %198, %197 ]
%204 = add nsw i32 %43, 1
br label %42
205: ; preds = %42
%206 = sext i32 %43 to i64
%207 = getelementptr inbounds i8, i8* %39, i64 %206
store i8 0, i8* %207
br label %208
208: ; preds = %26, %205, %101, %104, %12, %16, %21, %160
%209 = phi i8* [ null, %160 ], [ null, %21 ], [ null, %16 ], [ null, %12 ], [ %39, %104 ], [ %39, %101 ], [ %39, %205 ], [ null, %26 ]
ret i8* %209
}