1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2025-02-11 01:30:53 +00:00

Added sprintf(). Closes #715

This commit is contained in:
jespergravgaard 2021-08-13 22:31:54 +02:00
parent 5e18953517
commit 940e0813be
11 changed files with 11215 additions and 4 deletions

View File

@ -46,6 +46,7 @@ public class Procedure extends Scope {
final public static List<String> INTRINSIC_PROCEDURES = Arrays.asList(
Pass1PrintfIntrinsicRewrite.INTRINSIC_PRINTF_NAME,
Pass1PrintfIntrinsicRewrite.INTRINSIC_SNPRINTF_NAME,
Pass1PrintfIntrinsicRewrite.INTRINSIC_SPRINTF_NAME,
Pass1ByteXIntrinsicRewrite.INTRINSIC_MAKELONG4
);

View File

@ -26,9 +26,12 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
/** The printf procedure name. */
public static final String INTRINSIC_PRINTF_NAME = "printf";
/** The printf procedure name. */
/** The snprintf procedure name. */
public static final String INTRINSIC_SNPRINTF_NAME = "snprintf";
/** The sprintf procedure name. */
public static final String INTRINSIC_SPRINTF_NAME = "sprintf";
/** The printf routine used to print a raw char */
private static final String CPUTC = "cputc";
@ -91,6 +94,16 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
addPrintfCall(SNPRINTF_INIT, Arrays.asList(buffer, capacity), stmtIt, call);
addPrintfFormatStatements(stmtIt, call, format, formatParameters, SNPUTC);
addPrintfCall(SNPUTC, Arrays.asList(new ConstantInteger(0L, SymbolType.BYTE)), stmtIt, call);
} else if(((StatementCall) statement).getProcedureName().equals(INTRINSIC_SPRINTF_NAME)) {
StatementCall call = (StatementCall) statement;
stmtIt.remove();
List<RValue> callParameters = call.getParameters();
final RValue buffer = getParameterValue(callParameters, 0, call);
final RValue format = getParameterValue(callParameters, 1, call);
List<RValue> formatParameters = callParameters.subList(2, callParameters.size());
addPrintfCall(SNPRINTF_INIT, Arrays.asList(buffer, new ConstantInteger(65535L, SymbolType.WORD)), stmtIt, call);
addPrintfFormatStatements(stmtIt, call, format, formatParameters, SNPUTC);
addPrintfCall(SNPUTC, Arrays.asList(new ConstantInteger(0L, SymbolType.BYTE)), stmtIt, call);
}
}
}

View File

@ -1,4 +1,3 @@
#include <stddef.h>
#include <printf.h>
/// Composes a string with the same text that would be printed if format was used on printf(),
@ -13,12 +12,20 @@
/// Notice that only when this returned value is non-negative and less than n, the string has been completely written.
int snprintf ( char * s, size_t n, const char * format, ... );
/// Composes a string with the same text that would be printed if format was used on printf(),
/// but instead of being printed, the content is stored as a C string in the buffer pointed by s
/// @param s Pointer to a buffer where the resulting C-string is stored. The buffer should have a size of at least n characters.
/// @param format C string that contains a format string that follows the same specifications as format in printf (see printf for details).
/// @param ... Depending on the format string, the function may expect a sequence of additional arguments, each containing a value to be used to replace a format specifier in the format string (or a pointer to a storage location, for n).
/// There should be at least as many of these arguments as the number of values specified in the format specifiers. Additional arguments are ignored by the function.
/// @return The number of characters written not counting the terminating null character.
int sprintf( char * s, const char * format, ... );
/// Initialize the snprintf() state
/// @param s Pointer to a buffer where the resulting C-string is stored. The buffer should have a size of at least n characters.
/// @param n Maximum number of bytes to be used in the buffer. The generated string has a length of at most n-1, leaving space for the additional terminating null character.
void snprintf_init(char * s, size_t n);
/// Print a character into snprintf buffer
/// Used by snprintf()
/// @param c The character to print

View File

@ -3,4 +3,4 @@
#include <stddef.h>
#include <printf.h>
#include <snprintf.h>
#include <sprintf.h>

View File

@ -12,6 +12,15 @@
/// Notice that only when this returned value is non-negative and less than n, the string has been completely written.
__intrinsic int snprintf ( char * s, size_t n, const char * format, ... );
/// Composes a string with the same text that would be printed if format was used on printf(),
/// but instead of being printed, the content is stored as a C string in the buffer pointed by s
/// @param s Pointer to a buffer where the resulting C-string is stored. The buffer should have a size of at least n characters.
/// @param format C string that contains a format string that follows the same specifications as format in printf (see printf for details).
/// @param ... Depending on the format string, the function may expect a sequence of additional arguments, each containing a value to be used to replace a format specifier in the format string (or a pointer to a storage location, for n).
/// There should be at least as many of these arguments as the number of values specified in the format specifiers. Additional arguments are ignored by the function.
/// @return The number of characters written not counting the terminating null character.
__intrinsic int sprintf( char * s, const char * format, ... );
/// The capacity of the buffer (n passed to snprintf())
/// Used to hold state while printing
volatile size_t __snprintf_capacity;

View File

