number.c revision 1.2
1/*	$NetBSD: number.c,v 1.2 2017/01/28 21:31:45 christos Exp $	*/
2
3/*
4 * Copyright (c) 2010 Kungliga Tekniska H��gskolan
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
40static void
41number_dealloc(void *ptr)
42{
43}
44
45static int
46number_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
63static unsigned long
64number_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
71struct 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
90heim_number_t
91heim_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
110heim_tid_t
111heim_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
124int
125heim_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