properties.c 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. /* Copyright (C) 1995,1996,2000,2001 Free Software Foundation, Inc.
  2. *
  3. * This program is free software; you can redistribute it and/or modify
  4. * it under the terms of the GNU General Public License as published by
  5. * the Free Software Foundation; either version 2, or (at your option)
  6. * any later version.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11. * GNU General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public License
  14. * along with this software; see the file COPYING. If not, write to
  15. * the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
  16. * Boston, MA 02110-1301 USA
  17. *
  18. * As a special exception, the Free Software Foundation gives permission
  19. * for additional uses of the text contained in its release of GUILE.
  20. *
  21. * The exception is that, if you link the GUILE library with other files
  22. * to produce an executable, this does not by itself cause the
  23. * resulting executable to be covered by the GNU General Public License.
  24. * Your use of that executable is in no way restricted on account of
  25. * linking the GUILE library code into it.
  26. *
  27. * This exception does not however invalidate any other reasons why
  28. * the executable file might be covered by the GNU General Public License.
  29. *
  30. * This exception applies only to the code released by the
  31. * Free Software Foundation under the name GUILE. If you copy
  32. * code from other Free Software Foundation releases into a copy of
  33. * GUILE, as the General Public License permits, the exception does
  34. * not apply to the code that you add in this way. To avoid misleading
  35. * anyone as to the status of such modified files, you must delete
  36. * this exception notice from them.
  37. *
  38. * If you write modifications of your own for GUILE, it is your choice
  39. * whether to permit this exception to apply to your modifications.
  40. * If you do not wish that, delete this exception notice. */
  41. #include "libguile/_scm.h"
  42. #include "libguile/hashtab.h"
  43. #include "libguile/alist.h"
  44. #include "libguile/root.h"
  45. #include "libguile/weaks.h"
  46. #include "libguile/validate.h"
  47. #include "libguile/eval.h"
  48. #include "libguile/properties.h"
  49. /* {Properties}
  50. */
  51. SCM_DEFINE (scm_primitive_make_property, "primitive-make-property", 1, 0, 0,
  52. (SCM not_found_proc),
  53. "Create a @dfn{property token} that can be used with\n"
  54. "@code{primitive-property-ref} and @code{primitive-property-set!}.\n"
  55. "See @code{primitive-property-ref} for the significance of\n"
  56. "@var{not_found_proc}.")
  57. #define FUNC_NAME s_scm_primitive_make_property
  58. {
  59. if (not_found_proc != SCM_BOOL_F)
  60. SCM_VALIDATE_PROC (SCM_ARG1, not_found_proc);
  61. return scm_cons (not_found_proc, SCM_EOL);
  62. }
  63. #undef FUNC_NAME
  64. SCM_DEFINE (scm_primitive_property_ref, "primitive-property-ref", 2, 0, 0,
  65. (SCM prop, SCM obj),
  66. "Return the property @var{prop} of @var{obj}. When no value\n"
  67. "has yet been associated with @var{prop} and @var{obj}, call\n"
  68. "@var{not-found-proc} instead (see @code{primitive-make-property})\n"
  69. "and use its return value. That value is also associated with\n"
  70. "@var{obj} via @code{primitive-property-set!}. When\n"
  71. "@var{not-found-proc} is @code{#f}, use @code{#f} as the\n"
  72. "default value of @var{prop}.")
  73. #define FUNC_NAME s_scm_primitive_property_ref
  74. {
  75. SCM h;
  76. SCM_VALIDATE_CONS (SCM_ARG1, prop);
  77. h = scm_hashq_get_handle (scm_properties_whash, obj);
  78. if (!SCM_FALSEP (h))
  79. {
  80. SCM assoc = scm_assq (prop, SCM_CDR (h));
  81. if (!SCM_FALSEP (assoc))
  82. return SCM_CDR (assoc);
  83. }
  84. if (SCM_FALSEP (SCM_CAR (prop)))
  85. return SCM_BOOL_F;
  86. else
  87. {
  88. SCM val = scm_call_2 (SCM_CAR (prop), prop, obj);
  89. if (SCM_FALSEP (h))
  90. h = scm_hashq_create_handle_x (scm_properties_whash, obj, SCM_EOL);
  91. SCM_SETCDR (h, scm_acons (prop, val, SCM_CDR (h)));
  92. return val;
  93. }
  94. }
  95. #undef FUNC_NAME
  96. SCM_DEFINE (scm_primitive_property_set_x, "primitive-property-set!", 3, 0, 0,
  97. (SCM prop, SCM obj, SCM val),
  98. "Associate @var{code} with @var{prop} and @var{obj}.")
  99. #define FUNC_NAME s_scm_primitive_property_set_x
  100. {
  101. SCM h, assoc;
  102. SCM_VALIDATE_CONS (SCM_ARG1, prop);
  103. h = scm_hashq_create_handle_x (scm_properties_whash, obj, SCM_EOL);
  104. assoc = scm_assq (prop, SCM_CDR (h));
  105. if (SCM_NIMP (assoc))
  106. SCM_SETCDR (assoc, val);
  107. else
  108. {
  109. assoc = scm_acons (prop, val, SCM_CDR (h));
  110. SCM_SETCDR (h, assoc);
  111. }
  112. return SCM_UNSPECIFIED;
  113. }
  114. #undef FUNC_NAME
  115. SCM_DEFINE (scm_primitive_property_del_x, "primitive-property-del!", 2, 0, 0,
  116. (SCM prop, SCM obj),
  117. "Remove any value associated with @var{prop} and @var{obj}.")
  118. #define FUNC_NAME s_scm_primitive_property_del_x
  119. {
  120. SCM h;
  121. SCM_VALIDATE_CONS (SCM_ARG1, prop);
  122. h = scm_hashq_get_handle (scm_properties_whash, obj);
  123. if (!SCM_FALSEP (h))
  124. SCM_SETCDR (h, scm_assq_remove_x (SCM_CDR (h), prop));
  125. return SCM_UNSPECIFIED;
  126. }
  127. #undef FUNC_NAME
  128. void
  129. scm_init_properties ()
  130. {
  131. scm_properties_whash = scm_make_weak_key_hash_table (SCM_MAKINUM (511));
  132. #include "libguile/properties.x"
  133. }
  134. /*
  135. Local Variables:
  136. c-file-style: "gnu"
  137. End:
  138. */