changeset 1721:2c111aea4d06

* cdl/stdio.cdl (CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE): Only use CYGDAT_IO_SERIAL_TTY_CONSOLE if set. * src/input/vfscanf.cxx (vfscanf): Add long long and long double support. * cdl/stdio.cdl (CYGFUN_LIBC_STDIO_LONGLONG): Make it a new option.
author jlarmour
date Wed, 18 Aug 2004 14:11:59 +0000
parents 202432a1c50d
children d0cd03f9e00f
files packages/language/c/libc/stdio/current/ChangeLog packages/language/c/libc/stdio/current/cdl/stdio.cdl packages/language/c/libc/stdio/current/src/input/vfscanf.cxx
diffstat 3 files changed, 85 insertions(+), 6 deletions(-) [+]
line wrap: on
line diff
--- a/packages/language/c/libc/stdio/current/ChangeLog
+++ b/packages/language/c/libc/stdio/current/ChangeLog
@@ -1,3 +1,15 @@
+2004-08-18  Jonathan Larmour  <jifl@eCosCentric.com>
+
+	* cdl/stdio.cdl (CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE): Only use
+	CYGDAT_IO_SERIAL_TTY_CONSOLE if set.
+
+2004-08-18  Fredrik Hederstierna  <fredrik@wespot.com>
+2004-08-18  Jonathan Larmour  <jifl@eCosCentric.com>
+
+	* src/input/vfscanf.cxx (vfscanf): Add long long and long double
+	support.
+	* cdl/stdio.cdl (CYGFUN_LIBC_STDIO_LONGLONG): Make it a new option.
+
 2004-08-16  Oyvind Harboe <oyvind.harboe@zylin.com>
 
 	* src/common/stream.cxx (read): fixed performance problem with
