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