Move knowledge of unicode strings into sdata.h and object.h.
authorChris Hanson <org/chris-hanson/cph>
Tue, 22 May 2018 07:46:51 +0000 (00:46 -0700)
committerChris Hanson <org/chris-hanson/cph>
Tue, 22 May 2018 07:46:51 +0000 (00:46 -0700)
src/microcode/object.h
src/microcode/sdata.h
src/microcode/string.c

index ccaa59f0211e03e902401466d4d9753fed66e139..5dc0c51df911689a7bc6a3a1c3da9133ac42b694 100644 (file)
@@ -275,6 +275,26 @@ extern bool string_p (SCHEME_OBJECT);
 #define BYTEVECTOR_REF(s, i) (* (BYTEVECTOR_LOC ((s), (i))))
 #define BYTEVECTOR_SET(s, i, c) ((* (BYTEVECTOR_LOC ((s), (i)))) = (c))
 
+/* Unicode string operations */
+
+#define UNICODE_STRING_CP_LENGTH(u)                                    \
+  (OBJECT_DATUM (MEMORY_REF ((u), UNICODE_STRING_LENGTH_INDEX)))
+
+#define UNICODE_STRING_FLAGS(u)                                                \
+  (OBJECT_TYPE (MEMORY_REF ((u), UNICODE_STRING_LENGTH_INDEX)))
+
+/* This must be kept in sync with "runtime/string.scm". */
+#define UNICODE_STRING_BYTES_PER_CP(u)                                 \
+  ((((UNICODE_STRING_FLAGS (u)) & 0x3) == 0)                           \
+   ? 3                                                                 \
+   : ((UNICODE_STRING_FLAGS (u)) & 0x3))
+
+#define UNICODE_STRING_BYTE_LENGTH(u)                                  \
+  ((UNICODE_STRING_CP_LENGTH (u)) * (UNICODE_STRING_BYTES_PER_CP (u)))
+
+#define UNICODE_STRING_POINTER(u)                                      \
+  ((uint8_t *) (MEMORY_LOC ((u), UNICODE_STRING_DATA)))
+
 /* Legacy string operations */
 
 /* Legacy strings are laid out exactly the same way as bytevectors,
index 6caf5070d08e1d6d46fa368e92eee515a0bddae5..6396a03bc0193410add042e37802c23f7dc6eed0 100644 (file)
@@ -56,7 +56,7 @@ USA.
  * An object that points to one other object (extra indirection).
  * Used by the compiler to share objects.
  */
-#define CELL_CONTENTS          0
+#define CELL_CONTENTS          0
 
 /* BYTEVECTOR
  * Format consists of the normal non-marked vector header
@@ -67,6 +67,10 @@ USA.
 #define BYTEVECTOR_LENGTH_INDEX        1
 #define BYTEVECTOR_LENGTH_SIZE 1
 #define BYTEVECTOR_DATA                2
+
+#define UNICODE_STRING_HEADER 0
+#define UNICODE_STRING_LENGTH_INDEX 1
+#define UNICODE_STRING_DATA 2
 \f
 /* COMPILED_PROCEDURE */
 #define COMP_PROCEDURE_ADDRESS 0
index 0f249f4a55b5a8c63de3edfcd0bafe6d3231f528..cfef1b36de6ec9b3e5ef27aee0a2397b500cbb0a 100644 (file)
@@ -36,12 +36,7 @@ string_p (SCHEME_OBJECT object)
   return ((LEGACY_STRING_P (object))
           || (BYTEVECTOR_P (object))
           || ((UNICODE_STRING_P (object))
-              // This tests that the ustring-cp-size is == 1, meaning
-              // one byte per code point.  This must be kept in sync
-              // with "runtime/ustring.scm".
-              && (((OBJECT_TYPE (MEMORY_REF (object, BYTEVECTOR_LENGTH_INDEX)))
-                   & 0x03)
-                  == 0x01)));
+             && ((UNICODE_STRING_BYTES_PER_CP (object)) == 1)));
 }
 
 SCHEME_OBJECT