cs250/lab8-src/myprintf.c
2018-10-15 17:22:49 -04:00

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;
}