@@ -104,11 +104,23 @@ static int minimal_vsscanf(const char *buffer, const char *format,
104104 len = (size_t )(p - start );
105105 if (len > 60 )
106106 return -1 ;
107+ #if defined(C89STRINGUTILS_HAVE_STRNCPY_S )
108+ strncpy_s (token , sizeof (token ), start , len );
109+ #else
107110 strncpy (token , start , len );
108111 token [len ] = '\0' ;
112+ #endif
113+ #if defined(C89STRINGUTILS_HAVE_STRCAT_S )
114+ strcat_s (token , sizeof (token ), "%n" );
115+ #else
109116 strcat (token , "%n" );
117+ #endif
110118 consumed = 0 ;
119+ #if defined(_MSC_VER ) && _MSC_VER >= 1400
120+ if (sscanf_s (b , token , & consumed ) < 0 || consumed == 0 )
121+ #else
111122 if (sscanf (b , token , & consumed ) < 0 || consumed == 0 )
123+ #endif
112124 return count ;
113125 b += consumed ;
114126 continue ;
@@ -125,19 +137,44 @@ static int minimal_vsscanf(const char *buffer, const char *format,
125137 while (* p && * p != ']' )
126138 p ++ ;
127139 }
128- if (* p )
129- p ++ ;
130- len = (size_t )(p - start );
131- if (len > 60 )
132- return -1 ;
133- strncpy (token , start , len );
134- token [len ] = '\0' ;
135- strcat (token , "%n" );
136-
137- ptr = va_arg (args , void * );
138- consumed = 0 ;
139- if (sscanf (b , token , ptr , & consumed ) <= 0 || consumed == 0 )
140- return count ;
140+ {
141+ char spec = * (p - 1 );
142+ unsigned sz = 0 ;
143+ if (* p )
144+ p ++ ;
145+ len = (size_t )(p - start );
146+ if (len > 60 )
147+ return -1 ;
148+ spec = * (p - 1 ); /* get the specifier */
149+ #if defined(C89STRINGUTILS_HAVE_STRNCPY_S )
150+ strncpy_s (token , sizeof (token ), start , len );
151+ #else
152+ strncpy (token , start , len );
153+ token [len ] = '\0' ;
154+ #endif
155+ #if defined(C89STRINGUTILS_HAVE_STRCAT_S )
156+ strcat_s (token , sizeof (token ), "%n" );
157+ #else
158+ strcat (token , "%n" );
159+ #endif
160+ ptr = va_arg (args , void * );
161+ if (spec == 's' || spec == 'c' || spec == '[' ) {
162+ sz = va_arg (args , unsigned );
163+ }
164+ consumed = 0 ;
165+ #if defined(_MSC_VER ) && _MSC_VER >= 1400
166+ if (spec == 's' || spec == 'c' || spec == '[' ) {
167+ if (sscanf_s (b , token , ptr , sz , & consumed ) <= 0 || consumed == 0 )
168+ return count ;
169+ } else {
170+ if (sscanf_s (b , token , ptr , & consumed ) <= 0 || consumed == 0 )
171+ return count ;
172+ }
173+ #else
174+ if (sscanf (b , token , ptr , & consumed ) <= 0 || consumed == 0 )
175+ return count ;
176+ #endif
177+ }
141178 b += consumed ;
142179 count ++ ;
143180 }
@@ -206,11 +243,17 @@ static int minimal_vfscanf(FILE *stream, const char *format, va_list args) {
206243 len = (size_t )(p - start );
207244 if (len > 60 )
208245 return -1 ;
246+ #if defined(C89STRINGUTILS_HAVE_STRNCPY_S )
247+ strncpy_s (token , sizeof (token ), start , len );
248+ #else
209249 strncpy (token , start , len );
210250 token [len ] = '\0' ;
211- #if defined(__GNUC__ ) || defined(__clang__ )
212251#endif
252+ #if defined(_MSC_VER ) && _MSC_VER >= 1400
253+ if (fscanf_s (stream , token ) < 0 )
254+ #else
213255 if (fscanf (stream , token ) < 0 )
256+ #endif
214257 return count ;
215258#if defined(__GNUC__ ) || defined(__clang__ )
216259#endif
@@ -228,17 +271,38 @@ static int minimal_vfscanf(FILE *stream, const char *format, va_list args) {
228271 while (* p && * p != ']' )
229272 p ++ ;
230273 }
231- if (* p )
232- p ++ ;
233- len = (size_t )(p - start );
234- if (len > 60 )
235- return -1 ;
236- strncpy (token , start , len );
237- token [len ] = '\0' ;
238-
239- ptr = va_arg (args , void * );
240- if (fscanf (stream , token , ptr ) <= 0 )
241- return count ;
274+ {
275+ char spec = * (p - 1 );
276+ unsigned sz = 0 ;
277+ if (* p )
278+ p ++ ;
279+ len = (size_t )(p - start );
280+ if (len > 60 )
281+ return -1 ;
282+ spec = * (p - 1 );
283+ #if defined(C89STRINGUTILS_HAVE_STRNCPY_S )
284+ strncpy_s (token , sizeof (token ), start , len );
285+ #else
286+ strncpy (token , start , len );
287+ token [len ] = '\0' ;
288+ #endif
289+ ptr = va_arg (args , void * );
290+ if (spec == 's' || spec == 'c' || spec == '[' ) {
291+ sz = va_arg (args , unsigned );
292+ }
293+ #if defined(_MSC_VER ) && _MSC_VER >= 1400
294+ if (spec == 's' || spec == 'c' || spec == '[' ) {
295+ if (fscanf_s (stream , token , ptr , sz ) <= 0 )
296+ return count ;
297+ } else {
298+ if (fscanf_s (stream , token , ptr ) <= 0 )
299+ return count ;
300+ }
301+ #else
302+ if (fscanf (stream , token , ptr ) <= 0 )
303+ return count ;
304+ #endif
305+ }
242306 count ++ ;
243307 }
244308 }
0 commit comments