This is the mail archive of the ecos-patches@sourceware.org mailing list for the eCos project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

New eCos uSTL port patch for review


Hi John,

I created a new uSTL patch for review with a lot of changes mentioned in our previous discussion. You will find the patch here:

http://www.cetoni.de/ecos_ustl20090805.zip

Here a the number of changes so far:

- package is now in language/cxx/ustl folder
- testcases in CDL file are now without cpp extension
- compiles and runs now with (-fno-exceptions, -fno-rtti) and
 (-fexceptions, -frtti)
- adjusted test harness (stdtest.h) to call CYG_TEST_NA() if
  cin, cout & cerr are not present
- adjusted ustl.cdl to require CYGINT_ISO_xxx instead of libc packages
- File I/O package only required if file streams are active
- fixed copyright notices  - copyright notice in changelog remained
  unchanged (almost all eCos ChangeLog files contain GPL license text)
- C99 compliant vsnprintf() return code is now configurable - default
  option is the old implementation
- test case snprintf_c99.c provided for check of return code and test
  for C99 compliant return code
- ustl.cdl requires C99 implementation of snprinf()

At the moment I have not touched the stdint.h file but I will have a lock at the newlib stdint.h file to check if I can use parts of it.

Mike Sharov told me that he plans a new uSTL release within the next 1 or 2 days. He will fix the inconsistent use of #if MACRO and #ifdef MACRO checks in this new release so we can keep the changes to the source to a minumum. He further told me that uSTL releases are quite infrequent. So I think if I get this new relase I will try to implement it and then we should have a stable eCos uSTL implementation for a long period of time.

My last changes to the uSTL package showed that there are two contrasting requirements for this package. The first one is to make it highly configurable to reduce code size of final eCos image and the second one is to keep the changes to the uSTL source to a minimum to make a later import of a new version easy.

I decided to make the filestreams an option and also to make cin, cout and cerr optinal. Further configuration options would lead to an uSTL code that has a lot of modifications to the main uSTL source tree.

Regards, Uwe
diff -ruN ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/ChangeLog ecos/ecos/packages/language/c/libc/stdio/current/ChangeLog
--- ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/ChangeLog	2009-07-22 20:49:46.578125000 +0200
+++ ecos/ecos/packages/language/c/libc/stdio/current/ChangeLog	2009-08-05 10:55:26.366029000 +0200
@@ -1,3 +1,10 @@
+2009-02-16  Uwe Kindler  <uwe_kindler@web.de>
+
+	* cdl/stdio.cdl Added option CYGIMP_LIBC_STDIO_C99_SNPRINTF
+	for activation of C99 compliant snprinf() return value.
+	* src/output/vfnprintf: Added optional C99 compliant return
+	value calculation.
+	
 2009-02-16  Lars Povlsen  <lpovlsen@vitesse.com>
 
 	* include/stdio.h: Removed extra semicolon after scanf()
diff -ruN ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/cdl/stdio.cdl ecos/ecos/packages/language/c/libc/stdio/current/cdl/stdio.cdl
--- ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/cdl/stdio.cdl	2009-07-22 20:49:48.687500000 +0200
+++ ecos/ecos/packages/language/c/libc/stdio/current/cdl/stdio.cdl	2009-08-05 11:19:46.624014600 +0200
@@ -378,6 +378,19 @@
             the streams to be locked when accessed by
             multiple threads simultaneously."
     }
+	
+    cdl_option CYGIMP_LIBC_STDIO_C99_SNPRINTF {
+        display       "C99 compliant snprintf() family"
+        default_value 0
+        description   "
+                This option allows C99 compliant implementation of 
+                snprintf() family (i.e. snprintf(), vsnprintf()) 
+                of functions. C99 compliant snprintf() functions
+                return the number of characters that would have been written 
+                to a sufficiently sized buffer (excluding the '\\0'). 
+                If this option is disabled, the functions simply return 
+                the number of bytes that have been written to the buffer."
+    }
     
 
 # ====================================================================
