diff options
author | Karl Kurbjun <kkurbjun@gmail.com> | 2007-06-03 22:03:36 +0000 |
---|---|---|
committer | Karl Kurbjun <kkurbjun@gmail.com> | 2007-06-03 22:03:36 +0000 |
commit | aec5814d436f6307dc3e6a1a09aa1ffec5709c27 (patch) | |
tree | 9d553317483ec7ef53dca7db931bd9f99ca7a5b8 /firmware/common/sscanf.c | |
parent | 7428b79de328dca03274ccfe08d59636eb6f8d51 (diff) | |
download | rockbox-aec5814d436f6307dc3e6a1a09aa1ffec5709c27.tar.gz rockbox-aec5814d436f6307dc3e6a1a09aa1ffec5709c27.zip |
Some fixes to doom dehacked loading - make embedded dehacked files actually load, fix end of file detection in the string loader, fix ammo changes, fix bex code pointers. Also added the * flag to sscanf - still only tested against rockdoom sscanf calls.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@13547 a1c6a512-1295-4272-9138-f99709370657
Diffstat (limited to 'firmware/common/sscanf.c')
-rw-r--r-- | firmware/common/sscanf.c | 74 |
1 files changed, 54 insertions, 20 deletions
diff --git a/firmware/common/sscanf.c b/firmware/common/sscanf.c index 66bf0dd354..5fbe81f3e0 100644 --- a/firmware/common/sscanf.c +++ b/firmware/common/sscanf.c | |||
@@ -27,7 +27,7 @@ static int parse_dec(int (*peek)(void *userp), | |||
27 | int n = 0; | 27 | int n = 0; |
28 | int minus = 0; | 28 | int minus = 0; |
29 | char ch; | 29 | char ch; |
30 | 30 | ||
31 | if ((*peek)(userp) == '-') | 31 | if ((*peek)(userp) == '-') |
32 | { | 32 | { |
33 | (*pop)(userp); | 33 | (*pop)(userp); |
@@ -54,19 +54,24 @@ static int parse_dec(int (*peek)(void *userp), | |||
54 | static int parse_chars(int (*peek)(void *userp), | 54 | static int parse_chars(int (*peek)(void *userp), |
55 | void (*pop)(void *userp), | 55 | void (*pop)(void *userp), |
56 | void *userp, | 56 | void *userp, |
57 | char *vp) | 57 | char *vp, |
58 | bool fake) | ||
58 | { | 59 | { |
59 | int n = 0; | 60 | int n = 0; |
61 | |||
60 | char *pt=vp; | 62 | char *pt=vp; |
61 | 63 | ||
62 | while (!isspace((*peek)(userp))) | 64 | while (!isspace((*peek)(userp))) |
63 | { | 65 | { |
64 | *(pt++) = (*peek)(userp); | 66 | if(fake==false) |
67 | *(pt++) = (*peek)(userp); | ||
68 | |||
65 | n++; | 69 | n++; |
66 | (*pop)(userp); | 70 | (*pop)(userp); |
67 | } | 71 | } |
68 | 72 | ||
69 | (*pt)='\0'; | 73 | if(fake==false) |
74 | (*pt)='\0'; | ||
70 | 75 | ||
71 | return n; | 76 | return n; |
72 | } | 77 | } |
@@ -125,24 +130,38 @@ static int scan(int (*peek)(void *userp), | |||
125 | int n_chars = 0; | 130 | int n_chars = 0; |
126 | int r; | 131 | int r; |
127 | long lval; | 132 | long lval; |
133 | bool skip=false; | ||
128 | unsigned long ulval; | 134 | unsigned long ulval; |
129 | 135 | ||
130 | while ((ch = *fmt++) != '\0') | 136 | while ((ch = *fmt++) != '\0') |
131 | { | 137 | { |
132 | bool literal = false; | 138 | bool literal = false; |
133 | 139 | ||
134 | if (ch == '%') | 140 | if (ch == '%') |
135 | { | 141 | { |
136 | ch = *fmt++; | 142 | ch = *fmt++; |
137 | 143 | ||
144 | if(ch== '*') /* We should process this, but not store it in an arguement */ | ||
145 | { | ||
146 | ch=*fmt++; | ||
147 | skip=true; | ||
148 | } | ||
149 | else | ||
150 | { | ||
151 | skip=false; | ||
152 | } | ||
153 | |||
138 | switch (ch) | 154 | switch (ch) |
139 | { | 155 | { |
140 | case 'x': | 156 | case 'x': |
141 | n_chars += skip_spaces(peek, pop, userp); | 157 | n_chars += skip_spaces(peek, pop, userp); |
142 | if ((r = parse_hex(peek, pop, userp, &ulval)) >= 0) | 158 | if ((r = parse_hex(peek, pop, userp, &ulval)) >= 0) |
143 | { | 159 | { |
144 | *(va_arg(ap, unsigned int *)) = ulval; | 160 | if(skip==false) |
145 | n++; | 161 | { |
162 | *(va_arg(ap, unsigned int *)) = ulval; | ||
163 | n++; | ||
164 | } | ||
146 | n_chars += r; | 165 | n_chars += r; |
147 | } | 166 | } |
148 | else | 167 | else |
@@ -152,16 +171,22 @@ static int scan(int (*peek)(void *userp), | |||
152 | n_chars += skip_spaces(peek, pop, userp); | 171 | n_chars += skip_spaces(peek, pop, userp); |
153 | if ((r = parse_dec(peek, pop, userp, &lval)) >= 0) | 172 | if ((r = parse_dec(peek, pop, userp, &lval)) >= 0) |
154 | { | 173 | { |
155 | *(va_arg(ap, int *)) = lval; | 174 | if(skip==false) |
156 | n++; | 175 | { |
176 | *(va_arg(ap, int *)) = lval; | ||
177 | n++; | ||
178 | } | ||
157 | n_chars += r; | 179 | n_chars += r; |
158 | } | 180 | } |
159 | else | 181 | else |
160 | return n; | 182 | return n; |
161 | break; | 183 | break; |
162 | case 'n': | 184 | case 'n': |
163 | *(va_arg(ap, int *)) = n_chars; | 185 | if(skip==false) |
164 | n++; | 186 | { |
187 | *(va_arg(ap, int *)) = n_chars; | ||
188 | n++; | ||
189 | } | ||
165 | break; | 190 | break; |
166 | case 'l': | 191 | case 'l': |
167 | n_chars += skip_spaces(peek, pop, userp); | 192 | n_chars += skip_spaces(peek, pop, userp); |
@@ -171,8 +196,11 @@ static int scan(int (*peek)(void *userp), | |||
171 | case 'x': | 196 | case 'x': |
172 | if ((r = parse_hex(peek, pop, userp, &ulval)) >= 0) | 197 | if ((r = parse_hex(peek, pop, userp, &ulval)) >= 0) |
173 | { | 198 | { |
174 | *(va_arg(ap, unsigned long *)) = ulval; | 199 | if(skip==false) |
175 | n++; | 200 | { |
201 | *(va_arg(ap, unsigned long *)) = ulval; | ||
202 | n++; | ||
203 | } | ||
176 | n_chars += r; | 204 | n_chars += r; |
177 | } | 205 | } |
178 | else | 206 | else |
@@ -181,8 +209,11 @@ static int scan(int (*peek)(void *userp), | |||
181 | case 'd': | 209 | case 'd': |
182 | if ((r = parse_dec(peek, pop, userp, &lval)) >= 0) | 210 | if ((r = parse_dec(peek, pop, userp, &lval)) >= 0) |
183 | { | 211 | { |
184 | *(va_arg(ap, long *)) = lval; | 212 | if(skip==false) |
185 | n++; | 213 | { |
214 | *(va_arg(ap, long *)) = lval; | ||
215 | n++; | ||
216 | } | ||
186 | n_chars += r; | 217 | n_chars += r; |
187 | } | 218 | } |
188 | else | 219 | else |
@@ -195,10 +226,13 @@ static int scan(int (*peek)(void *userp), | |||
195 | break; | 226 | break; |
196 | } | 227 | } |
197 | break; | 228 | break; |
198 | case 's': | 229 | case 's': |
199 | n_chars += skip_spaces(peek, pop, userp); | 230 | n_chars += skip_spaces(peek, pop, userp); |
200 | n_chars += parse_chars(peek,pop, userp,va_arg(ap, char *) ); | 231 | n_chars += parse_chars(peek,pop, userp,skip?0:va_arg(ap, char *), skip ); |
201 | n++; | 232 | if(skip==false) |
233 | { | ||
234 | n++; | ||
235 | } | ||
202 | break; | 236 | break; |
203 | case '\0': | 237 | case '\0': |
204 | return n; | 238 | return n; |
@@ -239,7 +273,7 @@ int sscanf(const char *s, const char *fmt, ...) | |||
239 | int r; | 273 | int r; |
240 | va_list ap; | 274 | va_list ap; |
241 | const char *p; | 275 | const char *p; |
242 | 276 | ||
243 | p = s; | 277 | p = s; |
244 | va_start(ap, fmt); | 278 | va_start(ap, fmt); |
245 | r = scan(sspeek, sspop, &p, fmt, ap); | 279 | r = scan(sspeek, sspop, &p, fmt, ap); |