| 368 | /************************************************************************/ |
| 369 | |
| 370 | int msIO_fprintf( FILE *fp, const char *format, ... ) |
| 371 | |
| 372 | { |
| 373 | va_list args, args_copy; |
| 374 | int return_val; |
| 375 | msIOContext *context; |
| 376 | char workBuf[8000], *largerBuf = NULL; |
| 377 | |
| 378 | va_start( args, format ); |
| 379 | |
| 380 | #if !defined(HAVE_VSNPRINTF) |
| 381 | return_val = vsprintf( workBuf, format, args); |
| 382 | |
| 383 | if( return_val < 0 || return_val >= sizeof(workBuf) ) |
| 384 | { |
| 385 | va_end( args ); |
| 386 | msSetError(MS_MISCERR, "Possible buffer overrun.", "msIO_fprintf()"); |
| 387 | return -1; |
| 388 | } |
| 389 | |
| 390 | #else |
| 391 | |
| 392 | #ifdef va_copy |
| 393 | va_copy( args_copy, args ); |
| 394 | #else |
| 395 | args_copy = args; |
| 396 | #endif /* va_copy */ |
| 397 | |
| 398 | return_val = vsnprintf( workBuf, sizeof(workBuf), format, args ); |
| 399 | if (return_val == -1 || return_val >= sizeof(workBuf)-1) |
| 400 | { |
| 401 | return_val = _ms_vsprintf(&largerBuf, format, args_copy ); |
| 402 | } |
| 403 | va_end(args_copy); |
| 404 | |
| 405 | #endif /* HAVE_VSNPRINTF */ |
| 406 | |
| 407 | va_end( args ); |
| 408 | |
| 409 | if (return_val < 0) |
| 410 | return -1; |
| 411 | |
| 412 | context = msIO_getHandler( fp ); |
| 413 | if( context == NULL ) |
| 414 | return_val = fwrite( largerBuf?largerBuf:workBuf, 1, return_val, fp ); |
| 415 | else |
| 416 | return_val = msIO_contextWrite( context, |
| 417 | largerBuf?largerBuf:workBuf, |
| 418 | return_val ); |
| 419 | |
| 420 | msFree(largerBuf); |
| 421 | |
| 422 | return return_val; |
| 423 | } |
| 424 | |
| 425 | /************************************************************************/ |
| 426 | /* msIO_vfprintf() */ |
no test coverage detected