aboutsummaryrefslogtreecommitdiffhomepage
path: root/wutil.c
diff options
context:
space:
mode:
authorGravatar axel <axel@liljencrantz.se>2005-10-06 20:30:52 +1000
committerGravatar axel <axel@liljencrantz.se>2005-10-06 20:30:52 +1000
commit401e060c052ea9a5940d5b9995178c7b04b5f85d (patch)
treec77bceaa01b5c486246d14c2a04e7b6cfdbd28d0 /wutil.c
parent2d772358907757e8acca42f47269702964899b0b (diff)
Updates to string formating functions
darcs-hash:20051006103052-ac50b-78e27365d2b2412ffced94825f37cbf6c0fa4d45.gz
Diffstat (limited to 'wutil.c')
-rw-r--r--wutil.c130
1 files changed, 90 insertions, 40 deletions
diff --git a/wutil.c b/wutil.c
index 6a1a4122..cddae6af 100644
--- a/wutil.c
+++ b/wutil.c
@@ -228,8 +228,8 @@ static int vgwprintf( void (*writer)(wchar_t),
int width = 0;
filter++;
int loop=1;
- int precision=INT_MAX;
-
+ int precision=-1;
+
while( loop )
{
switch(*filter)
@@ -291,11 +291,26 @@ static int vgwprintf( void (*writer)(wchar_t),
break;
}
case L's':
- {
- wchar_t *ss = is_long?va_arg(va, wchar_t*):str2wcs(va_arg(va, char*));
-
+ {
+ wchar_t *ss=0;
+ if( is_long )
+ {
+ ss = va_arg(va, void *);
+ }
+ else
+ {
+ char *ns = va_arg(va, char*);
+
+ if( ns )
+ {
+ ss = str2wcs( ns );
+ }
+ }
+
if( !ss )
+ {
return -1;
+ }
if( width )
{
@@ -306,13 +321,13 @@ static int vgwprintf( void (*writer)(wchar_t),
count++;
}
}
-
+
wchar_t *s=ss;
int precount = count;
while( *s )
{
- if( (precision <= (count-precount) ) )
+ if( (precision > 0) && (precision <= (count-precount) ) )
break;
writer( *(s++) );
@@ -329,27 +344,38 @@ static int vgwprintf( void (*writer)(wchar_t),
case L'i':
{
char str[32];
-
+ char *pos;
+
switch( is_long )
{
case 0:
{
int d = va_arg( va, int );
- snprintf( str, 32, "%.*d", precision, d );
+ if( precision > 0 )
+ snprintf( str, 32, "%.*d", precision, d );
+ else
+ snprintf( str, 32, "%d", d );
+
break;
}
case 1:
{
long d = va_arg( va, long );
- snprintf( str, 32, "%.*ld", precision, d );
+ if( precision > 0 )
+ snprintf( str, 32, "%.*ld", precision, d );
+ else
+ snprintf( str, 32, "%ld", d );
break;
}
case 2:
{
long long d = va_arg( va, long long );
- snprintf( str, 32, "%.*lld", precision, d );
+ if( precision > 0 )
+ snprintf( str, 32, "%.*lld", precision, d );
+ else
+ snprintf( str, 32, "%lld", d );
break;
}
@@ -360,27 +386,29 @@ static int vgwprintf( void (*writer)(wchar_t),
if( width )
{
int i;
+
for( i=strlen(str); i<width; i++ )
{
writer( L' ' );
count++;
}
}
-
- int c = gwprintf( writer, L"%s", str );
- if( c==-1 )
- return -1;
- else
- count += c;
+
+ pos = str;
+ while( *pos )
+ {
+ writer( *(pos++) );
+ count++;
+ }
+
break;
}
-
+
case L'u':
{
char str[32];
-
switch( is_long )
{
case 0:
@@ -436,7 +464,7 @@ static int vgwprintf( void (*writer)(wchar_t),
}
default:
debug( 0, L"Unknown switch %lc in string %ls\n", *filter, filter_org );
- exit(1);
+// exit(1);
}
}
else
@@ -454,10 +482,12 @@ static int gwprintf( void (*writer)(wchar_t),
... )
{
va_list va;
+ int written;
+
va_start( va, filter );
- int written=vgwprintf( writer,
- filter,
- va );
+ written=vgwprintf( writer,
+ filter,
+ va );
va_end( va );
return written;
}
@@ -474,7 +504,7 @@ static struct
sw_data;
/**
- Writer for swprintf
+ Writers for string output
*/
static void sw_writer( wchar_t c )
{
@@ -483,17 +513,16 @@ static void sw_writer( wchar_t c )
sw_data.count++;
}
-
-int swprintf( wchar_t *out, size_t n, const wchar_t *filter, ... )
+int vswprintf( wchar_t *out, size_t n, const wchar_t *filter, va_list va )
{
- va_list va;
- va_start( va, filter );
+ int written;
+
sw_data.pos=out;
sw_data.max=n;
sw_data.count=0;
- int written=vgwprintf( &sw_writer,
- filter,
- va );
+ written=vgwprintf( &sw_writer,
+ filter,
+ va );
if( written < n )
{
*sw_data.pos = 0;
@@ -503,6 +532,16 @@ int swprintf( wchar_t *out, size_t n, const wchar_t *filter, ... )
written=-1;
}
+ return written;
+}
+
+int swprintf( wchar_t *out, size_t n, const wchar_t *filter, ... )
+{
+ va_list va;
+ int written;
+
+ va_start( va, filter );
+ written = vswprintf( out, n, filter, va );
va_end( va );
return written;
}
@@ -517,30 +556,41 @@ static void fw_writer( wchar_t c )
putw( c, fw_data );
}
-/**
- Writer for fwprintf and wprintf
+/*
+ Writers for file output
*/
+int vfwprintf( FILE *f, const wchar_t *filter, va_list va )
+{
+ fw_data = f;
+ return vgwprintf( &fw_writer, filter, va );
+}
+
int fwprintf( FILE *f, const wchar_t *filter, ... )
{
va_list va;
- va_start( va, filter );
- fw_data = f;
+ int written;
- int written=vgwprintf( &fw_writer, filter, va );
+ va_start( va, filter );
+ written = vfwprintf( f, filter, va );
va_end( va );
return written;
}
+int vwprintf( const wchar_t *filter, va_list va )
+{
+ fw_data=stdout;
+ return vgwprintf( &fw_writer, filter, va );
+}
+
int wprintf( const wchar_t *filter, ... )
{
va_list va;
- va_start( va, filter );
- fw_data = stdout;
+ int written;
- int written=vgwprintf( &fw_writer, filter, va );
+ va_start( va, filter );
+ written=vwprintf( filter, va );
va_end( va );
return written;
}
#endif
-