-
Notifications
You must be signed in to change notification settings - Fork 0
/
stdlib.c
121 lines (108 loc) · 1.95 KB
/
stdlib.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include <stdarg.h>
#include "stdlib.h"
volatile int *uart_write_reg = (int*)0x10000;
volatile int *uart_read_reg = (int*)0x10004;
int getchar()
{
int reg, isempty;
for(;;) {
reg = *uart_read_reg;
isempty = reg >> 8;
if (!isempty)
return reg & 0xff;
}
}
void putchar(int c)
{
// Ensure there's room in the tx buffer.
while(*uart_write_reg);
*uart_write_reg = c;
}
void puts(char *s)
{
char c;
while (c = *(s++))
putchar(c);
}
void print_uint(unsigned int i)
{
char buf[10]; // Build the string here in reverse
char *ptr;
for (ptr=buf;; ptr++) {
*ptr = '0' + i % 10;
i /= 10;
if (i==0) break;
}
// Copy to an output buffer (with length >= 11).
/* while (ptr >= buf) */
/* *dst++ = *ptr--; */
/* *dst = '\0'; */
while (ptr >= buf)
putchar(*ptr--);
}
// Based in `minprintf` in K&R.
void printf(char *fmt, ...)
{
va_list ap;
char *p, *sval;
int ival;
va_start(ap, fmt);
for (p = fmt; *p; p++) {
if (*p != '%') {
putchar(*p);
continue;
}
switch (*++p) {
case 'd':
ival = va_arg(ap, int);
print_uint(ival);
break;
case 's':
sval = va_arg(ap, char*);
puts(sval);
break;
case 'c':
ival = va_arg(ap, int);
putchar(ival);
break;
}
}
va_end(ap);
}
// Very simple memory allocation. See `alloc` in K&R.
#define ALLOCSIZE 128
static char allocbuf[ALLOCSIZE];
static char *allocp = allocbuf;
char* malloc(int n)
{
char *p;
if (allocbuf + ALLOCSIZE - allocp >= n) {
p = allocp;
allocp += n;
return p;
} else
return 0;
}
unsigned int time(void)
{
return *(unsigned int*)mtime;
}
void sleep(unsigned int ms)
{
unsigned int start;
start = time();
while (time() - start < ms);
}
// See K&R.
void strcpy(char *s, char *t)
{
while (*s++ = *t++);
}
// See K&R.
int strcmp(char *s, char *t)
{
for (; *s == *t; s++, t++)
if (*s == '\0') /* == *t */
return 0;
return *s - *t;
}