1 /* CFBase.h
2
3 Copyright (C) 2010 Free Software Foundation, Inc.
4
5 Written by: Stefan Bidigaray
6 Date: January, 2010
7
8 This file is part of the GNUstep CoreBase Library.
9
10 This library is free software; you can redistribute it and/or
11 modify it under the terms of the GNU Lesser General Public
12 License as published by the Free Software Foundation; either
13 version 2.1 of the License, or (at your option) any later version.
14
15 This library is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 Lesser General Public License for more details.
19
20 You should have received a copy of the GNU Lesser General Public
21 License along with this library; see the file COPYING.LIB.
22 If not, see <http://www.gnu.org/licenses/> or write to the
23 Free Software Foundation, 51 Franklin Street, Fifth Floor,
24 Boston, MA 02110-1301, USA.
25 */
26
27
28 #ifndef __COREFOUNDATION_CFBASE_H__
29 #define __COREFOUNDATION_CFBASE_H__
30
31 /* CoreFoundation defines __LITTLE_ENDIAN__ or __BIG_ENDIAN__ so we'll
32 * do the same here for compatibility.
33 */
34 #if !defined(__LITTLE_ENDIAN__) && !defined(__BIG_ENDIAN__)
35 #define __LITTLE_ENDIAN__ 1
36 #endif
37
38 #include "CFAvailability.h"
39 #include "../GNUstepBase/GSVersionMacros.h"
40
41 /*
42 * CoreFoundation types
43 */
44 typedef unsigned char Boolean;
45 typedef unsigned char UInt8;
46 typedef signed char SInt8;
47 typedef unsigned short UInt16;
48 typedef signed short SInt16;
49 typedef unsigned int UInt32;
50 typedef signed int SInt32;
51 typedef unsigned long long UInt64;
52 typedef signed long long SInt64;
53 typedef SInt32 OSStatus;
54
55 typedef float Float32;
56 typedef double Float64;
57 typedef UInt16 UniChar;
58 typedef UInt8 *StringPtr;
59 typedef const StringPtr *ConstStringPtr;
60 typedef UInt8 Str255[256];
61 typedef const Str255 *ConstStr255Param;
62 typedef SInt16 OSErr;
63 typedef SInt16 RegionCode;
64 typedef SInt16 LangCode;
65 typedef SInt16 ScriptCode;
66 typedef UInt32 FourCharCode;
67 #ifndef OSTYPE_DECLARED
68 typedef FourCharCode OSType;
69 #define OSTYPE_DECLARED
70 #endif
71 typedef UInt8 Byte;
72 typedef SInt8 SignedByte;
73
74 #ifndef UTF32Char /* UTF32Char is also defined in GSConfig.h */
75 typedef UInt32 UTF32Char;
76 #endif
77 typedef UInt16 UTF16Char;
78 typedef UInt8 UTF8Char;
79
80 #if !defined(CF_EXTERN_C_BEGIN)
81 #if defined(__cplusplus)
82 #define CF_EXTERN_C_BEGIN extern "C" {
83 #define CF_EXTERN_C_END }
84 #else
85 #define CF_EXTERN_C_BEGIN
86 #define CF_EXTERN_C_END
87 #endif
88 #endif
89
90 #if defined(_WIN32)
91 #if defined(BUILDING_SELF)
92 #if defined(__cplusplus)
93 #define CF_EXPORT extern "C" __declspec(dllexport)
94 #else
95 #define CF_EXPORT extern __declspec(dllexport)
96 #endif
97 #else
98 #if defined(__cplusplus)
99 #define CF_EXPORT extern "C" __declspec(dllimport)
100 #else
101 #define CF_EXPORT extern __declspec(dllimport)
102 #endif
103 #endif
104 #else
105 #if defined(__cplusplus)
106 #define CF_EXPORT extern "C"
107 #else
108 #define CF_EXPORT extern
109 #endif
110 #endif
111
112 #if !defined(__bool_true_false_are_defined)
113 #define true 1
114 #define false 0
115 #endif
116
117 #ifndef TRUE
118 #define TRUE 1
119 #endif
120 #ifndef FALSE
121 #define FALSE 0
122 #endif
123
124 #if !defined(CF_INLINE)
125 #if defined(__GNUC__) && (__GNUC__ >= 4)
126 #define CF_INLINE static __inline__ __attribute__((always_inline))
127 #elif defined(__GNUC__)
128 #define CF_INLINE static __inline__
129 #elif defined(__MWERKS__) || defined(__cplusplus)
130 #define CF_INLINE static inline
131 #elif defined(_MSC_VER)
132 #define CF_INLINE static __inline
133 #elif _WIN32
134 #define CF_INLINE static __inline__
135 #else
136 #define CF_INLINE static inline
137 #endif
138 #endif
139
140 #if defined(__GNUC__) || defined(__llvm__)
141 #define GS_PURE_FUNCTION __attribute__((pure))
142 #else
143 #define GS_PURE_FUNCTION
144 #endif
145
146 CF_EXTERN_C_BEGIN
147 /** \defgroup CFTypeRef CFType Reference
148 \{
149 */
150 typedef unsigned long CFTypeID;
151 typedef const void *CFTypeRef;
152 /** @}
153 */
154
155 /** \defgroup BaseUtils Base Utilities
156 \{
157 */
158 /** An integer value to store a hash code. */
159 typedef unsigned long CFHashCode;
160 /** A bitfield for passing information to functions. Can hold as many bits
161 as a word.
162 */
163 typedef unsigned long CFOptionFlags;
164 /** A signed integer representing an index, size, length or count. */
165 typedef signed long CFIndex;
166
167 /** A structure that represents a range of items in a container, such as
168 an array.
169 */
170 typedef struct CFRange CFRange;
171 struct CFRange
172 {
173 CFIndex location;
174 /**< An integer representing the start location of the range, inclusive. */
175 CFIndex length;
176 /**< An integer representing the total number of items in the range */
177 };
178
179 /** Creates a CFRange structure.
180 \param location The starting location.
181 \param length The length.
182 \return An initialized CFRange structure.
183 */
184 CF_INLINE CFRange
CFRangeMake(CFIndex location,CFIndex length)185 CFRangeMake (CFIndex location, CFIndex length)
186 {
187 CFRange range;
188
189 range.location = location;
190 range.length = length;
191 return range;
192 }
193
194 /* Returned by comparison functions */
195 typedef enum
196 {
197 kCFCompareLessThan = -1,
198 kCFCompareEqualTo = 0,
199 kCFCompareGreaterThan = 1
200 } CFComparisonResult;
201
202 /* Return when a value is not found */
203 enum
204 {
205 kCFNotFound = -1
206 };
207
208 /* Definition for standard comparison function callback. */
209 typedef CFComparisonResult (*CFComparatorFunction) (const void *val1,
210 const void *val2,
211 void *context);
212
213 /* CoreFoundation version numbers */
214 /** \name Library Version Numbers
215 \{
216 */
217 CF_EXPORT const double kCFCoreFoundationVersionNumber;
218 #define kCFCoreFoundationVersionNumber10_0 196.40
219 #define kCFCoreFoundationVersionNumber10_0_3 196.50
220 #define kCFCoreFoundationVersionNumber10_1 226.00
221 #define kCFCoreFoundationVersionNumber10_1_1 226.00
222 #define kCFCoreFoundationVersionNumber10_1_2 227.20
223 #define kCFCoreFoundationVersionNumber10_1_3 227.20
224 #define kCFCoreFoundationVersionNumber10_1_4 227.30
225 #define kCFCoreFoundationVersionNumber10_2 263.00
226 #define kCFCoreFoundationVersionNumber10_2_1 263.10
227 #define kCFCoreFoundationVersionNumber10_2_2 263.10
228 #define kCFCoreFoundationVersionNumber10_2_3 263.30
229 #define kCFCoreFoundationVersionNumber10_2_4 263.30
230 #define kCFCoreFoundationVersionNumber10_2_5 263.50
231 #define kCFCoreFoundationVersionNumber10_2_6 263.50
232 #define kCFCoreFoundationVersionNumber10_2_7 263.50
233 #define kCFCoreFoundationVersionNumber10_2_8 263.50
234 #define kCFCoreFoundationVersionNumber10_3 299.00
235 #define kCFCoreFoundationVersionNumber10_3_1 299.00
236 #define kCFCoreFoundationVersionNumber10_3_2 299.00
237 #define kCFCoreFoundationVersionNumber10_3_3 299.30
238 #define kCFCoreFoundationVersionNumber10_3_4 299.31
239 #define kCFCoreFoundationVersionNumber10_3_5 299.31
240 #define kCFCoreFoundationVersionNumber10_3_6 299.32
241 #define kCFCoreFoundationVersionNumber10_3_7 299.33
242 #define kCFCoreFoundationVersionNumber10_3_8 299.33
243 #define kCFCoreFoundationVersionNumber10_3_9 299.35
244 #define kCFCoreFoundationVersionNumber10_4 368.00
245 #define kCFCoreFoundationVersionNumber10_4_1 368.10
246 #define kCFCoreFoundationVersionNumber10_4_2 368.11
247 #define kCFCoreFoundationVersionNumber10_4_3 368.18
248 #define kCFCoreFoundationVersionNumber10_4_4_Intel 368.26
249 #define kCFCoreFoundationVersionNumber10_4_4_PowerPC 368.25
250 #define kCFCoreFoundationVersionNumber10_4_5_Intel 368.26
251 #define kCFCoreFoundationVersionNumber10_4_5_PowerPC 368.25
252 #define kCFCoreFoundationVersionNumber10_4_6_Intel 368.26
253 #define kCFCoreFoundationVersionNumber10_4_6_PowerPC 368.25
254 #define kCFCoreFoundationVersionNumber10_4_7 368.27
255 #define kCFCoreFoundationVersionNumber10_4_8 368.27
256 #define kCFCoreFoundationVersionNumber10_4_9 368.28
257 #define kCFCoreFoundationVersionNumber10_4_10 368.28
258 #define kCFCoreFoundationVersionNumber10_4_11 368.31
259 #define kCFCoreFoundationVersionNumber10_5 476.00
260 #define kCFCoreFoundationVersionNumber10_5_1 476.00
261 #define kCFCoreFoundationVersionNumber10_5_2 476.10
262 #define kCFCoreFoundationVersionNumber10_5_3 476.13
263 #define kCFCoreFoundationVersionNumber10_5_4 476.14
264 #define kCFCoreFoundationVersionNumber10_5_5 476.15
265 #define kCFCoreFoundationVersionNumber10_5_6 476.17
266 /** \} */
267 /** \} */
268
269 #if __has_feature(attribute_cf_returns_retained)
270 #define CF_RETURNS_RETAINED __attribute__((cf_returns_retained))
271 #else
272 #define CF_RETURNS_RETAINED
273 #endif
274
275 #if __has_feature(attribute_cf_returns_not_retained)
276 #define CF_RETURNS_NOT_RETAINED __attribute__((cf_returns_not_retained))
277 #else
278 #define CF_RETURNS_NOT_RETAINED
279 #endif
280
281 /** \ingroup CFPropertyListRef
282 */
283 typedef CFTypeRef CFPropertyListRef;
284
285 /** \ingroup CFStringRef
286 */
287 typedef const struct __CFString *CFStringRef;
288 /** \ingroup CFMutableStringRef
289 */
290 typedef struct __CFString *CFMutableStringRef;
291
292
293
294 /** \defgroup CFAllocatorRef CFAllocator Reference
295 \brief CFAllocator is an opaque type used to allocate and deallocate
296 memory.
297 \{
298 */
299 /** \brief A reference to a CFAllocator object.
300 */
301 typedef const struct __CFAllocator *CFAllocatorRef;
302
303 typedef void *(*CFAllocatorAllocateCallBack) (CFIndex allocSize,
304 CFOptionFlags hint, void *info);
305 typedef void (*CFAllocatorDeallocateCallBack) (void *ptr, void *info);
306 typedef void *(*CFAllocatorReallocateCallBack) (void *ptr,
307 CFIndex newsize,
308 CFOptionFlags hint, void *info);
309 typedef CFIndex (*CFAllocatorPreferredSizeCallBack) (CFIndex size,
310 CFOptionFlags hint,
311 void *info);
312 typedef const void *(*CFAllocatorRetainCallBack) (const void *info);
313 typedef void (*CFAllocatorReleaseCallBack) (const void *info);
314 typedef CFStringRef (*CFAllocatorCopyDescriptionCallBack) (const void *info);
315
316 struct _CFAllocatorContext
317 {
318 CFIndex version;
319 void *info;
320 CFAllocatorRetainCallBack retain;
321 CFAllocatorReleaseCallBack release;
322 CFAllocatorCopyDescriptionCallBack copyDescription;
323 CFAllocatorAllocateCallBack allocate;
324 CFAllocatorReallocateCallBack reallocate;
325 CFAllocatorDeallocateCallBack deallocate;
326 CFAllocatorPreferredSizeCallBack preferredSize;
327 };
328 typedef struct _CFAllocatorContext CFAllocatorContext;
329
330 /** The default allocator and is equivalent to NULL.
331 \see CFAllocatorGetDefault()
332 \see CFAllocatorSetDefault()
333 */
334 CF_EXPORT CFAllocatorRef kCFAllocatorDefault;
335 /** The default system allocator is used internally by GNUstep and is the
336 default allocator if none is been defined.
337 \see CFAllocatorSetDefault()
338 */
339 CF_EXPORT CFAllocatorRef kCFAllocatorSystemDefault;
340 /** An allocator that uses the system's malloc, realloc and free functions.
341 */
342 CF_EXPORT CFAllocatorRef kCFAllocatorMalloc;
343 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
344 /** Equivalent to kCFAllocatorSystemDefault
345 */
346 CF_EXPORT CFAllocatorRef kCFAllocatorMallocZone;
347 #endif
348 /** The NULL allocator does perform any operations. Can be passed as
349 a deallocator if you do not want GNUstep to deallocate the data.
350 */
351 CF_EXPORT CFAllocatorRef kCFAllocatorNull;
352 /** This is a special case allocator directing CFAllocatorCreate() to use
353 the given CFAllocatorContext structure to allocate the new allocator.
354 */
355 CF_EXPORT CFAllocatorRef kCFAllocatorUseContext;
356
357 /** Create a new CFAllocator.
358 \param allocator The allocator used to create this allocator or
359 kCFAllocatorUseContext to use the functions in \b context.
360 \param context The new allocator's context functions.
361 \return A new CFAllocator or NULL in case of failure.
362 \see CFAllocatorContext
363 */
364 CF_EXPORT CFAllocatorRef
365 CFAllocatorCreate (CFAllocatorRef allocator, CFAllocatorContext * context);
366
367 /** Allocate new memory.
368 \param allocator The CFAllocator to use.
369 \param size The number of bytes to allocate.
370 \param hint Option flags. Currently unused and should be 0.
371 \return Newly allocated memory of NULL in case of failure.
372 \see CFAllocatorDeallocate()
373 */
374 CF_EXPORT void *CFAllocatorAllocate (CFAllocatorRef allocator, CFIndex size,
375 CFOptionFlags hint);
376
377 /** Deallocate the memory pointed to by \b ptr.
378 \param allocator The CFAllocator to use.
379 \param ptr A pointer previously allocated by CFAllocatorAllocate().
380 \see CFAllocatorAllocate()
381 */
382 CF_EXPORT void CFAllocatorDeallocate (CFAllocatorRef allocator, void *ptr);
383
384 CF_EXPORT CFIndex
385 CFAllocatorGetPreferredSizeForSize (CFAllocatorRef allocator, CFIndex size,
386 CFOptionFlags hint);
387
388 CF_EXPORT void *CFAllocatorReallocate (CFAllocatorRef allocator, void *ptr,
389 CFIndex newsize, CFOptionFlags hint);
390
391 CF_EXPORT CFAllocatorRef CFAllocatorGetDefault (void);
392
393 CF_EXPORT void CFAllocatorSetDefault (CFAllocatorRef allocator);
394
395 CF_EXPORT void
396 CFAllocatorGetContext (CFAllocatorRef allocator, CFAllocatorContext * context);
397
398 CF_EXPORT CFTypeID CFAllocatorGetTypeID (void);
399 /** \} */
400
401
402
403 /** \ingroup CFTypeRef
404 \{
405 */
406 /* These function will be implemented in CFRuntime.c since they
407 require runtime support. */
408 CF_EXPORT CFStringRef CFCopyDescription (CFTypeRef cf);
409
410 CF_EXPORT CFStringRef CFCopyTypeIDDescription (CFTypeID typeID);
411
412 CF_EXPORT Boolean CFEqual (CFTypeRef cf1, CFTypeRef cf2);
413
414 CF_EXPORT CFAllocatorRef CFGetAllocator (CFTypeRef cf);
415
416 CF_EXPORT CFIndex CFGetRetainCount (CFTypeRef cf);
417
418 CF_EXPORT CFTypeID CFGetTypeID (CFTypeRef cf);
419
420 CF_EXPORT CFHashCode CFHash (CFTypeRef cf);
421
422 #if OS_API_VERSION(MAC_OS_X_VERSION_10_4, GS_API_LATEST)
423 CF_EXPORT CFTypeRef CFMakeCollectable (CFTypeRef cf);
424 #endif
425
426 CF_EXPORT void CFRelease (CFTypeRef cf);
427
428 CF_EXPORT CFTypeRef CFRetain (CFTypeRef cf);
429
430 CF_EXPORT CFTypeRef CFAutorelease(CFTypeRef arg);
431
432 #if OS_API_VERSION(MAC_OS_X_VERSION_10_7, GS_API_LATEST)
433 CF_EXPORT void *_CFBridgingRelease (CFTypeRef cf);
434 CF_EXPORT CFTypeRef _CFBridgingRetain (void *obj);
435
436 #if __has_feature(objc_arc)
437 #define CFBridgingRetain(x) (__bridge_retained CFTypeRef)(x)
438 #define CFBridgingRelease(x) (__bridge_transfer id)(x)
439 #elif __OBJC__
440 #define CFBridgingRetain(x) _CFBridgingRetain((void *)(x))
441 #define CFBridgingRelease(x) (id)_CFBridgingRelease((x))
442 #else
443 #define CFBridgingRetain(x) _CFBridgingRetain((void *)(x))
444 #define CFBridgingRelease(x) _CFBridgingRelease((x))
445 #endif
446 #endif
447 /** \} */
448
449
450
451 /** \defgroup CFNullRef CFNull Reference
452 \{
453 */
454 #if OS_API_VERSION(MAC_OS_X_VERSION_10_2, GS_API_LATEST)
455 typedef struct __CFNull *CFNullRef;
456
457 CF_EXPORT CFNullRef kCFNull;
458
459 CFTypeID CFNullGetTypeID (void);
460 #endif
461 /** \} */
462
463 CF_EXTERN_C_END
464 #endif /* __COREFOUNDATION_CFBASE_H__ */
465