@@ -435,7 +448,7 @@
             flavor  data
             no_define
             calculated { 
-                "tests/sprintf1 tests/sprintf2 tests/sscanf tests/stdiooutput " 
+                "tests/sprintf1 tests/sprintf2 tests/snprintf_c99 tests/sscanf tests/stdiooutput " 
                 . ((CYGPKG_IO_FILEIO && CYGPKG_FS_RAM) ? "tests/fileio " : "")
             }
             description   "
diff -ruN ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx ecos/ecos/packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx
--- ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx	2009-07-22 20:49:55.593750000 +0200
+++ ecos/ecos/packages/language/c/libc/stdio/current/src/output/vfnprintf.cxx	2009-08-04 16:27:21.576761600 +0200
@@ -206,6 +206,17 @@
         /*
          * BEWARE, these `goto error' on error, and PAD uses `n'.
          */
+#ifdef CYGIMP_LIBC_STDIO_C99_SNPRINTF
+#define PRINT(ptr, len)                                                      \
+CYG_MACRO_START                                                              \
+    if ((size_t)(ret + 1) < n) {                                             \
+        cyg_ucount32 length = MIN( (cyg_ucount32) len, n - ret - 1);         \
+        if (((Cyg_OutputStream *)stream)->write( (const cyg_uint8 *)ptr,     \
+                                            length, &length ))               \
+            goto error;                                                      \
+    }                                                                        \
+CYG_MACRO_END
+#else
 #define PRINT(ptr, len)                                                      \
 CYG_MACRO_START                                                              \
     cyg_ucount32 length = MIN( (cyg_ucount32) len, n - ret - 1);             \
@@ -217,7 +228,7 @@
         goto done;                                                           \
     }                                                                        \
 CYG_MACRO_END
-
+#endif // CYGIMP_LIBC_STDIO_C99_SNPRINTF
 
 #define PAD(howmany, with)                                                   \
 CYG_MACRO_START                                                              \
@@ -276,7 +287,11 @@
                         PRINT(cp, y);
                         ret += y;
                 }
+#ifdef CYGIMP_LIBC_STDIO_C99_SNPRINTF
+                if (x <= 0)
+#else
                 if ((x <= 0) || (ret >= (int)n))  // @@@ this check with n isn't good enough
+#endif
                         goto done;
                 fmt++;          /* skip over '%' */
 
