📄 rprintf_8c-source.html
字号:
00585 <span class="comment">// code below this line is commented out and can be ignored</span>00586 <span class="comment">//******************************************************************************</span>00587 <span class="comment">/*</span>00588 <span class="comment">char* sprintf(const char *sfmt, ...)</span>00589 <span class="comment">{</span>00590 <span class="comment"> register unsigned char *f, *bp, *str;</span>00591 <span class="comment"> register long l;</span>00592 <span class="comment"> register unsigned long u;</span>00593 <span class="comment"> register int i;</span>00594 <span class="comment"> register int fmt;</span>00595 <span class="comment"> register unsigned char pad = ' ';</span>00596 <span class="comment"> int flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0;</span>00597 <span class="comment"> int sign = 0;</span>00598 <span class="comment"></span>00599 <span class="comment"> va_list ap;</span>00600 <span class="comment"> va_start(ap, sfmt);</span>00601 <span class="comment"></span>00602 <span class="comment"> str = bufstring;</span>00603 <span class="comment"> f = (unsigned char *) sfmt;</span>00604 <span class="comment"></span>00605 <span class="comment"> for (; *f; f++)</span>00606 <span class="comment"> {</span>00607 <span class="comment"> if (*f != '%')</span>00608 <span class="comment"> { // not a format character</span>00609 <span class="comment"> *str++ = (*f); // then just output the char</span>00610 <span class="comment"> }</span>00611 <span class="comment"> else </span>00612 <span class="comment"> {</span>00613 <span class="comment"> f++; // if we have a "%" then skip it</span>00614 <span class="comment"> if (*f == '-')</span>00615 <span class="comment"> {</span>00616 <span class="comment"> flush_left = 1; // minus: flush left</span>00617 <span class="comment"> f++;</span>00618 <span class="comment"> }</span>00619 <span class="comment"> if (*f == '0' || *f == '.')</span>00620 <span class="comment"> {</span>00621 <span class="comment"> // padding with 0 rather than blank</span>00622 <span class="comment"> pad = '0';</span>00623 <span class="comment"> f++;</span>00624 <span class="comment"> }</span>00625 <span class="comment"> if (*f == '*')</span>00626 <span class="comment"> { // field width</span>00627 <span class="comment"> f_width = va_arg(ap, int);</span>00628 <span class="comment"> f++;</span>00629 <span class="comment"> }</span>00630 <span class="comment"> else if (Isdigit(*f))</span>00631 <span class="comment"> {</span>00632 <span class="comment"> f_width = atoi((char *) f);</span>00633 <span class="comment"> while (Isdigit(*f))</span>00634 <span class="comment"> f++; // skip the digits</span>00635 <span class="comment"> }</span>00636 <span class="comment"> if (*f == '.')</span>00637 <span class="comment"> { // precision</span>00638 <span class="comment"> f++;</span>00639 <span class="comment"> if (*f == '*')</span>00640 <span class="comment"> {</span>00641 <span class="comment"> prec = va_arg(ap, int);</span>00642 <span class="comment"> f++;</span>00643 <span class="comment"> }</span>00644 <span class="comment"> else if (Isdigit(*f))</span>00645 <span class="comment"> {</span>00646 <span class="comment"> prec = atoi((char *) f);</span>00647 <span class="comment"> while (Isdigit(*f))</span>00648 <span class="comment"> f++; // skip the digits</span>00649 <span class="comment"> }</span>00650 <span class="comment"> }</span>00651 <span class="comment"> if (*f == '#')</span>00652 <span class="comment"> { // alternate form</span>00653 <span class="comment"> hash = 1;</span>00654 <span class="comment"> f++;</span>00655 <span class="comment"> }</span>00656 <span class="comment"> if (*f == 'l')</span>00657 <span class="comment"> { // long format</span>00658 <span class="comment"> do_long = 1;</span>00659 <span class="comment"> f++;</span>00660 <span class="comment"> }</span>00661 <span class="comment"></span>00662 <span class="comment"> fmt = *f;</span>00663 <span class="comment"> bp = buf;</span>00664 <span class="comment"> switch (fmt) { // do the formatting</span>00665 <span class="comment"> case 'd': // 'd' signed decimal</span>00666 <span class="comment"> if (do_long)</span>00667 <span class="comment"> l = va_arg(ap, long);</span>00668 <span class="comment"> else</span>00669 <span class="comment"> l = (long) (va_arg(ap, int));</span>00670 <span class="comment"> if (l < 0)</span>00671 <span class="comment"> {</span>00672 <span class="comment"> sign = 1;</span>00673 <span class="comment"> l = -l;</span>00674 <span class="comment"> }</span>00675 <span class="comment"> do {</span>00676 <span class="comment"> *bp++ = l % 10 + '0';</span>00677 <span class="comment"> } while ((l /= 10) > 0);</span>00678 <span class="comment"> if (sign)</span>00679 <span class="comment"> *bp++ = '-';</span>00680 <span class="comment"> f_width = f_width - (bp - buf);</span>00681 <span class="comment"> if (!flush_left)</span>00682 <span class="comment"> while (f_width-- > 0)</span>00683 <span class="comment"> *str++ = (pad);</span>00684 <span class="comment"> for (bp--; bp >= buf; bp--)</span>00685 <span class="comment"> *str++ = (*bp);</span>00686 <span class="comment"> if (flush_left)</span>00687 <span class="comment"> while (f_width-- > 0)</span>00688 <span class="comment"> *str++ = (' ');</span>00689 <span class="comment"> break;</span>00690 <span class="comment"> case 'o': // 'o' octal number</span>00691 <span class="comment"> case 'x': // 'x' hex number</span>00692 <span class="comment"> case 'u': // 'u' unsigned decimal</span>00693 <span class="comment"> if (do_long)</span>00694 <span class="comment"> u = va_arg(ap, unsigned long);</span>00695 <span class="comment"> else</span>00696 <span class="comment"> u = (unsigned long) (va_arg(ap, unsigned));</span>00697 <span class="comment"> if (fmt == 'u')</span>00698 <span class="comment"> { // unsigned decimal</span>00699 <span class="comment"> do {</span>00700 <span class="comment"> *bp++ = u % 10 + '0';</span>00701 <span class="comment"> } while ((u /= 10) > 0);</span>00702 <span class="comment"> }</span>00703 <span class="comment"> else if (fmt == 'o')</span>00704 <span class="comment"> { // octal</span>00705 <span class="comment"> do {</span>00706 <span class="comment"> *bp++ = u % 8 + '0';</span>00707 <span class="comment"> } while ((u /= 8) > 0);</span>00708 <span class="comment"> if (hash)</span>00709 <span class="comment"> *bp++ = '0';</span>00710 <span class="comment"> }</span>00711 <span class="comment"> else if (fmt == 'x')</span>00712 <span class="comment"> { // hex</span>00713 <span class="comment"> do {</span>00714 <span class="comment"> i = u % 16;</span>00715 <span class="comment"> if (i < 10)</span>00716 <span class="comment"> *bp++ = i + '0';</span>00717 <span class="comment"> else</span>00718 <span class="comment"> *bp++ = i - 10 + 'a';</span>00719 <span class="comment"> } while ((u /= 16) > 0);</span>00720 <span class="comment"> if (hash)</span>00721 <span class="comment"> {</span>00722 <span class="comment"> *bp++ = 'x';</span>00723 <span class="comment"> *bp++ = '0';</span>00724 <span class="comment"> }</span>00725 <span class="comment"> }</span>00726 <span class="comment"> i = f_width - (bp - buf);</span>00727 <span class="comment"> if (!flush_left)</span>00728 <span class="comment"> while (i-- > 0)</span>00729 <span class="comment"> *str++ = (pad);</span>00730 <span class="comment"> for (bp--; bp >= buf; bp--)</span>00731 <span class="comment"> *str++ = ((int) (*bp));</span>00732 <span class="comment"> if (flush_left)</span>00733 <span class="comment"> while (i-- > 0)</span>00734 <span class="comment"> *str++ = (' ');</span>00735 <span class="comment"> break;</span>00736 <span class="comment"> case 'c': // 'c' character</span>00737 <span class="comment"> i = va_arg(ap, int);</span>00738 <span class="comment"> *str++ = ((int) (i));</span>00739 <span class="comment"> break;</span>00740 <span class="comment"> case 's': // 's' string</span>00741 <span class="comment"> bp = va_arg(ap, unsigned char *);</span>00742 <span class="comment"> if (!bp)</span>00743 <span class="comment"> bp = (unsigned char *) "(nil)";</span>00744 <span class="comment"> f_width = f_width - strlen((char *) bp);</span>00745 <span class="comment"> if (!flush_left)</span>00746 <span class="comment"> while (f_width-- > 0)</span>00747 <span class="comment"> *str++ = (pad);</span>00748 <span class="comment"> for (i = 0; *bp && i < prec; i++)</span>00749 <span class="comment"> {</span>00750 <span class="comment"> *str++ = (*bp);</span>00751 <span class="comment"> bp++;</span>00752 <span class="comment"> }</span>00753 <span class="comment"> if (flush_left)</span>00754 <span class="comment"> while (f_width-- > 0)</span>00755 <span class="comment"> *str++ = (' ');</span>00756 <span class="comment"> break;</span>00757 <span class="comment"> case '%': // '%' character</span>00758 <span class="comment"> *str++ = ('%');</span>00759 <span class="comment"> break;</span>00760 <span class="comment"> }</span>00761 <span class="comment"> flush_left = 0, f_width = 0, prec = INF, hash = 0, do_long = 0;</span>00762 <span class="comment"> sign = 0;</span>00763 <span class="comment"> pad = ' ';</span>00764 <span class="comment"> }</span>00765 <span class="comment"> }</span>00766 <span class="comment"></span>00767 <span class="comment"> va_end(ap);</span>00768 <span class="comment"> // terminate string with null</span>00769 <span class="comment"> *str++ = '\0';</span>00770 <span class="comment"> return bufstring;</span>00771 <span class="comment">}</span>00772 <span class="comment"></span>00773 <span class="comment">*/</span></pre></div><hr size="1"><address style="align: right;"><small>Generated on Fri Oct 15 03:50:22 2004 for Procyon AVRlib by<a href="http://www.doxygen.org/index.html"><img src="doxygen.png" alt="doxygen" align="middle" border=0 > </a>1.3.6 </small></address></body></html>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -