2010-11-18 22:52:36 +00:00
|
|
|
#import <Foundation/NSString.h>
|
|
|
|
#import <Foundation/NSException.h>
|
|
|
|
#include <unicode/utext.h>
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Initialises a UText structure with an NSString. If txt is NULL, then this
|
|
|
|
* allocates a new structure on the heap, otherwise it fills in the existing
|
|
|
|
* one.
|
|
|
|
*
|
|
|
|
* The returned UText object holds a reference to the NSString and accesses its
|
|
|
|
* contents directly.
|
|
|
|
*/
|
|
|
|
UText* UTextInitWithNSString(UText *txt, NSString *str);
|
2011-02-11 14:31:25 +00:00
|
|
|
|
2010-11-18 22:52:36 +00:00
|
|
|
/**
|
|
|
|
* Initialises a UText structure with an NSMutableString. If txt is NULL, then
|
|
|
|
* this allocates a new structure on the heap, otherwise it fills in the
|
|
|
|
* existing one.
|
|
|
|
*
|
|
|
|
* The returned UText object holds a reference to the NSMutableString and
|
|
|
|
* accesses its contents directly.
|
|
|
|
*
|
|
|
|
* This function returns a mutable UText, and changes made to it will be
|
|
|
|
* reflected in the underlying NSMutableString.
|
|
|
|
*/
|
|
|
|
UText* UTextInitWithNSMutableString(UText *txt, NSMutableString *str);
|
2011-02-11 14:31:25 +00:00
|
|
|
|
2010-11-18 22:52:36 +00:00
|
|
|
/**
|
|
|
|
* GSUTextString is an NSString subclass that is backed by a libicu UText
|
|
|
|
* structure. This class is intended to be used when returning UText created
|
|
|
|
* by libicu functions to Objective-C code.
|
|
|
|
*/
|
|
|
|
@interface GSUTextString : NSString
|
|
|
|
{
|
2011-02-11 14:31:25 +00:00
|
|
|
@public
|
|
|
|
/** The UText structure containing the libicu string interface. */
|
|
|
|
UText txt;
|
2010-11-18 22:52:36 +00:00
|
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
|
|
/**
|
|
|
|
* GSUTextString is an NSMutableString subclass that is backed by a libicu
|
|
|
|
* UText structure. This class is intended to be used when returning UText
|
|
|
|
* created by libicu functions to Objective-C code.
|
|
|
|
*/
|
|
|
|
@interface GSUTextMutableString : NSMutableString
|
|
|
|
{
|
2011-02-11 14:31:25 +00:00
|
|
|
@public
|
|
|
|
/** The UText structure containing the libicu string interface. */
|
|
|
|
UText txt;
|
2010-11-18 22:52:36 +00:00
|
|
|
}
|
|
|
|
@end
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Cleanup function used to fee a unichar buffer.
|
|
|
|
*/
|
|
|
|
static inline void free_string(unichar **buf)
|
|
|
|
{
|
2011-02-11 14:31:25 +00:00
|
|
|
if (0 != *buf)
|
|
|
|
{
|
|
|
|
free(*buf);
|
|
|
|
}
|
2010-11-18 22:52:36 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Allocates a temporary buffer of the requested size. This allocates buffers
|
|
|
|
* of up to 64 bytes on the stack or more than 64 bytes on the heap. The
|
|
|
|
* buffer is automatically destroyed when it goes out of scope in either case.
|
|
|
|
*
|
|
|
|
* Buffers created in this way are exception safe when using native exceptions.
|
|
|
|
*/
|
|
|
|
#define TEMP_BUFFER(name, size)\
|
2011-02-11 14:31:25 +00:00
|
|
|
__attribute__((cleanup(free_string))) unichar *name ##_onheap = 0;\
|
|
|
|
unichar name ## _onstack[64 / sizeof(unichar)];\
|
|
|
|
unichar *name = name ## _onstack;\
|
|
|
|
if (size > 64)\
|
|
|
|
{\
|
|
|
|
name ## _onheap = malloc(size);\
|
|
|
|
name = name ## _onheap;\
|
|
|
|
}
|
2010-11-19 22:15:13 +00:00
|
|
|
|