54 lines
1.2 KiB
C
54 lines
1.2 KiB
C
|
#include <stdio.h>
|
||
|
|
||
|
extern void printx(int);
|
||
|
extern void printd(int);
|
||
|
|
||
|
int myprintf(const char* format, ...) {
|
||
|
int* varArg = (int*)(&format + 1);
|
||
|
int varArgIndex = 0; // Offset by one
|
||
|
int i = 0;
|
||
|
|
||
|
char* varArgChar = (char*)(varArg);
|
||
|
char** varArgStr = (char**)(varArg);
|
||
|
int* varArgInt = (int*)(varArg);
|
||
|
|
||
|
while (format[i] != '\0') {
|
||
|
if (format[i] == '%') {
|
||
|
i++;
|
||
|
if (format[i] == 'c') {
|
||
|
// print var arg char.
|
||
|
putchar(varArgChar[varArgIndex]);
|
||
|
varArgIndex++;
|
||
|
} else if (format[i] == 's') {
|
||
|
// loop through each char of string in var arg.
|
||
|
int j = 0;
|
||
|
while (varArgStr[varArgIndex][j] != '\0') {
|
||
|
putchar(varArgStr[varArgIndex][j]);
|
||
|
j++;
|
||
|
}
|
||
|
varArgIndex++;
|
||
|
} else if (format[i] == 'x') {
|
||
|
// print the var arg's value in hex through assembly.
|
||
|
printx(varArgInt[varArgIndex]);
|
||
|
varArgIndex++;
|
||
|
} else if (format[i] == 'd') {
|
||
|
// print the var arg's value in decimal through assembly.
|
||
|
printd(varArgInt[varArgIndex]);
|
||
|
varArgIndex++;
|
||
|
} else if (format[i] == '%') {
|
||
|
// print an escaped percent symbol.
|
||
|
putchar('%');
|
||
|
} else {
|
||
|
printf("An invalid flag was encountered: %c.", format[i]);
|
||
|
return 1;
|
||
|
}
|
||
|
} else {
|
||
|
putchar(format[i]);
|
||
|
}
|
||
|
|
||
|
i++;
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|