#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,
                                   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;
  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) {
            sub_errors = 0;
            key2 = string_replace_with_callback(key, prefix, suffix, 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    $0xb0,%rsp
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,-0x38(%rbp)
je     11b8 <string_replace_with_callback+0x38>
mov    -0x38(%rbp),%rax
movl   $0x0,(%rax)
cmpq   $0x0,-0x10(%rbp)
je     11fe <string_replace_with_callback+0x7e>
cmpq   $0x0,-0x18(%rbp)
je     11fe <string_replace_with_callback+0x7e>
mov    -0x18(%rbp),%rax
cmpb   $0x0,(%rax)
je     11fe <string_replace_with_callback+0x7e>
cmpq   $0x0,-0x20(%rbp)
je     11fe <string_replace_with_callback+0x7e>
mov    -0x20(%rbp),%rax
cmpb   $0x0,(%rax)
je     11fe <string_replace_with_callback+0x7e>
cmpq   $0x0,-0x28(%rbp)
jne    120b <string_replace_with_callback+0x8b>
movq   $0x0,-0x8(%rbp)
jmp    16e2 <string_replace_with_callback+0x562>
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,-0x68(%rbp)
cmpq   $0x0,-0x68(%rbp)
je     16da <string_replace_with_callback+0x55a>
movl   $0x0,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     16ce <string_replace_with_callback+0x54e>
mov    -0x10(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x5c,%eax
jne    12d6 <string_replace_with_callback+0x156>
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    12d6 <string_replace_with_callback+0x156>
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    -0x68(%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    16c9 <string_replace_with_callback+0x549>
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    169a <string_replace_with_callback+0x51a>
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,-0x90(%rbp)
mov    -0x90(%rbp),%rax
cmpb   $0x0,(%rax)
je     13f2 <string_replace_with_callback+0x272>
mov    -0x90(%rbp),%rdi
mov    -0x20(%rbp),%rsi
mov    -0x40(%rbp),%edx
call   1040 <strncmp@plt>
cmp    $0x0,%rax
jne    1363 <string_replace_with_callback+0x1e3>
cmpl   $0x0,-0x58(%rbp)
jne    135a <string_replace_with_callback+0x1da>
jmp    13f2 <string_replace_with_callback+0x272>
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
mov    -0x90(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x5c,%eax
jne    13a7 <string_replace_with_callback+0x227>
mov    -0x90(%rbp),%rax
movsbl 0x1(%rax),%eax
mov    -0x18(%rbp),%rcx
movsbl (%rcx),%ecx
cmp    %ecx,%eax
jne    13a7 <string_replace_with_callback+0x227>
mov    -0x90(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x90(%rbp)
jmp    13db <string_replace_with_callback+0x25b>
mov    -0x90(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x3c(%rbp),%edx
call   1040 <strncmp@plt>
cmp    $0x0,%rax
jne    13d6 <string_replace_with_callback+0x256>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    13db <string_replace_with_callback+0x25b>
mov    -0x90(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x90(%rbp)
jmp    131e <string_replace_with_callback+0x19e>
mov    -0x90(%rbp),%rax
cmpb   $0x0,(%rax)
jne    1431 <string_replace_with_callback+0x2b1>
mov    -0x68(%rbp),%rax
movslq -0x50(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
cmpq   $0x0,-0x38(%rbp)
je     1424 <string_replace_with_callback+0x2a4>
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
mov    -0x68(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    16e2 <string_replace_with_callback+0x562>
mov    -0x10(%rbp),%rdi
movslq -0x4c(%rbp),%rax
add    %rax,%rdi
movslq -0x3c(%rbp),%rax
add    %rax,%rdi
mov    -0x90(%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,-0x78(%rbp)
cmpq   $0x0,-0x78(%rbp)
je     166b <string_replace_with_callback+0x4eb>
cmpl   $0x0,-0x54(%rbp)
jle    14ce <string_replace_with_callback+0x34e>
movl   $0x0,-0x5c(%rbp)
mov    -0x78(%rbp),%rdi
mov    -0x18(%rbp),%rsi
mov    -0x20(%rbp),%rdx
mov    -0x28(%rbp),%rcx
mov    -0x30(%rbp),%r8
lea    -0x5c(%rbp),%r9
call   1070 <string_replace_with_callback@plt>
mov    %rax,-0x80(%rbp)
cmpq   $0x0,-0x38(%rbp)
je     14bd <string_replace_with_callback+0x33d>
mov    -0x5c(%rbp),%ecx
mov    -0x38(%rbp),%rax
add    (%rax),%ecx
mov    %ecx,(%rax)
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
mov    -0x80(%rbp),%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0xa0(%rbp)
mov    -0x30(%rbp),%rax
mov    %rax,-0x98(%rbp)
cmpq   $0x0,-0x78(%rbp)
je     14ff <string_replace_with_callback+0x37f>
mov    -0x78(%rbp),%rax
mov    %rax,-0xa8(%rbp)
jmp    1512 <string_replace_with_callback+0x392>
lea    0xafa(%rip),%rax
mov    %rax,-0xa8(%rbp)
jmp    1512 <string_replace_with_callback+0x392>
mov    -0xa0(%rbp),%rax
mov    -0x98(%rbp),%rdi
mov    -0xa8(%rbp),%rsi
call   *%rax
mov    %rax,-0x88(%rbp)
cmpq   $0x0,-0x88(%rbp)
je     160d <string_replace_with_callback+0x48d>
mov    -0x88(%rbp),%rdi
call   1060 <strlen@plt>
mov    %eax,-0x48(%rbp)
cmpl   $0x0,-0x48(%rbp)
jle    15e4 <string_replace_with_callback+0x464>
mov    -0x48(%rbp),%eax
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x68(%rbp),%rdi
mov    -0x44(%rbp),%esi
call   1090 <realloc@plt>
mov    %rax,-0x70(%rbp)
cmpq   $0x0,-0x70(%rbp)
jne    15bc <string_replace_with_callback+0x43c>
cmpq   $0x0,-0x68(%rbp)
je     158f <string_replace_with_callback+0x40f>
mov    -0x68(%rbp),%rdi
call   1030 <free@plt>
cmpq   $0x0,-0x78(%rbp)
je     15a3 <string_replace_with_callback+0x423>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
mov    -0x88(%rbp),%rdi
call   1030 <free@plt>
movq   $0x0,-0x8(%rbp)
jmp    16e2 <string_replace_with_callback+0x562>
mov    -0x70(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x68(%rbp),%rdi
movslq -0x50(%rbp),%rax
add    %rax,%rdi
mov    -0x88(%rbp),%rsi
call   1050 <strcpy@plt>
mov    -0x48(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x90(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    %rcx,%rax
movslq -0x40(%rbp),%rcx
add    %rcx,%rax
mov    %eax,-0x4c(%rbp)
mov    -0x88(%rbp),%rdi
call   1030 <free@plt>
jmp    1652 <string_replace_with_callback+0x4d2>
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    -0x68(%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,-0x38(%rbp)
je     164d <string_replace_with_callback+0x4cd>
mov    -0x38(%rbp),%rax
mov    (%rax),%ecx
add    $0x1,%ecx
mov    %ecx,(%rax)
jmp    1652 <string_replace_with_callback+0x4d2>
cmpq   $0x0,-0x78(%rbp)
je     1666 <string_replace_with_callback+0x4e6>
mov    -0x78(%rbp),%rdi
call   1030 <free@plt>
jmp    1695 <string_replace_with_callback+0x515>
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    -0x68(%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    16c4 <string_replace_with_callback+0x544>
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    -0x68(%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    16c9 <string_replace_with_callback+0x549>
jmp    1257 <string_replace_with_callback+0xd7>
mov    -0x68(%rbp),%rax
movslq -0x50(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x68(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0xb0,%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    $0x68,%rsp
mov    %r9,%rbp
mov    %r8,%r15
mov    %rcx,%r12
mov    %rdx,%r14
mov    %rsi,%r13
mov    %rdi,%rbx
test   %r9,%r9
je     11ac <string_replace_with_callback+0x2c>
movl   $0x0,0x0(%rbp)
xor    %eax,%eax
test   %rbx,%rbx
je     156f <string_replace_with_callback+0x3ef>
test   %r13,%r13
je     156f <string_replace_with_callback+0x3ef>
xor    %eax,%eax
test   %r14,%r14
je     156f <string_replace_with_callback+0x3ef>
cmpb   $0x0,0x0(%r13)
je     156f <string_replace_with_callback+0x3ef>
xor    %eax,%eax
test   %r12,%r12
je     156f <string_replace_with_callback+0x3ef>
cmpb   $0x0,(%r14)
je     156f <string_replace_with_callback+0x3ef>
mov    %r13,%rdi
call   1060 <strlen@plt>
mov    %eax,0xc(%rsp)
mov    %r14,%rdi
call   1060 <strlen@plt>
mov    %eax,0x30(%rsp)
mov    %rbx,0x40(%rsp)
mov    %rbx,%rdi
call   1060 <strlen@plt>
mov    %eax,%ebx
add    $0x1,%ebx
mov    %ebx,%edi
call   1080 <malloc@plt>
xor    %esi,%esi
test   %rax,%rax
je     156d <string_replace_with_callback+0x3ed>
mov    %ebx,0x28(%rsp)
mov    %r12,0x48(%rsp)
mov    %r15,0x50(%rsp)
mov    %rbp,0x38(%rsp)
mov    0xc(%rsp),%edx
movslq %edx,%rcx
mov    %rcx,0x58(%rsp)
xor    %r15d,%r15d
mov    %r14,0x60(%rsp)
mov    %edx,%r14d
mov    %esi,%ebx
mov    0x40(%rsp),%rbp
mov    %rax,0x10(%rsp)
jmp    1278 <string_replace_with_callback+0xf8>
add    $0x1,%r15d
mov    (%r12),%al
movslq %ebx,%rcx
mov    0x10(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    %rdx,%rax
add    $0x1,%ebx
movslq %r15d,%r12
mov    0x0(%rbp,%r12,1),%cl
cmp    $0x5c,%cl
je     128e <string_replace_with_callback+0x10e>
test   %cl,%cl
jne    12c0 <string_replace_with_callback+0x140>
jmp    153b <string_replace_with_callback+0x3bb>
mov    0x1(%r12,%rbp,1),%al
cmp    0x0(%r13),%al
jne    12c0 <string_replace_with_callback+0x140>
add    $0x2,%r15d
movslq %ebx,%rcx
mov    0x10(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    0x10(%rsp),%rax
add    $0x1,%ebx
jmp    1278 <string_replace_with_callback+0xf8>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
add    %rbp,%r12
mov    %r12,%rdi
mov    %r13,%rsi
mov    %r14d,%edx
call   1040 <strncmp@plt>
test   %rax,%rax
jne    125f <string_replace_with_callback+0xdf>
mov    %r15d,0x2c(%rsp)
mov    %rbx,0x20(%rsp)
mov    0x58(%rsp),%rax
cmpb   $0x0,(%r12,%rax,1)
je     151e <string_replace_with_callback+0x39e>
mov    0x58(%rsp),%rax
lea    (%r12,%rax,1),%rbx
xor    %r14d,%r14d
mov    %rbx,%r15
xor    %ebp,%ebp
jmp    1323 <string_replace_with_callback+0x1a3>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%r15
cmpb   $0x0,0x1(%r15)
lea    0x1(%r15),%r15
je     151e <string_replace_with_callback+0x39e>
mov    %r15,%rdi
mov    0x60(%rsp),%rsi
mov    0x30(%rsp),%edx
call   1040 <strncmp@plt>
test   %rax,%rax
je     1350 <string_replace_with_callback+0x1d0>
cmpb   $0x5c,(%r15)
je     135f <string_replace_with_callback+0x1df>
jmp    136a <string_replace_with_callback+0x1ea>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
test   %r14d,%r14d
je     1387 <string_replace_with_callback+0x207>
add    $0xffffffff,%r14d
cmpb   $0x5c,(%r15)
jne    136a <string_replace_with_callback+0x1ea>
movzbl 0x1(%r15),%eax
cmp    0x0(%r13),%al
je     1310 <string_replace_with_callback+0x190>
mov    %r15,%rdi
mov    %r13,%rsi
mov    0xc(%rsp),%edx
call   1040 <strncmp@plt>
test   %rax,%rax
jne    1314 <string_replace_with_callback+0x194>
add    $0x1,%ebp
add    $0x1,%r14d
jmp    1314 <string_replace_with_callback+0x194>
cmpb   $0x0,(%r15)
je     151e <string_replace_with_callback+0x39e>
mov    %r15d,%esi
sub    %ebx,%esi
mov    %rbx,%rdi
call   10a0 <string_strndup@plt>
test   %rax,%rax
jne    13d5 <string_replace_with_callback+0x255>
mov    0x2c(%rsp),%r15d
add    $0x1,%r15d
mov    (%r12),%al
mov    0x20(%rsp),%rbx
movslq %ebx,%rcx
mov    0x10(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    %rdx,%rax
add    $0x1,%ebx
mov    0x40(%rsp),%rbp
mov    0xc(%rsp),%r14d
jmp    1278 <string_replace_with_callback+0xf8>
mov    %rax,%rbx
test   %ebp,%ebp
jle    1428 <string_replace_with_callback+0x2a8>
movl   $0x0,0x34(%rsp)
mov    %rbx,%rdi
mov    %r13,%rsi
mov    0x60(%rsp),%rdx
mov    0x48(%rsp),%rcx
mov    0x50(%rsp),%r8
lea    0x34(%rsp),%r9
call   1070 <string_replace_with_callback@plt>
mov    %rax,0x18(%rsp)
mov    0x38(%rsp),%rbp
test   %rbp,%rbp
je     1419 <string_replace_with_callback+0x299>
mov    0x34(%rsp),%eax
add    %eax,0x0(%rbp)
mov    %rbx,%rdi
call   1030 <free@plt>
mov    0x18(%rsp),%rbx
jmp    142d <string_replace_with_callback+0x2ad>
mov    0x38(%rsp),%rbp
test   %rbx,%rbx
mov    %rbx,%rsi
lea    0xbc6(%rip),%rax
cmove  %rax,%rsi
mov    0x50(%rsp),%rdi
call   *0x48(%rsp)
test   %rax,%rax
je     14a1 <string_replace_with_callback+0x321>
mov    %rax,%r14
mov    %rax,%rdi
call   1060 <strlen@plt>
test   %eax,%eax
mov    %rbx,0x18(%rsp)
jle    14d4 <string_replace_with_callback+0x354>
mov    0x28(%rsp),%esi
mov    %eax,%ebx
add    %eax,%esi
mov    0x10(%rsp),%rbp
mov    %rbp,%rdi
mov    %esi,0x28(%rsp)
call   1090 <realloc@plt>
test   %rax,%rax
je     1544 <string_replace_with_callback+0x3c4>
mov    %rax,%r12
mov    0x20(%rsp),%rbp
movslq %ebp,%rdi
add    %rax,%rdi
mov    %r14,%rsi
call   1050 <strcpy@plt>
add    %ebp,%ebx
mov    %r12,0x10(%rsp)
jmp    14d9 <string_replace_with_callback+0x359>
mov    0x2c(%rsp),%r15d
add    $0x1,%r15d
mov    0x20(%rsp),%rcx
lea    0x1(%rcx),%esi
mov    (%r12),%al
movslq %ecx,%rcx
mov    0x10(%rsp),%rdx
mov    %al,(%rdx,%rcx,1)
mov    %rdx,%rax
test   %rbp,%rbp
je     14cd <string_replace_with_callback+0x34d>
addl   $0x1,0x0(%rbp)
mov    0xc(%rsp),%r14d
jmp    14fc <string_replace_with_callback+0x37c>
mov    0x20(%rsp),%rbx
sub    0x40(%rsp),%r15d
add    0x30(%rsp),%r15d
mov    %r14,%rdi
call   1030 <free@plt>
mov    %ebx,%esi
mov    0x10(%rsp),%rax
mov    0xc(%rsp),%r14d
mov    0x18(%rsp),%rbx
test   %rbx,%rbx
je     1251 <string_replace_with_callback+0xd1>
mov    %rbx,%rdi
mov    %rax,%rbp
mov    %rsi,%rbx
call   1030 <free@plt>
mov    %rbx,%rsi
mov    %rbp,%rax
jmp    1251 <string_replace_with_callback+0xd1>
movslq 0x20(%rsp),%rcx
mov    0x10(%rsp),%rax
movb   $0x0,(%rax,%rcx,1)
mov    0x38(%rsp),%rcx
test   %rcx,%rcx
je     156f <string_replace_with_callback+0x3ef>
addl   $0x1,(%rcx)
jmp    156f <string_replace_with_callback+0x3ef>
movslq %ebx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    156f <string_replace_with_callback+0x3ef>
test   %rbp,%rbp
je     1553 <string_replace_with_callback+0x3d3>
mov    0x10(%rsp),%rdi
call   1030 <free@plt>
cmpq   $0x0,0x18(%rsp)
je     1565 <string_replace_with_callback+0x3e5>
mov    0x18(%rsp),%rdi
call   1030 <free@plt>
mov    %r14,%rdi
call   1030 <free@plt>
xor    %eax,%eax
add    $0x68,%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* (i8*, i8*)* %3, i8* %4, i32* %5) {
%7 = alloca i8*
%8 = alloca i8*
%9 = alloca i8*
%10 = alloca i8*
%11 = alloca i8* (i8*, i8*)*
%12 = alloca i8*
%13 = alloca i32*
%14 = alloca i32
%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 i8*
%24 = alloca i8*
%25 = alloca i8*
%26 = alloca i8*
%27 = alloca i8*
%28 = alloca i8*
store i8* %0, i8** %8
store i8* %1, i8** %9
store i8* %2, i8** %10
store i8* (i8*, i8*)* %3, i8* (i8*, i8*)** %11
store i8* %4, i8** %12
store i32* %5, i32** %13
%29 = load i32*, i32** %13
%30 = icmp ne i32* %29, null
br i1 %30, label %31, label %33
31: ; preds = %6
%32 = load i32*, i32** %13
store i32 0, i32* %32
br label %33
33: ; preds = %31, %6
%34 = load i8*, i8** %8
%35 = icmp ne i8* %34, null
br i1 %35, label %36, label %55
36: ; preds = %33
%37 = load i8*, i8** %9
%38 = icmp ne i8* %37, null
br i1 %38, label %39, label %55
39: ; preds = %36
%40 = load i8*, i8** %9
%41 = getelementptr inbounds i8, i8* %40, i64 0
%42 = load i8, i8* %41
%43 = icmp ne i8 %42, 0
br i1 %43, label %44, label %55
44: ; preds = %39
%45 = load i8*, i8** %10
%46 = icmp ne i8* %45, null
br i1 %46, label %47, label %55
47: ; preds = %44
%48 = load i8*, i8** %10
%49 = getelementptr inbounds i8, i8* %48, i64 0
%50 = load i8, i8* %49
%51 = icmp ne i8 %50, 0
br i1 %51, label %52, label %55
52: ; preds = %47
%53 = load i8* (i8*, i8*)*, i8* (i8*, i8*)** %11
%54 = icmp ne i8* (i8*, i8*)* %53, null
br i1 %54, label %56, label %55
55: ; preds = %52, %47, %44, %39, %36, %33
store i8* null, i8** %7
br label %367
56: ; preds = %52
%57 = load i8*, i8** %9
%58 = call i32 @strlen(i8* %57)
store i32 %58, i32* %14
%59 = load i8*, i8** %10
%60 = call i32 @strlen(i8* %59)
store i32 %60, i32* %15
%61 = load i8*, i8** %8
%62 = call i32 @strlen(i8* %61)
%63 = add nsw i32 %62, 1
store i32 %63, i32* %16
%64 = load i32, i32* %16
%65 = call i8* @malloc(i32 %64)
store i8* %65, i8** %23
%66 = load i8*, i8** %23
%67 = icmp ne i8* %66, null
br i1 %67, label %68, label %365
68: ; preds = %56
store i32 0, i32* %18
store i32 0, i32* %19
br label %69
69: ; preds = %359, %68
%70 = load i8*, i8** %8
%71 = load i32, i32* %18
%72 = sext i32 %71 to i64
%73 = getelementptr inbounds i8, i8* %70, i64 %72
%74 = load i8, i8* %73
%75 = icmp ne i8 %74, 0
br i1 %75, label %76, label %360
76: ; preds = %69
%77 = load i8*, i8** %8
%78 = load i32, i32* %18
%79 = sext i32 %78 to i64
%80 = getelementptr inbounds i8, i8* %77, i64 %79
%81 = load i8, i8* %80
%82 = sext i8 %81 to i32
%83 = icmp eq i32 %82, 92
br i1 %83, label %84, label %111
84: ; preds = %76
%85 = load i8*, i8** %8
%86 = load i32, i32* %18
%87 = add nsw i32 %86, 1
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i8, i8* %85, i64 %88
%90 = load i8, i8* %89
%91 = sext i8 %90 to i32
%92 = load i8*, i8** %9
%93 = getelementptr inbounds i8, i8* %92, i64 0
%94 = load i8, i8* %93
%95 = sext i8 %94 to i32
%96 = icmp eq i32 %91, %95
br i1 %96, label %97, label %111
97: ; preds = %84
%98 = load i32, i32* %18
%99 = add nsw i32 %98, 1
store i32 %99, i32* %18
%100 = load i8*, i8** %8
%101 = load i32, i32* %18
%102 = add nsw i32 %101, 1
store i32 %102, i32* %18
%103 = sext i32 %101 to i64
%104 = getelementptr inbounds i8, i8* %100, i64 %103
%105 = load i8, i8* %104
%106 = load i8*, i8** %23
%107 = load i32, i32* %19
%108 = add nsw i32 %107, 1
store i32 %108, i32* %19
%109 = sext i32 %107 to i64
%110 = getelementptr inbounds i8, i8* %106, i64 %109
store i8 %105, i8* %110
br label %359
111: ; preds = %84, %76
%112 = load i8*, i8** %8
%113 = load i32, i32* %18
%114 = sext i32 %113 to i64
%115 = getelementptr inbounds i8, i8* %112, i64 %114
%116 = load i8*, i8** %9
%117 = load i32, i32* %14
%118 = call i64 @strncmp(i8* %115, i8* %116, i32 %117)
%119 = icmp eq i64 %118, 0
br i1 %119, label %120, label %346
120: ; preds = %111
store i32 0, i32* %20
store i32 0, i32* %21
%121 = load i8*, i8** %8
%122 = load i32, i32* %18
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i8, i8* %121, i64 %123
%125 = load i32, i32* %14
%126 = sext i32 %125 to i64
%127 = getelementptr inbounds i8, i8* %124, i64 %126
store i8* %127, i8** %28
br label %128
128: ; preds = %177, %120
%129 = load i8*, i8** %28
%130 = getelementptr inbounds i8, i8* %129, i64 0
%131 = load i8, i8* %130
%132 = icmp ne i8 %131, 0
br i1 %132, label %133, label %180
133: ; preds = %128
%134 = load i8*, i8** %28
%135 = load i8*, i8** %10
%136 = load i32, i32* %15
%137 = call i64 @strncmp(i8* %134, i8* %135, i32 %136)
%138 = icmp eq i64 %137, 0
br i1 %138, label %139, label %146
139: ; preds = %133
%140 = load i32, i32* %21
%141 = icmp eq i32 %140, 0
br i1 %141, label %142, label %143
142: ; preds = %139
br label %180
143: ; preds = %139
%144 = load i32, i32* %21
%145 = add nsw i32 %144, -1
store i32 %145, i32* %21
br label %146
146: ; preds = %143, %133
%147 = load i8*, i8** %28
%148 = getelementptr inbounds i8, i8* %147, i64 0
%149 = load i8, i8* %148
%150 = sext i8 %149 to i32
%151 = icmp eq i32 %150, 92
br i1 %151, label %152, label %165
152: ; preds = %146
%153 = load i8*, i8** %28
%154 = getelementptr inbounds i8, i8* %153, i64 1
%155 = load i8, i8* %154
%156 = sext i8 %155 to i32
%157 = load i8*, i8** %9
%158 = getelementptr inbounds i8, i8* %157, i64 0
%159 = load i8, i8* %158
%160 = sext i8 %159 to i32
%161 = icmp eq i32 %156, %160
br i1 %161, label %162, label %165
162: ; preds = %152
%163 = load i8*, i8** %28
%164 = getelementptr inbounds i8, i8* %163, i32 1
store i8* %164, i8** %28
br label %177
165: ; preds = %152, %146
%166 = load i8*, i8** %28
%167 = load i8*, i8** %9
%168 = load i32, i32* %14
%169 = call i64 @strncmp(i8* %166, i8* %167, i32 %168)
%170 = icmp eq i64 %169, 0
br i1 %170, label %171, label %176
171: ; preds = %165
%172 = load i32, i32* %20
%173 = add nsw i32 %172, 1
store i32 %173, i32* %20
%174 = load i32, i32* %21
%175 = add nsw i32 %174, 1
store i32 %175, i32* %21
br label %176
176: ; preds = %171, %165
br label %177
177: ; preds = %176, %162
%178 = load i8*, i8** %28
%179 = getelementptr inbounds i8, i8* %178, i32 1
store i8* %179, i8** %28
br label %128
180: ; preds = %142, %128
%181 = load i8*, i8** %28
%182 = getelementptr inbounds i8, i8* %181, i64 0
%183 = load i8, i8* %182
%184 = icmp ne i8 %183, 0
br i1 %184, label %198, label %185
185: ; preds = %180
%186 = load i8*, i8** %23
%187 = load i32, i32* %19
%188 = sext i32 %187 to i64
%189 = getelementptr inbounds i8, i8* %186, i64 %188
store i8 0, i8* %189
%190 = load i32*, i32** %13
%191 = icmp ne i32* %190, null
br i1 %191, label %192, label %196
192: ; preds = %185
%193 = load i32*, i32** %13
%194 = load i32, i32* %193
%195 = add nsw i32 %194, 1
store i32 %195, i32* %193
br label %196
196: ; preds = %192, %185
%197 = load i8*, i8** %23
store i8* %197, i8** %7
br label %367
198: ; preds = %180
%199 = load i8*, i8** %8
%200 = load i32, i32* %18
%201 = sext i32 %200 to i64
%202 = getelementptr inbounds i8, i8* %199, i64 %201
%203 = load i32, i32* %14
%204 = sext i32 %203 to i64
%205 = getelementptr inbounds i8, i8* %202, i64 %204
%206 = load i8*, i8** %28
%207 = load i8*, i8** %8
%208 = load i32, i32* %18
%209 = sext i32 %208 to i64
%210 = getelementptr inbounds i8, i8* %207, i64 %209
%211 = load i32, i32* %14
%212 = sext i32 %211 to i64
%213 = getelementptr inbounds i8, i8* %210, i64 %212
%214 = ptrtoint i8* %206 to i64
%215 = ptrtoint i8* %213 to i64
%216 = sub i64 %214, %215
%217 = trunc i64 %216 to i32
%218 = call i8* @string_strndup(i8* %205, i32 %217)
store i8* %218, i8** %25
%219 = load i8*, i8** %25
%220 = icmp ne i8* %219, null
br i1 %220, label %221, label %333
221: ; preds = %198
%222 = load i32, i32* %20
%223 = icmp sgt i32 %222, 0
br i1 %223, label %224, label %242
224: ; preds = %221
store i32 0, i32* %22
%225 = load i8*, i8** %25
%226 = load i8*, i8** %9
%227 = load i8*, i8** %10
%228 = load i8* (i8*, i8*)*, i8* (i8*, i8*)** %11
%229 = load i8*, i8** %12
%230 = call i8* @string_replace_with_callback(i8* %225, i8* %226, i8* %227, i8* (i8*, i8*)* %228, i8* %229, i32* %22)
store i8* %230, i8** %26
%231 = load i32*, i32** %13
%232 = icmp ne i32* %231, null
br i1 %232, label %233, label %238
233: ; preds = %224
%234 = load i32, i32* %22
%235 = load i32*, i32** %13
%236 = load i32, i32* %235
%237 = add nsw i32 %236, %234
store i32 %237, i32* %235
br label %238
238: ; preds = %233, %224
%239 = load i8*, i8** %25
%240 = call i32 @free(i8* %239)
%241 = load i8*, i8** %26
store i8* %241, i8** %25
br label %242
242: ; preds = %238, %221
%243 = load i8* (i8*, i8*)*, i8* (i8*, i8*)** %11
%244 = load i8*, i8** %12
%245 = load i8*, i8** %25
%246 = icmp ne i8* %245, null
br i1 %246, label %247, label %249
247: ; preds = %242
%248 = load i8*, i8** %25
br label %250
249: ; preds = %242
br label %250
250: ; preds = %249, %247
%251 = phi i8* [ %248, %247 ], [ getelementptr inbounds ([1 x i8], [1 x i8]* @.str, i64 0, i64 0), %249 ]
%252 = call i8* %243(i8* %244, i8* %251)
store i8* %252, i8** %27
%253 = load i8*, i8** %27
%254 = icmp ne i8* %253, null
br i1 %254, label %255, label %307
255: ; preds = %250
%256 = load i8*, i8** %27
%257 = call i32 @strlen(i8* %256)
store i32 %257, i32* %17
%258 = load i32, i32* %17
%259 = icmp sgt i32 %258, 0
br i1 %259, label %260, label %295
260: ; preds = %255
%261 = load i32, i32* %17
%262 = load i32, i32* %16
%263 = add nsw i32 %262, %261
store i32 %263, i32* %16
%264 = load i8*, i8** %23
%265 = load i32, i32* %16
%266 = call i8* @realloc(i8* %264, i32 %265)
store i8* %266, i8** %24
%267 = load i8*, i8** %24
%268 = icmp ne i8* %267, null
br i1 %268, label %284, label %269
269: ; preds = %260
%270 = load i8*, i8** %23
%271 = icmp ne i8* %270, null
br i1 %271, label %272, label %275
272: ; preds = %269
%273 = load i8*, i8** %23
%274 = call i32 @free(i8* %273)
br label %275
275: ; preds = %272, %269
%276 = load i8*, i8** %25
%277 = icmp ne i8* %276, null
br i1 %277, label %278, label %281
278: ; preds = %275
%279 = load i8*, i8** %25
%280 = call i32 @free(i8* %279)
br label %281
281: ; preds = %278, %275
%282 = load i8*, i8** %27
%283 = call i32 @free(i8* %282)
store i8* null, i8** %7
br label %367
284: ; preds = %260
%285 = load i8*, i8** %24
store i8* %285, i8** %23
%286 = load i8*, i8** %23
%287 = load i32, i32* %19
%288 = sext i32 %287 to i64
%289 = getelementptr inbounds i8, i8* %286, i64 %288
%290 = load i8*, i8** %27
%291 = call i32 @strcpy(i8* %289, i8* %290)
%292 = load i32, i32* %17
%293 = load i32, i32* %19
%294 = add nsw i32 %293, %292
store i32 %294, i32* %19
br label %295
295: ; preds = %284, %255
%296 = load i8*, i8** %28
%297 = load i8*, i8** %8
%298 = ptrtoint i8* %296 to i64
%299 = ptrtoint i8* %297 to i64
%300 = sub i64 %298, %299
%301 = load i32, i32* %15
%302 = sext i32 %301 to i64
%303 = add nsw i64 %300, %302
%304 = trunc i64 %303 to i32
store i32 %304, i32* %18
%305 = load i8*, i8** %27
%306 = call i32 @free(i8* %305)
br label %326
307: ; preds = %250
%308 = load i8*, i8** %8
%309 = load i32, i32* %18
%310 = add nsw i32 %309, 1
store i32 %310, i32* %18
%311 = sext i32 %309 to i64
%312 = getelementptr inbounds i8, i8* %308, i64 %311
%313 = load i8, i8* %312
%314 = load i8*, i8** %23
%315 = load i32, i32* %19
%316 = add nsw i32 %315, 1
store i32 %316, i32* %19
%317 = sext i32 %315 to i64
%318 = getelementptr inbounds i8, i8* %314, i64 %317
store i8 %313, i8* %318
%319 = load i32*, i32** %13
%320 = icmp ne i32* %319, null
br i1 %320, label %321, label %325
321: ; preds = %307
%322 = load i32*, i32** %13
%323 = load i32, i32* %322
%324 = add nsw i32 %323, 1
store i32 %324, i32* %322
br label %325
325: ; preds = %321, %307
br label %326
326: ; preds = %325, %295
%327 = load i8*, i8** %25
%328 = icmp ne i8* %327, null
br i1 %328, label %329, label %332
329: ; preds = %326
%330 = load i8*, i8** %25
%331 = call i32 @free(i8* %330)
br label %332
332: ; preds = %329, %326
br label %345
333: ; preds = %198
%334 = load i8*, i8** %8
%335 = load i32, i32* %18
%336 = add nsw i32 %335, 1
store i32 %336, i32* %18
%337 = sext i32 %335 to i64
%338 = getelementptr inbounds i8, i8* %334, i64 %337
%339 = load i8, i8* %338
%340 = load i8*, i8** %23
%341 = load i32, i32* %19
%342 = add nsw i32 %341, 1
store i32 %342, i32* %19
%343 = sext i32 %341 to i64
%344 = getelementptr inbounds i8, i8* %340, i64 %343
store i8 %339, i8* %344
br label %345
345: ; preds = %333, %332
br label %358
346: ; preds = %111
%347 = load i8*, i8** %8
%348 = load i32, i32* %18
%349 = add nsw i32 %348, 1
store i32 %349, i32* %18
%350 = sext i32 %348 to i64
%351 = getelementptr inbounds i8, i8* %347, i64 %350
%352 = load i8, i8* %351
%353 = load i8*, i8** %23
%354 = load i32, i32* %19
%355 = add nsw i32 %354, 1
store i32 %355, i32* %19
%356 = sext i32 %354 to i64
%357 = getelementptr inbounds i8, i8* %353, i64 %356
store i8 %352, i8* %357
br label %358
358: ; preds = %346, %345
br label %359
359: ; preds = %358, %97
br label %69
360: ; preds = %69
%361 = load i8*, i8** %23
%362 = load i32, i32* %19
%363 = sext i32 %362 to i64
%364 = getelementptr inbounds i8, i8* %361, i64 %363
store i8 0, i8* %364
br label %365
365: ; preds = %360, %56
%366 = load i8*, i8** %23
store i8* %366, i8** %7
br label %367
367: ; preds = %365, %281, %196, %55
%368 = load i8*, i8** %7
ret i8* %368
}

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