1
0
mirror of https://gitlab.com/camelot/kickc.git synced 2024-06-02 00:41:42 +00:00

- Rework printf to include printf in libraries. printf_type functions don't user anymore the format structure, but all formatting is passed as parameters.

This commit is contained in:
Sven Van de Velde 2023-12-16 19:12:46 +01:00
parent 46321d47f4
commit fa678aac3d
3 changed files with 55 additions and 50 deletions

View File

@ -265,16 +265,12 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
// char upper_case; // Upper-case the letters in the number
// enum RADIX radix; // The number radix to use for formatting
// };
final ValueList format_number_struct =
new ValueList(Arrays.asList(
new ConstantInteger(width, SymbolType.BYTE),
new ConstantInteger(leftJustify, SymbolType.BYTE),
new ConstantInteger(signAlways, SymbolType.BYTE),
new ConstantInteger(zeroPadding, SymbolType.BYTE),
new ConstantInteger(upperCase, SymbolType.BYTE),
radix
));
addPrintfCall(printf_number_procedure, Arrays.asList(putcRef, getParameterValue(parameters, paramIdx, printfCall), format_number_struct), stmtIt, printfCall);
final ConstantInteger widthParameter = new ConstantInteger(width, SymbolType.BYTE);
final ConstantInteger leftJustifyParameter = new ConstantInteger(leftJustify, SymbolType.BYTE);
final ConstantInteger signAlwaysParameter = new ConstantInteger(signAlways, SymbolType.BYTE);
final ConstantInteger zeroPaddingParameter = new ConstantInteger(zeroPadding, SymbolType.BYTE);
final ConstantInteger upperCaseParameter = new ConstantInteger(upperCase, SymbolType.BYTE);
addPrintfCall(printf_number_procedure, Arrays.asList(putcRef, getParameterValue(parameters, paramIdx, printfCall), widthParameter, leftJustifyParameter, signAlwaysParameter, zeroPaddingParameter, upperCaseParameter, radix), stmtIt, printfCall);
paramIdx++;
} else if(typeField.equals("c")) {
// Print char
@ -291,7 +287,13 @@ public class Pass1PrintfIntrinsicRewrite extends Pass2SsaOptimization {
new ConstantInteger(upperCase, SymbolType.BYTE),
getProgramScope().getLocalConstant(HEXADECIMAL).getRef()
));
addPrintfCall(PRINTF_UINT, Arrays.asList(putcRef, new CastValue(SymbolType.WORD, getParameterValue(parameters, paramIdx, printfCall)), format_number_struct), stmtIt, printfCall);
final ConstantInteger widthParameter = new ConstantInteger(width, SymbolType.BYTE);
final ConstantInteger leftJustifyParameter = new ConstantInteger(leftJustify, SymbolType.BYTE);
final ConstantInteger signAlwaysParameter = new ConstantInteger(signAlways, SymbolType.BYTE);
final ConstantInteger zeroPaddingParameter = new ConstantInteger(zeroPadding, SymbolType.BYTE);
final ConstantInteger upperCaseParameter = new ConstantInteger(upperCase, SymbolType.BYTE);
final SymbolVariableRef radix = getProgramScope().getLocalConstant(HEXADECIMAL).getRef();
addPrintfCall(PRINTF_UINT, Arrays.asList(putcRef, new CastValue(SymbolType.WORD, getParameterValue(parameters, paramIdx, printfCall)), widthParameter, leftJustifyParameter, signAlwaysParameter, zeroPaddingParameter, upperCaseParameter, radix), stmtIt, printfCall);
paramIdx++;
}
}

View File

