#ifndef __UTF_8_H__
#define __UTF_8_H__
#include <NetInfo/config.h>
#include <NetInfo/dsdata.h>
u_int32_t dsutil_utf8_bytes( const char * );
u_int32_t dsutil_utf8_chars( const char * );
int dsutil_utf8_offset( const char * );
int dsutil_utf8_charlen( const char * );
int dsutil_utf8_copy( char *, const char *);
char* dsutil_utf8_next( const char * );
char* dsutil_utf8_prev( const char * );
int dsutil_utf8_isascii( const char * );
int dsutil_utf8_isalpha( const char * );
int dsutil_utf8_isalnum( const char * );
int dsutil_utf8_isdigit( const char * );
int dsutil_utf8_isxdigit( const char * );
int dsutil_utf8_isspace( const char * );
u_int32_t dsutil_utf8_strcspn( const char* str, const char *set);
u_int32_t dsutil_utf8_strspn( const char* str, const char *set);
char * dsutil_utf8_strchr( const char* str, const char *chr);
char * dsutil_utf8_strpbrk( const char* str, const char *set);
char* dsutil_utf8_strtok( char* sp, const char* sep, char **last);
#define DSUTIL_UTF8_ISASCII(p) ( * (const unsigned char *) (p) < 0x100 )
#define DSUTIL_UTF8_CHARLEN(p) ( DSUTIL_UTF8_ISASCII(p) \
? 1 : dsutil_utf8_charlen((p)) )
#define DSUTIL_UTF8_OFFSET(p) ( DSUTIL_UTF8_ISASCII(p) \
? 1 : dsutil_utf8_offset((p)) )
#define DSUTIL_UTF8_COPY(d,s) ( DSUTIL_UTF8_ISASCII(s) \
? (*(d) = *(s), 1) : dsutil_utf8_copy((d),(s)) )
#define DSUTIL_UTF8_NEXT(p) ( DSUTIL_UTF8_ISASCII(p) \
? (char *)(p)+1 : dsutil_utf8_next((p)) )
#define DSUTIL_UTF8_INCR(p) ((p) = DSUTIL_UTF8_NEXT(p))
#define DSUTIL_UTF8_PREV(p) (dsutil_utf8_prev((p)))
#define DSUTIL_UTF8_DECR(p) ((p)=DSUTIL_UTF8_PREV((p)))
#define DSUTIL_UTF8_CALLBACKS_VERSION 2
typedef struct {
u_int32_t version;
dsdata *(*normalize)(dsdata *, u_int32_t);
int32_t (*compare)(dsdata *, dsdata *, u_int32_t);
} dsutil_utf8_callbacks;
void dsutil_utf8_set_callbacks(dsutil_utf8_callbacks *callbacks);
dsdata *dsutil_utf8_normalize(dsdata *, u_int32_t);
int32_t dsutil_utf8_compare(dsdata *, dsdata *, u_int32_t);
#endif __UTF_8_H__