/* * Reader extension */ static ScmObj read_uvector(ScmPort *port, const char *tag, ScmReadContext *ctx) { ScmChar c; ScmObj uv = SCM_UNDEFINED; SCM_GETC(c, port); if (c != '(') Scm_Error("bad uniform vector syntax for %s", tag); ScmObj list = Scm_ReadList(SCM_OBJ(port), ')'); if (strcmp(tag, "s8") == 0) uv = Scm_ListToS8Vector(list, 0); else if (strcmp(tag, "u8") == 0) uv = Scm_ListToU8Vector(list, 0); else if (strcmp(tag, "s16") == 0) uv = Scm_ListToS16Vector(list, 0); else if (strcmp(tag, "u16") == 0) uv = Scm_ListToU16Vector(list, 0); else if (strcmp(tag, "s32") == 0) uv = Scm_ListToS32Vector(list, 0); else if (strcmp(tag, "u32") == 0) uv = Scm_ListToU32Vector(list, 0); else if (strcmp(tag, "s64") == 0) uv = Scm_ListToS64Vector(list, 0); else if (strcmp(tag, "u64") == 0) uv = Scm_ListToU64Vector(list, 0); else if (strcmp(tag, "f16") == 0) uv = Scm_ListToF16Vector(list, 0); else if (strcmp(tag, "f32") == 0) uv = Scm_ListToF32Vector(list, 0); else if (strcmp(tag, "f64") == 0) uv = Scm_ListToF64Vector(list, 0); else Scm_Error("invalid unform vector tag: %s", tag); /* If we are reading source file, let literal uvectors be immutable. */ if (Scm_ReadContextLiteralImmutable(ctx)) { SCM_UVECTOR_IMMUTABLE_P(uv) = TRUE; } return uv; }
static char *get_message_buffer(ScmUVector *v, u_int *size) { if (SCM_UVECTOR_IMMUTABLE_P(v)) { Scm_Error("attempted to use an immutable uniform vector as a buffer"); } *size = Scm_UVectorSizeInBytes(v); return (char *)SCM_UVECTOR_ELEMENTS(v); }