symbols.h 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. /* classes: h_files */
  2. #ifndef SYMBOLSH
  3. #define SYMBOLSH
  4. /* Copyright (C) 1995,1996,1997,1998, 2000, 2002 Free Software Foundation, Inc.
  5. *
  6. * This program is free software; you can redistribute it and/or modify
  7. * it under the terms of the GNU General Public License as published by
  8. * the Free Software Foundation; either version 2, or (at your option)
  9. * any later version.
  10. *
  11. * This program is distributed in the hope that it will be useful,
  12. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  13. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  14. * GNU General Public License for more details.
  15. *
  16. * You should have received a copy of the GNU General Public License
  17. * along with this software; see the file COPYING. If not, write to
  18. * the Free Software Foundation, Inc., 59 Temple Place, Suite 330,
  19. * Boston, MA 02111-1307 USA
  20. *
  21. * As a special exception, the Free Software Foundation gives permission
  22. * for additional uses of the text contained in its release of GUILE.
  23. *
  24. * The exception is that, if you link the GUILE library with other files
  25. * to produce an executable, this does not by itself cause the
  26. * resulting executable to be covered by the GNU General Public License.
  27. * Your use of that executable is in no way restricted on account of
  28. * linking the GUILE library code into it.
  29. *
  30. * This exception does not however invalidate any other reasons why
  31. * the executable file might be covered by the GNU General Public License.
  32. *
  33. * This exception applies only to the code released by the
  34. * Free Software Foundation under the name GUILE. If you copy
  35. * code from other Free Software Foundation releases into a copy of
  36. * GUILE, as the General Public License permits, the exception does
  37. * not apply to the code that you add in this way. To avoid misleading
  38. * anyone as to the status of such modified files, you must delete
  39. * this exception notice from them.
  40. *
  41. * If you write modifications of your own for GUILE, it is your choice
  42. * whether to permit this exception to apply to your modifications.
  43. * If you do not wish that, delete this exception notice. */
  44. #include "libguile/__scm.h"
  45. extern int scm_symhash_dim;
  46. /* SCM_LENGTH(SYM) is the length of SYM's name in characters, and
  47. SCM_CHARS(SYM) is the address of the first character of SYM's name.
  48. Beyond that, there are two kinds of symbols: ssymbols and msymbols,
  49. distinguished by the 'S' bit in the type.
  50. Ssymbols are just uniquified strings. They have a length, chars,
  51. and that's it. They use the scm_tc7_ssymbol tag (S bit clear).
  52. Msymbols are symbols with extra slots. These slots hold a property
  53. list and a function value (for Emacs Lisp compatibility), and a hash
  54. code. They use the scm_tc7_msymbol tag.
  55. We'd like SCM_CHARS to work on msymbols just as it does on
  56. ssymbols, so we'll have it point to the symbol's name as usual, and
  57. store a pointer to the slots just before the name in memory. Thus,
  58. you have to do some casting and pointer arithmetic to find the
  59. slots; see the SCM_SLOTS macro.
  60. In practice, the slots always live just before the pointer to them.
  61. So why not ditch the pointer, and use negative indices to refer to
  62. the slots? That's a good question; ask the author. I think it was
  63. the cognac. */
  64. #define SCM_SYMBOLP(x) (SCM_NIMP (x) \
  65. && (SCM_TYP7S (x) == scm_tc7_ssymbol))
  66. #define SCM_LENGTH_MAX (0xffffffL)
  67. #define SCM_LENGTH(x) (((unsigned long) SCM_CELL_WORD_0 (x)) >> 8)
  68. #define SCM_SETLENGTH(x, v, t) (SCM_SET_CELL_WORD_0 ((x), ((v) << 8) + (t)))
  69. #define SCM_CHARS(x) ((char *) (SCM_CELL_WORD_1 (x)))
  70. #define SCM_UCHARS(x) ((unsigned char *) (SCM_CELL_WORD_1 (x)))
  71. #define SCM_SETCHARS(x, v) (SCM_SET_CELL_WORD_1 ((x), (scm_bits_t) (v)))
  72. #define SCM_SYMBOL_SLOTS 4
  73. #define SCM_SLOTS(x) ((scm_bits_t *) (* ((scm_bits_t *) SCM_CHARS (x) - 1)))
  74. #define SCM_SYMBOL_FUNC(X) (SCM_PACK (SCM_SLOTS (X) [0]))
  75. #define SCM_SET_SYMBOL_FUNC(X, v) (SCM_SLOTS (X) [0] = SCM_UNPACK (v))
  76. #define SCM_SYMBOL_PROPS(X) (SCM_PACK (SCM_SLOTS (X) [1]))
  77. #define SCM_SET_SYMBOL_PROPS(X, v) (SCM_SLOTS (X) [1] = SCM_UNPACK (v))
  78. #define SCM_SYMBOL_HASH(X) (SCM_SLOTS (X) [2])
  79. #define SCM_ROSTRINGP(x) (SCM_NIMP(x) && ((SCM_TYP7S(x)==scm_tc7_string) \
  80. || (SCM_TYP7S(x) == scm_tc7_ssymbol)))
  81. #define SCM_ROCHARS(x) ((char *)((SCM_TYP7(x) == scm_tc7_substring) \
  82. ? SCM_INUM (SCM_CADR (x)) + SCM_CHARS (SCM_CDDR (x)) \
  83. : SCM_CHARS (x)))
  84. #define SCM_ROUCHARS(x) ((unsigned char *) ((SCM_TYP7(x) == scm_tc7_substring) \
  85. ? SCM_INUM (SCM_CADR (x)) + SCM_UCHARS (SCM_CDDR (x))\
  86. : SCM_UCHARS (x)))
  87. #define SCM_ROLENGTH(x) SCM_LENGTH (x)
  88. #define SCM_SLOPPY_SUBSTRP(x) (SCM_TYP7(x) == scm_tc7_substring)
  89. #define SCM_SUBSTRP(x) (SCM_NIMP(x) && SCM_SLOPPY_SUBSTRP(x))
  90. #define SCM_SUBSTR_STR(x) (SCM_CDDR (x))
  91. #define SCM_SUBSTR_OFFSET(x) (SCM_CADR (x))
  92. #define SCM_COERCE_SUBSTR(x) { if (SCM_SUBSTRP (x)) \
  93. x = scm_makfromstr (SCM_ROCHARS (x), \
  94. SCM_ROLENGTH (x), 0); }
  95. extern unsigned long scm_strhash (const unsigned char *str, scm_sizet len, unsigned long n);
  96. extern SCM scm_sym2vcell (SCM sym, SCM thunk, SCM definep);
  97. extern SCM scm_sym2ovcell_soft (SCM sym, SCM obarray);
  98. extern SCM scm_sym2ovcell (SCM sym, SCM obarray);
  99. extern SCM scm_intern_obarray_soft (const char *name, scm_sizet len, SCM obarray, int softness);
  100. extern SCM scm_intern_obarray (const char *name, scm_sizet len, SCM obarray);
  101. extern SCM scm_intern (const char *name, scm_sizet len);
  102. extern SCM scm_intern0 (const char *name);
  103. extern SCM scm_sysintern (const char *name, SCM val);
  104. extern SCM scm_sysintern0 (const char *name);
  105. extern SCM scm_sysintern0_no_module_lookup (const char *name);
  106. extern SCM scm_symbol_value0 (const char *name);
  107. extern SCM scm_symbol_p (SCM x);
  108. extern SCM scm_symbol_to_string (SCM s);
  109. extern SCM scm_string_to_symbol (SCM s);
  110. extern SCM scm_string_to_obarray_symbol (SCM o, SCM s, SCM softp);
  111. extern SCM scm_intern_symbol (SCM o, SCM s);
  112. extern SCM scm_unintern_symbol (SCM o, SCM s);
  113. extern SCM scm_symbol_binding (SCM o, SCM s);
  114. extern SCM scm_symbol_interned_p (SCM o, SCM s);
  115. extern SCM scm_symbol_bound_p (SCM o, SCM s);
  116. extern SCM scm_symbol_set_x (SCM o, SCM s, SCM v);
  117. extern SCM scm_symbol_fref (SCM s);
  118. extern SCM scm_symbol_pref (SCM s);
  119. extern SCM scm_symbol_fset_x (SCM s, SCM val);
  120. extern SCM scm_symbol_pset_x (SCM s, SCM val);
  121. extern SCM scm_symbol_hash (SCM s);
  122. extern SCM scm_builtin_bindings (void);
  123. extern SCM scm_builtin_weak_bindings (void);
  124. extern SCM scm_gensym (SCM name, SCM obarray);
  125. extern void scm_init_symbols (void);
  126. extern int scm_can_use_top_level_lookup_closure_var;
  127. #endif /* SYMBOLSH */
  128. /*
  129. Local Variables:
  130. c-file-style: "gnu"
  131. End:
  132. */