24.01.2014 Views

Codice

Codice

Codice

SHOW MORE
SHOW LESS

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

324 volume VI os16<br />

Sorgenti della libreria generale 325<br />

2810115 | //<br />

2810116 | // Calculate end input.<br />

2810117 | //<br />

2810118 | end_input = input + (strlen (input));<br />

2810119 | //<br />

2810120 | // Scan format and input strings. Index ‘f’ is not reset.<br />

2810121 | //<br />

2810122 | while (&format[f] < end_format && input < end_input)<br />

2810123 | {<br />

2810124 | if (!specifier)<br />

2810125 | {<br />

2810126 | //--------------- The context is not inside a specifier.<br />

2810127 | if (isspace (format[f]))<br />

2810128 | {<br />

2810129 | //------------------------------------------- Space.<br />

2810130 | while (isspace (*input))<br />

2810131 | {<br />

2810132 | input++;<br />

2810133 | }<br />

2810134 | //<br />

2810135 | // Verify that the input string is not finished.<br />

2810136 | //<br />

2810137 | if (input[0] == 0)<br />

2810138 | {<br />

2810139 | //<br />

2810140 | // As the input string is finished, the format<br />

2810141 | // string index is not advanced, because there<br />

2810142 | // might be more spaces on the next line (if<br />

2810143 | // there is a next line, of course).<br />

2810144 | //<br />

2810145 | continue;<br />

2810146 | }<br />

2810147 | else<br />

2810148 | {<br />

2810149 | f++;<br />

2810150 | continue;<br />

2810151 | }<br />

2810152 | }<br />

2810153 | if (format[f] != ’%’)<br />

2810154 | {<br />

2810155 | //------------------------------ Ordinary character.<br />

2810156 | if (format[f] == *input)<br />

2810157 | {<br />

2810158 | input++;<br />

2810159 | f++;<br />

2810160 | continue;<br />

2810161 | }<br />

2810162 | else<br />

2810163 | {<br />

2810164 | return (ass_or_eof (consumed, assigned));<br />

2810165 | }<br />

2810166 | }<br />

2810167 | if (format[f] == ’%’ && format[f+1] == ’%’)<br />

2810168 | {<br />

2810169 | //-------------------------- Matching a literal ’%’.<br />

2810170 | f++;<br />

2810171 | if (format[f] == *input)<br />

2810172 | {<br />

2810173 | input++;<br />

2810174 | f++;<br />

2810175 | continue;<br />

2810176 | }<br />

2810177 | else<br />

2810178 | {<br />

2810179 | return (ass_or_eof (consumed, assigned));<br />

2810180 | }<br />

2810181 | }<br />

2810182 | if (format[f] == ’%’)<br />

2810183 | {<br />

2810184 | //-------------------------- Percent of a specifier.<br />

2810185 | f++;<br />

2810186 | specifier = 1;<br />

2810187 | specifier_flags = 1;<br />

2810188 | continue;<br />

2810189 | }<br />

2810190 | }<br />

2810191 | //<br />

2810192 | if (specifier && specifier_flags)<br />

2810193 | {<br />

2810194 | //--------------- The context is inside specifier flags.<br />

2810195 | if (format[f] == ’*’)<br />

2810196 | {<br />

2810197 | //--------------------- Assignment suppression star.<br />

2810198 | flag_star = 1;<br />

2810199 | f++;<br />

2810200 | }<br />

2810201 | else<br />

2810202 | {<br />

2810203 | //----- End of flags and begin of specifier length.<br />

2810204 | specifier_flags = 0;<br />

2810205 | specifier_width = 1;<br />

2810206 | }<br />

2810207 | }<br />

2810208 | //<br />

2810209 | if (specifier && specifier_width)<br />

2810210 | {<br />

2810211 | //------------- The context is inside a specifier width.<br />

2810212 | for (w = 0;<br />

2810213 | format[f] >= ’0’<br />

2810214 | && format[f] WIDTH_MAX)<br />

2810224 | {<br />

2810225 | width = WIDTH_MAX;<br />

2810226 | }<br />

2810227 | //<br />

2810228 | // A zero width means an unspecified limit for the field<br />

2810229 | // length.<br />

2810230 | //<br />

2810231 | //--------- End of spec. width and begin of spec. type.<br />

2810232 | specifier_width = 0;<br />

2810233 | specifier_type = 1;<br />

2810234 | }<br />

2810235 | //<br />

2810236 | if (specifier && specifier_type)<br />

2810237 | {<br />

2810238 | //<br />

2810239 | // Specifiers with length modifier.<br />

2810240 | //<br />

2810241 | if (format[f] == ’h’ && format[f+1] == ’h’)<br />

2810242 | {<br />

2810243 | //-------------------------------------------- char.<br />

2810244 | if (format[f+2] == ’d’)<br />

2810245 | {<br />

2810246 | //------------------------ signed char, base 10.<br />

2810247 | value_i = strtointmax (input, &next, 10, width);<br />

2810248 | if (input == next)<br />

2810249 | {<br />

2810250 | return (ass_or_eof (consumed, assigned));<br />

2810251 | }<br />

2810252 | consumed++;<br />

2810253 | if (!flag_star)<br />

2810254 | {<br />

2810255 | ptr_schar = va_arg (ap, signed char *);<br />

2810256 | *ptr_schar = value_i;<br />

2810257 | assigned++;<br />

2810258 | }<br />

2810259 | f += 3;<br />

2810260 | input = next;<br />

2810261 | }<br />

2810262 | else if (format[f+2] == ’i’)<br />

2810263 | {<br />

2810264 | //------------------- signed char, base unknown.<br />

2810265 | value_i = strtointmax (input, &next, 0, width);<br />

2810266 | if (input == next)<br />

2810267 | {<br />

2810268 | return (ass_or_eof (consumed, assigned));<br />

2810269 | }<br />

2810270 | consumed++;<br />

2810271 | if (!flag_star)<br />

2810272 | {<br />

2810273 | ptr_schar = va_arg (ap, signed char *);<br />

2810274 | *ptr_schar = value_i;<br />

2810275 | assigned++;<br />

2810276 | }<br />

2810277 | f += 3;<br />

2810278 | input = next;<br />

2810279 | }<br />

2810280 | else if (format[f+2] == ’o’)<br />

2810281 | {<br />

2810282 | //------------------------- signed char, base 8.<br />

2810283 | value_i = strtointmax (input, &next, 8, width);<br />

2810284 | if (input == next)<br />

2810285 | {<br />

2810286 | return (ass_or_eof (consumed, assigned));<br />

2810287 | }<br />

2810288 | consumed++;<br />

2810289 | if (!flag_star)<br />

2810290 | {<br />

2810291 | ptr_schar = va_arg (ap, signed char *);<br />

2810292 | *ptr_schar = value_i;<br />

2810293 | assigned++;<br />

2810294 | }<br />

2810295 | f += 3;<br />

2810296 | input = next;<br />

2810297 | }<br />

2810298 | else if (format[f+2] == ’u’)<br />

2810299 | {<br />

2810300 | //---------------------- unsigned char, base 10.<br />

2810301 | value_u = strtointmax (input, &next, 10, width);<br />

2810302 | if (input == next)<br />

2810303 | {<br />

2810304 | return (ass_or_eof (consumed, assigned));<br />

2810305 | }<br />

2810306 | consumed++;<br />

2810307 | if (!flag_star)<br />

2810308 | {<br />

2810309 | ptr_uchar = va_arg (ap, unsigned char *);<br />

2810310 | *ptr_uchar = value_u;<br />

2810311 | assigned++;<br />

2810312 | }<br />

2810313 | f += 3;<br />

2810314 | input = next;<br />

2810315 | }<br />

2810316 | else if (format[f+2] == ’x’ || format[f+2] == ’X’)<br />

2810317 | {<br />

2810318 | //------------------------ signed char, base 16.<br />

2810319 | value_i = strtointmax (input, &next, 16, width);<br />

2810320 | if (input == next)<br />

2810321 | {<br />

2810322 | return (ass_or_eof (consumed, assigned));<br />

2810323 | }<br />

2810324 | consumed++;<br />

2810325 | if (!flag_star)<br />

2810326 | {<br />

2810327 | ptr_schar = va_arg (ap, signed char *);<br />

2810328 | *ptr_schar = value_i;<br />

2810329 | assigned++;<br />

2810330 | }<br />

2810331 | f += 3;<br />

2810332 | input = next;<br />

2810333 | }<br />

2810334 | else if (format[f+2] == ’n’)<br />

2810335 | {<br />

2810336 | //----------- signed char, string index counter.<br />

2810337 | ptr_schar = va_arg (ap, signed char *);<br />

2810338 | *ptr_schar = (signed char)<br />

2810339 | (input - start + scanned);<br />

2810340 | f += 3;<br />

2810341 | }<br />

2810342 | else<br />

2810343 | {<br />

2810344 | //------------ unsupported or unknown specifier.<br />

2810345 | f += 2;<br />

2810346 | }

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!