render_string_box(n, row, col, title, names, values, maxchar) int n, row, col,
    maxchar;
char **names, values[][25], *title;
{
  int i, k = 0, id, dif;
  int j, ll;
  char item[256];
  char dum[256];
  char sname[50];
  plintf("%s\n\n", title);
  for (i = 0; i < row; i++) {
    for (j = 0; j < col; j++) {
      if (names[k][0] == '*')
        sprintf(sname, "*%s", names[k] + 2);
      else
        sprintf(sname, "%s", names[k]);
      sprintf(item, "%d: %s=%s", k, sname, values[k]);
      ll = 25 - strlen(item);
      sprintf(dum, "  ");
      if (ll > 2) {
        for (id = 0; id <= ll; id++)
          dum[id] = ' ';
        dum[id] = 0;
      }
      if (j < (col - 1))
        printf("%s%s", item, dum);
      else
        printf("%s", item);
      k++;
      if (k >= n)
        break;
    }
    plintf("\n\n");
  }
}


x86 assembly (clang, -O0):
<render_string_box>:
push   %rbp
mov    %rsp,%rbp
sub    $0x280,%rsp
mov    0x10(%rbp),%eax
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
mov    %r8,-0x20(%rbp)
mov    %r9,-0x28(%rbp)
movl   $0x0,-0x30(%rbp)
mov    -0x18(%rbp),%rsi
lea    0xe8b(%rip),%rdi
mov    $0x0,%al
call   1050 <plintf@plt>
movl   $0x0,-0x2c(%rbp)
mov    -0x2c(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    1335 <render_string_box+0x1f5>
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x10(%rbp),%eax
jge    1319 <render_string_box+0x1d9>
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movsbl (%rax),%eax
cmp    $0x2a,%eax
jne    11e4 <render_string_box+0xa4>
lea    -0x280(%rbp),%rdi
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
add    $0x2,%rdx
lea    0xe2d(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
jmp    1205 <render_string_box+0xc5>
lea    -0x280(%rbp),%rdi
mov    -0x20(%rbp),%rax
movslq -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
lea    0xe08(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
lea    -0x140(%rbp),%rdi
mov    -0x30(%rbp),%edx
lea    -0x280(%rbp),%rcx
mov    -0x28(%rbp),%r8
movslq -0x30(%rbp),%rax
imul   $0x19,%rax,%rax
add    %rax,%r8
lea    0xddd(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
lea    -0x140(%rbp),%rdi
call   1030 <strlen@plt>
mov    %rax,%rcx
mov    $0x19,%eax
sub    %rcx,%rax
mov    %eax,-0x40(%rbp)
lea    -0x240(%rbp),%rdi
lea    0xdb8(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
cmpl   $0x2,-0x40(%rbp)
jle    12a5 <render_string_box+0x165>
movl   $0x0,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x40(%rbp),%eax
jg     1299 <render_string_box+0x159>
movslq -0x34(%rbp),%rax
movb   $0x20,-0x240(%rbp,%rax,1)
20
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1273 <render_string_box+0x133>
movslq -0x34(%rbp),%rax
movb   $0x0,-0x240(%rbp,%rax,1)
mov    -0x3c(%rbp),%eax
mov    -0x10(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    12d7 <render_string_box+0x197>
lea    -0x140(%rbp),%rsi
lea    -0x240(%rbp),%rdx
lea    0xd4b(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
jmp    12ec <render_string_box+0x1ac>
lea    -0x140(%rbp),%rsi
lea    0xd21(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
mov    -0x30(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x30(%rbp)
mov    -0x30(%rbp),%eax
cmp    -0x8(%rbp),%eax
jl     1306 <render_string_box+0x1c6>
jmp    1319 <render_string_box+0x1d9>
jmp    130b <render_string_box+0x1cb>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1196 <render_string_box+0x56>
lea    0xce2(%rip),%rdi
mov    $0x0,%al
call   1050 <plintf@plt>
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1183 <render_string_box+0x43>
mov    -0x4(%rbp),%eax
add    $0x280,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<render_string_box>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x288,%rsp
mov    %r9,0x20(%rsp)
mov    %r8,0x18(%rsp)
mov    %rdx,(%rsp)
mov    %esi,%ebx
mov    %edi,%r14d
lea    0xe75(%rip),%rdi
mov    %rcx,%rsi
xor    %eax,%eax
call   1070 <plintf@plt>
mov    %ebx,0x8(%rsp)
test   %ebx,%ebx
jle    135d <render_string_box+0x1fd>
mov    (%rsp),%rax
add    $0xffffffff,%eax
mov    %eax,0x14(%rsp)
movslq %r14d,%r14
lea    0x40(%rsp),%r12
lea    0xe4e(%rip),%r15
xor    %ebx,%ebx
xor    %ebp,%ebp
jmp    11f5 <render_string_box+0x95>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    0xc(%rsp),%ebp
add    %ebx,%ebp
mov    0x10(%rsp),%ebx
lea    0xe21(%rip),%rdi
xor    %eax,%eax
call   1070 <plintf@plt>
add    $0x1,%ebx
cmp    0x8(%rsp),%ebx
je     135d <render_string_box+0x1fd>
cmpl   $0x0,(%rsp)
jle    11da <render_string_box+0x7a>
mov    %ebx,0x10(%rsp)
mov    %ebp,0xc(%rsp)
movslq %ebp,%rcx
mov    0x18(%rsp),%rax
lea    (%rax,%rcx,8),%rax
mov    %rax,0x30(%rsp)
lea    (%rcx,%rcx,4),%rax
lea    (%rax,%rax,4),%r13
add    0x20(%rsp),%r13
mov    %ecx,%eax
mov    %rax,0x28(%rsp)
add    $0x1,%rcx
mov    %rcx,0x38(%rsp)
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    0x30(%rsp),%rax
mov    (%rax,%rbx,8),%rdx
cmpb   $0x2a,(%rdx)
jne    1270 <render_string_box+0x110>
add    $0x2,%rdx
mov    %r12,%rdi
lea    0xda9(%rip),%rsi
xor    %eax,%eax
call   1080 <sprintf@plt>
jmp    127b <render_string_box+0x11b>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %r12,%rdi
mov    %rdx,%rsi
call   1030 <strcpy@plt>
mov    0x28(%rsp),%rax
lea    (%rax,%rbx,1),%edx
lea    0x180(%rsp),%rbp
mov    %rbp,%rdi
mov    %r15,%rsi
mov    %r12,%rcx
mov    %r13,%r8
xor    %eax,%eax
call   1080 <sprintf@plt>
mov    %rbp,%rdi
call   1040 <strlen@plt>
movw   $0x2020,0x80(%rsp)
movb   $0x0,0x82(%rsp)
lea    -0x1a(%rax),%ecx
cmp    $0xfffffffc,%ecx
jg     12fa <render_string_box+0x19a>
mov    %r12,%r15
mov    %r14,%r12
mov    $0x1a,%r14d
sub    %eax,%r14d
lea    0x80(%rsp),%rdi
mov    $0x20,%esi
mov    %r14,%rdx
call   1060 <memset@plt>
movb   $0x0,0x80(%rsp,%r14,1)
mov    %r12,%r14
mov    %r15,%r12
lea    0xd0f(%rip),%r15
cmp    0x14(%rsp),%ebx
jge    1320 <render_string_box+0x1c0>
lea    0xd0f(%rip),%rdi
lea    0x180(%rsp),%rsi
lea    0x80(%rsp),%rdx
xor    %eax,%eax
call   1050 <printf@plt>
jmp    1336 <render_string_box+0x1d6>
lea    0xcdf(%rip),%rdi
lea    0x180(%rsp),%rsi
xor    %eax,%eax
call   1050 <printf@plt>
mov    0x38(%rsp),%rax
add    %rbx,%rax
add    $0x1,%rbx
cmp    %r14,%rax
jge    11d0 <render_string_box+0x70>
add    $0x19,%r13
cmp    (%rsp),%ebx
jl     1240 <render_string_box+0xe0>
jmp    11d0 <render_string_box+0x70>
add    $0x288,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [5 x i8] c"%s\0A\0A\00"
@.str.1 = [4 x i8] c"*%s\00"
@.str.2 = [3 x i8] c"%s\00"
@.str.3 = [10 x i8] c"%d: %s=%s\00"
@.str.4 = [3 x i8] c" \00"
@.str.5 = [5 x i8] c"%s%s\00"
@.str.6 = [3 x i8] c"\0A\0A\00"
define i32 @render_string_box(i32 %0, i32 %1, i32 %2, i8* %3, i8** %4, [25 x i8]* %5, i32 %6) {
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i8*
%13 = alloca i8**
%14 = alloca [25 x i8]*
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
%21 = alloca i32
%22 = alloca [256 x i8]
%23 = alloca [256 x i8]
%24 = alloca [50 x i8]
store i32 %0, i32* %9
store i32 %1, i32* %10
store i32 %2, i32* %11
store i8* %3, i8** %12
store i8** %4, i8*** %13
store [25 x i8]* %5, [25 x i8]** %14
store i32 %6, i32* %15
store i32 0, i32* %17
%25 = load i8*, i8** %12
%26 = call i32 (i8*, i8*, ...) bitcast (i32 (...)* @plintf to i32 (i8*, i8*, ...)*)(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i8* %25)
store i32 0, i32* %16
br label %27
27: ; preds = %122, %7
%28 = load i32, i32* %16
%29 = load i32, i32* %10
%30 = icmp slt i32 %28, %29
br i1 %30, label %31, label %125
31: ; preds = %27
store i32 0, i32* %20
br label %32
32: ; preds = %117, %31
%33 = load i32, i32* %20
%34 = load i32, i32* %11
%35 = icmp slt i32 %33, %34
br i1 %35, label %36, label %120
36: ; preds = %32
%37 = load i8**, i8*** %13
%38 = load i32, i32* %17
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds i8*, i8** %37, i64 %39
%41 = load i8*, i8** %40
%42 = getelementptr inbounds i8, i8* %41, i64 0
%43 = load i8, i8* %42
%44 = sext i8 %43 to i32
%45 = icmp eq i32 %44, 42
br i1 %45, label %46, label %55
46: ; preds = %36
%47 = getelementptr inbounds [50 x i8], [50 x i8]* %24, i64 0, i64 0
%48 = load i8**, i8*** %13
%49 = load i32, i32* %17
%50 = sext i32 %49 to i64
%51 = getelementptr inbounds i8*, i8** %48, i64 %50
%52 = load i8*, i8** %51
%53 = getelementptr inbounds i8, i8* %52, i64 2
%54 = call i32 (i8*, i8*, ...) @sprintf(i8* %47, i8* getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0), i8* %53)
br label %63
55: ; preds = %36
%56 = getelementptr inbounds [50 x i8], [50 x i8]* %24, i64 0, i64 0
%57 = load i8**, i8*** %13
%58 = load i32, i32* %17
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds i8*, i8** %57, i64 %59
%61 = load i8*, i8** %60
%62 = call i32 (i8*, i8*, ...) @sprintf(i8* %56, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i8* %61)
br label %63
63: ; preds = %55, %46
%64 = getelementptr inbounds [256 x i8], [256 x i8]* %22, i64 0, i64 0
%65 = load i32, i32* %17
%66 = getelementptr inbounds [50 x i8], [50 x i8]* %24, i64 0, i64 0
%67 = load [25 x i8]*, [25 x i8]** %14
%68 = load i32, i32* %17
%69 = sext i32 %68 to i64
%70 = getelementptr inbounds [25 x i8], [25 x i8]* %67, i64 %69
%71 = getelementptr inbounds [25 x i8], [25 x i8]* %70, i64 0, i64 0
%72 = call i32 (i8*, i8*, ...) @sprintf(i8* %64, i8* getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i64 0, i64 0), i32 %65, i8* %66, i8* %71)
%73 = getelementptr inbounds [256 x i8], [256 x i8]* %22, i64 0, i64 0
%74 = call i64 @strlen(i8* %73)
%75 = sub i64 25, %74
%76 = trunc i64 %75 to i32
store i32 %76, i32* %21
%77 = getelementptr inbounds [256 x i8], [256 x i8]* %23, i64 0, i64 0
%78 = call i32 (i8*, i8*, ...) @sprintf(i8* %77, i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.4, i64 0, i64 0))
%79 = load i32, i32* %21
%80 = icmp sgt i32 %79, 2
br i1 %80, label %81, label %97
81: ; preds = %63
store i32 0, i32* %18
br label %82
82: ; preds = %90, %81
%83 = load i32, i32* %18
%84 = load i32, i32* %21
%85 = icmp sle i32 %83, %84
br i1 %85, label %86, label %93
86: ; preds = %82
%87 = load i32, i32* %18
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds [256 x i8], [256 x i8]* %23, i64 0, i64 %88
store i8 32, i8* %89
br label %90
90: ; preds = %86
%91 = load i32, i32* %18
%92 = add nsw i32 %91, 1
store i32 %92, i32* %18
br label %82
93: ; preds = %82
%94 = load i32, i32* %18
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds [256 x i8], [256 x i8]* %23, i64 0, i64 %95
store i8 0, i8* %96
br label %97
97: ; preds = %93, %63
%98 = load i32, i32* %20
%99 = load i32, i32* %11
%100 = sub nsw i32 %99, 1
%101 = icmp slt i32 %98, %100
br i1 %101, label %102, label %106
102: ; preds = %97
%103 = getelementptr inbounds [256 x i8], [256 x i8]* %22, i64 0, i64 0
%104 = getelementptr inbounds [256 x i8], [256 x i8]* %23, i64 0, i64 0
%105 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* %103, i8* %104)
br label %109
106: ; preds = %97
%107 = getelementptr inbounds [256 x i8], [256 x i8]* %22, i64 0, i64 0
%108 = call i32 (i8*, ...) @printf(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i8* %107)
br label %109
109: ; preds = %106, %102
%110 = load i32, i32* %17
%111 = add nsw i32 %110, 1
store i32 %111, i32* %17
%112 = load i32, i32* %17
%113 = load i32, i32* %9
%114 = icmp sge i32 %112, %113
br i1 %114, label %115, label %116
115: ; preds = %109
br label %120
116: ; preds = %109
br label %117
117: ; preds = %116
%118 = load i32, i32* %20
%119 = add nsw i32 %118, 1
store i32 %119, i32* %20
br label %32
120: ; preds = %115, %32
%121 = call i32 (i8*, ...) bitcast (i32 (...)* @plintf to i32 (i8*, ...)*)(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0))
br label %122
122: ; preds = %120
%123 = load i32, i32* %16
%124 = add nsw i32 %123, 1
store i32 %124, i32* %16
br label %27
125: ; preds = %27
%126 = load i32, i32* %8
ret i32 %126
}

LLVM IR (-O2):
@.str = [5 x i8] c"%s\0A\0A\00"
@.str.1 = [4 x i8] c"*%s\00"
@.str.2 = [3 x i8] c"%s\00"
@.str.3 = [10 x i8] c"%d: %s=%s\00"
@.str.4 = [3 x i8] c" \00"
@.str.5 = [5 x i8] c"%s%s\00"
@.str.6 = [3 x i8] c"\0A\0A\00"
define i32 @render_string_box(i32 %0, i32 %1, i32 %2, i8* %3, i8** nocapture %4, [25 x i8]* %5, i32 %6) {
%8 = alloca [256 x i8]
%9 = alloca [256 x i8]
%10 = getelementptr inbounds [256 x i8], [256 x i8]* %9, i64 0, i64 0
%11 = alloca [50 x i8]
%12 = getelementptr inbounds [256 x i8], [256 x i8]* %8, i64 0, i64 0
%13 = getelementptr inbounds [256 x i8], [256 x i8]* %9, i64 0, i64 0
%14 = getelementptr inbounds [50 x i8], [50 x i8]* %11, i64 0, i64 0
%15 = tail call i32 (i8*, i8*, ...) bitcast (i32 (...)* @plintf to i32 (i8*, i8*, ...)*)(i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str, i64 0, i64 0), i8* %3)
%16 = icmp sgt i32 %1, 0
br i1 %16, label %17, label %71
17: ; preds = %7
%18 = icmp sgt i32 %2, 0
%19 = add nsw i32 %2, -1
%20 = sext i32 %0 to i64
br label %21
21: ; preds = %17, %66
%22 = phi i32 [ 0, %17 ], [ %69, %66 ]
%23 = phi i32 [ 0, %17 ], [ %67, %66 ]
br i1 %18, label %24, label %66
24: ; preds = %21
%25 = sext i32 %23 to i64
br label %26
26: ; preds = %24, %58
%27 = phi i64 [ %25, %24 ], [ %59, %58 ]
%28 = phi i32 [ 0, %24 ], [ %61, %58 ]
%29 = getelementptr inbounds i8*, i8** %4, i64 %27
%30 = load i8*, i8** %29
%31 = load i8, i8* %30
%32 = icmp eq i8 %31, 42
br i1 %32, label %33, label %36
33: ; preds = %26
%34 = getelementptr inbounds i8, i8* %30, i64 2
%35 = call i32 (i8*, i8*, ...) @sprintf(i8* %14, i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str.1, i64 0, i64 0), i8* %34)
br label %38
36: ; preds = %26
%37 = call i8* @strcpy(i8* %14, i8* %30)
br label %38
38: ; preds = %36, %33
%39 = getelementptr inbounds [25 x i8], [25 x i8]* %5, i64 %27, i64 0
%40 = trunc i64 %27 to i32
%41 = call i32 (i8*, i8*, ...) @sprintf(i8* %12, i8* dereferenceable(1) getelementptr inbounds ([10 x i8], [10 x i8]* @.str.3, i64 0, i64 0), i32 %40, i8* %14, i8* %39)
%42 = call i64 @strlen(i8* %12)
%43 = trunc i64 %42 to i32
%44 = add i32 %43, -26
%45 = icmp slt i32 %44, -3
br i1 %45, label %46, label %52
46: ; preds = %38
%47 = sub i64 26, %42
%48 = and i64 %47, 4294967295
%49 = sub i64 26, %42
%50 = and i64 %49, 4294967295
%51 = getelementptr inbounds [256 x i8], [256 x i8]* %9, i64 0, i64 %50
store i8 0, i8* %51
br label %52
52: ; preds = %46, %38
%53 = icmp slt i32 %28, %19
br i1 %53, label %54, label %56
54: ; preds = %52
%55 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([5 x i8], [5 x i8]* @.str.5, i64 0, i64 0), i8* %12, i8* %13)
br label %58
56: ; preds = %52
%57 = call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([3 x i8], [3 x i8]* @.str.2, i64 0, i64 0), i8* %12)
br label %58
58: ; preds = %56, %54
%59 = add nsw i64 %27, 1
%60 = icmp slt i64 %59, %20
%61 = add nuw nsw i32 %28, 1
%62 = icmp slt i32 %61, %2
%63 = select i1 %60, i1 %62, i1 false
br i1 %63, label %26, label %64
64: ; preds = %58
%65 = trunc i64 %59 to i32
br label %66
66: ; preds = %64, %21
%67 = phi i32 [ %23, %21 ], [ %65, %64 ]
%68 = call i32 (i8*, ...) bitcast (i32 (...)* @plintf to i32 (i8*, ...)*)(i8* getelementptr inbounds ([3 x i8], [3 x i8]* @.str.6, i64 0, i64 0))
%69 = add nuw nsw i32 %22, 1
%70 = icmp eq i32 %69, %1
br i1 %70, label %71, label %21
71: ; preds = %66, %7
ret i32 undef
}