#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 KEY_BACKSPACE;
int KEY_DC;
int KEY_DOWN;
int KEY_END;
int KEY_ENTER;
int KEY_F(int);
int KEY_HOME;
int KEY_LEFT;
int KEY_NPAGE;
int KEY_PPAGE;
int KEY_RIGHT;
int KEY_UP;
int /*<<< orphan*/ addch(char);
int /*<<< orphan*/ addnstr(char *, int);
int get_key(int, int);
int /*<<< orphan*/ getmaxyx(int /*<<< orphan*/, int, int);
scalar_t__ isprint(int);
int /*<<< orphan*/ mvaddch(int, int, char);
int /*<<< orphan*/ refresh();
int /*<<< orphan*/ stdscr;
int strlen(char *);
int io_text(int y, int x, char *buf, int width, unsigned long mask) {
  int c = 0, index = 0, offset = 0, cursor = x + 1, wall = 0, max_x = 0;
  int max_y = 0;
  getmaxyx(stdscr, max_y, max_x);
  wall = max_x - 3;
  if (max_x < 24) {
    return (-1);
  }
  for (;;) {
    mvaddch(y, x, offset ? '<' : '[');
    addnstr(&buf[offset], wall - x - 1);
    addch(strlen(&buf[offset]) > wall - x - 1 ? '>' : ']');
    addch(' ');
    refresh();
    if (KEY_ENTER == (c = get_key(y, cursor))) {
      return (KEY_ENTER);
    } else if (KEY_LEFT == c) {
      if (index) {
        index--;
        if (x + 1 == cursor) {
          if (offset) {
            offset--;
          }
        } else {
          cursor--;
        }
      }
    } else if (KEY_RIGHT == c) {
      if ('\0' != buf[index]) {
        index++;
        if (cursor == wall) {
          offset++;
        } else {
          cursor++;
        }
      }
    } else if (KEY_DC == c) {
      if (buf[index]) {
        unsigned int i = 0;
        for (i = index; i < width; i++) {
          buf[i] = buf[i + 1];
        }
        buf[width] = '\0';
      }
    } else if (KEY_BACKSPACE == c) {
      if (index) {
        unsigned int i = 0;
        for (i = index - 1; i < width; i++) {
          buf[i] = buf[i + 1];
        }
        buf[width - 1] = '\0';
        index--;
        if (0 == offset) {
          if (x + 1 < cursor) {
            cursor--;
          }
        } else {
          offset--;
        }
      }
    } else if (((KEY_F(3) == c) && (mask & ((unsigned long)0x4))) ||
               ((KEY_F(4) == c) && (mask & ((unsigned long)0x8))) ||
               ((KEY_F(5) == c) && (mask & ((unsigned long)0x10))) ||
               ((KEY_NPAGE == c) && (mask & ((unsigned long)0x40))) ||
               ((KEY_PPAGE == c) && (mask & ((unsigned long)0x80))) ||
               ((KEY_DOWN == c) && (mask & ((unsigned long)0x200))) ||
               ((KEY_UP == c) && (mask & ((unsigned long)0x100))) ||
               ((KEY_F(10) == c) && (mask & ((unsigned long)0x20)))) {
      return (c);
    } else if (KEY_HOME == c) {
      index = 0;
      offset = 0;
      cursor = x + 1;
    } else if (KEY_END == c) {
      unsigned int i = 0;
      for (i = index; i < (width); i++) {
        if ('\0' == buf[i]) {
          index = i;
          break;
        }
      }
      if (x + 1 + index < wall) {
        cursor = x + 1 + index;
        offset = 0;
      } else {
        cursor = wall;
        offset = x + 1 + index - wall;
      }
    } else if (isprint(c)) {
      if ('\0' == buf[width - 1]) {
        unsigned int i = 0;
        for (i = width - 1; i > index; i--) {
          buf[i] = buf[i - 1];
        }
        buf[index++] = c;
        if (cursor == wall) {
          offset++;
        } else {
          cursor++;
        }
      }
    }
  }
}


