home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 22 gnu / 22-gnu.zip / gwm18a.zip / wl_number.c < prev    next >
C/C++ Source or Header  |  1995-07-03  |  3KB  |  149 lines

  1. /* Copyright 1989 GROUPE BULL -- See license conditions in file COPYRIGHT
  2.  * Copyright 1989 Massachusetts Institute of Technology
  3.  */
  4. /***********************\
  5. *                 *
  6. *  WOOL_OBJECT: Number  *
  7. *  BODY                *
  8. *                 *
  9. \***********************/
  10.  
  11. #include "EXTERN.h"
  12. #include <stdio.h>
  13. #include "wool.h"
  14. #include "wl_atom.h"
  15. #include "wl_list.h"
  16. #include "wl_pointer.h"
  17. #include "INTERN.h"
  18. #include "wl_number.h"
  19.  
  20. /* pre-calculated numbers for efficiency */
  21. #define MIN_BUILT_IN_NUMBER -1
  22. #define MAX_BUILT_IN_NUMBER 10
  23. static WOOL_Number
  24.     built_in_numbers[MAX_BUILT_IN_NUMBER - MIN_BUILT_IN_NUMBER + 1];
  25.  
  26. /*
  27.  * Constructor: WLNumber_make
  28.  *   argument 1: The Num (int of size char *) which is to be our number.
  29.  */
  30.  
  31. WOOL_Number 
  32. WLNumber_make(i)
  33. Num            i;    /* just the Num value of the integer */
  34. {
  35.     WOOL_Number object;
  36.  
  37.     if (i <= MAX_BUILT_IN_NUMBER && i >= MIN_BUILT_IN_NUMBER)
  38.     return built_in_numbers[i - MIN_BUILT_IN_NUMBER];
  39.     object = (WOOL_Number) Malloc(sizeof(struct _WOOL_Number));
  40.     zrt_put(object);
  41.     object -> type = WLNumber;
  42.     object -> number = i;
  43.     return object;
  44. }
  45.  
  46. WOOL_Number
  47. WLNumber_raw_make(i)
  48. long            i;     /* just the LONG value of the integer */
  49. {
  50.     WOOL_Number object =
  51.     (WOOL_Number) Malloc(sizeof(struct _WOOL_Number));
  52.  
  53.     zrt_put(object);
  54.     object -> type = WLNumber;
  55.     object -> number = i;
  56.     return object;
  57. }
  58.  
  59.  
  60. /*
  61.  * pre-calculate "low" numbers (most used ones)
  62.  */
  63.  
  64. WLNumber_init()
  65. {
  66.     long            i;
  67.  
  68.     for (i = MIN_BUILT_IN_NUMBER; i <= MAX_BUILT_IN_NUMBER; i++)
  69.     increase_reference(built_in_numbers[i - MIN_BUILT_IN_NUMBER]
  70.                = WLNumber_raw_make(i));
  71.     /* calculates the UNDEFINED_WOOL_VALUE */
  72.     UNDEFINED_WOOL_VALUE = (WOOL_OBJECT) WLNumber_raw_make(0);
  73.     increase_reference(UNDEFINED_WOOL_VALUE);
  74. }
  75.  
  76. /*
  77.  * WLNumber_eval:
  78.  * A number evaluates to itself.
  79.  */
  80.  
  81. WOOL_OBJECT 
  82. WLNumber_eval(obj)
  83. WOOL_OBJECT obj;
  84. {
  85.     return obj;
  86. }
  87.  
  88. /*
  89.  * WLNumber_print:
  90.  * a number prints as a long.
  91.  */
  92.  
  93. WOOL_OBJECT 
  94. WLNumber_print(obj)
  95. WOOL_Number     obj;
  96. {
  97.     wool_printf("%ld", obj -> number);
  98.     return (WOOL_OBJECT) obj;
  99. }
  100.  
  101. /*
  102.  * WLNumber_free:
  103.  * The structure is just freed.
  104.  */
  105.  
  106. WOOL_OBJECT 
  107. WLNumber_free(obj)
  108. WOOL_Number     obj;
  109. {
  110.     Free(obj);
  111.     return NULL;
  112. }
  113.  
  114. /*
  115.  * handles its number as an C object. This is the normal way to use pointers
  116.  */
  117.  
  118. long *
  119. WLNumber_get_C_value(obj)
  120. WOOL_Number obj;
  121. {
  122.     return (long *) (obj->number);
  123. }
  124.  
  125. WOOL_OBJECT
  126. WLNumber_equal(n1, n2)
  127. WOOL_Number n1, n2;
  128. {
  129.     if (n2 -> type == n1 -> type && n2 -> number == n1 -> number)
  130.     return (WOOL_OBJECT) n1;
  131.     else
  132.     return NIL;
  133. }
  134.  
  135.  
  136. WOOL_OBJECT
  137. add_numbers(argc,argv)
  138. int        argc;
  139. WOOL_Number     argv[];
  140. {
  141.     int             i, result = 0;
  142.  
  143.     for (i = 0; i < argc; i++) {
  144.     must_be_number(argv[i], i);
  145.     result += argv[i] -> number;
  146.     }
  147.     return (WOOL_OBJECT) WLNumber_make(result);
  148. }
  149.