fmt_conv.c

来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 767 行 · 第 1/3 页

C
767
字号
       m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>unsigned</i> <i>short</i>);    <b>else</b> <b>if</b> (pFmt_a-&gt;LenMod == <font color="DarkGreen">'l'</font> || pFmt_a-&gt;LenMod == <font color="DarkGreen">'L'</font>)       m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>unsigned</i> <i>long</i>);    <b>else</b>       m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>unsigned</i> <i>int</i>);    <b>do</b> {       *--p = (m&amp;0x7) + <font color="DarkGreen">'0'</font>;    } <b>while</b> ((m &gt;&gt;= 3) != 0);    <b>if</b> (*p != <font color="DarkGreen">'0'</font> &amp;&amp; <a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&amp;pFmt_a-&gt;Flags,<font color="DarkGreen">'#'</font>)==1)        pFmt_a-&gt;pPrefix = <font color="DarkGreen">"0"</font>;    <b>else</b>        pFmt_a-&gt;pPrefix = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;    <b>return</b> <a href="#frmt_PutDec">frmt_PutDec</a> (p, (<i>crtx_Int_t</i>)((Buf + <i>sizeof</i>(Buf)) - p), pFmt_a);}<font color="#6920ac">/* specifier '%x' convertion function */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_x">frmt_Convert_x</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <i>crtx_Unsigned_t</i>  m;    <i>crtx_Char_t</i>      Buf[44];    <i>crtx_Char_t</i>     *p = Buf + <i>sizeof</i>(Buf);    <i>crtx_Char_t</i>     *pConvStr;    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a)    <b>if</b> (pFmt_a-&gt;LenMod == <font color="DarkGreen">'h'</font> || pFmt_a-&gt;LenMod == <font color="DarkGreen">'H'</font>)       m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>unsigned</i> <i>short</i>);    <b>else</b> <b>if</b> (pFmt_a-&gt;LenMod == <font color="DarkGreen">'l'</font> || pFmt_a-&gt;LenMod == <font color="DarkGreen">'L'</font>)       m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>unsigned</i> <i>long</i>);    <b>else</b>       m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>unsigned</i> <i>int</i>);    <b>if</b> (pFmt_a-&gt;Code == <font color="DarkGreen">'x'</font>)       pConvStr = <font color="DarkGreen">"0123456789abcdef"</font>;       <font color="#6920ac">/* %x */</font>    <b>else</b>       pConvStr = <font color="DarkGreen">"0123456789ABCDEF"</font>;       <font color="#6920ac">/* %X */</font>    <b>do</b> {       *--p = pConvStr[(<i>crtx_Int_t</i>)(m&amp;0xf)];    } <b>while</b> ((m &gt;&gt;= 4) != 0);    <b>if</b> (*p != <font color="DarkGreen">'0'</font> &amp;&amp; <a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&amp;pFmt_a-&gt;Flags,<font color="DarkGreen">'#'</font>)==1) {        <b>if</b> (pFmt_a-&gt;Code == <font color="DarkGreen">'x'</font>)           pFmt_a-&gt;pPrefix = <font color="DarkGreen">"0x"</font>;        <b>else</b>           pFmt_a-&gt;pPrefix = <font color="DarkGreen">"0X"</font>;    }    <b>else</b>        pFmt_a-&gt;pPrefix = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;    <b>return</b> <a href="#frmt_PutDec">frmt_PutDec</a> (p, (<i>crtx_Int_t</i>)((Buf + <i>sizeof</i>(Buf)) - p), pFmt_a);}<font color="#6920ac">/* specifier '%p' convertion function */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_p">frmt_Convert_p</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <i>crtx_Unsigned_t</i>  m;    <i>crtx_Char_t</i>      Buf[44];    <i>crtx_Char_t</i>     *p = Buf + <i>sizeof</i>(Buf);    <i>crtx_Char_t</i>     *pConvStr;    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a)    m = (<i>crtx_Unsigned_t</i>)<a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a-&gt;pArg), <i>void</i> *);    <b>if</b> (pFmt_a-&gt;Code == <font color="DarkGreen">'p'</font>)       pConvStr = <font color="DarkGreen">"0123456789abcdef"</font>;       <font color="#6920ac">/* %p */</font>    <b>else</b>       pConvStr = <font color="DarkGreen">"0123456789ABCDEF"</font>;       <font color="#6920ac">/* %P */</font>    <b>do</b> {       *--p = pConvStr[(<i>crtx_Int_t</i>)(m&amp;0xf)];    } <b>while</b> ((m &gt;&gt;= 4) != 0);    <b>if</b> (*p != <font color="DarkGreen">'0'</font> &amp;&amp; <a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&amp;pFmt_a-&gt;Flags,<font color="DarkGreen">'#'</font>)==1) {        <b>if</b> (pFmt_a-&gt;Code == <font color="DarkGreen">'p'</font>)           pFmt_a-&gt;pPrefix = <font color="DarkGreen">"0x"</font>;        <b>else</b>           pFmt_a-&gt;pPrefix = <font color="DarkGreen">"0X"</font>;    }    <b>else</b>        pFmt_a-&gt;pPrefix = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;    pFmt_a-&gt;Prec = <a href="INT_MIN.FIND-DEF">INT_MIN</a>;    <b>return</b> <a href="#frmt_PutDec">frmt_PutDec</a> (p, (<i>crtx_Int_t</i>)((Buf + <i>sizeof</i>(Buf)) - p), pFmt_a);}<font color="#6920ac">/* specifier '%n' convertion function */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_n">frmt_Convert_n</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <b>return</b> <a href="#frmt_Convert_Unknown">frmt_Convert_Unknown</a> (pFmt_a);}<font color="#6920ac">/* specifier '%f' convertion function */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_f">frmt_Convert_f</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <b>return</b> <a href="#frmt_Convert_Unknown">frmt_Convert_Unknown</a> (pFmt_a);}<font color="#6920ac">/* specifier '%e' convertion function */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_e">frmt_Convert_e</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <b>return</b> <a href="#frmt_Convert_Unknown">frmt_Convert_Unknown</a> (pFmt_a);}<font color="#6920ac">/* specifier '%g' convertion function */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_g">frmt_Convert_g</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <b>return</b> <a href="#frmt_Convert_Unknown">frmt_Convert_Unknown</a> (pFmt_a);}<font color="#6920ac">/* convertion function for unknown (unregistered) format specifier  */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Convert_Unknown">frmt_Convert_Unknown</a></font></b>(    <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <i>crtx_Unsigned_t</i> m;    <i>crtx_Int_t</i>      n = 0;    <i>crtx_Int_t</i>      i;    <i>crtx_Char_t</i>     buf[43], *p;    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a)    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a-&gt;pPut)    <font color="#6920ac">/* emit % */</font>    <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(<font color="DarkGreen">'%'</font>, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;    n++;    <font color="#6920ac">/* emit optional flags */</font>    <b>for</b> (i=0; i&lt;256; i++) {        <b>if</b> (<a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&amp;pFmt_a-&gt;Flags, i)) {           <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(i, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;           n++;        }    }    <font color="#6920ac">/* emit width */</font>    <b>if</b> (pFmt_a-&gt;Width != <a href="INT_MIN.FIND-DEF">INT_MIN</a>) {       <b>if</b> (pFmt_a-&gt;Width &lt; 0)          m = -pFmt_a-&gt;Width;       <b>else</b>          m = pFmt_a-&gt;Width;       p = buf + <i>sizeof</i>(buf);       <b>do</b> {          *--p = m%10 + <font color="DarkGreen">'0'</font>;       } <b>while</b> ((m/=10) &gt; 0);       <b>if</b> (pFmt_a-&gt;Width &lt; 0)          *--p = <font color="DarkGreen">'-'</font>;       <b>while</b> (p&lt;buf+<i>sizeof</i>(buf)) {           <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(*p++, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;           n++;       }    }    <font color="#6920ac">/* emit precision */</font>    <b>if</b> (pFmt_a-&gt;Prec != <a href="INT_MIN.FIND-DEF">INT_MIN</a>) {       <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(<font color="DarkGreen">'.'</font>, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;       n++;       <b>if</b> (pFmt_a-&gt;Prec &lt; 0)          m = -pFmt_a-&gt;Prec;       <b>else</b>          m = pFmt_a-&gt;Prec;       p = buf + <i>sizeof</i>(buf);       <b>do</b> {          *--p = m%10 + <font color="DarkGreen">'0'</font>;       } <b>while</b> ((m/=10) &gt; 0);       <b>if</b> (pFmt_a-&gt;Prec &lt; 0)          *--p = <font color="DarkGreen">'-'</font>;       <b>while</b> (p&lt;buf+<i>sizeof</i>(buf)) {           <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(*p++, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;           n++;       }    }    <font color="#6920ac">/* emit length modifier */</font>    <b>if</b> (pFmt_a-&gt;LenMod) {       <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(pFmt_a-&gt;LenMod, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;       n++;    }    <font color="#6920ac">/* emit format code */</font>    <b>if</b> (pFmt_a-&gt;<a href="pPut.FIND-FUNC">pPut</a>(pFmt_a-&gt;Code, pFmt_a-&gt;pEnv)&lt;0) <b>return</b> -1;    n++;    <b>if</b> (pFmt_a-&gt;pArg)        p = *pFmt_a-&gt;pArg;   <font color="#6920ac">/* shut up compiler warnings */</font>    <b>return</b> n;}<font color="#6920ac">/* Emit decimal number */</font><font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_PutDec">frmt_PutDec</a></font></b>(    <i>crtx_Char_t</i> *pStr_a, <i>crtx_Int_t</i> Len_a, <i>frmt_SpecDesc_t</i> *pFmt_a){</font>    <i>crtx_Int_t</i> Sign, i, j, n = 0;    <i>crtx_Int_t</i> PrefixLen = 0;    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a)    <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pStr_a)    <b>if</b> (pFmt_a-&gt;pPrefix != <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>)       PrefixLen = <a href="strlen.FIND-FUNC">strlen</a>(pFmt_a-&gt;pPrefix);    <font color="#6920ac">/* normalise width and flags */</font>    <b>if</b> (pFmt_a-&gt;Width == <a href="INT_MIN.FIND-DEF">INT_MIN</a>)       pFmt_a-&gt;Width = 0;    <b>if</b> (pFmt_a-&gt;Width &lt; 0) {       pFmt_a-&gt;Width = - pFmt_a-&gt;Width;       <a href="vbit_Put.FIND-FUNC">vbit_Put</a>(&amp;pFmt_a-&gt;Flags, <font color="DarkGreen">'-'</font>, 1);    }    <b>if</b> (pFmt_a-&gt;Prec &gt;= 0)       <a href="vbit_Put.FIND-FUNC">vbit_Put</a>(&amp;pFmt_a-&gt;Flags, <font color="DarkGreen">'0'</font>, 0);    <font color="#6920ac">/* compute the sign */</font>    <b>if</b> (Len_a &gt; 0 &amp;&amp; (*pStr_a == <font color="DarkGreen">'-'</font> || *pStr_a == <font color="DarkGreen">'+'</font>)) {       Sign = *pStr_a++;       Len_a--;    }    <b>else</b> <b>if</b> (<a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&amp;pFmt_a-&gt;Flags, <font color="DarkGreen">'+'</font>)==1)       Sign = <font color="DarkGreen">'+'</font>;    <b>else</b> <b>if</b> (<a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&amp;pFmt_a-&gt;Flags, <font color="DarkGreen">' '</font>)==1)       Sign = <font color="DarkGreen">' '</font>;    <b>else</b>       Sign = 0;    <font color="#6920ac">/* emit string pStr_a justified in width */</font>    <b>if</b> (pFmt_a-&gt;Prec &lt; 0)       pFmt_a-&gt;Prec = 1;    <b>if</b> (Len_a &lt; pFmt_a-&gt;Prec)       i = pFmt_a-&gt;Prec;    <b>else</b> <b>if</b> (pFmt_a-&gt;Prec==0 &amp;&amp; Len_a==1 &amp;&amp; pStr_a[0]==<font color="DarkGreen">'0'</font>)

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?