diff -ruN ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/tests/snprintf_c99.c ecos/ecos/packages/language/c/libc/stdio/current/tests/snprintf_c99.c
--- ecos_web_cvs/ecos/packages/language/c/libc/stdio/current/tests/snprintf_c99.c	1970-01-01 01:00:00.000000000 +0100
+++ ecos/ecos/packages/language/c/libc/stdio/current/tests/snprintf_c99.c	2009-08-05 11:22:06.284193200 +0200
@@ -0,0 +1,131 @@
+//=================================================================
+//
+//        snprintf_c99.c
+//
+//        Testcase for C library snprintf() implementation
+//
+//=================================================================
+// ####ECOSGPLCOPYRIGHTBEGIN####
+// -------------------------------------------
+// This file is part of eCos, the Embedded Configurable Operating System.
+// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
+//
+// eCos is free software; you can redistribute it and/or modify it under
+// the terms of the GNU General Public License as published by the Free
+// Software Foundation; either version 2 or (at your option) any later
+// version.
+//
+// eCos is distributed in the hope that it will be useful, but WITHOUT
+// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
+// for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with eCos; if not, write to the Free Software Foundation, Inc.,
+// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
+//
+// As a special exception, if other files instantiate templates or use
+// macros or inline functions from this file, or you compile this file
+// and link it with other works to produce a work based on this file,
+// this file does not by itself cause the resulting work to be covered by
+// the GNU General Public License. However the source code for this file
+// must still be made available in accordance with section (3) of the GNU
+// General Public License v2.
+//
+// This exception does not invalidate any other reasons why a work based
+// on this file might be covered by the GNU General Public License.
+// -------------------------------------------
+// ####ECOSGPLCOPYRIGHTEND####
+//=================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):       Uwe Kindler
+// Contributors:
+// Date:            2009-08-05
+// Description:     Contains testcode for C library snprintf() function
+//
+//
+//####DESCRIPTIONEND####
+
+// CONFIGURATION
+
+#include <pkgconf/libc_stdio.h>   // Configuration header
+
+// INCLUDES
+
+#include <stdio.h>
+#include <cyg/infra/testcase.h>
+
+static int my_strnlen(const char *s, size_t maxlen)
+{
+    const char *ptr;
+    const char *endptr;
+
+    ptr = s;
+    endptr = s + maxlen;
+    while ((*ptr != '\0') && (ptr != endptr))
+    {
+        ptr++;
+    }
+
+    return (int)(ptr-s);
+} // my_strlen()
+
+static void
+test( CYG_ADDRWORD data )
+{
+    static char x[32];
+    static char y[4];
+    int xret;
+    int yret;
+    int xstrlen;
+    int ystrlen;
+
+    // fill buffer to ensure that there are no zeros in the buffers
+    memset(x, 0xFF, sizeof(x));
+    memset(y, 0xFF, sizeof(y));
+    
+    // print into a buffer with sufficient size 
+    xret = snprintf(x, sizeof(x), "%d:%d:%d:%d", 1, 2, 3, 4);
+    xstrlen = my_strnlen(x, sizeof(x));
+    
+    // print into a buffer that is too small
+    yret = snprintf(y, sizeof(y), "%d:%d:%d:%d", 1, 2, 3, 4);
+    ystrlen = my_strnlen(y, sizeof(y));
+    
+    CYG_TEST_PASS_FAIL(xret == xstrlen, "[buffer > strlen] return code");
+    
+#ifdef CYGIMP_LIBC_STDIO_C99_SNPRINTF
+    // C99 compliant implementation returns the number of characters that 
+    // would have been written had size been sufficiently large, 
+    // not counting the terminating nul character
+    CYG_TEST_PASS_FAIL(xret == yret, "[buffer < strlen] return code");
+    CYG_TEST_INFO("C99 compliant implementation of snprintf()");
+#else
+    // default eCos implementation returns number of bytes written into
+    // the buffer without terminating nul character
+    CYG_TEST_PASS_FAIL(yret == ystrlen, "[buffer < strlen] return code");
+    CYG_TEST_INFO("Default implementation of snprintf() (no C99 compliance)");
+#endif
+
+
+    CYG_TEST_FINISH("Finished tests from testcase " __FILE__
+                    " for C library snprintf() function return values");
+
+} // test()
+
+int
+main(int argc, char *argv[])
+{
+    CYG_TEST_INIT();
+
+    CYG_TEST_INFO("Starting tests from testcase " __FILE__ " for C "
+                  "library snprintf() function return values");
+    CYG_TEST_INFO("These test return values of snprinf() family of functions");
+
+    test(0);
+
+    return 0;
+} // main()
+
+// EOF sprintf2.c
--- ecos_web_cvs/ecos/packages/ecos.db	2009-07-22 20:35:26.187500000 +0200
+++ ecos/ecos/packages/ecos.db	2009-08-04 10:40:50.617436400 +0200
@@ -2567,6 +2567,18 @@
 main()"
 }
 
+package CYGPKG_USTL {
+    alias       { "uSTL library" ustl }
+	directory	language/cxx/ustl
+	script		ustl.cdl
+    description  "
+This package enables support for the uSTL library. uSTL is a 
+partial implementation of the STL specification intended to 
+reduce code size of the derivative programs. This allows the 
+user application to use well known standard C++ STL library 
+containers, streams, iterators, algorithms and functors."
+}
+
 package CYGPKG_LIBC {
 	alias		{ "C library" libc clib clibrary }
 	directory	language/c/libc/common

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]