/* [<][>][^][v][top][bottom][index][help] */
1 /*
2 * extend.h - Stuff useful to write Gauche extension
3 *
4 * Copyright (c) 2000-2003 Shiro Kawai, All rights reserved.
5 *
6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions
8 * are met:
9 *
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 *
13 * 2. Redistributions in binary form must reproduce the above copyright
14 * notice, this list of conditions and the following disclaimer in the
15 * documentation and/or other materials provided with the distribution.
16 *
17 * 3. Neither the name of the authors nor the names of its contributors
18 * may be used to endorse or promote products derived from this
19 * software without specific prior written permission.
20 *
21 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
22 * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
23 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
24 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
25 * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
26 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
27 * TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
28 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
29 * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
30 * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
31 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
32 *
33 * $Id: extend.h,v 1.6 2005/10/26 06:00:44 shirok Exp $
34 */
35
36 #ifndef GAUCHE_EXTEND_H
37 #define GAUCHE_EXTEND_H
38
39 #ifndef GAUCHE_H
40 #include <gauche.h>
41 #endif
42
43 #ifdef __cplusplus
44 extern "C" {
45 #endif
46
47 #ifndef __CYGWIN__
48 #define SCM_INIT_EXTENSION(name) \
49 do { \
50 extern void *SCM_CPP_CAT(Scm__datastart_, name); \
51 extern void *SCM_CPP_CAT(Scm__dataend_, name); \
52 extern void *SCM_CPP_CAT(Scm__bssstart_, name); \
53 extern void *SCM_CPP_CAT(Scm__bssend_, name); \
54 Scm_RegisterDL((void*)&SCM_CPP_CAT(Scm__datastart_, name), \
55 (void*)&SCM_CPP_CAT(Scm__dataend_, name), \
56 (void*)&SCM_CPP_CAT(Scm__bssstart_, name), \
57 (void*)&SCM_CPP_CAT(Scm__bssend_, name)); \
58 } while (0)
59 #else /* __CYGWIN__ */
60 /* Cygwin's loader rearranges placement of bss, so Scm__bssstart_ and
61 Scm__bssend_ are no longer useful to find bss area. It defines
62 _bss_start__ and _bss_end__ for each DLLs so we can use it.
63 Note that these symbols are declared in gc.h. */
64 #define SCM_INIT_EXTENSION(name) \
65 do { \
66 extern void *SCM_CPP_CAT(Scm__datastart_, name); \
67 extern void *SCM_CPP_CAT(Scm__dataend_, name); \
68 Scm_RegisterDL((void*)&SCM_CPP_CAT(Scm__datastart_, name), \
69 (void*)&SCM_CPP_CAT(Scm__dataend_, name), \
70 (void*)&_bss_start__, \
71 (void*)&_bss_end__); \
72 } while (0)
73 #endif /* __CYGWIN__ */
74
75 #ifdef __cplusplus
76 }
77 #endif
78
79 #endif /* GAUCHE_EXTEND_H */