home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / a-urealp.c < prev    next >
C/C++ Source or Header  |  1996-09-28  |  4KB  |  107 lines

  1. /****************************************************************************/
  2. /*                                                                          */
  3. /*                        GNAT COMPILER COMPONENTS                          */
  4. /*                                                                          */
  5. /*                             A - U R E A L P                              */
  6. /*                                                                          */
  7. /*                          C Implementation File                           */
  8. /*                                                                          */
  9. /*                            $Revision: 1.5 $                              */
  10. /*                                                                          */
  11. /*           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          */
  12. /*                                                                          */
  13. /* GNAT is free software;  you can  redistribute it  and/or modify it under */
  14. /* terms of the  GNU General Public License as published  by the Free Soft- */
  15. /* ware  Foundation;  either version 2,  or (at your option) any later ver- */
  16. /* sion.  GNAT is distributed in the hope that it will be useful, but WITH- */
  17. /* OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY */
  18. /* or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License */
  19. /* for  more details.  You should have  received  a copy of the GNU General */
  20. /* Public License  distributed with GNAT;  see file COPYING.  If not, write */
  21. /* to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
  22. /*                                                                          */
  23. /****************************************************************************/
  24.  
  25. /* This file corresponds to the Ada package body Urealp. It was created
  26.    manually from the files urealp.ads and urealp.adb. */
  27.  
  28. #include "config.h"
  29. #include "tree.h"
  30. #include "a-ada.h"
  31. #include "a-types.h"
  32. #include "a-atree.h"
  33. #include "a-nlists.h"
  34. #include "a-elists.h"
  35. #include "a-sinfo.h"
  36. #include "a-einfo.h"
  37. #include "a-namet.h"
  38. #include "a-string.h"
  39. #include "a-uintp.h"
  40. #include "a-urealp.h"
  41.  
  42. /* Universal reals are represented by the Ureal type which is an index into
  43.    the Ureals_Ptr table containing Ureal_Entry values.  A Ureal_Entry contains
  44.    a numerator value, a denominator value and a Bas value.  */
  45.  
  46. #define UI_Ge uintp__ui_ge
  47. extern Boolean UI_Ge  PROTO ((Uint, Uint));
  48.  
  49. #define UI_Gt uintp__ui_gt
  50. extern Boolean UI_Gt  PROTO ((Uint, Uint));
  51.  
  52. #define UI_Mul uintp__ui_mul
  53. extern Uint UI_Product  PROTO ((Uint, Uint));
  54.  
  55. #define UI_Expon uintp__ui_expon
  56. extern Uint UI_Exponentiate  PROTO ((Uint, Uint));
  57.  
  58. #define UI_From_Int uintp__ui_from_int
  59. extern Uint UI_From_Int  PROTO ((Int));
  60.  
  61. #define UI_Negate uintp__ui_negate
  62. extern Uint UI_Negate  PROTO ((Uint));
  63.  
  64. /* We are not preserving negative zeroes properly here ??? */
  65.  
  66. Uint
  67. Numerator (Real)
  68.      Ureal Real;
  69. {
  70.   Nat Bas = Ureals_Ptr[Real].Bas;
  71.   Uint Num = Ureals_Ptr[Real].Num;
  72.  
  73.   if (Ureals_Ptr[Real].Negative)
  74.      Num = UI_Negate (Num);
  75.  
  76.   if (Bas == 0)
  77.     return Num;
  78.   else
  79.     {
  80.       Uint Den = Ureals_Ptr[Real].Den;
  81.  
  82.       if (UI_Ge (Den, Uint_0))
  83.     return Num;
  84.       else
  85.     return UI_Mul (UI_Expon (UI_From_Int (Bas),
  86.                UI_Negate (Den)), Num);
  87.     }
  88. }
  89.  
  90. Uint
  91. Denominator (Real)
  92.      Ureal Real;
  93. {
  94.   Nat Bas = Ureals_Ptr[Real].Bas;
  95.   Uint Den  = Ureals_Ptr[Real].Den;
  96.  
  97.   if (Bas == 0)
  98.     return Den;
  99.   else
  100.     {
  101.       if (UI_Gt (Den, Uint_0))
  102.     return UI_Expon (UI_From_Int (Bas), Den);
  103.       else
  104.     return Uint_1;
  105.      }
  106. }
  107.