external-lib.c 2.8 KB

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