#ifndef __DSDATA_H__
#define __DSDATA_H__
#ifndef IndexNull
#define IndexNull (u_int32_t)-1
#endif
#include <stdio.h>
#include <NetInfo/config.h>
#include <NetInfo/dsstatus.h>
#define DataTypeNil 0
#define DataTypeBlob 1
#define DataTypeBool 2
#define DataTypeInt 3
#define DataTypeUInt 4
#define DataTypeFloat 5
#define DataTypeCStr 6
#define DataTypeUTF8Str 7
#define DataTypeCaseCStr 8
#define DataTypeCaseUTF8Str 9
#define DataTypeInt8Array 64
#define DataTypeUInt8Array 65
#define DataTypeInt16Array 66
#define DataTypeUInt16Array 67
#define DataTypeInt32Array 68
#define DataTypeUInt32Array 69
#define DataTypeInt64Array 70
#define DataTypeUInt64Array 71
#define DataTypeDSReference 251
#define DataTypeCPtr 252
#define DataTypeDirectoryID 253
#define DataTypeDSAttribute 254
#define DataTypeAny 255
#define DataTypeDSRecord 256
#define IsStringDataType(type) (((type) == DataTypeCStr) || \
((type) == DataTypeCaseCStr) || \
((type) == DataTypeUTF8Str) || \
((type) == DataTypeCaseUTF8Str))
#define IsCaseStringDataType(type) (((type) == DataTypeCaseCStr) || \
((type) == DataTypeCaseUTF8Str))
#define IsUTF8DataType(type) (((type) == DataTypeUTF8Str) || \
((type) == DataTypeCaseUTF8Str))
#define StringDataTypes(t1, t2) (IsStringDataType(t1) && IsStringDataType(t2))
#define ComparableDataTypes(t1, t2) (((t2) == DataTypeAny) ? 1 : \
(StringDataTypes(t1, t2) || ((t1) == (t2))))
#define DSDATA_STORAGE_HEADER_SIZE 8
typedef struct
{
u_int32_t type;
u_int32_t length;
char *data;
u_int32_t retain;
} dsdata;
dsdata *dsdata_alloc(u_int32_t size);
dsdata *dsdata_new(u_int32_t type, u_int32_t len, char *buf);
dsdata *dsdata_copy(dsdata *d);
dsdata *dsdata_insert(dsdata *a, dsdata *b, u_int32_t where, u_int32_t len);
dsdata *dsdata_retain(dsdata *d);
void dsdata_release(dsdata *d);
u_int32_t dsdata_size(dsdata *d);
dsdata *dsdata_read(char *filename);
dsdata *dsdata_fread(FILE *file);
dsstatus dsdata_write(dsdata *d, char *filename);
dsstatus dsdata_fwrite(dsdata *d, FILE *file);
int32_t dsdata_equal(dsdata *a, dsdata *b);
int32_t dsdata_compare(dsdata *a, dsdata *b);
int32_t dsdata_compare_sub(dsdata *a, dsdata *b, u_int32_t start, u_int32_t len);
dsdata *cstring_to_dsdata(char *s);
dsdata *casecstring_to_dsdata(char *s);
dsdata *utf8string_to_dsdata(char *s);
dsdata *caseutf8string_to_dsdata(char *);
dsdata *int8_to_dsdata(int8_t n);
dsdata *uint8_to_dsdata(u_int8_t n);
dsdata *int16_to_dsdata(int16_t n);
dsdata *uint16_to_dsdata(u_int16_t n);
dsdata *int32_to_dsdata(int32_t n);
dsdata *uint32_to_dsdata(u_int32_t n);
dsdata *int64_to_dsdata(int64_t n);
dsdata *uint64_to_dsdata(u_int64_t n);
dsdata *dsid_to_dsdata(u_int32_t n);
char *dsdata_to_cstring(dsdata *d);
char *dsdata_to_utf8string(dsdata *d);
int8_t dsdata_to_int8(dsdata *d);
u_int8_t dsdata_to_uint8(dsdata *d);
int16_t dsdata_to_int16(dsdata *d);
u_int16_t dsdata_to_uint16(dsdata *d);
int32_t dsdata_to_int32(dsdata *d);
u_int32_t dsdata_to_uint32(dsdata *d);
int64_t dsdata_to_int64(dsdata *d);
u_int64_t dsdata_to_uint64(dsdata *d);
u_int32_t dsdata_to_dsid(dsdata *d);
dsdata *int8_array_to_dsdata(int8_t *, u_int32_t);
dsdata *uint8_array_to_dsdata(u_int8_t *, u_int32_t);
dsdata *int16_array_to_dsdata(int16_t *, u_int32_t);
dsdata *uint16_array_to_dsdata(u_int16_t *, u_int32_t);
dsdata *int32_array_to_dsdata(int32_t *, u_int32_t);
dsdata *uint32_array_to_dsdata(u_int32_t *, u_int32_t);
dsdata *int64_array_to_dsdata(int64_t *, u_int32_t);
dsdata *uint64_array_to_dsdata(u_int64_t *, u_int32_t);
int8_t dsdata_int8_at_index(dsdata *d, u_int32_t i);
u_int8_t dsdata_uint8_at_index(dsdata *d, u_int32_t i);
int16_t dsdata_int16_at_index(dsdata *d, u_int32_t i);
u_int16_t dsdata_uint16_at_index(dsdata *d, u_int32_t i);
int32_t dsdata_int32_at_index(dsdata *d, u_int32_t i);
u_int32_t dsdata_uint32_at_index(dsdata *d, u_int32_t i);
int64_t dsdata_int64_at_index(dsdata *d, u_int32_t i);
u_int64_t dsdata_uint64_at_index(dsdata *d, u_int32_t i);
void dsdata_print(dsdata *d, FILE *f);
#endif __DSDATA_H__