tag.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. /* Copyright (C) 1996, 1997, 2000, 2002 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., 59 Temple Place, Suite 330,
  16. * Boston, MA 02111-1307 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 <stdio.h>
  42. #include "libguile/_scm.h"
  43. #include "libguile/chars.h"
  44. #include "libguile/struct.h"
  45. #include "libguile/tag.h"
  46. SCM_CONST_LONG (scm_utag_immediate_integer, "utag_immediate_integer", 0);
  47. SCM_CONST_LONG (scm_utag_immediate_char, "utag_immediate_char", 1);
  48. SCM_CONST_LONG (scm_utag_pair, "utag_pair", 2);
  49. SCM_CONST_LONG (scm_utag_closure, "utag_closure", 3);
  50. SCM_CONST_LONG (scm_utag_symbol, "utag_symbol", 4);
  51. SCM_CONST_LONG (scm_utag_vector, "utag_vector", 5);
  52. SCM_CONST_LONG (scm_utag_wvect, "utag_wvect", 6);
  53. #ifdef HAVE_ARRAYS
  54. SCM_CONST_LONG (scm_utag_bvect, "utag_bvect", 7);
  55. SCM_CONST_LONG (scm_utag_byvect, "utag_byvect", 8);
  56. SCM_CONST_LONG (scm_utag_svect, "utag_svect", 9);
  57. SCM_CONST_LONG (scm_utag_ivect, "utag_ivect", 10);
  58. SCM_CONST_LONG (scm_utag_uvect, "utag_uvect", 11);
  59. SCM_CONST_LONG (scm_utag_fvect, "utag_fvect", 12);
  60. SCM_CONST_LONG (scm_utag_dvect, "utag_dvect", 13);
  61. SCM_CONST_LONG (scm_utag_cvect, "utag_cvect", 14);
  62. #endif
  63. SCM_CONST_LONG (scm_utag_string, "utag_string", 15);
  64. SCM_CONST_LONG (scm_utag_substring, "utag_substring", 17);
  65. SCM_CONST_LONG (scm_utag_asubr, "utag_asubr", 19);
  66. SCM_CONST_LONG (scm_utag_subr_0, "utag_subr_0", 20);
  67. SCM_CONST_LONG (scm_utag_subr_1, "utag_subr_1", 21);
  68. SCM_CONST_LONG (scm_utag_cxr, "utag_cxr", 22);
  69. SCM_CONST_LONG (scm_utag_subr_3, "utag_subr_3", 23);
  70. SCM_CONST_LONG (scm_utag_subr_2, "utag_subr_2", 24);
  71. SCM_CONST_LONG (scm_utag_rpsubr, "utag_rpsubr", 25);
  72. SCM_CONST_LONG (scm_utag_subr_1o, "utag_subr_1o", 26);
  73. SCM_CONST_LONG (scm_utag_subr_2o, "utag_subr_2o", 27);
  74. SCM_CONST_LONG (scm_utag_lsubr_2, "utag_lsubr_2", 28);
  75. SCM_CONST_LONG (scm_utag_lsubr, "utag_lsubr", 29);
  76. SCM_CONST_LONG (scm_utag_smob_base, "utag_smob_base", 252);
  77. SCM_CONST_LONG (scm_utag_port_base, "utag_port_base", 253);
  78. SCM_CONST_LONG (scm_utag_flag_base, "utag_flag_base", 254);
  79. SCM_CONST_LONG (scm_utag_struct_base, "utag_struct_base", 255);
  80. #if (SCM_DEBUG_DEPRECATED == 0)
  81. SCM_DEFINE (scm_tag, "tag", 1, 0, 0,
  82. (SCM x),
  83. "Return an integer corresponding to the type of X. Deprecated.")
  84. #define FUNC_NAME s_scm_tag
  85. {
  86. switch (SCM_ITAG3 (x))
  87. {
  88. case scm_tc3_int_1:
  89. case scm_tc3_int_2:
  90. return SCM_CDR (scm_utag_immediate_integer) ;
  91. case scm_tc3_imm24:
  92. if (SCM_CHARP (x))
  93. return SCM_CDR (scm_utag_immediate_char) ;
  94. else
  95. {
  96. SCM tag = SCM_MAKINUM ((SCM_UNPACK (x) >> 8) & 0xff);
  97. return SCM_MAKINUM (SCM_INUM (SCM_CDR (scm_utag_flag_base) ) | (SCM_UNPACK (tag) << 8));
  98. }
  99. case scm_tc3_cons:
  100. switch (SCM_TYP7 (x))
  101. {
  102. case scm_tcs_cons_nimcar:
  103. return SCM_CDR (scm_utag_pair) ;
  104. case scm_tcs_closures:
  105. return SCM_CDR (scm_utag_closure) ;
  106. case scm_tcs_symbols:
  107. return SCM_CDR (scm_utag_symbol) ;
  108. case scm_tc7_vector:
  109. return SCM_CDR (scm_utag_vector) ;
  110. case scm_tc7_wvect:
  111. return SCM_CDR (scm_utag_wvect) ;
  112. #ifdef HAVE_ARRAYS
  113. case scm_tc7_bvect:
  114. return SCM_CDR (scm_utag_bvect) ;
  115. case scm_tc7_byvect:
  116. return SCM_CDR (scm_utag_byvect) ;
  117. case scm_tc7_svect:
  118. return SCM_CDR (scm_utag_svect) ;
  119. case scm_tc7_ivect:
  120. return SCM_CDR (scm_utag_ivect) ;
  121. case scm_tc7_uvect:
  122. return SCM_CDR (scm_utag_uvect) ;
  123. case scm_tc7_fvect:
  124. return SCM_CDR (scm_utag_fvect) ;
  125. case scm_tc7_dvect:
  126. return SCM_CDR (scm_utag_dvect) ;
  127. case scm_tc7_cvect:
  128. return SCM_CDR (scm_utag_cvect) ;
  129. #endif
  130. case scm_tc7_string:
  131. return SCM_CDR (scm_utag_string) ;
  132. case scm_tc7_substring:
  133. return SCM_CDR (scm_utag_substring) ;
  134. case scm_tc7_asubr:
  135. return SCM_CDR (scm_utag_asubr) ;
  136. case scm_tc7_subr_0:
  137. return SCM_CDR (scm_utag_subr_0) ;
  138. case scm_tc7_subr_1:
  139. return SCM_CDR (scm_utag_subr_1) ;
  140. case scm_tc7_cxr:
  141. return SCM_CDR (scm_utag_cxr) ;
  142. case scm_tc7_subr_3:
  143. return SCM_CDR (scm_utag_subr_3) ;
  144. case scm_tc7_subr_2:
  145. return SCM_CDR (scm_utag_subr_2) ;
  146. case scm_tc7_rpsubr:
  147. return SCM_CDR (scm_utag_rpsubr) ;
  148. case scm_tc7_subr_1o:
  149. return SCM_CDR (scm_utag_subr_1o) ;
  150. case scm_tc7_subr_2o:
  151. return SCM_CDR (scm_utag_subr_2o) ;
  152. case scm_tc7_lsubr_2:
  153. return SCM_CDR (scm_utag_lsubr_2) ;
  154. case scm_tc7_lsubr:
  155. return SCM_CDR (scm_utag_lsubr) ;
  156. case scm_tc7_port:
  157. {
  158. int tag;
  159. tag = (SCM_TYP16 (x) >> 8) & 0xff;
  160. return SCM_MAKINUM (SCM_INUM (SCM_CDR (scm_utag_port_base)) | (tag << 8));
  161. }
  162. case scm_tc7_smob:
  163. {
  164. int tag;
  165. tag = (SCM_TYP16 (x) >> 8) & 0xff;
  166. return SCM_MAKINUM (SCM_INUM (SCM_CDR (scm_utag_smob_base))
  167. | (tag << 8));
  168. }
  169. case scm_tcs_cons_gloc:
  170. /* must be a struct */
  171. {
  172. int tag = (int) SCM_STRUCT_VTABLE_DATA (x) >> 3;
  173. return SCM_MAKINUM (SCM_INUM (SCM_CDR (scm_utag_struct_base))
  174. | (tag << 8));
  175. }
  176. default:
  177. if (SCM_CONSP (x))
  178. return SCM_CDR (scm_utag_pair);
  179. else
  180. return SCM_MAKINUM (-1);
  181. }
  182. case scm_tc3_cons_gloc:
  183. case scm_tc3_tc7_1:
  184. case scm_tc3_tc7_2:
  185. case scm_tc3_closure:
  186. /* Never reached */
  187. break;
  188. }
  189. return SCM_MAKINUM (-1);
  190. }
  191. #undef FUNC_NAME
  192. #endif /* SCM_DEBUG_DEPRECATED == 0 */
  193. void
  194. scm_init_tag ()
  195. {
  196. #include "libguile/tag.x"
  197. }
  198. /*
  199. Local Variables:
  200. c-file-style: "gnu"
  201. End:
  202. */