@ -879,6 +879,11 @@ public class TestProgramsFast extends TestPrograms {
assertError("printf-error-1.c", "Needed printf sub-procedure not found");
}
@Test
public void testPrintf19() throws IOException {
compileAndCompare("printf-19.c");
}
@Test
public void testPrintf18() throws IOException {
compileAndCompare("printf-18.c");

31
src/test/kc/printf-19.c Normal file
View File

@ -0,0 +1,31 @@
// Tests sprintf function call rewriting
// Test simple formats
#include <sprintf.h>
char BUF[20];
char * screen = (char*)0x0400;
void print(char* msg) {
while(*msg)
*(screen++) = *(msg++);
}
void main() {
// String - no format
sprintf(BUF, "hello world! ");
print(BUF);
// String & char format
sprintf(BUF, "hello %s%c ", "world", '!');
print(BUF);
// Number format
sprintf(BUF, "hello %d+%x! ", 3,11);
print(BUF);
// Long
sprintf(BUF, "hi %ld! ", 22222222l);
print(BUF);
}

1035
src/test/ref/printf-19.asm Normal file

File diff suppressed because it is too large Load Diff

565
src/test/ref/printf-19.cfg Normal file
View File

@ -0,0 +1,565 @@
void __start()
__start: scope:[__start] from
[0] phi()
to:__start::__init1
__start::__init1: scope:[__start] from __start
[1] __snprintf_capacity = 0
[2] __snprintf_size = 0
[3] __snprintf_buffer = (char *) 0
to:__start::@1
__start::@1: scope:[__start] from __start::__init1
[4] phi()
[5] call main
to:__start::@return
__start::@return: scope:[__start] from __start::@1
[6] return
to:@return
__stackcall void snputc(char c)
snputc: scope:[snputc] from
[7] snputc::c#0 = stackidx(char,snputc::OFFSET_STACK_C)
[8] __snprintf_size = ++ __snprintf_size
[9] if(__snprintf_size<=__snprintf_capacity) goto snputc::@1
to:snputc::@return
snputc::@return: scope:[snputc] from snputc snputc::@2
[10] return
to:@return
snputc::@1: scope:[snputc] from snputc
[11] if(__snprintf_size!=__snprintf_capacity) goto snputc::@3
to:snputc::@2
snputc::@3: scope:[snputc] from snputc::@1
[12] phi()
to:snputc::@2
snputc::@2: scope:[snputc] from snputc::@1 snputc::@3
[13] snputc::c#2 = phi( snputc::@3/snputc::c#0, snputc::@1/0 )
[14] *__snprintf_buffer = snputc::c#2
[15] __snprintf_buffer = ++ __snprintf_buffer
to:snputc::@return
void main()
main: scope:[main] from __start::@1
[16] phi()
[17] call snprintf_init
to:main::@1
main::@1: scope:[main] from main
[18] phi()
[19] call printf_str
to:main::@2
main::@2: scope:[main] from main::@1
[20] stackpush(char) = 0
[21] callexecute snputc
sideeffect stackpullbytes(1)
[23] call print
to:main::@3
main::@3: scope:[main] from main::@2
[24] phi()
[25] call snprintf_init
to:main::@4
main::@4: scope:[main] from main::@3
[26] phi()
[27] call printf_str
to:main::@5
main::@5: scope:[main] from main::@4
[28] phi()
[29] call printf_string
to:main::@6
main::@6: scope:[main] from main::@5
[30] stackpush(char) = '!'
[31] callexecute snputc
sideeffect stackpullbytes(1)
[33] call printf_str
to:main::@7
main::@7: scope:[main] from main::@6
[34] stackpush(char) = 0
[35] callexecute snputc
sideeffect stackpullbytes(1)
[37] call print
to:main::@8
main::@8: scope:[main] from main::@7
[38] phi()
[39] call snprintf_init
to:main::@9
main::@9: scope:[main] from main::@8
[40] phi()
[41] call printf_str
to:main::@10
main::@10: scope:[main] from main::@9
[42] phi()
[43] call printf_sint
to:main::@11
main::@11: scope:[main] from main::@10
[44] phi()
[45] call printf_str
to:main::@12
main::@12: scope:[main] from main::@11
[46] phi()
[47] call printf_uint
to:main::@13
main::@13: scope:[main] from main::@12
[48] phi()
[49] call printf_str
to:main::@14
main::@14: scope:[main] from main::@13
[50] stackpush(char) = 0
[51] callexecute snputc
sideeffect stackpullbytes(1)
[53] call print
to:main::@15
main::@15: scope:[main] from main::@14
[54] phi()
[55] call snprintf_init
to:main::@16
main::@16: scope:[main] from main::@15
[56] phi()
[57] call printf_str
to:main::@17
main::@17: scope:[main] from main::@16
[58] phi()
[59] call printf_slong
to:main::@18
main::@18: scope:[main] from main::@17
[60] phi()
[61] call printf_str
to:main::@19
main::@19: scope:[main] from main::@18
[62] stackpush(char) = 0
[63] callexecute snputc
sideeffect stackpullbytes(1)
[65] call print
to:main::@return
main::@return: scope:[main] from main::@19
[66] return
to:@return
void snprintf_init(char *s , unsigned int n)
snprintf_init: scope:[snprintf_init] from main main::@15 main::@3 main::@8
[67] __snprintf_capacity = $ffff
[68] __snprintf_size = 0
[69] __snprintf_buffer = BUF
to:snprintf_init::@return
snprintf_init::@return: scope:[snprintf_init] from snprintf_init
[70] return
to:@return
void printf_str(void (*putc)(char) , const char *s)
printf_str: scope:[printf_str] from main::@1 main::@11 main::@13 main::@16 main::@18 main::@4 main::@6 main::@9 printf_number_buffer::@5 printf_string::@1
[71] printf_str::putc#12 = phi( main::@1/&snputc, main::@11/&snputc, main::@13/&snputc, main::@16/&snputc, main::@18/&snputc, main::@4/&snputc, main::@6/&snputc, main::@9/&snputc, printf_number_buffer::@5/printf_str::putc#0, printf_string::@1/printf_string::putc#0 )
[71] printf_str::s#12 = phi( main::@1/main::s, main::@11/main::s4, main::@13/main::s5, main::@16/main::s6, main::@18/main::s5, main::@4/main::s1, main::@6/main::s2, main::@9/main::s1, printf_number_buffer::@5/(char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS, printf_string::@1/main::str )
to:printf_str::@1
printf_str::@1: scope:[printf_str] from printf_str printf_str::@2
[72] printf_str::s#11 = phi( printf_str/printf_str::s#12, printf_str::@2/printf_str::s#0 )
[73] printf_str::c#1 = *printf_str::s#11
[74] printf_str::s#0 = ++ printf_str::s#11
[75] if(0!=printf_str::c#1) goto printf_str::@2
to:printf_str::@return
printf_str::@return: scope:[printf_str] from printf_str::@1
[76] return
to:@return
printf_str::@2: scope:[printf_str] from printf_str::@1
[77] stackpush(char) = printf_str::c#1
[78] callexecute *printf_str::putc#12
sideeffect stackpullbytes(1)
to:printf_str::@1
void print(char *msg)
print: scope:[print] from main::@14 main::@19 main::@2 main::@7
[80] screen#25 = phi( main::@14/screen#1, main::@19/screen#1, main::@2/(char *) 1024, main::@7/screen#1 )
to:print::@1
print::@1: scope:[print] from print print::@2
[81] screen#1 = phi( print/screen#25, print::@2/screen#0 )
[81] print::msg#5 = phi( print/BUF, print::@2/print::msg#0 )
[82] if(0!=*print::msg#5) goto print::@2
to:print::@return
print::@return: scope:[print] from print::@1
[83] return
to:@return
print::@2: scope:[print] from print::@1
[84] *screen#1 = *print::msg#5
[85] screen#0 = ++ screen#1
[86] print::msg#0 = ++ print::msg#5
to:print::@1
void printf_string(void (*putc)(char) , char *str , char format_min_length , char format_justify_left)
printf_string: scope:[printf_string] from main::@5
[87] phi()
to:printf_string::@1
printf_string::@1: scope:[printf_string] from printf_string
[88] phi()
[89] call printf_str
to:printf_string::@return
printf_string::@return: scope:[printf_string] from printf_string::@1
[90] return
to:@return
void printf_sint(void (*putc)(char) , int value , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
printf_sint: scope:[printf_sint] from main::@10
[91] *((char *)&printf_buffer) = 0
to:printf_sint::@1
printf_sint::@1: scope:[printf_sint] from printf_sint
[92] phi()
[93] call utoa
to:printf_sint::@2
printf_sint::@2: scope:[printf_sint] from printf_sint::@1
[94] printf_number_buffer::buffer_sign#1 = *((char *)&printf_buffer)
[95] call printf_number_buffer
to:printf_sint::@return
printf_sint::@return: scope:[printf_sint] from printf_sint::@2
[96] return
to:@return
void printf_uint(void (*putc)(char) , unsigned int uvalue , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
printf_uint: scope:[printf_uint] from main::@12
[97] phi()
to:printf_uint::@1
printf_uint::@1: scope:[printf_uint] from printf_uint
[98] *((char *)&printf_buffer) = 0
[99] call utoa
to:printf_uint::@2
printf_uint::@2: scope:[printf_uint] from printf_uint::@1
[100] printf_number_buffer::buffer_sign#2 = *((char *)&printf_buffer)
[101] call printf_number_buffer
to:printf_uint::@return
printf_uint::@return: scope:[printf_uint] from printf_uint::@2
[102] return
to:@return
void printf_slong(void (*putc)(char) , long value , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
printf_slong: scope:[printf_slong] from main::@17
[103] *((char *)&printf_buffer) = 0
to:printf_slong::@1
printf_slong::@1: scope:[printf_slong] from printf_slong
[104] phi()
[105] call ultoa
to:printf_slong::@2
printf_slong::@2: scope:[printf_slong] from printf_slong::@1
[106] printf_number_buffer::buffer_sign#0 = *((char *)&printf_buffer)
[107] call printf_number_buffer
to:printf_slong::@return
printf_slong::@return: scope:[printf_slong] from printf_slong::@2
[108] return
to:@return
void utoa(unsigned int value , char *buffer , char radix)
utoa: scope:[utoa] from printf_sint::@1 printf_uint::@1
[109] utoa::value#10 = phi( printf_sint::@1/printf_sint::uvalue#0, printf_uint::@1/printf_uint::uvalue#0 )
[109] utoa::radix#2 = phi( printf_sint::@1/DECIMAL, printf_uint::@1/HEXADECIMAL )
[110] if(utoa::radix#2==DECIMAL) goto utoa::@1
to:utoa::@2
utoa::@2: scope:[utoa] from utoa
[111] if(utoa::radix#2==HEXADECIMAL) goto utoa::@1
to:utoa::@3
utoa::@3: scope:[utoa] from utoa::@2
[112] if(utoa::radix#2==OCTAL) goto utoa::@1
to:utoa::@4
utoa::@4: scope:[utoa] from utoa::@3
[113] if(utoa::radix#2==BINARY) goto utoa::@1
to:utoa::@5
utoa::@5: scope:[utoa] from utoa::@4
[114] *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS) = 'e'
[115] *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS+1) = 'r'
[116] *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS+2) = 'r'
[117] *((char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS+3) = 0
to:utoa::@return
utoa::@return: scope:[utoa] from utoa::@5 utoa::@8
[118] return
to:@return
utoa::@1: scope:[utoa] from utoa utoa::@2 utoa::@3 utoa::@4
[119] utoa::digit_values#8 = phi( utoa/RADIX_DECIMAL_VALUES, utoa::@2/RADIX_HEXADECIMAL_VALUES, utoa::@3/RADIX_OCTAL_VALUES, utoa::@4/RADIX_BINARY_VALUES )
[119] utoa::max_digits#7 = phi( utoa/5, utoa::@2/4, utoa::@3/6, utoa::@4/$10 )
to:utoa::@6
utoa::@6: scope:[utoa] from utoa::@1 utoa::@9
[120] utoa::buffer#10 = phi( utoa::@9/utoa::buffer#15, utoa::@1/(char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[120] utoa::started#2 = phi( utoa::@9/utoa::started#4, utoa::@1/0 )
[120] utoa::value#3 = phi( utoa::@9/utoa::value#7, utoa::@1/utoa::value#10 )
[120] utoa::digit#2 = phi( utoa::@9/utoa::digit#1, utoa::@1/0 )
[121] utoa::$4 = utoa::max_digits#7 - 1
[122] if(utoa::digit#2<utoa::$4) goto utoa::@7
to:utoa::@8
utoa::@8: scope:[utoa] from utoa::@6
[123] utoa::$11 = (char)utoa::value#3
[124] *utoa::buffer#10 = DIGITS[utoa::$11]
[125] utoa::buffer#3 = ++ utoa::buffer#10
[126] *utoa::buffer#3 = 0
to:utoa::@return
utoa::@7: scope:[utoa] from utoa::@6
[127] utoa::$10 = utoa::digit#2 << 1
[128] utoa::digit_value#0 = utoa::digit_values#8[utoa::$10]
[129] if(0!=utoa::started#2) goto utoa::@10
to:utoa::@12
utoa::@12: scope:[utoa] from utoa::@7
[130] if(utoa::value#3>=utoa::digit_value#0) goto utoa::@10
to:utoa::@9
utoa::@9: scope:[utoa] from utoa::@11 utoa::@12
[131] utoa::buffer#15 = phi( utoa::@12/utoa::buffer#10, utoa::@11/utoa::buffer#4 )
[131] utoa::started#4 = phi( utoa::@12/utoa::started#2, utoa::@11/1 )
[131] utoa::value#7 = phi( utoa::@12/utoa::value#3, utoa::@11/utoa::value#0 )
[132] utoa::digit#1 = ++ utoa::digit#2
to:utoa::@6
utoa::@10: scope:[utoa] from utoa::@12 utoa::@7
[133] utoa_append::buffer#0 = utoa::buffer#10
[134] utoa_append::value#0 = utoa::value#3
[135] utoa_append::sub#0 = utoa::digit_value#0
[136] call utoa_append
[137] utoa_append::return#0 = utoa_append::value#2
to:utoa::@11
utoa::@11: scope:[utoa] from utoa::@10
[138] utoa::value#0 = utoa_append::return#0
[139] utoa::buffer#4 = ++ utoa::buffer#10
to:utoa::@9
void printf_number_buffer(void (*putc)(char) , char buffer_sign , char *buffer_digits , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
printf_number_buffer: scope:[printf_number_buffer] from printf_sint::@2 printf_slong::@2 printf_uint::@2
[140] printf_number_buffer::format_upper_case#10 = phi( printf_sint::@2/printf_sint::format_upper_case#0, printf_slong::@2/printf_slong::format_upper_case#0, printf_uint::@2/printf_uint::format_upper_case#0 )
[140] printf_number_buffer::putc#10 = phi( printf_sint::@2/printf_sint::putc#0, printf_slong::@2/printf_slong::putc#0, printf_uint::@2/printf_uint::putc#0 )
[140] printf_number_buffer::buffer_sign#10 = phi( printf_sint::@2/printf_number_buffer::buffer_sign#1, printf_slong::@2/printf_number_buffer::buffer_sign#0, printf_uint::@2/printf_number_buffer::buffer_sign#2 )
[140] printf_number_buffer::format_zero_padding#10 = phi( printf_sint::@2/printf_sint::format_zero_padding#0, printf_slong::@2/printf_slong::format_zero_padding#0, printf_uint::@2/printf_uint::format_zero_padding#0 )
[140] printf_number_buffer::format_justify_left#10 = phi( printf_sint::@2/printf_sint::format_justify_left#0, printf_slong::@2/printf_slong::format_justify_left#0, printf_uint::@2/printf_uint::format_justify_left#0 )
[140] printf_number_buffer::format_min_length#3 = phi( printf_sint::@2/printf_sint::format_min_length#0, printf_slong::@2/printf_slong::format_min_length#0, printf_uint::@2/printf_uint::format_min_length#0 )
[141] if(0==printf_number_buffer::format_min_length#3) goto printf_number_buffer::@1
to:printf_number_buffer::@6
printf_number_buffer::@6: scope:[printf_number_buffer] from printf_number_buffer
[142] phi()
[143] call strlen
[144] strlen::return#2 = strlen::len#2
to:printf_number_buffer::@14
printf_number_buffer::@14: scope:[printf_number_buffer] from printf_number_buffer::@6
[145] printf_number_buffer::$19 = strlen::return#2
[146] printf_number_buffer::len#0 = (signed char)printf_number_buffer::$19
[147] if(0==printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@13
to:printf_number_buffer::@7
printf_number_buffer::@7: scope:[printf_number_buffer] from printf_number_buffer::@14
[148] printf_number_buffer::len#1 = ++ printf_number_buffer::len#0
to:printf_number_buffer::@13
printf_number_buffer::@13: scope:[printf_number_buffer] from printf_number_buffer::@14 printf_number_buffer::@7
[149] printf_number_buffer::len#2 = phi( printf_number_buffer::@14/printf_number_buffer::len#0, printf_number_buffer::@7/printf_number_buffer::len#1 )
[150] printf_number_buffer::padding#1 = (signed char)printf_number_buffer::format_min_length#3 - printf_number_buffer::len#2
[151] if(printf_number_buffer::padding#1>=0) goto printf_number_buffer::@21
to:printf_number_buffer::@1
printf_number_buffer::@21: scope:[printf_number_buffer] from printf_number_buffer::@13
[152] phi()
to:printf_number_buffer::@1
printf_number_buffer::@1: scope:[printf_number_buffer] from printf_number_buffer printf_number_buffer::@13 printf_number_buffer::@21
[153] printf_number_buffer::padding#10 = phi( printf_number_buffer/0, printf_number_buffer::@21/printf_number_buffer::padding#1, printf_number_buffer::@13/0 )
[154] if(0!=printf_number_buffer::format_justify_left#10) goto printf_number_buffer::@2
to:printf_number_buffer::@17
printf_number_buffer::@17: scope:[printf_number_buffer] from printf_number_buffer::@1
[155] if(0!=printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@2
to:printf_number_buffer::@16
printf_number_buffer::@16: scope:[printf_number_buffer] from printf_number_buffer::@17
[156] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@8
to:printf_number_buffer::@2
printf_number_buffer::@8: scope:[printf_number_buffer] from printf_number_buffer::@16
[157] printf_padding::putc#0 = printf_number_buffer::putc#10
[158] printf_padding::length#0 = (char)printf_number_buffer::padding#10
[159] call printf_padding
to:printf_number_buffer::@2
printf_number_buffer::@2: scope:[printf_number_buffer] from printf_number_buffer::@1 printf_number_buffer::@16 printf_number_buffer::@17 printf_number_buffer::@8
[160] if(0==printf_number_buffer::buffer_sign#10) goto printf_number_buffer::@3
to:printf_number_buffer::@9
printf_number_buffer::@9: scope:[printf_number_buffer] from printf_number_buffer::@2
[161] stackpush(char) = printf_number_buffer::buffer_sign#10
[162] callexecute *printf_number_buffer::putc#10
sideeffect stackpullbytes(1)
to:printf_number_buffer::@3
printf_number_buffer::@3: scope:[printf_number_buffer] from printf_number_buffer::@2 printf_number_buffer::@9
[164] if(0==printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@4
to:printf_number_buffer::@18
printf_number_buffer::@18: scope:[printf_number_buffer] from printf_number_buffer::@3
[165] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@10
to:printf_number_buffer::@4
printf_number_buffer::@10: scope:[printf_number_buffer] from printf_number_buffer::@18
[166] printf_padding::putc#1 = printf_number_buffer::putc#10
[167] printf_padding::length#1 = (char)printf_number_buffer::padding#10
[168] call printf_padding
to:printf_number_buffer::@4
printf_number_buffer::@4: scope:[printf_number_buffer] from printf_number_buffer::@10 printf_number_buffer::@18 printf_number_buffer::@3
[169] if(0==printf_number_buffer::format_upper_case#10) goto printf_number_buffer::@5
to:printf_number_buffer::@11
printf_number_buffer::@11: scope:[printf_number_buffer] from printf_number_buffer::@4
[170] phi()
[171] call strupr
to:printf_number_buffer::@5
printf_number_buffer::@5: scope:[printf_number_buffer] from printf_number_buffer::@11 printf_number_buffer::@4
[172] printf_str::putc#0 = printf_number_buffer::putc#10
[173] call printf_str
to:printf_number_buffer::@15
printf_number_buffer::@15: scope:[printf_number_buffer] from printf_number_buffer::@5
[174] if(0==printf_number_buffer::format_justify_left#10) goto printf_number_buffer::@return
to:printf_number_buffer::@20
printf_number_buffer::@20: scope:[printf_number_buffer] from printf_number_buffer::@15
[175] if(0!=printf_number_buffer::format_zero_padding#10) goto printf_number_buffer::@return
to:printf_number_buffer::@19
printf_number_buffer::@19: scope:[printf_number_buffer] from printf_number_buffer::@20
[176] if(0!=printf_number_buffer::padding#10) goto printf_number_buffer::@12
to:printf_number_buffer::@return
printf_number_buffer::@12: scope:[printf_number_buffer] from printf_number_buffer::@19
[177] printf_padding::putc#2 = printf_number_buffer::putc#10
[178] printf_padding::length#2 = (char)printf_number_buffer::padding#10
[179] call printf_padding
to:printf_number_buffer::@return
printf_number_buffer::@return: scope:[printf_number_buffer] from printf_number_buffer::@12 printf_number_buffer::@15 printf_number_buffer::@19 printf_number_buffer::@20
[180] return
to:@return
void ultoa(unsigned long value , char *buffer , char radix)
ultoa: scope:[ultoa] from printf_slong::@1
[181] phi()
to:ultoa::@1
ultoa::@1: scope:[ultoa] from ultoa ultoa::@4
[182] ultoa::buffer#11 = phi( ultoa::@4/ultoa::buffer#14, ultoa/(char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS )
[182] ultoa::started#2 = phi( ultoa::@4/ultoa::started#4, ultoa/0 )
[182] ultoa::value#2 = phi( ultoa::@4/ultoa::value#6, ultoa/printf_slong::uvalue#0 )
[182] ultoa::digit#2 = phi( ultoa::@4/ultoa::digit#1, ultoa/0 )
[183] if(ultoa::digit#2<ultoa::max_digits#1-1) goto ultoa::@2
to:ultoa::@3
ultoa::@3: scope:[ultoa] from ultoa::@1
[184] ultoa::$11 = (char)ultoa::value#2
[185] *ultoa::buffer#11 = DIGITS[ultoa::$11]
[186] ultoa::buffer#3 = ++ ultoa::buffer#11
[187] *ultoa::buffer#3 = 0
to:ultoa::@return
ultoa::@return: scope:[ultoa] from ultoa::@3
[188] return
to:@return
ultoa::@2: scope:[ultoa] from ultoa::@1
[189] ultoa::$10 = ultoa::digit#2 << 2
[190] ultoa::digit_value#0 = RADIX_DECIMAL_VALUES_LONG[ultoa::$10]
[191] if(0!=ultoa::started#2) goto ultoa::@5
to:ultoa::@7
ultoa::@7: scope:[ultoa] from ultoa::@2
[192] if(ultoa::value#2>=ultoa::digit_value#0) goto ultoa::@5
to:ultoa::@4
ultoa::@4: scope:[ultoa] from ultoa::@6 ultoa::@7
[193] ultoa::buffer#14 = phi( ultoa::@7/ultoa::buffer#11, ultoa::@6/ultoa::buffer#4 )
[193] ultoa::started#4 = phi( ultoa::@7/ultoa::started#2, ultoa::@6/1 )
[193] ultoa::value#6 = phi( ultoa::@7/ultoa::value#2, ultoa::@6/ultoa::value#0 )
[194] ultoa::digit#1 = ++ ultoa::digit#2
to:ultoa::@1
ultoa::@5: scope:[ultoa] from ultoa::@2 ultoa::@7
[195] ultoa_append::buffer#0 = ultoa::buffer#11
[196] ultoa_append::value#0 = ultoa::value#2
[197] ultoa_append::sub#0 = ultoa::digit_value#0
[198] call ultoa_append
[199] ultoa_append::return#0 = ultoa_append::value#2
to:ultoa::@6
ultoa::@6: scope:[ultoa] from ultoa::@5
[200] ultoa::value#0 = ultoa_append::return#0
[201] ultoa::buffer#4 = ++ ultoa::buffer#11
to:ultoa::@4
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
utoa_append: scope:[utoa_append] from utoa::@10
[202] phi()
to:utoa_append::@1
utoa_append::@1: scope:[utoa_append] from utoa_append utoa_append::@2
[203] utoa_append::digit#2 = phi( utoa_append/0, utoa_append::@2/utoa_append::digit#1 )
[203] utoa_append::value#2 = phi( utoa_append/utoa_append::value#0, utoa_append::@2/utoa_append::value#1 )
[204] if(utoa_append::value#2>=utoa_append::sub#0) goto utoa_append::@2
to:utoa_append::@3
utoa_append::@3: scope:[utoa_append] from utoa_append::@1
[205] *utoa_append::buffer#0 = DIGITS[utoa_append::digit#2]
to:utoa_append::@return
utoa_append::@return: scope:[utoa_append] from utoa_append::@3
[206] return
to:@return
utoa_append::@2: scope:[utoa_append] from utoa_append::@1
[207] utoa_append::digit#1 = ++ utoa_append::digit#2
[208] utoa_append::value#1 = utoa_append::value#2 - utoa_append::sub#0
to:utoa_append::@1
unsigned int strlen(char *str)
strlen: scope:[strlen] from printf_number_buffer::@6
[209] phi()
to:strlen::@1
strlen::@1: scope:[strlen] from strlen strlen::@2
[210] strlen::len#2 = phi( strlen/0, strlen::@2/strlen::len#1 )
[210] strlen::str#3 = phi( strlen/(char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS, strlen::@2/strlen::str#0 )
[211] if(0!=*strlen::str#3) goto strlen::@2
to:strlen::@return
strlen::@return: scope:[strlen] from strlen::@1
[212] return
to:@return
strlen::@2: scope:[strlen] from strlen::@1
[213] strlen::len#1 = ++ strlen::len#2
[214] strlen::str#0 = ++ strlen::str#3
to:strlen::@1
void printf_padding(void (*putc)(char) , char pad , char length)
printf_padding: scope:[printf_padding] from printf_number_buffer::@10 printf_number_buffer::@12 printf_number_buffer::@8
[215] printf_padding::putc#7 = phi( printf_number_buffer::@10/printf_padding::putc#1, printf_number_buffer::@12/printf_padding::putc#2, printf_number_buffer::@8/printf_padding::putc#0 )
[215] printf_padding::pad#7 = phi( printf_number_buffer::@10/'0', printf_number_buffer::@12/' ', printf_number_buffer::@8/' ' )
[215] printf_padding::length#6 = phi( printf_number_buffer::@10/printf_padding::length#1, printf_number_buffer::@12/printf_padding::length#2, printf_number_buffer::@8/printf_padding::length#0 )
to:printf_padding::@1
printf_padding::@1: scope:[printf_padding] from printf_padding printf_padding::@3
[216] printf_padding::i#2 = phi( printf_padding/0, printf_padding::@3/printf_padding::i#1 )
[217] if(printf_padding::i#2<printf_padding::length#6) goto printf_padding::@2
to:printf_padding::@return
printf_padding::@return: scope:[printf_padding] from printf_padding::@1
[218] return
to:@return
printf_padding::@2: scope:[printf_padding] from printf_padding::@1
[219] stackpush(char) = printf_padding::pad#7
[220] callexecute *printf_padding::putc#7
sideeffect stackpullbytes(1)
to:printf_padding::@3
printf_padding::@3: scope:[printf_padding] from printf_padding::@2
[222] printf_padding::i#1 = ++ printf_padding::i#2
to:printf_padding::@1
char * strupr(char *str)
strupr: scope:[strupr] from printf_number_buffer::@11
[223] phi()
to:strupr::@1
strupr::@1: scope:[strupr] from strupr strupr::@3
[224] strupr::src#2 = phi( strupr/strupr::str#0, strupr::@3/strupr::src#1 )
[225] if(0!=*strupr::src#2) goto strupr::@2
to:strupr::@return
strupr::@return: scope:[strupr] from strupr::@1
[226] return
to:@return
strupr::@2: scope:[strupr] from strupr::@1
[227] toupper::ch#0 = *strupr::src#2
[228] call toupper
[229] toupper::return#3 = toupper::return#2
to:strupr::@3
strupr::@3: scope:[strupr] from strupr::@2
[230] strupr::$0 = toupper::return#3
[231] *strupr::src#2 = strupr::$0
[232] strupr::src#1 = ++ strupr::src#2
to:strupr::@1
unsigned long ultoa_append(char *buffer , unsigned long value , unsigned long sub)
ultoa_append: scope:[ultoa_append] from ultoa::@5
[233] phi()
to:ultoa_append::@1
ultoa_append::@1: scope:[ultoa_append] from ultoa_append ultoa_append::@2
[234] ultoa_append::digit#2 = phi( ultoa_append/0, ultoa_append::@2/ultoa_append::digit#1 )
[234] ultoa_append::value#2 = phi( ultoa_append/ultoa_append::value#0, ultoa_append::@2/ultoa_append::value#1 )
[235] if(ultoa_append::value#2>=ultoa_append::sub#0) goto ultoa_append::@2
to:ultoa_append::@3
ultoa_append::@3: scope:[ultoa_append] from ultoa_append::@1
[236] *ultoa_append::buffer#0 = DIGITS[ultoa_append::digit#2]
to:ultoa_append::@return
ultoa_append::@return: scope:[ultoa_append] from ultoa_append::@3
[237] return
to:@return
ultoa_append::@2: scope:[ultoa_append] from ultoa_append::@1
[238] ultoa_append::digit#1 = ++ ultoa_append::digit#2
[239] ultoa_append::value#1 = ultoa_append::value#2 - ultoa_append::sub#0
to:ultoa_append::@1
char toupper(char ch)
toupper: scope:[toupper] from strupr::@2
[240] if(toupper::ch#0<'a') goto toupper::@return
to:toupper::@2
toupper::@2: scope:[toupper] from toupper
[241] if(toupper::ch#0<='z') goto toupper::@1
to:toupper::@return
toupper::@1: scope:[toupper] from toupper::@2
[242] toupper::return#0 = toupper::ch#0 + 'A'-'a'
to:toupper::@return
toupper::@return: scope:[toupper] from toupper toupper::@1 toupper::@2
[243] toupper::return#2 = phi( toupper::@1/toupper::return#0, toupper/toupper::ch#0, toupper::@2/toupper::ch#0 )
[244] return
to:@return

9241
src/test/ref/printf-19.log Normal file

File diff suppressed because one or more lines are too long

304
src/test/ref/printf-19.sym Normal file
View File

@ -0,0 +1,304 @@
__constant char BINARY = 2
__constant char BUF[$14] = { fill( $14, 0) }
__constant char DECIMAL = $a
__constant char DIGITS[] = "0123456789abcdef"z
__constant char HEXADECIMAL = $10
__constant char OCTAL = 8
__constant char OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS = 1
__constant char RADIX::BINARY = 2
__constant char RADIX::DECIMAL = $a
__constant char RADIX::HEXADECIMAL = $10
__constant char RADIX::OCTAL = 8
__constant unsigned int RADIX_BINARY_VALUES[] = { $8000, $4000, $2000, $1000, $800, $400, $200, $100, $80, $40, $20, $10, 8, 4, 2 }
__constant unsigned int RADIX_DECIMAL_VALUES[] = { $2710, $3e8, $64, $a }
__constant unsigned long RADIX_DECIMAL_VALUES_LONG[] = { $3b9aca00, $5f5e100, $989680, $f4240, $186a0, $2710, $3e8, $64, $a }
__constant unsigned int RADIX_HEXADECIMAL_VALUES[] = { $1000, $100, $10 }
__constant unsigned int RADIX_OCTAL_VALUES[] = { $8000, $1000, $200, $40, 8 }
__constant char SIZEOF_STRUCT_PRINTF_BUFFER_NUMBER = $c
__constant unsigned int STACK_BASE = $103
__loadstore char *__snprintf_buffer // zp[2]:26 9.022222222222222
__loadstore volatile unsigned int __snprintf_capacity // zp[2]:22 6.48936170212766
__loadstore volatile unsigned int __snprintf_size // zp[2]:24 11.021739130434781
void __start()
void main()
__constant char main::s[$e] = "hello world! "
__constant char main::s1[7] = "hello "
__constant char main::s2[2] = " "
__constant char main::s4[2] = "+"
__constant char main::s5[3] = "! "
__constant char main::s6[4] = "hi "
__constant char main::str[6] = "world"
void print(char *msg)
char *print::msg
char *print::msg#0 // msg zp[2]:13 2002.0
char *print::msg#5 // msg zp[2]:13 1001.0
__loadstore struct printf_buffer_number printf_buffer = {} // mem[12]
void printf_number_buffer(void (*putc)(char) , char buffer_sign , char *buffer_digits , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
unsigned int printf_number_buffer::$19 // zp[2]:28 1001.0
struct printf_buffer_number printf_number_buffer::buffer
char *printf_number_buffer::buffer_digits
char printf_number_buffer::buffer_sign
char printf_number_buffer::buffer_sign#0 // buffer_sign zp[1]:8 202.0
char printf_number_buffer::buffer_sign#1 // buffer_sign zp[1]:8 202.0
char printf_number_buffer::buffer_sign#10 // buffer_sign zp[1]:8 157.42857142857142
char printf_number_buffer::buffer_sign#2 // buffer_sign zp[1]:8 202.0
struct printf_format_number printf_number_buffer::format
char printf_number_buffer::format_justify_left
char printf_number_buffer::format_justify_left#10 // format_justify_left zp[1]:4 60.666666666666664
char printf_number_buffer::format_min_length
char printf_number_buffer::format_min_length#3 // reg byte x 100.1
char printf_number_buffer::format_radix
char printf_number_buffer::format_sign_always
char printf_number_buffer::format_upper_case
char printf_number_buffer::format_upper_case#10 // format_upper_case zp[1]:6 35.75
char printf_number_buffer::format_zero_padding
char printf_number_buffer::format_zero_padding#10 // format_zero_padding zp[1]:5 88.32352941176471
signed char printf_number_buffer::len
signed char printf_number_buffer::len#0 // reg byte y 1501.5
signed char printf_number_buffer::len#1 // reg byte y 2002.0
signed char printf_number_buffer::len#2 // reg byte y 3003.0
signed char printf_number_buffer::padding
signed char printf_number_buffer::padding#1 // padding zp[1]:7 1001.0
signed char printf_number_buffer::padding#10 // padding zp[1]:7 166.83333333333334
void (*printf_number_buffer::putc)(char)
void (*printf_number_buffer::putc#10)(char) // putc zp[2]:13 111.22222222222223
void printf_padding(void (*putc)(char) , char pad , char length)
char printf_padding::i
char printf_padding::i#1 // i zp[1]:19 200002.0
char printf_padding::i#2 // i zp[1]:19 100001.0
char printf_padding::length
char printf_padding::length#0 // length zp[1]:17 2002.0
char printf_padding::length#1 // length zp[1]:17 2002.0
char printf_padding::length#2 // length zp[1]:17 2002.0
char printf_padding::length#6 // length zp[1]:17 20600.8
char printf_padding::pad
char printf_padding::pad#7 // pad zp[1]:18 16666.833333333332
void (*printf_padding::putc)(char)
void (*printf_padding::putc#0)(char) // putc zp[2]:13 1001.0
void (*printf_padding::putc#1)(char) // putc zp[2]:13 1001.0
void (*printf_padding::putc#2)(char) // putc zp[2]:13 1001.0
void (*printf_padding::putc#7)(char) // putc zp[2]:13 30030.0
void printf_sint(void (*putc)(char) , int value , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
struct printf_format_number printf_sint::format
char printf_sint::format_justify_left
__constant char printf_sint::format_justify_left#0 = 0 // format_justify_left
char printf_sint::format_min_length
__constant char printf_sint::format_min_length#0 = 0 // format_min_length
char printf_sint::format_radix
char printf_sint::format_sign_always
char printf_sint::format_upper_case
__constant char printf_sint::format_upper_case#0 = 0 // format_upper_case
char printf_sint::format_zero_padding
__constant char printf_sint::format_zero_padding#0 = 0 // format_zero_padding
void (*printf_sint::putc)(char)
__constant void (*printf_sint::putc#0)(char) = &snputc // putc
unsigned int printf_sint::uvalue
__constant unsigned int printf_sint::uvalue#0 = (unsigned int)printf_sint::value#1 // uvalue
int printf_sint::value
__constant int printf_sint::value#1 = 3 // value
void printf_slong(void (*putc)(char) , long value , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
struct printf_format_number printf_slong::format
char printf_slong::format_justify_left
__constant char printf_slong::format_justify_left#0 = 0 // format_justify_left
char printf_slong::format_min_length
__constant char printf_slong::format_min_length#0 = 0 // format_min_length
char printf_slong::format_radix
char printf_slong::format_sign_always
char printf_slong::format_upper_case
__constant char printf_slong::format_upper_case#0 = 0 // format_upper_case
char printf_slong::format_zero_padding
__constant char printf_slong::format_zero_padding#0 = 0 // format_zero_padding
void (*printf_slong::putc)(char)
__constant void (*printf_slong::putc#0)(char) = &snputc // putc
unsigned long printf_slong::uvalue
__constant unsigned long printf_slong::uvalue#0 = (unsigned long)printf_slong::value#1 // uvalue
long printf_slong::value
__constant long printf_slong::value#1 = $153158e // value
void printf_str(void (*putc)(char) , const char *s)
char printf_str::c
char printf_str::c#1 // reg byte a 100001.0
void (*printf_str::putc)(char)
void (*printf_str::putc#0)(char) // putc zp[2]:13 2002.0
void (*printf_str::putc#12)(char) // putc zp[2]:13 10010.0
const char *printf_str::s
const char *printf_str::s#0 // s zp[2]:20 100001.0
const char *printf_str::s#11 // s zp[2]:20 155002.0
const char *printf_str::s#12 // s zp[2]:20 10001.0
void printf_string(void (*putc)(char) , char *str , char format_min_length , char format_justify_left)
struct printf_format_string printf_string::format
char printf_string::format_justify_left
char printf_string::format_min_length
signed char printf_string::len
signed char printf_string::padding
void (*printf_string::putc)(char)
__constant void (*printf_string::putc#0)(char) = &snputc // putc
char *printf_string::str
void printf_uint(void (*putc)(char) , unsigned int uvalue , char format_min_length , char format_justify_left , char format_sign_always , char format_zero_padding , char format_upper_case , char format_radix)
struct printf_format_number printf_uint::format
char printf_uint::format_justify_left
__constant char printf_uint::format_justify_left#0 = 0 // format_justify_left
char printf_uint::format_min_length
__constant char printf_uint::format_min_length#0 = 0 // format_min_length
char printf_uint::format_radix
char printf_uint::format_sign_always
char printf_uint::format_upper_case
__constant char printf_uint::format_upper_case#0 = 0 // format_upper_case
char printf_uint::format_zero_padding
__constant char printf_uint::format_zero_padding#0 = 0 // format_zero_padding
void (*printf_uint::putc)(char)
__constant void (*printf_uint::putc#0)(char) = &snputc // putc
unsigned int printf_uint::uvalue
__constant unsigned int printf_uint::uvalue#0 = $b // uvalue
char *screen
char *screen#0 // screen zp[2]:2 1001.0
char *screen#1 // screen zp[2]:2 68.19565217391305
char *screen#25 // screen zp[2]:2 134.0
void snprintf_init(char *s , unsigned int n)
unsigned int snprintf_init::n
char *snprintf_init::s
__stackcall void snputc(char c)
__constant char snputc::OFFSET_STACK_C = 0
char snputc::c
char snputc::c#0 // reg byte x 40.4
char snputc::c#2 // reg byte x 202.0
unsigned int strlen(char *str)
unsigned int strlen::len
unsigned int strlen::len#1 // len zp[2]:28 100001.0
unsigned int strlen::len#2 // len zp[2]:28 50250.75
unsigned int strlen::return
unsigned int strlen::return#2 // return zp[2]:28 2002.0
char *strlen::str
char *strlen::str#0 // str zp[2]:15 200002.0
char *strlen::str#3 // str zp[2]:15 100001.0
char * strupr(char *str)
char strupr::$0 // reg byte a 200002.0
char *strupr::return
char *strupr::src
char *strupr::src#1 // src zp[2]:20 200002.0
char *strupr::src#2 // src zp[2]:20 71429.28571428571
char *strupr::str
__constant char *strupr::str#0 = (char *)&printf_buffer+OFFSET_STRUCT_PRINTF_BUFFER_NUMBER_DIGITS // str
char toupper(char ch)
char toupper::ch
char toupper::ch#0 // reg byte a 1700002.0000000002
char toupper::return
char toupper::return#0 // reg byte a 2000002.0
char toupper::return#2 // reg byte a 1033334.6666666667
char toupper::return#3 // reg byte a 200002.0
void ultoa(unsigned long value , char *buffer , char radix)
char ultoa::$10 // reg byte a 20002.0
char ultoa::$11 // reg byte a 2002.0
char *ultoa::buffer
char *ultoa::buffer#11 // buffer zp[2]:13 3000.4285714285716
char *ultoa::buffer#14 // buffer zp[2]:13 15001.5
char *ultoa::buffer#3 // buffer zp[2]:13 2002.0
char *ultoa::buffer#4 // buffer zp[2]:13 20002.0
char ultoa::digit
char ultoa::digit#1 // digit zp[1]:8 20002.0
char ultoa::digit#2 // digit zp[1]:8 2857.4285714285716
unsigned long ultoa::digit_value
unsigned long ultoa::digit_value#0 // digit_value zp[4]:30 6000.6
unsigned long *ultoa::digit_values
char ultoa::max_digits
__constant char ultoa::max_digits#1 = $a // max_digits
char ultoa::radix
char ultoa::started
char ultoa::started#2 // reg byte x 5000.5
char ultoa::started#4 // reg byte x 10001.0
unsigned long ultoa::value
unsigned long ultoa::value#0 // value zp[4]:9 10001.0
unsigned long ultoa::value#2 // value zp[4]:9 5714.857142857143
unsigned long ultoa::value#6 // value zp[4]:9 15001.5
unsigned long ultoa_append(char *buffer , unsigned long value , unsigned long sub)
char *ultoa_append::buffer
char *ultoa_append::buffer#0 // buffer zp[2]:13 13750.25
char ultoa_append::digit
char ultoa_append::digit#1 // reg byte x 1.0000001E7
char ultoa_append::digit#2 // reg byte x 1.00500015E7
unsigned long ultoa_append::return
unsigned long ultoa_append::return#0 // return zp[4]:9 20002.0
unsigned long ultoa_append::sub
unsigned long ultoa_append::sub#0 // sub zp[4]:30 3335000.5
unsigned long ultoa_append::value
unsigned long ultoa_append::value#0 // value zp[4]:9 36667.33333333333
unsigned long ultoa_append::value#1 // value zp[4]:9 2.0000002E7
unsigned long ultoa_append::value#2 // value zp[4]:9 5018334.166666666
void utoa(unsigned int value , char *buffer , char radix)
char utoa::$10 // reg byte a 20002.0
char utoa::$11 // reg byte x 2002.0
char utoa::$4 // reg byte a 20002.0
char *utoa::buffer
char *utoa::buffer#10 // buffer zp[2]:15 2800.4000000000005
char *utoa::buffer#15 // buffer zp[2]:15 15001.5
char *utoa::buffer#3 // buffer zp[2]:15 2002.0
char *utoa::buffer#4 // buffer zp[2]:15 20002.0
char utoa::digit
char utoa::digit#1 // digit zp[1]:5 20002.0
char utoa::digit#2 // digit zp[1]:5 2666.9333333333334
unsigned int utoa::digit_value
unsigned int utoa::digit_value#0 // digit_value zp[2]:28 6000.6
unsigned int *utoa::digit_values
unsigned int *utoa::digit_values#8 // digit_values zp[2]:20 588.2941176470588
char utoa::max_digits
char utoa::max_digits#7 // max_digits zp[1]:4 588.2941176470588
char utoa::radix
char utoa::radix#2 // reg byte x 1001.0
char utoa::started
char utoa::started#2 // reg byte x 4286.142857142857
char utoa::started#4 // reg byte x 10001.0
unsigned int utoa::value
unsigned int utoa::value#0 // value zp[2]:13 10001.0
unsigned int utoa::value#10 // value zp[2]:13 166.83333333333334
unsigned int utoa::value#3 // value zp[2]:13 5125.625
unsigned int utoa::value#7 // value zp[2]:13 15001.5
unsigned int utoa_append(char *buffer , unsigned int value , unsigned int sub)
char *utoa_append::buffer
char *utoa_append::buffer#0 // buffer zp[2]:15 13750.25
char utoa_append::digit
char utoa_append::digit#1 // reg byte x 1.0000001E7
char utoa_append::digit#2 // reg byte x 1.00500015E7
unsigned int utoa_append::return
unsigned int utoa_append::return#0 // return zp[2]:13 20002.0
unsigned int utoa_append::sub
unsigned int utoa_append::sub#0 // sub zp[2]:28 3335000.5
unsigned int utoa_append::value
unsigned int utoa_append::value#0 // value zp[2]:13 36667.33333333333
unsigned int utoa_append::value#1 // value zp[2]:13 2.0000002E7
unsigned int utoa_append::value#2 // value zp[2]:13 5018334.166666666
reg byte x [ snputc::c#2 snputc::c#0 ]
zp[2]:2 [ screen#25 screen#1 screen#0 ]
reg byte x [ utoa::radix#2 ]
reg byte x [ utoa::started#2 utoa::started#4 ]
reg byte x [ printf_number_buffer::format_min_length#3 ]
zp[1]:4 [ printf_number_buffer::format_justify_left#10 utoa::max_digits#7 ]
zp[1]:5 [ printf_number_buffer::format_zero_padding#10 utoa::digit#2 utoa::digit#1 ]
zp[1]:6 [ printf_number_buffer::format_upper_case#10 ]
reg byte y [ printf_number_buffer::len#2 printf_number_buffer::len#0 printf_number_buffer::len#1 ]
zp[1]:7 [ printf_number_buffer::padding#10 printf_number_buffer::padding#1 ]
zp[1]:8 [ ultoa::digit#2 ultoa::digit#1 printf_number_buffer::buffer_sign#10 printf_number_buffer::buffer_sign#1 printf_number_buffer::buffer_sign#0 printf_number_buffer::buffer_sign#2 ]
zp[4]:9 [ ultoa::value#2 ultoa::value#6 ultoa::value#0 ultoa_append::value#2 ultoa_append::value#0 ultoa_append::value#1 ultoa_append::return#0 ]
reg byte x [ ultoa::started#2 ultoa::started#4 ]
zp[2]:13 [ ultoa::buffer#11 ultoa::buffer#14 ultoa::buffer#4 ultoa::buffer#3 ultoa_append::buffer#0 utoa::value#3 utoa::value#7 utoa::value#10 utoa::value#0 utoa_append::value#2 utoa_append::value#0 utoa_append::value#1 utoa_append::return#0 print::msg#5 print::msg#0 printf_str::putc#12 printf_str::putc#0 printf_number_buffer::putc#10 printf_padding::putc#7 printf_padding::putc#1 printf_padding::putc#2 printf_padding::putc#0 ]
reg byte x [ utoa_append::digit#2 utoa_append::digit#1 ]
zp[2]:15 [ strlen::str#3 strlen::str#0 utoa::buffer#10 utoa::buffer#15 utoa::buffer#4 utoa::buffer#3 utoa_append::buffer#0 ]
zp[1]:17 [ printf_padding::length#6 printf_padding::length#1 printf_padding::length#2 printf_padding::length#0 ]
zp[1]:18 [ printf_padding::pad#7 ]
zp[1]:19 [ printf_padding::i#2 printf_padding::i#1 ]
zp[2]:20 [ strupr::src#2 strupr::src#1 utoa::digit_values#8 printf_str::s#11 printf_str::s#12 printf_str::s#0 ]
reg byte x [ ultoa_append::digit#2 ultoa_append::digit#1 ]
reg byte a [ toupper::return#2 toupper::return#0 toupper::ch#0 ]
zp[2]:22 [ __snprintf_capacity ]
zp[2]:24 [ __snprintf_size ]
zp[2]:26 [ __snprintf_buffer ]
reg byte a [ printf_str::c#1 ]
reg byte a [ utoa::$4 ]
reg byte x [ utoa::$11 ]
reg byte a [ utoa::$10 ]
zp[2]:28 [ utoa::digit_value#0 utoa_append::sub#0 strlen::len#2 strlen::len#1 strlen::return#2 printf_number_buffer::$19 ]
reg byte a [ ultoa::$11 ]
reg byte a [ ultoa::$10 ]
zp[4]:30 [ ultoa::digit_value#0 ultoa_append::sub#0 ]
reg byte a [ toupper::return#3 ]
reg byte a [ strupr::$0 ]
mem[12] [ printf_buffer ]