mirror of
https://gitlab.com/camelot/kickc.git
synced 2024-06-03 07:29:37 +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:
parent
46321d47f4
commit
fa678aac3d
|
@ -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++;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 {
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user