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