x86 assembly (clang, -O0):
<io_text>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
movl   $0x0,-0x2c(%rbp)
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
movl   $0x0,-0x40(%rbp)
movl   $0x0,-0x44(%rbp)
mov    0x2dd5(%rip),%rax
mov    (%rax),%edi
mov    -0x44(%rbp),%esi
mov    -0x40(%rbp),%edx
call   1050 <getmaxyx@plt>
mov    -0x40(%rbp),%eax
sub    $0x3,%eax
mov    %eax,-0x3c(%rbp)
cmpl   $0x18,-0x40(%rbp)
jge    120f <io_text+0x7f>
movl   $0xffffffff,-0x4(%rbp)
jmp    1798 <io_text+0x608>
jmp    1214 <io_text+0x84>
mov    -0x8(%rbp),%edi
mov    -0xc(%rbp),%esi
mov    -0x34(%rbp),%edx
mov    $0x5b,%eax
mov    $0x3c,%ecx
cmp    $0x0,%edx
cmovne %ecx,%eax
movsbl %al,%edx
call   10b0 <mvaddch@plt>
mov    -0x18(%rbp),%rdi
movslq -0x34(%rbp),%rax
add    %rax,%rdi
mov    -0x3c(%rbp),%esi
sub    -0xc(%rbp),%esi
sub    $0x1,%esi
call   10a0 <addnstr@plt>
mov    -0x18(%rbp),%rdi
movslq -0x34(%rbp),%rax
add    %rax,%rdi
call   1030 <strlen@plt>
mov    %eax,%edx
mov    -0x3c(%rbp),%esi
sub    -0xc(%rbp),%esi
sub    $0x1,%esi
mov    $0x5d,%eax
mov    $0x3e,%ecx
cmp    %esi,%edx
cmovg  %ecx,%eax
movsbl %al,%edi
call   1070 <addch@plt>
mov    $0x20,%edi
call   1070 <addch@plt>
mov    $0x0,%al
call   1080 <refresh@plt>
mov    0x2ce8(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x58(%rbp)
mov    -0x8(%rbp),%edi
mov    -0x38(%rbp),%esi
call   1060 <get_key@plt>
mov    %eax,%ecx
mov    -0x58(%rbp),%eax
mov    %ecx,-0x2c(%rbp)
cmp    %ecx,%eax
jne    12c9 <io_text+0x139>
mov    0x2cc1(%rip),%rax
mov    (%rax),%eax
mov    %eax,-0x4(%rbp)
jmp    1798 <io_text+0x608>
mov    0x2cc0(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    1328 <io_text+0x198>
cmpl   $0x0,-0x30(%rbp)
je     1323 <io_text+0x193>
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
cmp    -0x38(%rbp),%eax
jne    1315 <io_text+0x185>
cmpl   $0x0,-0x34(%rbp)
je     1310 <io_text+0x180>
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
jmp    131e <io_text+0x18e>
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
jmp    1323 <io_text+0x193>
jmp    178e <io_text+0x5fe>
mov    0x2c69(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    1386 <io_text+0x1f6>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    %ecx,%eax
je     1381 <io_text+0x1f1>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jne    1373 <io_text+0x1e3>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    137c <io_text+0x1ec>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1381 <io_text+0x1f1>
jmp    1789 <io_text+0x5f9>
mov    0x2c4b(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    13fb <io_text+0x26b>
mov    -0x18(%rbp),%rax
movslq -0x30(%rbp),%rcx
cmpb   $0x0,(%rax,%rcx,1)
je     13f6 <io_text+0x266>
movl   $0x0,-0x48(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x48(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jae    13ea <io_text+0x25a>
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x18(%rbp),%rax
mov    -0x48(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    13b7 <io_text+0x227>
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1784 <io_text+0x5f4>
mov    0x2bce(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    14af <io_text+0x31f>
cmpl   $0x0,-0x30(%rbp)
je     14aa <io_text+0x31a>
movl   $0x0,-0x4c(%rbp)
mov    -0x30(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jae    145a <io_text+0x2ca>
mov    -0x18(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x18(%rbp),%rax
mov    -0x4c(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    1427 <io_text+0x297>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x30(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x30(%rbp)
xor    %eax,%eax
cmp    -0x34(%rbp),%eax
jne    149c <io_text+0x30c>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
cmp    -0x38(%rbp),%eax
jge    1497 <io_text+0x307>
mov    -0x38(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x38(%rbp)
jmp    14a5 <io_text+0x315>
mov    -0x34(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x34(%rbp)
jmp    14aa <io_text+0x31a>
jmp    177f <io_text+0x5ef>
mov    $0x3,%edi
call   1040 <KEY_F@plt>
cmp    -0x2c(%rbp),%eax
jne    14d4 <io_text+0x344>
mov    -0x28(%rbp),%rax
and    $0x4,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    $0x4,%edi
call   1040 <KEY_F@plt>
cmp    -0x2c(%rbp),%eax
jne    14f9 <io_text+0x369>
mov    -0x28(%rbp),%rax
and    $0x8,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    $0x5,%edi
call   1040 <KEY_F@plt>
cmp    -0x2c(%rbp),%eax
jne    151e <io_text+0x38e>
mov    -0x28(%rbp),%rax
and    $0x10,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    0x2a8b(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    1542 <io_text+0x3b2>
mov    -0x28(%rbp),%rax
and    $0x40,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    0x2aaf(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    1568 <io_text+0x3d8>
mov    -0x28(%rbp),%rax
and    $0x80,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    0x2a59(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    158e <io_text+0x3fe>
mov    -0x28(%rbp),%rax
and    $0x200,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    0x2a2b(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    15b4 <io_text+0x424>
mov    -0x28(%rbp),%rax
and    $0x100,%rax
cmp    $0x0,%rax
jne    15d9 <io_text+0x449>
mov    $0xa,%edi
call   1040 <KEY_F@plt>
cmp    -0x2c(%rbp),%eax
jne    15e4 <io_text+0x454>
mov    -0x28(%rbp),%rax
and    $0x20,%rax
cmp    $0x0,%rax
je     15e4 <io_text+0x454>
mov    -0x2c(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1798 <io_text+0x608>
mov    0x29f5(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    1612 <io_text+0x482>
movl   $0x0,-0x30(%rbp)
movl   $0x0,-0x34(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1775 <io_text+0x5e5>
mov    0x2987(%rip),%rax
mov    (%rax),%eax
cmp    -0x2c(%rbp),%eax
jne    16b4 <io_text+0x524>
movl   $0x0,-0x50(%rbp)
mov    -0x30(%rbp),%eax
mov    %eax,-0x50(%rbp)
mov    -0x50(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jae    1670 <io_text+0x4e0>
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%ecx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    165d <io_text+0x4cd>
mov    -0x50(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1670 <io_text+0x4e0>
jmp    1662 <io_text+0x4d2>
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1631 <io_text+0x4a1>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
add    -0x30(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jge    169a <io_text+0x50a>
mov    -0xc(%rbp),%eax
add    $0x1,%eax
add    -0x30(%rbp),%eax
mov    %eax,-0x38(%rbp)
movl   $0x0,-0x34(%rbp)
jmp    16af <io_text+0x51f>
mov    -0x3c(%rbp),%eax
mov    %eax,-0x38(%rbp)
mov    -0xc(%rbp),%eax
add    $0x1,%eax
add    -0x30(%rbp),%eax
sub    -0x3c(%rbp),%eax
mov    %eax,-0x34(%rbp)
jmp    1770 <io_text+0x5e0>
mov    -0x2c(%rbp),%edi
call   1090 <isprint@plt>
cmp    $0x0,%rax
je     176b <io_text+0x5db>
mov    -0x18(%rbp),%rax
mov    -0x1c(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    %ecx,%eax
jne    1766 <io_text+0x5d6>
movl   $0x0,-0x54(%rbp)
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x30(%rbp),%eax
jbe    1724 <io_text+0x594>
mov    -0x18(%rbp),%rax
mov    -0x54(%rbp),%ecx
sub    $0x1,%ecx
mov    %ecx,%ecx
mov    (%rax,%rcx,1),%dl
mov    -0x18(%rbp),%rax
mov    -0x54(%rbp),%ecx
mov    %dl,(%rax,%rcx,1)
mov    -0x54(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x54(%rbp)
jmp    16f1 <io_text+0x561>
mov    -0x2c(%rbp),%eax
mov    %al,%dl
mov    -0x18(%rbp),%rax
mov    -0x30(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x30(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x38(%rbp),%eax
cmp    -0x3c(%rbp),%eax
jne    1758 <io_text+0x5c8>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1761 <io_text+0x5d1>
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x38(%rbp)
jmp    1766 <io_text+0x5d6>
jmp    176b <io_text+0x5db>
jmp    1770 <io_text+0x5e0>
jmp    1775 <io_text+0x5e5>
jmp    177a <io_text+0x5ea>
jmp    177f <io_text+0x5ef>
jmp    1784 <io_text+0x5f4>
jmp    1789 <io_text+0x5f9>
jmp    178e <io_text+0x5fe>
jmp    1793 <io_text+0x603>
jmp    1214 <io_text+0x84>
mov    -0x4(%rbp),%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<io_text>:
push   %rax
mov    0x2ed0(%rip),%rax
mov    (%rax),%edi
xor    %esi,%esi
xor    %edx,%edx
call   1030 <getmaxyx@plt>
mov    $0xffffffff,%eax
pop    %rcx
ret

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

LLVM IR (-O2):
@stdscr = global i32 0
@KEY_ENTER = global i32 0
@KEY_LEFT = global i32 0
@KEY_RIGHT = global i32 0
@KEY_DC = global i32 0
@KEY_BACKSPACE = global i32 0
@KEY_NPAGE = global i32 0
@KEY_PPAGE = global i32 0
@KEY_DOWN = global i32 0
@KEY_UP = global i32 0
@KEY_HOME = global i32 0
@KEY_END = global i32 0
define i32 @io_text(i32 %0, i32 %1, i8* nocapture readnone %2, i32 %3, i64 %4) {
%6 = load i32, i32* @stdscr
%7 = tail call i32 @getmaxyx(i32 %6, i32 0, i32 0)
ret i32 -1
}