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 &lt;=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>*)&amp;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-&gt;pPtr++ = Byte_a;    <b>if</b> (pBuf-&gt;pPtr &gt;= pBuf-&gt;pBuf + pBuf-&gt;Size)        pBuf-&gt;pPtr = pBuf-&gt;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 &lt;=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>*)&amp;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 &lt;=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>*)&amp;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  = &amp;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)&lt;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, &amp;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 &amp;&amp; <a href="strchr.FIND-FUNC">strchr</a>(frmt_Flags_g, c); c = *++pFmt_a)                  <a href="vbit_Put.FIND-FUNC">vbit_Put</a>(&amp;Fmt.Flags, c, 1);           }           <font color="#6920ac">/* get optional field width */</font>           <b>if</b> (*pFmt_a &amp;&amp; (*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 &lt;= (<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 &amp;&amp; (*pFmt_a ==<font color="DarkGreen">'.'</font> &amp;&amp; (*++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 &lt;= (<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 &amp;&amp; frmt_LenMods_g)           {              <b>if</b> (*pFmt_a &amp;&amp; <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&lt;<a href="FRMT_CONVERT_TABLE_SIZE.FIND-DEF">FRMT_CONVERT_TABLE_SIZE</a>; i++)                {                   <b>if</b> (frmt_ConvertTable_g[i].SpecCode == Fmt.Code &amp;&amp;                       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)(&amp;Fmt))&lt;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 + -
显示快捷键?