home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 7 / Apprentice-Release7.iso / Source Code / C / Applications / Moscow ML 1.42 / src / !runtime / intext.h < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-18  |  2.2 KB  |  92 lines  |  [TEXT/R*ch]

  1. /* Structured input/output */
  2.  
  3. #ifndef __intext__
  4. #define __intext__
  5.  
  6. #include "misc.h"
  7. #include "mlvalues.h"
  8. #include "io.h"
  9.  
  10. /* Magic numbers used to discriminate between the extern formats */
  11.  
  12. #define Base_magic_number 0x8495A6B9
  13. #define Big_endian_32_magic_number Base_magic_number
  14. #define Little_endian_32_magic_number (Base_magic_number + 1)
  15. #define Big_endian_64_magic_number (Base_magic_number + 2)
  16. #define Little_endian_64_magic_number (Base_magic_number + 3)
  17. #define Compact_magic_number (Base_magic_number + 4)
  18. #define First_valid_magic_number Base_magic_number
  19. #define Last_valid_magic_number (Base_magic_number + 4)
  20.  
  21. #ifdef SIXTYFOUR
  22. # ifdef MOSML_BIG_ENDIAN
  23. #  define Extern_magic_number Big_endian_64_magic_number
  24. # else
  25. #  define Extern_magic_number Little_endian_64_magic_number
  26. # endif
  27. #else
  28. # ifdef MOSML_BIG_ENDIAN
  29. #  define Extern_magic_number Big_endian_32_magic_number
  30. # else
  31. #  define Extern_magic_number Little_endian_32_magic_number
  32. # endif
  33. #endif
  34.  
  35. /* Codes for the compact format */
  36.  
  37. #define PREFIX_SMALL_BLOCK 0x80
  38. #define PREFIX_SMALL_INT 0x40
  39. #define PREFIX_SMALL_STRING 0x20
  40. #define CODE_INT8 0x0
  41. #define CODE_INT16 0x1
  42. #define CODE_INT32 0x2
  43. #define CODE_INT64 0x3
  44. #define CODE_SHARED8 0x4
  45. #define CODE_SHARED16 0x5
  46. #define CODE_SHARED32 0x6
  47. #define CODE_BLOCK32 0x8
  48. #define CODE_STRING8 0x9
  49. #define CODE_STRING32 0xA
  50. #define CODE_DOUBLE 0xB
  51.  
  52. /* Initial sizes of data structures for extern */
  53.  
  54. #ifndef INITIAL_EXTERN_SIZE
  55. #define INITIAL_EXTERN_SIZE 4096
  56. #endif
  57. #ifndef INITIAL_EXTERN_TABLE_SIZE
  58. #define INITIAL_EXTERN_TABLE_SIZE 2039
  59. #endif
  60.  
  61. /* The hashtable of objects already emitted */
  62.  
  63. typedef unsigned long byteoffset_t;
  64.  
  65. struct extern_obj {
  66.   value obj;
  67.   byteoffset_t ofs;
  68. };
  69.  
  70. extern struct extern_obj * extern_table;
  71. extern asize_t extern_table_size, extern_table_used;
  72.  
  73. #ifdef SIXTYFOUR
  74. #define Hash(v) (((asize_t) ((v) >> 3)) % extern_table_size)
  75. #else
  76. #define Hash(v) (((asize_t) ((v) >> 2)) % extern_table_size)
  77. #endif
  78.  
  79. void alloc_extern_table P((void));
  80. void resize_extern_table P((void));
  81.  
  82. /* The entry points */
  83.  
  84. value extern_val P((struct channel *, value));
  85. value extern_compact_val P((struct channel *, value));
  86. value intern_val P((struct channel *));
  87. value intern_compact_val P((struct channel *));
  88.  
  89.  
  90. #endif
  91.  
  92.