Home | History | Annotate | Line # | Download | only in base
      1 /*	$NetBSD: number.c,v 1.2 2017/01/28 21:31:45 christos Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2010 Kungliga Tekniska Hgskolan
      5  * (Royal Institute of Technology, Stockholm, Sweden).
      6  * All rights reserved.
      7  *
      8  * Portions Copyright (c) 2010 Apple Inc. All rights reserved.
      9  *
     10  * Redistribution and use in source and binary forms, with or without
     11  * modification, are permitted provided that the following conditions
     12  * are met:
     13  *
     14  * 1. Redistributions of source code must retain the above copyright
     15  *    notice, this list of conditions and the following disclaimer.
     16  *
     17  * 2. Redistributions in binary form must reproduce the above copyright
     18  *    notice, this list of conditions and the following disclaimer in the
     19  *    documentation and/or other materials provided with the distribution.
     20  *
     21  * 3. Neither the name of the Institute nor the names of its contributors
     22  *    may be used to endorse or promote products derived from this software
     23  *    without specific prior written permission.
     24  *
     25  * THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
     26  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
     27  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
     28  * ARE DISCLAIMED.  IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
     29  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
     30  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
     31  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
     32  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
     33  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
     34  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
     35  * SUCH DAMAGE.
     36  */
     37 
     38 #include "baselocl.h"
     39 
     40 static void
     41 number_dealloc(void *ptr)
     42 {
     43 }
     44 
     45 static int
     46 number_cmp(void *a, void *b)
     47 {
     48     int na, nb;
     49 
     50     if (heim_base_is_tagged_object(a))
     51 	na = heim_base_tagged_object_value(a);
     52     else
     53 	na = *(int *)a;
     54 
     55     if (heim_base_is_tagged_object(b))
     56 	nb = heim_base_tagged_object_value(b);
     57     else
     58 	nb = *(int *)b;
     59 
     60     return na - nb;
     61 }
     62 
     63 static unsigned long
     64 number_hash(void *ptr)
     65 {
     66     if (heim_base_is_tagged_object(ptr))
     67 	return heim_base_tagged_object_value(ptr);
     68     return (unsigned long)*(int *)ptr;
     69 }
     70 
     71 struct heim_type_data _heim_number_object = {
     72     HEIM_TID_NUMBER,
     73     "number-object",
     74     NULL,
     75     number_dealloc,
     76     NULL,
     77     number_cmp,
     78     number_hash,
     79     NULL
     80 };
     81 
     82 /**
     83  * Create a number object
     84  *
     85  * @param the number to contain in the object
     86  *
     87  * @return a number object
     88  */
     89 
     90 heim_number_t
     91 heim_number_create(int number)
     92 {
     93     heim_number_t n;
     94 
     95     if (number < 0xffffff && number >= 0)
     96 	return heim_base_make_tagged_object(number, HEIM_TID_NUMBER);
     97 
     98     n = _heim_alloc_object(&_heim_number_object, sizeof(int));
     99     if (n)
    100 	*((int *)n) = number;
    101     return n;
    102 }
    103 
    104 /**
    105  * Return the type ID of number objects
    106  *
    107  * @return type id of number objects
    108  */
    109 
    110 heim_tid_t
    111 heim_number_get_type_id(void)
    112 {
    113     return HEIM_TID_NUMBER;
    114 }
    115 
    116 /**
    117  * Get the int value of the content
    118  *
    119  * @param number the number object to get the value from
    120  *
    121  * @return an int
    122  */
    123 
    124 int
    125 heim_number_get_int(heim_number_t number)
    126 {
    127     if (heim_base_is_tagged_object(number))
    128 	return heim_base_tagged_object_value(number);
    129     return *(int *)number;
    130 }
    131