This is the mail archive of the
ecos-patches@sourceware.org
mailing list for the eCos project.
New eCos uSTL port patch for review
- From: cetoni GmbH - Uwe Kindler <uwe dot kindler at cetoni dot de>
- To: ecos-patches at sourceware dot org
- Date: Wed, 05 Aug 2009 11:57:03 +0200
- Subject: 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