MIPS/resources/project/lib/stdio.c
2021-08-14 20:18:43 +08:00

110 lines
1.6 KiB
C

#include "tiny.h"
int putchar(char c)
{
WRITESERIAL(c);
return c;
}
char* itoa(int num, char* str, int base)
{
if (num == 0 || base <= 1)
{
str[0] = '0';
str[1] = '\0';
return str;
}
int neg = 0, i = 0;
if (num < 0 && base == 10)
{
neg = 1;
num = -num;
}
while (num != 0)
{
int rem = num % base;
str[i] = (rem > 9) ? (rem - 10) + 'A' : rem + '0';
num /= base;
i++;
}
if (neg == 1)
{
str[i++] = '-';
str[i] = '\0';
}
else
str[i] = '\0';
i--;
int start = 0;
while (start < i)
{
char tmp = *(str + i);
*(str + i) = *(str + start);
*(str + start) = tmp;
start++;
i--;
}
return str;
}
int vsprintf(char* buf, const char* fmt, va_list args)
{
char* p;
char tmp[256];
va_list p_next_arg = args;
for (p = buf; *fmt; fmt++)
{
if (*fmt != '%')
{
*p++ = *fmt;
continue;
}
fmt++;
switch (*fmt)
{
case 'x':
// itoa(tmp, *((int *)p_next_arg));
itox(*((int*)p_next_arg), tmp, 16);
strcpy(p, tmp);
p_next_arg += 4;
p += strlen(tmp);
break;
case 'd':
itox(*((int*)p_next_arg), tmp, 10);
strcpy(p, tmp);
p_next_arg += 4;
p += strlen(tmp);
break;
case 's':
strcpy(p, (char*)(*((unsigned*)p_next_arg)));
p += strlen((char*)(*((unsigned*)p_next_arg)));
p_next_arg += 4;
break;
default:
break;
}
}
return (p - buf);
}
int printf(const char* fmt, ...)
{
int i;
char buf[256];
va_list arg = (va_list)((char*)(&fmt) + 4); /*4是参数fmt所占堆栈中的大小*/
i = vsprintf(buf, fmt, arg);
write(buf, i);
return i;
}