xref: /xnu-11215/libkern/c++/OSNumber.cpp (revision fad439e7)
1 /*
2  * Copyright (c) 2000 Apple Computer, Inc. All rights reserved.
3  *
4  * @APPLE_LICENSE_HEADER_START@
5  *
6  * The contents of this file constitute Original Code as defined in and
7  * are subject to the Apple Public Source License Version 1.1 (the
8  * "License").  You may not use this file except in compliance with the
9  * License.  Please obtain a copy of the License at
10  * http://www.apple.com/publicsource and read it before using this file.
11  *
12  * This Original Code and all software distributed under the License are
13  * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER
14  * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
15  * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
16  * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT.  Please see the
17  * License for the specific language governing rights and limitations
18  * under the License.
19  *
20  * @APPLE_LICENSE_HEADER_END@
21  */
22 /* IOOffset.m created by rsulack on Wed 17-Sep-1997 */
23 
24 #include <sys/cdefs.h>
25 
26 __BEGIN_DECLS
27 extern int sscanf(const char *input, const char *fmt, ...);
28 __END_DECLS
29 
30 #include <libkern/c++/OSNumber.h>
31 #include <libkern/c++/OSString.h>
32 #include <libkern/c++/OSSerialize.h>
33 #include <libkern/c++/OSLib.h>
34 
35 #define sizeMask (~0ULL >> (64 - size))
36 
37 #define super OSObject
38 
39 OSDefineMetaClassAndStructors(OSNumber, OSObject)
40 
41 OSMetaClassDefineReservedUnused(OSNumber, 0);
42 OSMetaClassDefineReservedUnused(OSNumber, 1);
43 OSMetaClassDefineReservedUnused(OSNumber, 2);
44 OSMetaClassDefineReservedUnused(OSNumber, 3);
45 OSMetaClassDefineReservedUnused(OSNumber, 4);
46 OSMetaClassDefineReservedUnused(OSNumber, 5);
47 OSMetaClassDefineReservedUnused(OSNumber, 6);
48 OSMetaClassDefineReservedUnused(OSNumber, 7);
49 
50 bool OSNumber::init(unsigned long long inValue, unsigned int numberOfBits)
51 {
52     if (!super::init())
53         return false;
54 
55     size = numberOfBits;
56     value = (inValue & sizeMask);
57 
58     return true;
59 }
60 
61 bool OSNumber::init(const char *value, unsigned int numberOfBits)
62 {
63     unsigned long long thisOffset;
64 
65 #ifdef q_works
66     sscanf(value, "%qi", thisOffset);
67 #else
68     unsigned int smallOffset;
69 
70     sscanf(value, "%i", &smallOffset);
71     thisOffset = smallOffset;
72 #endif
73 
74     return init(thisOffset, numberOfBits);
75 }
76 
77 void OSNumber::free() { super::free(); }
78 
79 OSNumber *OSNumber::withNumber(unsigned long long value,
80                            unsigned int numberOfBits)
81 {
82     OSNumber *me = new OSNumber;
83 
84     if (me && !me->init(value, numberOfBits)) {
85         me->free();
86         return 0;
87     }
88 
89     return me;
90 }
91 
92 OSNumber *OSNumber::withNumber(const char *value, unsigned int numberOfBits)
93 {
94     OSNumber *me = new OSNumber;
95 
96     if (me && !me->init(value, numberOfBits)) {
97         me->free();
98         return 0;
99     }
100 
101     return me;
102 }
103 
104 unsigned int OSNumber::numberOfBits() const { return size; }
105 
106 unsigned int OSNumber::numberOfBytes() const { return (size + 7) / 8; }
107 
108 
109 unsigned char OSNumber::unsigned8BitValue() const
110 {
111     return (unsigned char) value;
112 }
113 
114 unsigned short OSNumber::unsigned16BitValue() const
115 {
116     return (unsigned short) value;
117 }
118 
119 unsigned int OSNumber::unsigned32BitValue() const
120 {
121     return (unsigned int) value;
122 }
123 
124 unsigned long long OSNumber::unsigned64BitValue() const
125 {
126     return value;
127 }
128 
129 void OSNumber::addValue(signed long long inValue)
130 {
131     value = ((value + inValue) & sizeMask);
132 }
133 
134 void OSNumber::setValue(unsigned long long inValue)
135 {
136     value = (inValue & sizeMask);
137 }
138 
139 bool OSNumber::isEqualTo(const OSNumber *integer) const
140 {
141     return((value == integer->value));
142 }
143 
144 bool OSNumber::isEqualTo(const OSMetaClassBase *obj) const
145 {
146     OSNumber *	offset;
147     if ((offset = OSDynamicCast(OSNumber, obj)))
148 	return isEqualTo(offset);
149     else
150 	return false;
151 }
152 
153 bool OSNumber::serialize(OSSerialize *s) const
154 {
155     char temp[32];
156 
157     if (s->previouslySerialized(this)) return true;
158 
159     sprintf(temp, "integer size=\"%d\"", size);
160     if (!s->addXMLStartTag(this, temp)) return false;
161 
162     //XXX    sprintf(temp, "0x%qx", value);
163     if ((value >> 32)) {
164         sprintf(temp, "0x%lx%08lx", (unsigned long)(value >> 32),
165                     (unsigned long)(value & 0xFFFFFFFF));
166     } else {
167         sprintf(temp, "0x%lx", (unsigned long)value);
168     }
169     if (!s->addString(temp)) return false;
170 
171     return s->addXMLEndTag("integer");
172 }
173