diff packages/language/c/libc/current/include/stdlib.inl @ 0:3111d98ba7b3 ecos-v1_1-release

Initial commit of eCos version 1.1
author jlarmour
date Tue, 11 May 1999 11:16:07 +0000
parents
children 443894e2e912
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/packages/language/c/libc/current/include/stdlib.inl
@@ -0,0 +1,206 @@
+#ifndef CYGONCE_LIBC_STDLIB_INL
+#define CYGONCE_LIBC_STDLIB_INL
+//===========================================================================
+//
+//      stdlib.inl
+//
+//      Inline implementations for the ANSI standard utility functions
+//      defined in section 7.10 of the standard
+//
+//===========================================================================
+//####COPYRIGHTBEGIN####
+//
+// -------------------------------------------
+// The contents of this file are subject to the Cygnus eCos Public License
+// Version 1.0 (the "License"); you may not use this file except in
+// compliance with the License.  You may obtain a copy of the License at
+// http://sourceware.cygnus.com/ecos
+// 
+// Software distributed under the License is distributed on an "AS IS"
+// basis, WITHOUT WARRANTY OF ANY KIND, either express or implied.  See the
+// License for the specific language governing rights and limitations under
+// the License.
+// 
+// The Original Code is eCos - Embedded Cygnus Operating System, released
+// September 30, 1998.
+// 
+// The Initial Developer of the Original Code is Cygnus.  Portions created
+// by Cygnus are Copyright (C) 1998 Cygnus Solutions.  All Rights Reserved.
+// -------------------------------------------
+//
+//####COPYRIGHTEND####
+//===========================================================================
+//#####DESCRIPTIONBEGIN####
+//
+// Author(s):   jlarmour
+// Contributors:  jlarmour@cygnus.co.uk
+// Date:        1998-02-13
+// Purpose:     
+// Description: 
+// Usage:       #include <stdlib.h> - do not include this file directly
+//
+//####DESCRIPTIONEND####
+//
+//===========================================================================
+//
+// The div() and ldiv() functions in this file are based on original
+// code with the following copyright:
+//
+// Note that only div() and ldiv() have this copyright
+//
+/*
+ * Copyright (c) 1990 Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * Chris Torek.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *      This product includes software developed by the University of
+ *      California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+// CONFIGURATION
+
+#include <pkgconf/libc.h>   // Configuration header
+
+// Include the C library?
+#ifdef CYGPKG_LIBC     
+
+// INCLUDES
+
+#include <stddef.h>         // NULL, wchar_t and size_t from compiler
+#include <stdlib.h>         // Just to be sure that the main header is there
+
+// FUNCTIONS
+
+//===========================================================================
+
+// 7.10.1 String conversion functions
+
+
+CYGPRI_LIBC_INLINE double
+atof( const char *nptr )
+{
+    return strtod( nptr, (char **)NULL );
+} // atof()
+
+CYGPRI_LIBC_INLINE int
+atoi( const char *nptr )
+{
+    return (int)strtol( nptr, (char **)NULL, 10 );
+} // atoi()
+
+
+CYGPRI_LIBC_INLINE long
+atol( const char *nptr )
+{
+    return strtol( nptr, (char **)NULL, 10 );
+} // atol()
+
+//===========================================================================
+
+// 7.10.6 Integer arithmetic functions
+
+
+CYGPRI_LIBC_INLINE int
+abs( int j )
+{
+    return (j<0) ? -j : j;
+} // abs()
+
+
+CYGPRI_LIBC_INLINE div_t
+div( int numer, int denom )
+{
+    div_t result;
+    
+    // The ANSI standard says that |r.quot| <= |n/d|, where
+    // n/d is to be computed in infinite precision.  In other
+    // words, we should always truncate the quotient towards
+    // 0, never -infinity.
+    //
+    // Machine division and remainer may work either way when
+    // one or both of n or d is negative.  If only one is
+    // negative and r.quot has been truncated towards -inf,
+    // r.rem will have the same sign as denom and the opposite
+    // sign of num; if both are negative and r.quot has been
+    // truncated towards -inf, r.rem will be positive (will
+    // have the opposite sign of num).  These are considered
+    // `wrong'.
+    //
+    // If both are num and denom are positive, r will always
+    // be positive.
+    //
+    // This all boils down to:
+    //      if num >= 0, but r.rem < 0, we got the wrong answer.
+    // In that case, to get the right answer, add 1 to r.quot and
+    // subtract denom from r.rem.
+
+    result.quot = numer / denom;
+    result.rem = numer % denom;
+
+    if ( (numer >= 0) && (result.rem < 0) )
+    {
+        result.quot++;
+        result.rem -= denom;
+    } // if
+
+    return result;
+} // div()
+
+
+CYGPRI_LIBC_INLINE long
+labs( long j )
+{
+    return (j<0) ? -j : j;
+} // labs()
+
+
+CYGPRI_LIBC_INLINE ldiv_t
+ldiv( long numer, long denom )
+{
+    ldiv_t result;
+
+    result.quot = numer / denom;
+    result.rem = numer % denom;
+
+    if ( (numer >= 0) && (result.rem < 0) )
+    {
+        result.quot++;
+        result.rem -= denom;
+    } // if
+
+    return result;
+} // ldiv()
+
+
+#endif // ifdef CYGPKG_LIBC     
+
+#endif // CYGONCE_LIBC_STDLIB_INL multiple inclusion protection
+
+// EOF stdlib.inl