#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 DataTypeInt8Array 64
#define DataTypeUInt8Array 65
#define DataTypeInt16Array 66
#define DataTypeUInt16Array 67
#define DataTypeInt32Array 68
#define DataTypeUInt32Array 69
#define DataTypeInt64Array 70
#define DataTypeUInt64Array 71
#define DataTypeDirectoryID 253
#define DataTypeDSAttribute 254
#define DataTypeAny 255
#define DataTypeDSRecord 256
#define IsStringDataType(type) ((type == DataTypeCStr) || (type == DataTypeUTF8Str))
#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_new(u_int32_t, u_int32_t, char *);
dsdata *dsdata_copy(dsdata *);
dsdata *dsdata_insert(dsdata *a, dsdata *b, u_int32_t where, u_int32_t len);
dsdata *dsdata_retain(dsdata *);
void dsdata_release(dsdata *);
u_int32_t dsdata_size(dsdata *);
dsdata *dsdata_read(char *);
dsdata *dsdata_fread(FILE *);
dsstatus dsdata_write(dsdata *, char *);
dsstatus dsdata_fwrite(dsdata *, FILE *);
int32_t dsdata_equal(dsdata *, dsdata *);
int32_t dsdata_compare(dsdata *, dsdata *);
int32_t dsdata_compare_sub(dsdata *, dsdata *, u_int32_t, u_int32_t);
dsdata *cstring_to_dsdata(char *);
dsdata *utf8string_to_dsdata(char *);
dsdata *int8_to_dsdata(int8_t);
dsdata *uint8_to_dsdata(u_int8_t);
dsdata *int16_to_dsdata(int16_t);
dsdata *uint16_to_dsdata(u_int16_t);
dsdata *int32_to_dsdata(int32_t);
dsdata *uint32_to_dsdata(u_int32_t);
dsdata *int64_to_dsdata(int64_t);
dsdata *uint64_to_dsdata(u_int64_t);
dsdata *dsid_to_dsdata(u_int32_t i);
char *dsdata_to_cstring(dsdata *);
char *dsdata_to_utf8string(dsdata *);
int8_t dsdata_to_int8(dsdata *);
u_int8_t dsdata_to_uint8(dsdata *);
int16_t dsdata_to_int16(dsdata *);
u_int16_t dsdata_to_uint16(dsdata *);
int32_t dsdata_to_int32(dsdata *);
u_int32_t dsdata_to_uint32(dsdata *);
int64_t dsdata_to_int64(dsdata *);
u_int64_t dsdata_to_uint64(dsdata *);
u_int32_t dsdata_to_dsid(dsdata *data);
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 *, u_int32_t);
u_int8_t dsdata_uint8_at_index(dsdata *, u_int32_t);
int16_t dsdata_int16_at_index(dsdata *, u_int32_t);
u_int16_t dsdata_uint16_at_index(dsdata *, u_int32_t);
int32_t dsdata_int32_at_index(dsdata *, u_int32_t);
u_int32_t dsdata_uint32_at_index(dsdata *, u_int32_t);
int64_t dsdata_int64_at_index(dsdata *, u_int32_t);
u_int64_t dsdata_uint64_at_index(dsdata *, u_int32_t);
void dsdata_print(dsdata *, FILE *);
#endif __DSDATA_H__