void printf(char *fmt, ...) { unsigned short bp; char **cp; char *fmtStr; int *ip; char tmp; bp = getbp(); //printf("bp = %x\n", bp); // For testing cp = (char**)(bp+4); //printf("cp = %x, *cp = %c\n", cp, **cp); // For testing fmtStr = *cp; //printf("fmtStr = %s", fmtStr); ip = (uint16_t *)(bp+6); //printf("ip = %x\n", ip); // For testing while(*fmtStr != 0) { if(*fmtStr == '%') { fmtStr++; switch(*fmtStr) { case 'c': tmp = (char)*ip; putc(tmp); break; case 's': prints((char *)(*ip)); break; case 'd': printd((int)*ip); break; case 'x': printx((uint16_t)*ip); break; case 'u': printu((uint16_t)*ip); break; case 'l': ip++; printu((uint32_t)*ip); break; default: prints(" Invalid format specifier "); break; } //fflush(stdout); ip++; } else { putc(*fmtStr); //fflush(stdout); if(*fmtStr == '\n') { putc('\r'); } } fmtStr++; } }
void myprintf(char *fmt, ...) { int i = 0; char *cp; int *bp; int *ip; int retPC; cp = fmt; bp = (int *)getbp(); ip = bp; retPC = *(ip++); // To make ip point to first argument, we have to iterate it by 2 ip += 2; i = 0; // We loop through the string. while(fmt[i] != '\0') { if(fmt[i] == '\n') // Case where character is a newline { putc('\n'); putc('\r'); } else if(fmt[i] == '%') // User wants to print either a char, string, int, etc. { char *cPtr = 0; switch(fmt[++i]) { case 's': cPtr = (char *)*ip; prints(cPtr); break; case 'u': printu(*ip); break; case 'd': printd(*ip); break; case 'o': printo(*ip); break; case 'x': printx(*ip); break; case 'c': putc(*ip); break; default: break; } ip++; } else { putc(fmt[i]); // Case where just a regular character } i++; } return; }