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 | }