/* Structured input/output */ #ifndef __intext__#define __intext__ #include "misc.h"#include "mlvalues.h"#include "io.h" /* Magic numbers used to discriminate between the extern formats */ #define Base_magic_number 0x8495A6B9#define Big_endian_32_magic_number Base_magic_number#define Little_endian_32_magic_number (Base_magic_number + 1)#define Big_endian_64_magic_number (Base_magic_number + 2)#define Little_endian_64_magic_number (Base_magic_number + 3)#define Compact_magic_number (Base_magic_number + 4)#define First_valid_magic_number Base_magic_number#define Last_valid_magic_number (Base_magic_number + 4) #ifdef SIXTYFOUR# ifdef MOSML_BIG_ENDIAN# define Extern_magic_number Big_endian_64_magic_number# else# define Extern_magic_number Little_endian_64_magic_number# endif#else# ifdef MOSML_BIG_ENDIAN# define Extern_magic_number Big_endian_32_magic_number# else# define Extern_magic_number Little_endian_32_magic_number# endif#endif /* Codes for the compact format */ #define PREFIX_SMALL_BLOCK 0x80#define PREFIX_SMALL_INT 0x40#define PREFIX_SMALL_STRING 0x20#define CODE_INT8 0x0#define CODE_INT16 0x1#define CODE_INT32 0x2#define CODE_INT64 0x3#define CODE_SHARED8 0x4#define CODE_SHARED16 0x5#define CODE_SHARED32 0x6#define CODE_BLOCK32 0x8#define CODE_STRING8 0x9#define CODE_STRING32 0xA#define CODE_DOUBLE 0xB /* Initial sizes of data structures for extern */ #ifndef INITIAL_EXTERN_SIZE#define INITIAL_EXTERN_SIZE 4096#endif#ifndef INITIAL_EXTERN_TABLE_SIZE#define INITIAL_EXTERN_TABLE_SIZE 2039#endif /* The hashtable of objects already emitted */ typedef unsigned long byteoffset_t; struct extern_obj { value obj; byteoffset_t ofs;}; extern struct extern_obj * extern_table;extern asize_t extern_table_size, extern_table_used; extern byteoffset_t * extern_block;extern asize_t extern_size, extern_pos; #ifdef SIXTYFOUR#define Hash(v) (((asize_t) ((v) >> 3)) % extern_table_size)#else#define Hash(v) (((asize_t) ((v) >> 2)) % extern_table_size)#endif void alloc_extern_table (void);void resize_extern_table (void); /* The entry points */ value extern_val (struct channel *, value);value extern_compact_val (struct channel *, value);value intern_val (struct channel *);value intern_compact_val (struct channel *); byteoffset_t emit_all(value root);void adjust_pointers(value * start, mlsize_t size, color_t color); #endif
/* Structured input/output */
#ifndef __intext__
#define __intext__
#include "misc.h"
#include "mlvalues.h"
#include "io.h"
/* Magic numbers used to discriminate between the extern formats */
#define Base_magic_number 0x8495A6B9
#define Big_endian_32_magic_number Base_magic_number
#define Little_endian_32_magic_number (Base_magic_number + 1)
#define Big_endian_64_magic_number (Base_magic_number + 2)
#define Little_endian_64_magic_number (Base_magic_number + 3)
#define Compact_magic_number (Base_magic_number + 4)
#define First_valid_magic_number Base_magic_number
#define Last_valid_magic_number (Base_magic_number + 4)
#ifdef SIXTYFOUR
# ifdef MOSML_BIG_ENDIAN
# define Extern_magic_number Big_endian_64_magic_number
# else
# define Extern_magic_number Little_endian_64_magic_number
# endif
#else
# ifdef MOSML_BIG_ENDIAN
# define Extern_magic_number Big_endian_32_magic_number
# else
# define Extern_magic_number Little_endian_32_magic_number
# endif
#endif
/* Codes for the compact format */
#define PREFIX_SMALL_BLOCK 0x80
#define PREFIX_SMALL_INT 0x40
#define PREFIX_SMALL_STRING 0x20
#define CODE_INT8 0x0
#define CODE_INT16 0x1
#define CODE_INT32 0x2
#define CODE_INT64 0x3
#define CODE_SHARED8 0x4
#define CODE_SHARED16 0x5
#define CODE_SHARED32 0x6
#define CODE_BLOCK32 0x8
#define CODE_STRING8 0x9
#define CODE_STRING32 0xA
#define CODE_DOUBLE 0xB
/* Initial sizes of data structures for extern */
#ifndef INITIAL_EXTERN_SIZE
#define INITIAL_EXTERN_SIZE 4096
#endif
#ifndef INITIAL_EXTERN_TABLE_SIZE
#define INITIAL_EXTERN_TABLE_SIZE 2039
#endif
/* The hashtable of objects already emitted */
typedef unsigned long byteoffset_t;
struct extern_obj {
value obj;
byteoffset_t ofs;
};
extern struct extern_obj * extern_table;
extern asize_t extern_table_size, extern_table_used;
extern byteoffset_t * extern_block;
extern asize_t extern_size, extern_pos;
#ifdef SIXTYFOUR
#define Hash(v) (((asize_t) ((v) >> 3)) % extern_table_size)
#else
#define Hash(v) (((asize_t) ((v) >> 2)) % extern_table_size)
#endif
void alloc_extern_table (void);
void resize_extern_table (void);
/* The entry points */
value extern_val (struct channel *, value);
value extern_compact_val (struct channel *, value);
value intern_val (struct channel *);
value intern_compact_val (struct channel *);
byteoffset_t emit_all(value root);
void adjust_pointers(value * start, mlsize_t size, color_t color);
#endif