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