1/* 2****************************************************************************** 3* 4* Copyright (C) 1998-2004, International Business Machines 5* Corporation and others. All Rights Reserved. 6* 7****************************************************************************** 8* 9* File uprintf.c 10* 11* Modification History: 12* 13* Date Name Description 14* 11/19/98 stephen Creation. 15* 03/12/99 stephen Modified for new C API. 16* Added conversion from default codepage. 17* 08/07/2003 george Reunify printf implementations 18****************************************************************************** 19*/ 20 21#include "unicode/utypes.h" 22 23#if !UCONFIG_NO_FORMATTING 24 25#include "unicode/ustdio.h" 26#include "unicode/ustring.h" 27#include "unicode/unum.h" 28#include "unicode/udat.h" 29#include "unicode/putil.h" 30 31#include "uprintf.h" 32#include "ufile.h" 33#include "locbund.h" 34 35#include "cmemory.h" 36 37static int32_t U_EXPORT2 38u_printf_write(void *context, 39 const UChar *str, 40 int32_t count) 41{ 42 return u_file_write(str, count, (UFILE *)context); 43} 44 45static int32_t 46u_printf_pad_and_justify(void *context, 47 const u_printf_spec_info *info, 48 const UChar *result, 49 int32_t resultLen) 50{ 51 UFILE *output = (UFILE *)context; 52 int32_t written, i; 53 54 /* pad and justify, if needed */ 55 if(info->fWidth != -1 && resultLen < info->fWidth) { 56 /* left justify */ 57 if(info->fLeft) { 58 written = u_file_write(result, resultLen, output); 59 for(i = 0; i < info->fWidth - resultLen; ++i) { 60 written += u_file_write(&info->fPadChar, 1, output); 61 } 62 } 63 /* right justify */ 64 else { 65 written = 0; 66 for(i = 0; i < info->fWidth - resultLen; ++i) { 67 written += u_file_write(&info->fPadChar, 1, output); 68 } 69 written += u_file_write(result, resultLen, output); 70 } 71 } 72 /* just write the formatted output */ 73 else { 74 written = u_file_write(result, resultLen, output); 75 } 76 77 return written; 78} 79 80U_CAPI int32_t U_EXPORT2 81u_fprintf( UFILE *f, 82 const char *patternSpecification, 83 ... ) 84{ 85 va_list ap; 86 int32_t count; 87 88 va_start(ap, patternSpecification); 89 count = u_vfprintf(f, patternSpecification, ap); 90 va_end(ap); 91 92 return count; 93} 94 95U_CAPI int32_t U_EXPORT2 96u_fprintf_u( UFILE *f, 97 const UChar *patternSpecification, 98 ... ) 99{ 100 va_list ap; 101 int32_t count; 102 103 va_start(ap, patternSpecification); 104 count = u_vfprintf_u(f, patternSpecification, ap); 105 va_end(ap); 106 107 return count; 108} 109 110U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 111u_vfprintf( UFILE *f, 112 const char *patternSpecification, 113 va_list ap) 114{ 115 int32_t count; 116 UChar *pattern; 117 UChar buffer[UFMT_DEFAULT_BUFFER_SIZE]; 118 int32_t size = (int32_t)strlen(patternSpecification) + 1; 119 120 /* convert from the default codepage to Unicode */ 121 if (size >= MAX_UCHAR_BUFFER_SIZE(buffer)) { 122 pattern = (UChar *)uprv_malloc(size * sizeof(UChar)); 123 if(pattern == 0) { 124 return 0; 125 } 126 } 127 else { 128 pattern = buffer; 129 } 130 u_charsToUChars(patternSpecification, pattern, size); 131 132 /* do the work */ 133 count = u_vfprintf_u(f, pattern, ap); 134 135 /* clean up */ 136 if (pattern != buffer) { 137 uprv_free(pattern); 138 } 139 140 return count; 141} 142 143static const u_printf_stream_handler g_stream_handler = { 144 u_printf_write, 145 u_printf_pad_and_justify 146}; 147 148U_CAPI int32_t U_EXPORT2 /* U_CAPI ... U_EXPORT2 added by Peter Kirk 17 Nov 2001 */ 149u_vfprintf_u( UFILE *f, 150 const UChar *patternSpecification, 151 va_list ap) 152{ 153 int32_t written = 0; /* haven't written anything yet */ 154 155 /* parse and print the whole format string */ 156 u_printf_parse(&g_stream_handler, patternSpecification, f, NULL, &f->str.fBundle, &written, ap); 157 158 /* return # of UChars written */ 159 return written; 160} 161 162#endif /* #if !UCONFIG_NO_FORMATTING */ 163 164