external-lib.c 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * Part of Scheme 48 1.9. See file COPYING for notices and license.
  3. *
  4. * Authors: Mike Sperber, Harald Glab-Phlak
  5. */
  6. /*
  7. * Access to various Scheme-side libraries via the FFI
  8. */
  9. #include <stdlib.h>
  10. #include "scheme48.h"
  11. /*
  12. * Enum sets
  13. */
  14. static s48_ref_t enum_set_type_binding = NULL;
  15. /*
  16. * This needs to be in synch with the layout of :ENUM-SET in enum-set.scm
  17. */
  18. static void
  19. check_enum_set(s48_value sch_thing)
  20. {
  21. s48_check_record_type(sch_thing, s48_deref(enum_set_type_binding));
  22. }
  23. static void
  24. check_enum_set_2(s48_call_t call, s48_ref_t sch_thing)
  25. {
  26. s48_check_record_type_2(call, sch_thing, enum_set_type_binding);
  27. }
  28. void
  29. s48_check_enum_set_type(s48_value sch_thing, s48_value sch_enum_set_type_binding)
  30. {
  31. check_enum_set(sch_thing);
  32. {
  33. s48_value actual_type = S48_UNSAFE_RECORD_REF(sch_thing, 0);
  34. s48_value binding_val = S48_SHARED_BINDING_REF(sch_enum_set_type_binding);
  35. s48_value unspecific = S48_UNSPECIFIC;
  36. if (!S48_EQ_P(S48_UNSAFE_RECORD_REF(sch_thing, 0),
  37. S48_SHARED_BINDING_REF(sch_enum_set_type_binding)))
  38. s48_assertion_violation("s48_check_enum_set_type", "invalid enum-set type", 2,
  39. sch_thing, binding_val);
  40. }
  41. }
  42. void
  43. s48_check_enum_set_type_2(s48_call_t call, s48_ref_t sch_thing, s48_ref_t sch_enum_set_type_binding)
  44. {
  45. check_enum_set_2(call, sch_thing);
  46. {
  47. s48_ref_t actual_type = s48_unsafe_record_ref_2(call, sch_thing, 0);
  48. s48_ref_t binding_val = s48_shared_binding_ref_2(call, sch_enum_set_type_binding);
  49. if (!s48_eq_p_2(call, actual_type, binding_val))
  50. s48_assertion_violation_2(call, "s48_check_enum_set_type_2",
  51. "invalid enum-set type", 2,
  52. sch_thing, binding_val);
  53. }
  54. }
  55. long
  56. s48_enum_set2integer(s48_value sch_enum_set)
  57. {
  58. check_enum_set(sch_enum_set);
  59. return s48_extract_fixnum(S48_UNSAFE_RECORD_REF(sch_enum_set, 1));
  60. }
  61. long
  62. s48_enum_set2integer_2(s48_call_t call, s48_ref_t sch_enum_set)
  63. {
  64. check_enum_set_2(call, sch_enum_set);
  65. return s48_extract_long_2(call, s48_unsafe_record_ref_2(call, sch_enum_set, 1));
  66. }
  67. s48_value
  68. s48_integer2enum_set(s48_value sch_enum_set_type_binding, long mask)
  69. {
  70. s48_value sch_enum_set = s48_make_record(s48_deref(enum_set_type_binding));
  71. S48_UNSAFE_RECORD_SET(sch_enum_set, 0, S48_SHARED_BINDING_REF(sch_enum_set_type_binding));
  72. S48_UNSAFE_RECORD_SET(sch_enum_set, 1, s48_enter_fixnum(mask));
  73. return sch_enum_set;
  74. }
  75. s48_ref_t
  76. s48_integer2enum_set_2(s48_call_t call, s48_ref_t sch_enum_set_type_binding, long mask)
  77. {
  78. s48_ref_t sch_enum_set = s48_make_record_2(call, enum_set_type_binding);
  79. s48_unsafe_record_set_2(call, sch_enum_set, 0,
  80. s48_shared_binding_ref_2(call, sch_enum_set_type_binding));
  81. s48_unsafe_record_set_2(call, sch_enum_set, 1,
  82. s48_enter_long_as_fixnum_2(call, mask));
  83. return sch_enum_set;
  84. }
  85. void
  86. s48_init_external_libs(void)
  87. {
  88. enum_set_type_binding = s48_get_imported_binding_2("enum-set-type");
  89. }