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