110 lines
1.6 KiB
C
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;
|
|
} |