Coverage Report

Created: 2026-01-16 06:47

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/samba/third_party/heimdal/lib/base/number.c
Line
Count
Source
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
number_dealloc(void *ptr)
40
0
{
41
0
}
42
43
static int
44
number_cmp(void *a, void *b)
45
0
{
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
0
    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
0
    else
56
0
  nb = *(int *)b;
57
58
0
    return na - nb;
59
0
}
60
61
static uintptr_t
62
number_hash(void *ptr)
63
0
{
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
0
}
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
heim_number_create(int64_t number)
90
0
{
91
0
    heim_number_t n;
92
93
0
    if (number < 0xffffff && number >= 0)
94
0
  return heim_base_make_tagged_object(number, HEIM_TID_NUMBER);
95
96
0
    n = _heim_alloc_object(&_heim_number_object, sizeof(int64_t));
97
0
    if (n)
98
0
  *((int64_t *)n) = number;
99
0
    return n;
100
0
}
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
heim_number_get_type_id(void)
110
0
{
111
0
    return HEIM_TID_NUMBER;
112
0
}
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
heim_number_get_int(heim_number_t number)
124
0
{
125
0
    if (heim_base_is_tagged_object(number))
126
0
  return heim_base_tagged_object_value(number);
127
0
    return (int)(*(int64_t *)number);
128
0
}
129
130
int64_t
131
heim_number_get_long(heim_number_t number)
132
0
{
133
0
    if (heim_base_is_tagged_object(number))
134
0
  return heim_base_tagged_object_value(number);
135
0
    return *(int64_t *)number;
136
0
}