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