sprintf.c

Go to the documentation of this file.
00001 
00043 #include <mware/formatwr.h>
00044 #include <cpu/pgm.h>
00045 #include <cfg/compiler.h>
00046 
00047 #include <stdio.h>
00048 
00049 
00050 static void __str_put_char(char c, void *ptr)
00051 {
00052     /*
00053      * This Does not work on Code Warrior. Hmm...
00054      *  *(*((char **)ptr))++ = c;
00055      */
00056 
00057     **((char **)ptr) = c;
00058     (*((char **)ptr))++;
00059 }
00060 
00061 static void __null_put_char(UNUSED_ARG(char, c), UNUSED_ARG(void *, ptr))
00062 {
00063     /* nop */
00064 }
00065 
00066 
00067 int PGM_FUNC(vsprintf)(char *str, const char * PGM_ATTR fmt, va_list ap)
00068 {
00069     int result;
00070 
00071     if (str)
00072     {
00073         result = PGM_FUNC(_formatted_write)(fmt, __str_put_char, &str, ap);
00074 
00075         /* Terminate string */
00076         *str = '\0';
00077     }
00078     else
00079         result = PGM_FUNC(_formatted_write)(fmt, __null_put_char, 0, ap);
00080 
00081 
00082     return result;
00083 }
00084 
00085 
00086 int PGM_FUNC(sprintf)(char *str, const char * fmt, ...)
00087 {
00088     int result;
00089     va_list ap;
00090 
00091     va_start(ap, fmt);
00092     result = PGM_FUNC(vsprintf)(str, fmt, ap);
00093     va_end(ap);
00094 
00095     return result;
00096 }
00097 
00101 struct __sn_state
00102 {
00103     char *str;
00104     size_t len;
00105 };
00106 
00110 static void __sn_put_char(char c, void *ptr)
00111 {
00112     struct __sn_state *state = (struct __sn_state *)ptr;
00113 
00114     if (state->len)
00115     {
00116         --state->len;
00117         *state->str++ = c;
00118     }
00119 }
00120 
00121 
00122 int PGM_FUNC(vsnprintf)(char *str, size_t size, const char * PGM_ATTR fmt, va_list ap)
00123 {
00124     int result = 0;
00125 
00126     /* Make room for traling '\0'. */
00127     if (size--)
00128     {
00129         if (str)
00130         {
00131             struct __sn_state state;
00132             state.str = str;
00133             state.len = size;
00134 
00135             result = PGM_FUNC(_formatted_write)(fmt, __sn_put_char, &state, ap);
00136 
00137             /* Terminate string. */
00138             *state.str = '\0';
00139         }
00140         else
00141             result = PGM_FUNC(_formatted_write)(fmt, __null_put_char, 0, ap);
00142     }
00143 
00144     return result;
00145 }
00146 
00147 
00148 int PGM_FUNC(snprintf)(char *str, size_t size, const char * fmt, ...)
00149 {
00150     int result;
00151     va_list ap;
00152 
00153     va_start(ap, fmt);
00154     result = PGM_FUNC(vsnprintf)(str, size, fmt, ap);
00155     va_end(ap);
00156 
00157     return result;
00158 }