BeRTOS
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 }