📄 rprintf_8c-source.html
字号:
00392 <span class="keyword">register</span> <span class="keywordtype">int</span> i;00393 <span class="keyword">register</span> <span class="keywordtype">int</span> fmt;00394 <span class="keyword">register</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> pad = <span class="charliteral">' '</span>;00395 <span class="keywordtype">int</span> flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0;00396 <span class="keywordtype">int</span> sign = 0;00397 00398 va_list ap;00399 va_start(ap, sfmt);00400 00401 f = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) sfmt;00402 00403 <span class="keywordflow">for</span> (; READMEMBYTE(stringInRom,f); f++)00404 {00405 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) != <span class="charliteral">'%'</span>)00406 { <span class="comment">// not a format character</span>00407 <span class="comment">// then just output the char</span>00408 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(READMEMBYTE(stringInRom,f));00409 }00410 <span class="keywordflow">else</span> 00411 {00412 f++; <span class="comment">// if we have a "%" then skip it</span>00413 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'-'</span>)00414 {00415 flush_left = 1; <span class="comment">// minus: flush left</span>00416 f++;00417 }00418 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'0'</span>00419 || READMEMBYTE(stringInRom,f) == <span class="charliteral">'.'</span>)00420 {00421 <span class="comment">// padding with 0 rather than blank</span>00422 pad = <span class="charliteral">'0'</span>;00423 f++;00424 }00425 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'*'</span>)00426 { <span class="comment">// field width</span>00427 f_width = va_arg(ap, <span class="keywordtype">int</span>);00428 f++;00429 }00430 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Isdigit(READMEMBYTE(stringInRom,f)))00431 {00432 f_width = atoiRamRom(stringInRom, (<span class="keywordtype">char</span> *) f);00433 <span class="keywordflow">while</span> (Isdigit(READMEMBYTE(stringInRom,f)))00434 f++; <span class="comment">// skip the digits</span>00435 }00436 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'.'</span>)00437 { <span class="comment">// precision</span>00438 f++;00439 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'*'</span>)00440 {00441 prec = va_arg(ap, <span class="keywordtype">int</span>);00442 f++;00443 }00444 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (Isdigit(READMEMBYTE(stringInRom,f)))00445 {00446 prec = atoiRamRom(stringInRom, (<span class="keywordtype">char</span> *) f);00447 <span class="keywordflow">while</span> (Isdigit(READMEMBYTE(stringInRom,f)))00448 f++; <span class="comment">// skip the digits</span>00449 }00450 }00451 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'#'</span>)00452 { <span class="comment">// alternate form</span>00453 hash = 1;00454 f++;00455 }00456 <span class="keywordflow">if</span> (READMEMBYTE(stringInRom,f) == <span class="charliteral">'l'</span>)00457 { <span class="comment">// long format</span>00458 do_long = 1;00459 f++;00460 }00461 00462 fmt = READMEMBYTE(stringInRom,f);00463 bp = buf;00464 <span class="keywordflow">switch</span> (fmt) { <span class="comment">// do the formatting</span>00465 <span class="keywordflow">case</span> <span class="charliteral">'d'</span>: <span class="comment">// 'd' signed decimal</span>00466 <span class="keywordflow">if</span> (do_long)00467 l = va_arg(ap, <span class="keywordtype">long</span>);00468 <span class="keywordflow">else</span>00469 l = (long) (va_arg(ap, <span class="keywordtype">int</span>));00470 <span class="keywordflow">if</span> (l < 0)00471 {00472 sign = 1;00473 l = -l;00474 }00475 <span class="keywordflow">do</span> {00476 *bp++ = l % 10 + <span class="charliteral">'0'</span>;00477 } <span class="keywordflow">while</span> ((l /= 10) > 0);00478 <span class="keywordflow">if</span> (sign)00479 *bp++ = <span class="charliteral">'-'</span>;00480 f_width = f_width - (bp - buf);00481 <span class="keywordflow">if</span> (!flush_left)00482 <span class="keywordflow">while</span> (f_width-- > 0)00483 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(pad);00484 <span class="keywordflow">for</span> (bp--; bp >= buf; bp--)00485 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(*bp);00486 <span class="keywordflow">if</span> (flush_left)00487 <span class="keywordflow">while</span> (f_width-- > 0)00488 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00489 <span class="keywordflow">break</span>;00490 <span class="keywordflow">case</span> <span class="charliteral">'o'</span>: <span class="comment">// 'o' octal number</span>00491 <span class="keywordflow">case</span> <span class="charliteral">'x'</span>: <span class="comment">// 'x' hex number</span>00492 <span class="keywordflow">case</span> <span class="charliteral">'u'</span>: <span class="comment">// 'u' unsigned decimal</span>00493 <span class="keywordflow">if</span> (do_long)00494 u = va_arg(ap, <span class="keywordtype">unsigned</span> <span class="keywordtype">long</span>);00495 <span class="keywordflow">else</span>00496 u = (<span class="keywordtype">unsigned</span> long) (va_arg(ap, <span class="keywordtype">unsigned</span>));00497 <span class="keywordflow">if</span> (fmt == <span class="charliteral">'u'</span>)00498 { <span class="comment">// unsigned decimal</span>00499 <span class="keywordflow">do</span> {00500 *bp++ = u % 10 + <span class="charliteral">'0'</span>;00501 } <span class="keywordflow">while</span> ((u /= 10) > 0);00502 }00503 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fmt == <span class="charliteral">'o'</span>)00504 { <span class="comment">// octal</span>00505 <span class="keywordflow">do</span> {00506 *bp++ = u % 8 + <span class="charliteral">'0'</span>;00507 } <span class="keywordflow">while</span> ((u /= 8) > 0);00508 <span class="keywordflow">if</span> (hash)00509 *bp++ = <span class="charliteral">'0'</span>;00510 }00511 <span class="keywordflow">else</span> <span class="keywordflow">if</span> (fmt == <span class="charliteral">'x'</span>)00512 { <span class="comment">// hex</span>00513 <span class="keywordflow">do</span> {00514 i = u % 16;00515 <span class="keywordflow">if</span> (i < 10)00516 *bp++ = i + <span class="charliteral">'0'</span>;00517 <span class="keywordflow">else</span>00518 *bp++ = i - 10 + <span class="charliteral">'a'</span>;00519 } <span class="keywordflow">while</span> ((u /= 16) > 0);00520 <span class="keywordflow">if</span> (hash)00521 {00522 *bp++ = <span class="charliteral">'x'</span>;00523 *bp++ = <span class="charliteral">'0'</span>;00524 }00525 }00526 i = f_width - (bp - buf);00527 <span class="keywordflow">if</span> (!flush_left)00528 <span class="keywordflow">while</span> (i-- > 0)00529 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(pad);00530 <span class="keywordflow">for</span> (bp--; bp >= buf; bp--)00531 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>((<span class="keywordtype">int</span>) (*bp));00532 <span class="keywordflow">if</span> (flush_left)00533 <span class="keywordflow">while</span> (i-- > 0)00534 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00535 <span class="keywordflow">break</span>;00536 <span class="keywordflow">case</span> <span class="charliteral">'c'</span>: <span class="comment">// 'c' character</span>00537 i = va_arg(ap, <span class="keywordtype">int</span>);00538 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>((<span class="keywordtype">int</span>) (i));00539 <span class="keywordflow">break</span>;00540 <span class="keywordflow">case</span> <span class="charliteral">'s'</span>: <span class="comment">// 's' string</span>00541 bp = va_arg(ap, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *);00542 <span class="keywordflow">if</span> (!bp)00543 bp = (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> *) <span class="stringliteral">"(nil)"</span>;00544 f_width = f_width - strlen((<span class="keywordtype">char</span> *) bp);00545 <span class="keywordflow">if</span> (!flush_left)00546 <span class="keywordflow">while</span> (f_width-- > 0)00547 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(pad);00548 <span class="keywordflow">for</span> (i = 0; *bp && i < prec; i++)00549 {00550 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(*bp);00551 bp++;00552 }00553 <span class="keywordflow">if</span> (flush_left)00554 <span class="keywordflow">while</span> (f_width-- > 0)00555 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">' '</span>);00556 <span class="keywordflow">break</span>;00557 <span class="keywordflow">case</span> <span class="charliteral">'%'</span>: <span class="comment">// '%' character</span>00558 <a class="code" href="group__rprintf.html#ga1">rprintfChar</a>(<span class="charliteral">'%'</span>);00559 <span class="keywordflow">break</span>;00560 }00561 flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0;00562 sign = 0;00563 pad = <span class="charliteral">' '</span>;00564 }00565 }00566 00567 va_end(ap);00568 <span class="keywordflow">return</span> 0;00569 }00570 00571 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> Isdigit(<span class="keywordtype">char</span> c)00572 {00573 <span class="keywordflow">if</span>((c >= 0x30) && (c <= 0x39))00574 <span class="keywordflow">return</span> TRUE;00575 <span class="keywordflow">else</span>00576 <span class="keywordflow">return</span> FALSE;00577 }00578 00579 <span class="keywordtype">int</span> atoiRamRom(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> stringInRom, <span class="keywordtype">char</span> *str)00580 {00581 <span class="keywordtype">int</span> num = 0;;00582 00583 <span class="keywordflow">while</span>(Isdigit(READMEMBYTE(stringInRom,str)))00584 {00585 num *= 10;00586 num += ((READMEMBYTE(stringInRom,str++)) - 0x30);00587 }00588 <span class="keywordflow">return</span> num;00589 }00590
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -