fmt_core.c
来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 571 行 · 第 1/2 页
C
571 行
* LOCAL VARIABLES * *********************/</font> <i>crtx_Int_t</i> n; <i>frmt_Buffer_t</i> Buffer;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pStr_a) <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a) <b>if</b> (Size_a <=0) <b>return</b> 0; Buffer.pBuf = Buffer.pPtr = pStr_a; Buffer.Size = Size_a - 1; n = <a href="#frmt_Vformat">frmt_Vformat</a>(frmt_SformatPut2, (<i>crtx_Void_t</i>*)&Buffer, pFmt_a, Args_a); *Buffer.pPtr = 0; <b>return</b> n;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font size="+1"><i>static</i> <i>int</i> <b><font color="azure1"><a name="frmt_SformatPut3">frmt_SformatPut3</a></font></b>( <i>crtx_Char_t</i> Byte_a, <font color="#6920ac">/* byte to write into buffer */</font> <i>crtx_Void_t</i> *pEnv_a <font color="#6920ac">/* private context */</font>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>frmt_Buffer_t</i> *pBuf;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> pBuf = (<i>frmt_Buffer_t</i>*)pEnv_a; *pBuf->pPtr++ = Byte_a; <b>if</b> (pBuf->pPtr >= pBuf->pBuf + pBuf->Size) pBuf->pPtr = pBuf->pBuf; <b>return</b> Byte_a;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Sformat3">frmt_Sformat3</a></font></b>( <i>crtx_Char_t</i> *pStr_a, <font color="#6920ac">/* output string to fill in */</font> <i>crtx_Int_t</i> Size_a, <font color="#6920ac">/* size of output string */</font> <i>crtx_Char_t</i> *pFmt_a, <font color="#6920ac">/* output format string */</font> ... <font color="#6920ac">/* output arguments */</font>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>va_list</i> Args; <i>crtx_Int_t</i> n; <i>frmt_Buffer_t</i> Buffer;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pStr_a) <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a) <b>if</b> (Size_a <=0) <b>return</b> 0; Buffer.pBuf = Buffer.pPtr = pStr_a; Buffer.Size = Size_a - 1; <a href="va_start.FIND-FUNC">va_start</a>(Args, pFmt_a); n = <a href="#frmt_Vformat">frmt_Vformat</a>(frmt_SformatPut3, (<i>crtx_Void_t</i>*)&Buffer, pFmt_a, Args); <a href="va_end.FIND-FUNC">va_end</a>(Args); *Buffer.pPtr = 0; <b>return</b> n;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_SVformat3">frmt_SVformat3</a></font></b>( <i>crtx_Char_t</i> *pStr_a, <font color="#6920ac">/* output string to fill in */</font> <i>crtx_Int_t</i> Size_a, <font color="#6920ac">/* size of output string */</font> <i>crtx_Char_t</i> *pFmt_a, <font color="#6920ac">/* output format string */</font> <i>va_list</i> Args_a <font color="#6920ac">/* output arguments list */</font>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>crtx_Int_t</i> n; <i>frmt_Buffer_t</i> Buffer;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pStr_a) <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a) <b>if</b> (Size_a <=0) <b>return</b> 0; Buffer.pBuf = Buffer.pPtr = pStr_a; Buffer.Size = Size_a - 1; n = <a href="#frmt_Vformat">frmt_Vformat</a>(frmt_SformatPut3, (<i>crtx_Void_t</i>*)&Buffer, pFmt_a, Args_a); *Buffer.pPtr = 0; <b>return</b> n;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="frmt_Vformat">frmt_Vformat</a></font></b>( <i>frmt_Put_t</i> Put_a, <font color="#6920ac">/* procedure to emit character */</font> <i>crtx_Void_t</i> *pEnv_a, <font color="#6920ac">/* client supplied data for Put handler */</font> <i>crtx_Char_t</i> *pFmt_a, <font color="#6920ac">/* output format string */</font> <i>va_list</i> Args_a <font color="#6920ac">/* output arguments list */</font>){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <a href="VBIT_UNIT_ARRAY.FIND-DEF">VBIT_UNIT_ARRAY</a>(BitUnits, 256); <i>frmt_Convert_t</i> ConvertFunc; <i>frmt_SpecDesc_t</i> Fmt; <i>crtx_Int_t</i> n = 0; <i>crtx_Int_t</i> i;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(Put_a) <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pFmt_a)<font color="#6920ac">/* Fmt.Width = Fmt.Prec = INT_MIN;*/</font> <font color="#6920ac">/* to indicate absence */</font> Fmt.pPut = Put_a; Fmt.pEnv = pEnv_a; Fmt.pArg = &Args_a; <b>while</b> (*pFmt_a) { Fmt.Width = Fmt.Prec = <a href="INT_MIN.FIND-DEF">INT_MIN</a>; <font color="#6920ac">/* to indicate absence */</font> <b>if</b> (*pFmt_a != <font color="DarkGreen">'%'</font> || *++pFmt_a == <font color="DarkGreen">'%'</font>) { <font color="#6920ac">/* emit character from format string verbatim */</font> <b>if</b> (<a href="Put_a.FIND-FUNC">Put_a</a>((<i>crtx_Int_t</i>)*pFmt_a++, pEnv_a)<0) <b>return</b> -1; n++; } <b>else</b> { <font color="#6920ac">/* process current format specifier */</font> <font color="#6920ac">/* initialise flags array */</font> <a href="vbit_Create.FIND-FUNC">vbit_Create</a>(256, &Fmt.Flags, BitUnits, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); <font color="#6920ac">/* get optional flags */</font> <b>if</b> (frmt_Flags_g) { <i>crtx_Byte_t</i> c = *pFmt_a; <b>for</b> ( ; c && <a href="strchr.FIND-FUNC">strchr</a>(frmt_Flags_g, c); c = *++pFmt_a) <a href="vbit_Put.FIND-FUNC">vbit_Put</a>(&Fmt.Flags, c, 1); } <font color="#6920ac">/* get optional field width */</font> <b>if</b> (*pFmt_a && (*pFmt_a == <font color="DarkGreen">'*'</font> || <a href="isdigit.FIND-FUNC">isdigit</a>((<i>int</i>)*pFmt_a))) { <i>crtx_Int_t</i> nn; <b>if</b> (*pFmt_a == <font color="DarkGreen">'*'</font>) { nn = <a href="va_arg.FIND-FUNC">va_arg</a>(Args_a, <i>int</i>); <b>if</b> (nn == <a href="INT_MIN.FIND-DEF">INT_MIN</a>) nn++; pFmt_a++; } <b>else</b> { <b>for</b> (nn=0; <a href="isdigit.FIND-FUNC">isdigit</a>((<i>int</i>)*pFmt_a); pFmt_a++) { <i>crtx_Int_t</i> d = *pFmt_a - <font color="DarkGreen">'0'</font>; <b>if</b> (nn <= (<a href="INT_MAX.FIND-DEF">INT_MAX</a> - d)/10) nn = 10*nn + d; } } Fmt.Width = nn; } <font color="#6920ac">/* get optional field precision */</font> <b>if</b> (*pFmt_a && (*pFmt_a ==<font color="DarkGreen">'.'</font> && (*++pFmt_a==<font color="DarkGreen">'*'</font> || <a href="isdigit.FIND-FUNC">isdigit</a>((<i>int</i>)*pFmt_a)))) { <i>crtx_Int_t</i> nn; <b>if</b> (*pFmt_a == <font color="DarkGreen">'*'</font>) { nn = <a href="va_arg.FIND-FUNC">va_arg</a>(Args_a, <i>int</i>); <b>if</b> (nn == <a href="INT_MIN.FIND-DEF">INT_MIN</a>) nn++; pFmt_a++; } <b>else</b> { <b>for</b> (nn=0; <a href="isdigit.FIND-FUNC">isdigit</a>((<i>int</i>)*pFmt_a); pFmt_a++) { <i>crtx_Int_t</i> d = *pFmt_a - <font color="DarkGreen">'0'</font>; <b>if</b> (nn <= (<a href="INT_MAX.FIND-DEF">INT_MAX</a> - d)/10) nn = 10*nn + d; } } Fmt.Prec = nn; } <font color="#6920ac">/* get length modifier */</font> <b>if</b> (*pFmt_a && frmt_LenMods_g) { <b>if</b> (*pFmt_a && <a href="strchr.FIND-FUNC">strchr</a>(frmt_LenMods_g, *pFmt_a)) Fmt.LenMod = *pFmt_a++; <b>else</b> Fmt.LenMod = 0; } <font color="#6920ac">/* get format specified character */</font> ConvertFunc = frmt_Convert_Unknown; Fmt.Code = *pFmt_a; <b>if</b> (*pFmt_a) { pFmt_a++; <b>for</b> (i=0; i<<a href="FRMT_CONVERT_TABLE_SIZE.FIND-DEF">FRMT_CONVERT_TABLE_SIZE</a>; i++) { <b>if</b> (frmt_ConvertTable_g[i].SpecCode == Fmt.Code && frmt_ConvertTable_g[i].ConvertFunc != <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { ConvertFunc = frmt_ConvertTable_g[i].ConvertFunc; <b>break</b>; } } } <b>if</b> ((i=(*ConvertFunc)(&Fmt))<0) <b>return</b> -1; n += i; } } <b>return</b> n;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font> <font color="#6920ac">/* None */</font>}</pre></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?