fmt_conv.c
来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 767 行 · 第 1/3 页
C
767 行
m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a->pArg), <i>unsigned</i> <i>short</i>); <b>else</b> <b>if</b> (pFmt_a->LenMod == <font color="DarkGreen">'l'</font> || pFmt_a->LenMod == <font color="DarkGreen">'L'</font>) m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a->pArg), <i>unsigned</i> <i>long</i>); <b>else</b> m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a->pArg), <i>unsigned</i> <i>int</i>); <b>do</b> { *--p = (m&0x7) + <font color="DarkGreen">'0'</font>; } <b>while</b> ((m >>= 3) != 0); <b>if</b> (*p != <font color="DarkGreen">'0'</font> && <a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&pFmt_a->Flags,<font color="DarkGreen">'#'</font>)==1) pFmt_a->pPrefix = <font color="DarkGreen">"0"</font>; <b>else</b> pFmt_a->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->LenMod == <font color="DarkGreen">'h'</font> || pFmt_a->LenMod == <font color="DarkGreen">'H'</font>) m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a->pArg), <i>unsigned</i> <i>short</i>); <b>else</b> <b>if</b> (pFmt_a->LenMod == <font color="DarkGreen">'l'</font> || pFmt_a->LenMod == <font color="DarkGreen">'L'</font>) m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a->pArg), <i>unsigned</i> <i>long</i>); <b>else</b> m = <a href="va_arg.FIND-FUNC">va_arg</a>(*(pFmt_a->pArg), <i>unsigned</i> <i>int</i>); <b>if</b> (pFmt_a->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&0xf)]; } <b>while</b> ((m >>= 4) != 0); <b>if</b> (*p != <font color="DarkGreen">'0'</font> && <a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&pFmt_a->Flags,<font color="DarkGreen">'#'</font>)==1) { <b>if</b> (pFmt_a->Code == <font color="DarkGreen">'x'</font>) pFmt_a->pPrefix = <font color="DarkGreen">"0x"</font>; <b>else</b> pFmt_a->pPrefix = <font color="DarkGreen">"0X"</font>; } <b>else</b> pFmt_a->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->pArg), <i>void</i> *); <b>if</b> (pFmt_a->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&0xf)]; } <b>while</b> ((m >>= 4) != 0); <b>if</b> (*p != <font color="DarkGreen">'0'</font> && <a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&pFmt_a->Flags,<font color="DarkGreen">'#'</font>)==1) { <b>if</b> (pFmt_a->Code == <font color="DarkGreen">'p'</font>) pFmt_a->pPrefix = <font color="DarkGreen">"0x"</font>; <b>else</b> pFmt_a->pPrefix = <font color="DarkGreen">"0X"</font>; } <b>else</b> pFmt_a->pPrefix = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>; pFmt_a->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->pPut) <font color="#6920ac">/* emit % */</font> <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(<font color="DarkGreen">'%'</font>, pFmt_a->pEnv)<0) <b>return</b> -1; n++; <font color="#6920ac">/* emit optional flags */</font> <b>for</b> (i=0; i<256; i++) { <b>if</b> (<a href="vbit_Get.FIND-FUNC">vbit_Get</a>(&pFmt_a->Flags, i)) { <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(i, pFmt_a->pEnv)<0) <b>return</b> -1; n++; } } <font color="#6920ac">/* emit width */</font> <b>if</b> (pFmt_a->Width != <a href="INT_MIN.FIND-DEF">INT_MIN</a>) { <b>if</b> (pFmt_a->Width < 0) m = -pFmt_a->Width; <b>else</b> m = pFmt_a->Width; p = buf + <i>sizeof</i>(buf); <b>do</b> { *--p = m%10 + <font color="DarkGreen">'0'</font>; } <b>while</b> ((m/=10) > 0); <b>if</b> (pFmt_a->Width < 0) *--p = <font color="DarkGreen">'-'</font>; <b>while</b> (p<buf+<i>sizeof</i>(buf)) { <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(*p++, pFmt_a->pEnv)<0) <b>return</b> -1; n++; } } <font color="#6920ac">/* emit precision */</font> <b>if</b> (pFmt_a->Prec != <a href="INT_MIN.FIND-DEF">INT_MIN</a>) { <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(<font color="DarkGreen">'.'</font>, pFmt_a->pEnv)<0) <b>return</b> -1; n++; <b>if</b> (pFmt_a->Prec < 0) m = -pFmt_a->Prec; <b>else</b> m = pFmt_a->Prec; p = buf + <i>sizeof</i>(buf); <b>do</b> { *--p = m%10 + <font color="DarkGreen">'0'</font>; } <b>while</b> ((m/=10) > 0); <b>if</b> (pFmt_a->Prec < 0) *--p = <font color="DarkGreen">'-'</font>; <b>while</b> (p<buf+<i>sizeof</i>(buf)) { <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(*p++, pFmt_a->pEnv)<0) <b>return</b> -1; n++; } } <font color="#6920ac">/* emit length modifier */</font> <b>if</b> (pFmt_a->LenMod) { <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(pFmt_a->LenMod, pFmt_a->pEnv)<0) <b>return</b> -1; n++; } <font color="#6920ac">/* emit format code */</font> <b>if</b> (pFmt_a-><a href="pPut.FIND-FUNC">pPut</a>(pFmt_a->Code, pFmt_a->pEnv)<0) <b>return</b> -1; n++; <b>if</b> (pFmt_a->pArg) p = *pFmt_a->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->pPrefix != <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) PrefixLen = <a href="strlen.FIND-FUNC">strlen</a>(pFmt_a->pPrefix); <font color="#6920ac">/* normalise width and flags */</font> <b>if</b> (pFmt_a->Width == <a href="INT_MIN.FIND-DEF">INT_MIN</a>) pFmt_a->Width = 0; <b>if</b> (pFmt_a->Width < 0) { pFmt_a->Width = - pFmt_a->Width; <a href="vbit_Put.FIND-FUNC">vbit_Put</a>(&pFmt_a->Flags, <font color="DarkGreen">'-'</font>, 1); } <b>if</b> (pFmt_a->Prec >= 0) <a href="vbit_Put.FIND-FUNC">vbit_Put</a>(&pFmt_a->Flags, <font color="DarkGreen">'0'</font>, 0); <font color="#6920ac">/* compute the sign */</font> <b>if</b> (Len_a > 0 && (*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>(&pFmt_a->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>(&pFmt_a->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->Prec < 0) pFmt_a->Prec = 1; <b>if</b> (Len_a < pFmt_a->Prec) i = pFmt_a->Prec; <b>else</b> <b>if</b> (pFmt_a->Prec==0 && Len_a==1 && pStr_a[0]==<font color="DarkGreen">'0'</font>)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?