Changeset 9963 for trunk/src/kernel32/unicode/string.c
- Timestamp:
- Mar 31, 2003, 1:54:29 PM (22 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kernel32/unicode/string.c
r8666 r9963 7 7 #include <windows.h> 8 8 #include <limits.h> 9 #include <stdio.h> 10 #include <ctype.h> 9 11 10 12 #include "wine/unicode.h" … … 273 275 return 0L; 274 276 } 277 278 int vsnprintfW(WCHAR *str, unsigned int len, const WCHAR *format, va_list valist) 279 { 280 unsigned int written = 0; 281 const WCHAR *iter = format; 282 char bufa[256], fmtbufa[64], *fmta; 283 284 while (*iter) 285 { 286 while (*iter && *iter != '%') 287 { 288 if (written++ >= len) 289 return -1; 290 *str++ = *iter++; 291 } 292 if (*iter == '%') 293 { 294 fmta = fmtbufa; 295 *fmta++ = *iter++; 296 while (*iter == '0' || 297 *iter == '+' || 298 *iter == '-' || 299 *iter == ' ' || 300 *iter == '0' || 301 *iter == '*' || 302 *iter == '#') 303 { 304 if (*iter == '*') 305 { 306 char *buffiter = bufa; 307 int fieldlen = va_arg(valist, int); 308 sprintf(buffiter, "%d", fieldlen); 309 while (*buffiter) 310 *fmta++ = *buffiter++; 311 } 312 else 313 *fmta++ = *iter; 314 iter++; 315 } 316 317 while (isdigit(*iter)) 318 *fmta++ = *iter++; 319 320 if (*iter == '.') 321 { 322 *fmta++ = *iter++; 323 if (*iter == '*') 324 { 325 char *buffiter = bufa; 326 int fieldlen = va_arg(valist, int); 327 sprintf(buffiter, "%d", fieldlen); 328 while (*buffiter) 329 *fmta++ = *buffiter++; 330 } 331 else 332 while (isdigit(*iter)) 333 *fmta++ = *iter++; 334 } 335 if (*iter == 'h' || *iter == 'l') 336 *fmta++ = *iter++; 337 338 switch (*iter) 339 { 340 case 's': 341 { 342 static const WCHAR none[] = { '(','n','u','l','l',')',0 }; 343 const WCHAR *wstr = va_arg(valist, const WCHAR *); 344 const WCHAR *striter = wstr ? wstr : none; 345 while (*striter) 346 { 347 if (written++ >= len) 348 return -1; 349 *str++ = *striter++; 350 } 351 iter++; 352 break; 353 } 354 355 case 'c': 356 if (written++ >= len) 357 return -1; 358 *str++ = (WCHAR)va_arg(valist, int); 359 iter++; 360 break; 361 362 default: 363 { 364 /* For non wc types, use system sprintf and append to wide char output */ 365 /* FIXME: for unrecognised types, should ignore % when printing */ 366 char *bufaiter = bufa; 367 if (*iter == 'p') 368 sprintf(bufaiter, "%08lX", va_arg(valist, long)); 369 else 370 { 371 *fmta++ = *iter; 372 *fmta = '\0'; 373 if (*iter == 'f') 374 sprintf(bufaiter, fmtbufa, va_arg(valist, double)); 375 else 376 sprintf(bufaiter, fmtbufa, va_arg(valist, void *)); 377 } 378 while (*bufaiter) 379 { 380 if (written++ >= len) 381 return -1; 382 *str++ = *bufaiter++; 383 } 384 iter++; 385 break; 386 } 387 } 388 } 389 } 390 if (written >= len) 391 return -1; 392 *str++ = 0; 393 return (int)written; 394 } 395 396 397 int snprintfW(WCHAR *str, unsigned int len, const WCHAR *format, ...) 398 { 399 int retval; 400 va_list valist; 401 va_start(valist, format); 402 retval = vsnprintfW(str, len, format, valist); 403 va_end(valist); 404 return retval; 405 }
Note:
See TracChangeset
for help on using the changeset viewer.