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