Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * lround_generic.c
  3.  *
  4.  * $Id: lround_generic.c,v 1.1 2008/06/03 18:42:21 keithmarshall Exp $
  5.  *
  6.  * Provides a generic implementation for the `lround()', `lroundf()',
  7.  * `lroundl()', `llround()', `llroundf()' and `llroundl()' functions;
  8.  * compile with `-D FUNCTION=name', with `name' set to each of these
  9.  * six in turn, to create separate object files for each of the six
  10.  * functions.
  11.  *
  12.  * Written by Keith Marshall <keithmarshall@users.sourceforge.net>
  13.  *
  14.  * This is free software.  You may redistribute and/or modify it as you
  15.  * see fit, without restriction of copyright.
  16.  *
  17.  * This software is provided "as is", in the hope that it may be useful,
  18.  * but WITHOUT WARRANTY OF ANY KIND, not even any implied warranty of
  19.  * MERCHANTABILITY, nor of FITNESS FOR ANY PARTICULAR PURPOSE.  At no
  20.  * time will the author accept any form of liability for any damages,
  21.  * however caused, resulting from the use of this software.
  22.  *
  23.  */
  24. #ifndef FUNCTION
  25. /*
  26.  * Normally specified with `-D FUNCTION=name', on the command line.
  27.  * Valid FUNCTION names are `lround', `lroundf', `lroundl', `llround'
  28.  * `llroundf' and `llroundl'; specifying anything else will most likely
  29.  * cause a compilation error.  If user did not specify an appropriate
  30.  * FUNCTION name, default to `lround'.
  31.  */
  32. #define FUNCTION lround
  33. #endif
  34.  
  35. #include "round_internal.h"
  36.  
  37. #include <limits.h>
  38. #include <errno.h>
  39.  
  40. /* Generic implementation.
  41.  * The user is required to specify the FUNCTION name;
  42.  * the RETURN_TYPE and INPUT_TYPE macros resolve to appropriate
  43.  * type declarations, to match the selected FUNCTION prototype,
  44.  * while RETURN_MAX and RETURN_MIN map to the correspondingly
  45.  * appropriate limits.h manifest values, to establish the
  46.  * valid range for the RETURN_TYPE.
  47.  */
  48. RETURN_TYPE FUNCTION( INPUT_TYPE x )
  49. {
  50.   if( !isfinite( x ) || !isfinite( x = round_internal( x ) )
  51.   ||  (x > MAX_RETURN_VALUE) || (x < MIN_RETURN_VALUE)        )
  52.     /*
  53.      * Undefined behaviour...
  54.      * POSIX requires us to report a domain error; ANSI C99 says we
  55.      * _may_ report a range error, and previous MinGW implementation
  56.      * set `errno = ERANGE' here; we change that, conforming to the
  57.      * stricter requiremment of the POSIX standard.
  58.      */
  59.     errno = EDOM;
  60.  
  61.   return (RETURN_TYPE)(x);
  62. }
  63.  
  64. /* $RCSfile: lround_generic.c,v $$Revision: 1.1 $: end of file */
  65.