Commit | Line | Data |
---|---|---|
5b4215a8 JB |
1 | /* classes: h_files */ |
2 | ||
3 | /* Macros for snarfing initialization actions from C source. */ | |
4 | ||
5 | #ifndef LIBGUILE_SNARF_H | |
6 | #define LIBGUILE_SNARF_H | |
7 | ||
e282f286 | 8 | /* Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. |
5b4215a8 JB |
9 | * |
10 | * This program is free software; you can redistribute it and/or modify | |
11 | * it under the terms of the GNU General Public License as published by | |
12 | * the Free Software Foundation; either version 2, or (at your option) | |
13 | * any later version. | |
14 | * | |
15 | * This program is distributed in the hope that it will be useful, | |
16 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
17 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
18 | * GNU General Public License for more details. | |
19 | * | |
20 | * You should have received a copy of the GNU General Public License | |
21 | * along with this software; see the file COPYING. If not, write to | |
82892bed JB |
22 | * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, |
23 | * Boston, MA 02111-1307 USA | |
5b4215a8 JB |
24 | * |
25 | * As a special exception, the Free Software Foundation gives permission | |
26 | * for additional uses of the text contained in its release of GUILE. | |
27 | * | |
28 | * The exception is that, if you link the GUILE library with other files | |
29 | * to produce an executable, this does not by itself cause the | |
30 | * resulting executable to be covered by the GNU General Public License. | |
31 | * Your use of that executable is in no way restricted on account of | |
32 | * linking the GUILE library code into it. | |
33 | * | |
34 | * This exception does not however invalidate any other reasons why | |
35 | * the executable file might be covered by the GNU General Public License. | |
36 | * | |
37 | * This exception applies only to the code released by the | |
38 | * Free Software Foundation under the name GUILE. If you copy | |
39 | * code from other Free Software Foundation releases into a copy of | |
40 | * GUILE, as the General Public License permits, the exception does | |
41 | * not apply to the code that you add in this way. To avoid misleading | |
42 | * anyone as to the status of such modified files, you must delete | |
43 | * this exception notice from them. | |
44 | * | |
45 | * If you write modifications of your own for GUILE, it is your choice | |
46 | * whether to permit this exception to apply to your modifications. | |
47 | * If you do not wish that, delete this exception notice. */ | |
1bbd0b84 GB |
48 | |
49 | /* Software engineering face-lift by Greg J. Badros, 11-Dec-1999, | |
50 | gjb@cs.washington.edu, http://www.cs.washington.edu/homes/gjb */ | |
51 | ||
5b4215a8 JB |
52 | \f |
53 | ||
4b4d0898 GB |
54 | #if defined(__cplusplus) || defined(GUILE_CPLUSPLUS_SNARF) |
55 | #define SCM_FUNC_CAST_ARBITRARY_ARGS SCM (*)(...) | |
bfe19b46 | 56 | #else |
4b4d0898 | 57 | #define SCM_FUNC_CAST_ARBITRARY_ARGS SCM (*)() |
bfe19b46 MD |
58 | #endif |
59 | ||
73d8385e MD |
60 | /* Generic macros to be used in user macro definitions. |
61 | * | |
62 | * For example, in order to define a macro which creates ints and | |
63 | * initializes them to the result of foo (), do: | |
64 | * | |
65 | * #define SCM_FOO(NAME) \ | |
94a70859 MD |
66 | * SCM_SNARF_HERE (int NAME) \ |
67 | * SCM_SNARF_INIT (NAME = foo ()) | |
1e76143f | 68 | * |
94a70859 | 69 | * The SCM_SNARF_INIT text goes into the corresponding .x file |
d80f396e | 70 | * up through the first occurrence of SCM__D on that line, if any. |
73d8385e MD |
71 | */ |
72 | ||
1e76143f | 73 | #ifndef SCM_MAGIC_SNARFER |
94a70859 MD |
74 | # define SCM_SNARF_HERE(X) X |
75 | # define SCM_SNARF_INIT(X) | |
76 | # define SCM_SNARF_DOCS(X) | |
1e76143f | 77 | #else |
94a70859 MD |
78 | # define SCM_SNARF_HERE(X) |
79 | # define SCM_SNARF_INIT(X) SCM__I X | |
80 | # define SCM_SNARF_DOCS(X) X | |
1e76143f | 81 | #endif |
73d8385e | 82 | |
a1ec6916 | 83 | #define SCM_DEFINE(FNAME, PRIMNAME, REQ, OPT, VAR, ARGLIST, DOCSTRING) \ |
94a70859 | 84 | SCM_SNARF_HERE(\ |
4b4d0898 GB |
85 | static const char s_ ## FNAME [] = PRIMNAME; \ |
86 | SCM FNAME ARGLIST\ | |
87 | )\ | |
94a70859 MD |
88 | SCM_SNARF_INIT(\ |
89 | scm_make_gsubr (s_ ## FNAME, REQ, OPT, VAR, \ | |
90 | (SCM_FUNC_CAST_ARBITRARY_ARGS) FNAME); \ | |
2fdcf8bd | 91 | )\ |
94a70859 | 92 | SCM_SNARF_DOCS(\ |
d80f396e | 93 | SCM__DP PRIMNAME #ARGLIST | REQ | OPT | VAR | __FILE__:__LINE__ | SCM__S DOCSTRING SCM__E \ |
4b4d0898 | 94 | ) |
1bbd0b84 | 95 | |
c3ee7520 | 96 | #define SCM_DEFINE1(FNAME, PRIMNAME, TYPE, ARGLIST, DOCSTRING) \ |
94a70859 | 97 | SCM_SNARF_HERE(\ |
4b4d0898 GB |
98 | static const char s_ ## FNAME [] = PRIMNAME; \ |
99 | SCM FNAME ARGLIST\ | |
2fdcf8bd | 100 | )\ |
94a70859 MD |
101 | SCM_SNARF_INIT(scm_make_subr (s_ ## FNAME, TYPE, FNAME); ) \ |
102 | SCM_SNARF_DOCS(\ | |
d80f396e | 103 | SCM__D1 PRIMNAME #ARGLIST | 2 | 0 | 0 | __FILE__:__LINE__ | SCM__S DOCSTRING SCM__E \ |
4b4d0898 | 104 | ) |
1bbd0b84 | 105 | |
9b1594fd | 106 | #define SCM_PROC(RANAME, STR, REQ, OPT, VAR, CFN) \ |
94a70859 MD |
107 | SCM_SNARF_HERE(static const char RANAME[]=STR) \ |
108 | SCM_SNARF_INIT(scm_make_gsubr (RANAME, REQ, OPT, VAR, \ | |
109 | (SCM_FUNC_CAST_ARBITRARY_ARGS) CFN)) | |
9b1594fd | 110 | |
1bbd0b84 | 111 | #define SCM_REGISTER_PROC(RANAME, STR, REQ, OPT, VAR, CFN) \ |
94a70859 MD |
112 | SCM_SNARF_HERE(static const char RANAME[]=STR) \ |
113 | SCM_SNARF_INIT(scm_make_gsubr (RANAME, REQ, OPT, VAR, \ | |
114 | (SCM_FUNC_CAST_ARBITRARY_ARGS) CFN);) \ | |
115 | SCM_SNARF_DOCS(\ | |
d80f396e | 116 | SCM__DR STR | REQ | OPT | VAR | __FILE__:__LINE__ | SCM__S CFN SCM__E \ |
4b4d0898 | 117 | ) |
3dc81fba | 118 | |
9de33deb | 119 | #define SCM_GPROC(RANAME, STR, REQ, OPT, VAR, CFN, GF) \ |
94a70859 | 120 | SCM_SNARF_HERE(\ |
4b4d0898 | 121 | static const char RANAME[]=STR;\ |
54778cd3 | 122 | static SCM GF \ |
94a70859 | 123 | )SCM_SNARF_INIT(\ |
54778cd3 | 124 | GF = SCM_PACK (0); /* Dirk:FIXME:: Can we safely use #f instead of 0? */ \ |
94a70859 MD |
125 | scm_make_gsubr_with_generic (RANAME, REQ, OPT, VAR, \ |
126 | (SCM_FUNC_CAST_ARBITRARY_ARGS) CFN, &GF) \ | |
4b4d0898 | 127 | ) |
3dc81fba | 128 | |
4b4d0898 | 129 | #define SCM_PROC1(RANAME, STR, TYPE, CFN) \ |
94a70859 MD |
130 | SCM_SNARF_HERE(static const char RANAME[]=STR) \ |
131 | SCM_SNARF_INIT(\ | |
fd61ba9e | 132 | scm_make_subr (RANAME, TYPE, (SCM_FUNC_CAST_ARBITRARY_ARGS) CFN) \ |
4b4d0898 | 133 | ) |
9b1594fd | 134 | |
9b1594fd | 135 | |
4b4d0898 | 136 | #define SCM_GPROC1(RANAME, STR, TYPE, CFN, GF) \ |
94a70859 | 137 | SCM_SNARF_HERE(\ |
4b4d0898 | 138 | static const char RANAME[]=STR; \ |
54778cd3 | 139 | static SCM GF \ |
94a70859 | 140 | )SCM_SNARF_INIT(\ |
54778cd3 | 141 | GF = SCM_PACK (0); /* Dirk:FIXME:: Can we safely use #f instead of 0? */ \ |
94a70859 MD |
142 | scm_make_subr_with_generic (RANAME, TYPE, \ |
143 | (SCM_FUNC_CAST_ARBITRARY_ARGS) CFN, &GF) \ | |
4b4d0898 | 144 | ) |
5b4215a8 | 145 | |
b8229a3b | 146 | #define SCM_SYNTAX(RANAME, STR, TYPE, CFN) \ |
94a70859 MD |
147 | SCM_SNARF_HERE(static const char RANAME[]=STR)\ |
148 | SCM_SNARF_INIT(scm_make_synt (RANAME, TYPE, CFN)) | |
b8229a3b | 149 | |
5b4215a8 | 150 | #define SCM_SYMBOL(c_name, scheme_name) \ |
94a70859 MD |
151 | SCM_SNARF_HERE(static SCM c_name) \ |
152 | SCM_SNARF_INIT(c_name = scm_permanent_object (SCM_CAR (scm_intern0 (scheme_name)))) | |
5b4215a8 | 153 | |
78f9f47b | 154 | #define SCM_GLOBAL_SYMBOL(c_name, scheme_name) \ |
94a70859 MD |
155 | SCM_SNARF_HERE(SCM c_name) \ |
156 | SCM_SNARF_INIT(c_name = scm_permanent_object (SCM_CAR (scm_intern0 (scheme_name)))) | |
78f9f47b | 157 | |
37b83f68 | 158 | #define SCM_KEYWORD(c_name, scheme_name) \ |
94a70859 MD |
159 | SCM_SNARF_HERE(static SCM c_name) \ |
160 | SCM_SNARF_INIT(c_name = scm_permanent_object (scm_c_make_keyword (scheme_name))) | |
37b83f68 | 161 | |
37b83f68 | 162 | #define SCM_GLOBAL_KEYWORD(c_name, scheme_name) \ |
94a70859 MD |
163 | SCM_SNARF_HERE(SCM c_name) \ |
164 | SCM_SNARF_INIT(c_name = scm_permanent_object (scm_c_make_keyword (scheme_name))) | |
5b4215a8 | 165 | |
78f9f47b | 166 | #define SCM_VCELL(c_name, scheme_name) \ |
94a70859 MD |
167 | SCM_SNARF_HERE(static SCM c_name) \ |
168 | SCM_SNARF_INIT(c_name = scm_permanent_object (scm_intern0 (scheme_name)); SCM_SETCDR (c_name, SCM_BOOL_F)) | |
78f9f47b | 169 | |
78f9f47b | 170 | #define SCM_GLOBAL_VCELL(c_name, scheme_name) \ |
94a70859 MD |
171 | SCM_SNARF_HERE(SCM c_name) \ |
172 | SCM_SNARF_INIT(c_name = scm_permanent_object (scm_intern0 (scheme_name)); SCM_SETCDR (c_name, SCM_BOOL_F)) | |
5b4215a8 | 173 | |
2e07d033 | 174 | #define SCM_VCELL_INIT(c_name, scheme_name, init_val) \ |
94a70859 MD |
175 | SCM_SNARF_HERE(static SCM c_name) \ |
176 | SCM_SNARF_INIT(c_name = scm_permanent_object (scm_intern0 (scheme_name)); SCM_SETCDR (c_name, init_val)) | |
5b4215a8 | 177 | |
2e07d033 | 178 | #define SCM_GLOBAL_VCELL_INIT(c_name, scheme_name, init_val) \ |
94a70859 MD |
179 | SCM_SNARF_HERE(SCM c_name) \ |
180 | SCM_SNARF_INIT(c_name = scm_permanent_object (scm_intern0 (scheme_name)); SCM_SETCDR (c_name, init_val)) | |
5b4215a8 | 181 | |
4b4d0898 GB |
182 | #define SCM_CONST_LONG(c_name, scheme_name,value) \ |
183 | SCM_VCELL_INIT(c_name, scheme_name, scm_long2num(value)) | |
184 | ||
185 | #ifdef SCM_MAGIC_SNARFER | |
186 | #undef SCM_ASSERT | |
187 | #define SCM_ASSERT(_cond, _arg, _pos, _subr) *&*&*&*SCM_ARG_BETTER_BE_IN_POSITION(_arg,_pos,__LINE__) | |
188 | #endif /* SCM_MAGIC_SNARFER */ | |
2e07d033 | 189 | |
5b4215a8 | 190 | #endif /* LIBGUILE_SNARF_H */ |
4b4d0898 | 191 | |
89e00824 ML |
192 | |
193 | /* | |
194 | Local Variables: | |
195 | c-file-style: "gnu" | |
196 | End: | |
197 | */ |