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