--- a/packages/language/c/libc/stdio/current/cdl/stdio.cdl
+++ b/packages/language/c/libc/stdio/current/cdl/stdio.cdl
@@ -293,7 +293,7 @@ cdl_package CYGPKG_LIBC_STDIO {
     cdl_option CYGDAT_LIBC_STDIO_DEFAULT_CONSOLE {
         display       "Default console device"
         flavor        data
-        default_value CYGDAT_IO_SERIAL_TTY_CONSOLE
+        default_value { CYGDAT_IO_SERIAL_TTY_CONSOLE ? CYGDAT_IO_SERIAL_TTY_CONSOLE : "\"/dev/null\"" }
         description   "
             This option allows you to choose the
             default console device. In the current
@@ -348,6 +348,16 @@ cdl_package CYGPKG_LIBC_STDIO {
                 converted."
         }
     }
+
+    cdl_option CYGFUN_LIBC_STDIO_LONGLONG {
+        display       "Long long support"
+        requires      CYGFUN_LIBC_STDLIB_CONV_LONGLONG
+        default_value 1
+        description   "
+                This option allows various functions in the C Standard I/O
+                library to support the 'long long' datatype. Doing so
+                will come with a noticeable code size penalty however."
+    }
     
     cdl_option CYGSEM_LIBC_STDIO_THREAD_SAFE_STREAMS {
         display       "Thread safe I/O streams"
--- a/packages/language/c/libc/stdio/current/src/input/vfscanf.cxx
+++ b/packages/language/c/libc/stdio/current/src/input/vfscanf.cxx
@@ -109,7 +109,7 @@
  */
 
 #define LONG            0x01    /* l: long or double */
-#define LONGDBL         0x02    /* L: long double; unimplemented */
+#define LONGDBL         0x02    /* L: long double */
 #define SHORT           0x04    /* h: short */
 #define SUPPRESS        0x08    /* suppress assignment */
 #define POINTER         0x10    /* weird %p pointer (`fake hex') */
@@ -146,8 +146,10 @@
 #endif
 #define u_char char
 #define u_long unsigned long
+#define u_long_long unsigned long long
 
 typedef unsigned long (*strtoul_t)(const char *, char **endptr, int base);
+typedef unsigned long long (*strtoull_t)(const char *, char **endptr, int base);
 
 static u_char *
 __sccl (char *tab, u_char *fmt);
@@ -200,6 +202,10 @@ vfscanf (FILE *fp, const char *fmt0, va_
 #endif
     
     strtoul_t ccfn = NULL;      /* conversion function (strtol/strtoul) */
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+    strtoull_t ccfnL = NULL;      /* conversion function (strtoll/strtoull) */
+    long long *ll;
+#endif
     char ccltab[256];           /* character class table for %[...] */
     char buf[BUF];              /* buffer for numeric conversions */
 
@@ -280,11 +286,23 @@ literal:
             flags |= SUPPRESS;
             goto again;
         case 'l':
-            flags |= LONG;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+	    // check if we are using long long 'll'
+	    if (flags & LONG) {
+	      // change to long long
+	      flags &= ~LONG;
+	      flags |= LONGDBL;
+	    }
+	    else
+#endif
+	      flags |= LONG;
+	    
             goto again;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
         case 'L':
             flags |= LONGDBL;
             goto again;
+#endif
         case 'h':
             flags |= SHORT;
             goto again;
@@ -316,12 +334,20 @@ literal:
         case 'd':
             c = CT_INT;
             ccfn = (strtoul_t)strtol;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+	    if (flags & LONGDBL)
+	      ccfnL = (strtoull_t)strtoll;
+#endif
             base = 10;
             break;
 
         case 'i':
             c = CT_INT;
             ccfn = (strtoul_t)strtol;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+	    if (flags & LONGDBL)
+	      ccfnL = (strtoull_t)strtoll;
+#endif
             base = 0;
             break;
 
@@ -331,12 +357,20 @@ literal:
         case 'o':
             c = CT_INT;
             ccfn = strtoul;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+	    if (flags & LONGDBL)
+	      ccfnL = strtoull;
+#endif
             base = 8;
             break;
 
         case 'u':
             c = CT_INT;
             ccfn = strtoul;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+	    if (flags & LONGDBL)
+	      ccfnL = strtoull;
+#endif
             base = 10;
             break;
 
@@ -345,6 +379,10 @@ literal:
             flags |= PFXOK;     /* enable 0x prefixing */
             c = CT_INT;
             ccfn = strtoul;
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+	    if (flags & LONGDBL)
+	      ccfnL = strtoull;
+#endif
             base = 16;
             break;
 
@@ -733,10 +771,21 @@ literal:
             }
             if ((flags & SUPPRESS) == 0)
             {
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+                u_long_long res;
+#else
                 u_long res;
+#endif
 
                 *p = 0;
-                res = (*ccfn) (buf, (char **) NULL, base);
+		
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+		if (flags & LONGDBL)
+		  res = (*ccfnL) (buf, (char **) NULL, base);
+		else
+#endif
+		  res = (*ccfn) (buf, (char **) NULL, base);
+
                 if (flags & POINTER)
                     *(va_arg (ap, char **)) = (char *) (CYG_ADDRESS) res;
                 else if (flags & SHORT)
@@ -749,6 +798,13 @@ literal:
                     lp = va_arg (ap, long *);
                     *lp = res;
                 }
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
+                else if (flags & LONGDBL)
+                {
+                    ll = va_arg (ap, long long *);
+                    *ll = res;
+                }
+#endif
                 else
                 {
                     ip = va_arg (ap, int *);
@@ -859,10 +915,9 @@ literal:
             if ((flags & SUPPRESS) == 0)
             {
                 double res;
-
                 *p = 0;
 #ifdef CYGSEM_LIBC_STDIO_SCANF_FLOATING_POINT
-                res = atof (buf);
+                res = strtod( buf, NULL );
 #else
                 res = 0.0;
 #endif
@@ -871,11 +926,13 @@ literal:
                     dp = va_arg (ap, double *);
                     *dp = res;
                 }
+#ifdef CYGFUN_LIBC_STDIO_LONGLONG
                 else if (flags & LONGDBL)
                 {
                     ldp = va_arg (ap, long double *);
                     *ldp = res;
                 }
+#endif
                 else
                 {
                     flp = va_arg (ap, float *);