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