changeset 330:b2c4b0b4d44f

Add initial support for ll and L printf modifiers.
author Matti Hamalainen <ccr@tnsp.org>
date Tue, 23 Feb 2016 12:55:09 +0200
parents 0fa9d39df928
children 6e42d50c08c4
files th_string.c th_string.h
diffstat 2 files changed, 59 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/th_string.c	Tue Feb 23 12:54:26 2016 +0200
+++ b/th_string.c	Tue Feb 23 12:55:09 2016 +0200
@@ -324,7 +324,20 @@
             switch (*fmt)
             {
                 case 'l':
+                    if (*++fmt == 'l')
+                    {
+                        f_flags |= TH_PF_LONGLONG;
+                        fmt++;
+                    }
+                    else
+                        f_flags |= TH_PF_LONG;
+                    break;
+
                 case 'L':
+                    fmt++;
+                    f_flags |= TH_PF_LONGLONG;
+                    break;
+
                 case 'h':
                 case 'j':
                 case 'z':
@@ -347,24 +360,51 @@
                     break;
 
                 case 'o':
-                    if ((ret = th_printf_vput_int(ctx, vputch, va_arg(ap, unsigned int),
-                        8, f_flags, f_width, f_prec, TRUE, FALSE)) == EOF)
-                        goto out;
+                    if (f_flags & TH_PF_LONGLONG)
+                    {
+                        if ((ret = th_printf_vput_int64(ctx, vputch, va_arg(ap, int64_t),
+                            8, f_flags, f_width, f_prec, TRUE, FALSE)) == EOF)
+                            goto out;
+                    }
+                    else
+                    {
+                        if ((ret = th_printf_vput_int(ctx, vputch, va_arg(ap, unsigned int),
+                            8, f_flags, f_width, f_prec, TRUE, FALSE)) == EOF)
+                            goto out;
+                    }
                     break;
 
                 case 'u':
                 case 'i':
                 case 'd':
-                    if ((ret = th_printf_vput_int(ctx, vputch, va_arg(ap, unsigned int),
-                        10, f_flags, f_width, f_prec, *fmt == 'u', FALSE)) == EOF)
-                        goto out;
+                    if (f_flags & TH_PF_LONGLONG)
+                    {
+                        if ((ret = th_printf_vput_int64(ctx, vputch, va_arg(ap, int64_t),
+                            10, f_flags, f_width, f_prec, *fmt == 'u', FALSE)) == EOF)
+                            goto out;
+                    }
+                    else
+                    {
+                        if ((ret = th_printf_vput_int(ctx, vputch, va_arg(ap, unsigned int),
+                            10, f_flags, f_width, f_prec, *fmt == 'u', FALSE)) == EOF)
+                            goto out;
+                    }
                     break;
 
                 case 'x':
                 case 'X':
-                    if ((ret = th_printf_vput_int(ctx, vputch, va_arg(ap, unsigned int),
-                        16, f_flags, f_width, f_prec, TRUE, *fmt == 'X')) == EOF)
-                        goto out;
+                    if (f_flags & TH_PF_LONGLONG)
+                    {
+                        if ((ret = th_printf_vput_int64(ctx, vputch, va_arg(ap, int64_t),
+                            16, f_flags, f_width, f_prec, TRUE, *fmt == 'X')) == EOF)
+                            goto out;
+                    }
+                    else
+                    {
+                        if ((ret = th_printf_vput_int(ctx, vputch, va_arg(ap, unsigned int),
+                            16, f_flags, f_width, f_prec, TRUE, *fmt == 'X')) == EOF)
+                            goto out;
+                    }
                     break;
 
                 case 'p':
--- a/th_string.h	Tue Feb 23 12:54:26 2016 +0200
+++ b/th_string.h	Tue Feb 23 12:55:09 2016 +0200
@@ -50,14 +50,17 @@
 
 enum
 {
-    TH_PF_NONE  = 0x00,
-    TH_PF_ALT   = 0x01,
-    TH_PF_SIGN  = 0x02,
-    TH_PF_SPACE = 0x04,
-    TH_PF_GROUP = 0x08,
+    TH_PF_NONE  = 0x0000,
+    TH_PF_ALT   = 0x0001,
+    TH_PF_SIGN  = 0x0002,
+    TH_PF_SPACE = 0x0004,
+    TH_PF_GROUP = 0x0008,
 
-    TH_PF_ZERO  = 0x10,
-    TH_PF_LEFT  = 0x20,
+    TH_PF_ZERO  = 0x0100,
+    TH_PF_LEFT  = 0x0200,
+
+    TH_PF_LONG  = 0x1000,
+    TH_PF_LONGLONG = 0x2000,
 };