sprintf.c

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