Chameleon

Chameleon Commit Details

Date:2012-01-24 19:51:24 (12 years 2 months ago)
Author:armel cadet-petit
Commit:1809
Parents: 1808
Message:fixed a bug in newStringWithFormat()
Changes:
M/branches/cparm/i386/libsa/prf.c
M/branches/cparm/i386/libsaio/console.c
M/branches/cparm/i386/libsa/libsa.h
M/branches/cparm/TODO

File differences

branches/cparm/TODO
11
22
33
4
5
46
57
68
TODO List for Chameleon Boot Loader
====================================
- (re-)Implement a watchdog library set (clear the watchdog at the right moment can avoid infinite loop made for unknow reasons by the compiler)
- Implement a Host like in bits to avoid some return issues
- Implement snprintf to avoid buffer overflow in some case
branches/cparm/i386/libsaio/console.c
254254
255255
256256
257
258
257
259258
260259
261
262
260
261
262
263
264
265
266
267
268
269
270
263271
264
265
266
267
268272
269273
270274
char *str = NULL;
va_start(ap, fmt);
pi.last_str = 0;
len = prf_fmt_str_len(fmt, ap);
len = prf(fmt, ap, NULL, NULL);
if (len > 0)
{
str = malloc(len+1);
if (!str) return NULL;
str = newEmptyStringWithLength(len);
if (str != NULL)
{
pi.last_str = 0;
pi.str = str;
prf(fmt, ap, sputc, &pi);
*pi.str = '\0';
}
}
pi.str = str;
prf(fmt, ap, sputc, &pi);
*pi.str = '\0';
va_end(ap);
return str;
branches/cparm/i386/libsa/libsa.h
114114
115115
116116
117
118
119
117
118
120119
121120
122121
/*
* prf.c
*/
extern void prf(const char * fmt, va_list ap, void (*putfn_p)(),
void * putfn_arg);
extern int prf_fmt_str_len(const char * fmt, va_list ap);
extern int prf(const char * fmt, va_list ap, void (*putfn_p)(),
void * putfn_arg);
/*
* printf.c
branches/cparm/i386/libsa/prf.c
9090
9191
9292
93
94
95
96
97
98
93
94
95
96
97
98
9999
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177100
178101
179102
......
183106
184107
185108
109
110
111
186112
187113
188114
......
224150
225151
226152
153
154
155
227156
228157
229158
230159
231160
161
162
163
232164
233165
234166
235
167
168
169
170
236171
172
237173
238174
175
176
177
239178
240179
241180
......
243182
244183
245184
246
185
while (cp > prbuf);
}
void prf(
char *fmt,
unsigned int *adx,
void (*putfn_p)(),
void *putfn_arg
)
int prf(
char *fmt,
unsigned int *adx,
void (*putfn_p)(),
void *putfn_arg
)
{
int b, c;
char *s;
int flag = 0, width = 0;
int minwidth;
loop:
while ((c = *fmt++) != '%') {
if(c == '\0')
return;
(*putfn_p)(c, putfn_arg);
}
minwidth = 0;
again:
c = *fmt++;
switch (c) {
case 'l':
goto again;
case ' ':
flag |= SPACE;
goto again;
case '0':
if (minwidth == 0) {
/* this is a flag */
flag |= ZERO;
goto again;
} /* fall through */
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
minwidth *= 10;
minwidth += c - '0';
goto again;
case 'X':
flag |= UCASE;
/* fall through */
case 'x':
b = 16;
goto number;
case 'd':
b = 10;
goto number;
case 'o': case 'O':
b = 8;
number:
printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg);
break;
case 's':
s = (char *)*adx;
while ((c = *s++)) {
(*putfn_p)(c, putfn_arg);
width++;
}
while (width++ < minwidth)
(*putfn_p)(' ', putfn_arg);
break;
case 'c':
(*putfn_p)((char)*adx, putfn_arg);
break;
default:
break;
}
adx++;
goto loop;
}
int prf_fmt_str_len(
char *fmt,
unsigned int *adx
)
{
int b, c, len =0;
char *s;
int flag = 0, width = 0;
while ((c = *fmt++) != '%') {
if(c == '\0')
return len;
if (putfn_p && putfn_arg) {
(*putfn_p)(c, putfn_arg);
}
len++;
}
minwidth = 0;
case 'o': case 'O':
b = 8;
number:
if (putfn_p && putfn_arg) {
printn((u_long)*adx, b, flag, minwidth, putfn_p, putfn_arg);
}
len++;
break;
case 's':
s = (char *)*adx;
while ((c = *s++)) {
if (putfn_p && putfn_arg) {
(*putfn_p)(c, putfn_arg);
}
len++;
width++;
}
while (width++ < minwidth)
while (width++ < minwidth) {
if (putfn_p && putfn_arg) {
(*putfn_p)(' ', putfn_arg);
}
len++;
}
break;
case 'c':
if (putfn_p && putfn_arg) {
(*putfn_p)((char)*adx, putfn_arg);
}
len++;
break;
default:
}
adx++;
goto loop;
}
}

Archive Download the corresponding diff file

Revision: 1809