@ -39,26 +39,26 @@ struct printf_buffer_number {
};
/// Print a signed long using a specific format
void printf_slong(void (*putc)(char), signed long value, struct printf_format_number format);
void printf_slong(void (*putc)(char), signed 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);
/// Print an unsigned int using a specific format
void printf_ulong(void (*putc)(char), unsigned long uvalue, struct printf_format_number format);
void printf_ulong(void (*putc)(char), unsigned long uvalue, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix);
/// Print a signed integer using a specific format
void printf_sint(void (*putc)(char), signed int value, struct printf_format_number format);
void printf_sint(void (*putc)(char), signed 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);
/// Print an unsigned int using a specific format
void printf_uint(void (*putc)(char), unsigned int uvalue, struct printf_format_number format);
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);
/// Print a signed char using a specific format
void printf_schar(void (*putc)(char), signed char value, struct printf_format_number format);
void printf_schar(void (*putc)(char), signed char value, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix);
/// Print an unsigned char using a specific format
void printf_uchar(void (*putc)(char), unsigned char uvalue, struct printf_format_number format);
void printf_uchar(void (*putc)(char), unsigned char uvalue, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix);
/// Print the contents of the number buffer using a specific format.
/// This handles minimum length, zero-filling, and left/right justification from the format
void printf_number_buffer(void (*putc)(char), struct printf_buffer_number buffer, struct printf_format_number format);
void printf_number_buffer(void (*putc)(char), struct printf_buffer_number buffer, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix);
/// Format specifying how to format a printed string
struct printf_format_string {

View File

@ -25,7 +25,7 @@ void printf_padding(void (*putc)(char), char pad, char length) {
}
// Print a signed long using a specific format
void printf_slong(void (*putc)(char), signed long value, struct printf_format_number format) {
void printf_slong(void (*putc)(char), signed 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) {
// Handle any sign
printf_buffer.sign = 0;
if(value<0) {
@ -34,28 +34,29 @@ void printf_slong(void (*putc)(char), signed long value, struct printf_format_nu
printf_buffer.sign = '-';
} else {
// Positive
if(format.sign_always)
if(format_sign_always)
printf_buffer.sign = '+';
}
// Format number into buffer
unsigned long uvalue = (unsigned long)value;
ultoa(uvalue, printf_buffer.digits, format.radix);
ultoa(uvalue, printf_buffer.digits, format_radix);
// Print using format
printf_number_buffer(putc, printf_buffer, format);
printf_number_buffer(putc, printf_buffer, format_min_length, format_justify_left, format_sign_always, format_zero_padding, format_upper_case, format_radix);
}
// Print an unsigned int using a specific format
void printf_ulong(void (*putc)(char), unsigned long uvalue, struct printf_format_number format) {
void printf_ulong(void (*putc)(char), unsigned long uvalue, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix) {
// Handle any sign
printf_buffer.sign = format.sign_always?'+':0;
printf_buffer.sign = format_sign_always?'+':0;
// Format number into buffer
ultoa(uvalue, printf_buffer.digits, format.radix);
ultoa(uvalue, printf_buffer.digits, format_radix);
// Print using format
printf_number_buffer(putc, printf_buffer, format);
printf_number_buffer(putc, printf_buffer, format_min_length, format_justify_left, format_sign_always, format_zero_padding, format_upper_case, format_radix);
}
// Print a signed integer using a specific format
void printf_sint(void (*putc)(char), signed int value, struct printf_format_number format) {
// // Print a signed integer using a specific format
void printf_sint(void (*putc)(char), signed 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) {
// Handle any sign
printf_buffer.sign = 0;
if(value<0) {
@ -64,28 +65,30 @@ void printf_sint(void (*putc)(char), signed int value, struct printf_format_numb
printf_buffer.sign = '-';
} else {
// Positive
if(format.sign_always)
if(format_sign_always)
printf_buffer.sign = '+';
}
// Format number into buffer
unsigned int uvalue = (unsigned int)value;
utoa(uvalue, printf_buffer.digits, format.radix);
utoa(uvalue, printf_buffer.digits, format_radix);
// Print using format
printf_number_buffer(putc, printf_buffer, format);
printf_number_buffer(putc, printf_buffer, format_min_length, format_justify_left, format_sign_always, format_zero_padding, format_upper_case, format_radix);
}
// Print an unsigned int using a specific format
void printf_uint(void (*putc)(char), unsigned int uvalue, struct printf_format_number format) {
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) {
// void printf_uint(void (*putc)(char), unsigned int uvalue, struct printf_format_number format) {
// Handle any sign
printf_buffer.sign = format.sign_always?'+':0;
printf_buffer.sign = format_sign_always?'+':0;
// Format number into buffer
utoa(uvalue, printf_buffer.digits, format.radix);
utoa(uvalue, printf_buffer.digits, format_radix);
// Print using format
printf_number_buffer(putc, printf_buffer, format);
printf_number_buffer(putc, printf_buffer, format_min_length, format_justify_left, format_sign_always, format_zero_padding, format_upper_case, format_radix);
}
// Print a signed char using a specific format
void printf_schar(void (*putc)(char), signed char value, struct printf_format_number format) {
void printf_schar(void (*putc)(char), signed char value, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix) {
// Handle any sign
printf_buffer.sign = 0;
if(value<0) {
@ -94,48 +97,48 @@ void printf_schar(void (*putc)(char), signed char value, struct printf_format_nu
printf_buffer.sign = '-';
} else {
// Positive
if(format.sign_always)
if(format_sign_always)
printf_buffer.sign = '+';
}
// Format number into buffer
unsigned char uvalue = (unsigned char)value;
uctoa(uvalue, printf_buffer.digits, format.radix);
uctoa(uvalue, printf_buffer.digits, format_radix);
// Print using format
printf_number_buffer(putc, printf_buffer, format);
printf_number_buffer(putc, printf_buffer, format_min_length, format_justify_left, format_sign_always, format_zero_padding, format_upper_case, format_radix);
}
// Print an unsigned char using a specific format
void printf_uchar(void (*putc)(char), unsigned char uvalue, struct printf_format_number format) {
void printf_uchar(void (*putc)(char), unsigned char uvalue, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix) {
// Handle any sign
printf_buffer.sign = format.sign_always?'+':0;
printf_buffer.sign = format_sign_always?'+':0;
// Format number into buffer
uctoa(uvalue, printf_buffer.digits, format.radix);
uctoa(uvalue, printf_buffer.digits, format_radix);
// Print using format
printf_number_buffer(putc, printf_buffer, format);
printf_number_buffer(putc, printf_buffer, format_min_length, format_justify_left, format_sign_always, format_zero_padding, format_upper_case, format_radix);
}
// Print the contents of the number buffer using a specific format.
// This handles minimum length, zero-filling, and left/right justification from the format
void printf_number_buffer(void (*putc)(char), struct printf_buffer_number buffer, struct printf_format_number format) {
void printf_number_buffer(void (*putc)(char), struct printf_buffer_number buffer, char format_min_length, char format_justify_left, char format_sign_always, char format_zero_padding, char format_upper_case, char format_radix) {
signed char padding = 0;
if(format.min_length) {
if(format_min_length) {
// There is a minimum length - work out the padding
signed char len = (signed char)strlen(buffer.digits);
if(buffer.sign) len++;
padding = (signed char)format.min_length - len;
padding = (signed char)format_min_length - len;
if(padding<0) padding = 0;
}
if(!format.justify_left && !format.zero_padding && padding)
if(!format_justify_left && !format_zero_padding && padding)
printf_padding(putc, ' ',(char)padding);
if(buffer.sign)
putc(buffer.sign);
if(format.zero_padding && padding)
if(format_zero_padding && padding)
printf_padding(putc, '0',(char)padding);
if(format.upper_case) {
if(format_upper_case) {
strupr(buffer.digits);
}
printf_str(putc, buffer.digits);
if(format.justify_left && !format.zero_padding && padding)
if(format_justify_left && !format_zero_padding && padding)
printf_padding(putc, ' ',(char)padding);
}