1 /* examples/box-module/box.c
3 * Copyright (C) 1998,2001, 2006 Free Software Foundation, Inc.
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public License
7 * as published by the Free Software Foundation; either version 3, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this software; see the file COPYING.LESSER. If
17 * not, write to the Free Software Foundation, Inc., 51 Franklin
18 * Street, Fifth Floor, Boston, MA 02110-1301 USA
21 /* Include all needed declarations. */
25 /* The type code for the newly created smob type will be stored into
26 this variable. It has the prefix `scm_tc16_' to make it usable
27 with the SCM_VALIDATE_SMOB macro below. */
28 static scm_t_bits scm_tc16_box
;
31 /* This function is responsible for marking all SCM objects included
36 /* Since we have only one SCM object to protect, we simply return it
37 and the caller will mark it. */
38 return SCM_CELL_OBJECT_1 (b
);
42 /* Print a textual represenation of the smob to a given port. */
44 print_box (SCM b
, SCM port
, scm_print_state
*pstate
)
46 SCM value
= SCM_CELL_OBJECT_1 (b
);
48 scm_puts ("#<box ", port
);
49 scm_write (value
, port
);
52 /* Non-zero means success. */
57 /* This defines the primitve `make-box', which returns a new smob of
58 type `box', initialized to `#f'. */
60 #define FUNC_NAME "make-box"
63 /* This macro creates the new objects, stores the value `#f' into it
64 and returns it to the caller. */
65 SCM_RETURN_NEWSMOB (scm_tc16_box
, SCM_BOOL_F
);
70 /* This is the primitive `box-ref' which returns the object stored in
74 #define FUNC_NAME "box-ref"
76 /* First, we have to ensure that the user really gave us a box
77 objects. The macro SCM_VALIDATE_SMOB will do all what is needed.
78 The parameters are interpreted as follows:
80 1: The position of the checked variable in the parameter list.
81 b: The passed parameter.
82 box: Concatenated with the fixed prefix scm_tc16_, names the type
83 code for the expected smob type. */
84 SCM_VALIDATE_SMOB (1, b
, box
);
86 /* Fetch the object from the box and return it. */
87 return SCM_CELL_OBJECT_1 (b
);
92 /* Primitive which stores an arbitrary value into a box. */
94 box_set_x (SCM b
, SCM value
)
95 #define FUNC_NAME "box-set!"
97 SCM_VALIDATE_SMOB (1, b
, box
);
99 /* Set the cell number 1 of the smob to the given value. */
100 SCM_SET_CELL_OBJECT_1 (b
, value
);
102 /* When this constant is returned, the REPL will not print the
103 returned value. All procedures in Guile which are documented as
104 returning `and unspecified value' actually return this value. */
105 return SCM_UNSPECIFIED
;
110 /* Create and initialize the new smob type, and register the
111 primitives withe the interpreter library.
113 This function must be declared a bit different from the example in
114 the ../box directory, because it will be called by
115 `scm_c_define_module', called from below. */
117 init_box_type (void * unused
)
119 scm_tc16_box
= scm_make_smob_type ("box", 0);
120 scm_set_smob_mark (scm_tc16_box
, mark_box
);
121 scm_set_smob_print (scm_tc16_box
, print_box
);
123 scm_c_define_gsubr ("make-box", 0, 0, 0, make_box
);
124 scm_c_define_gsubr ("box-set!", 2, 0, 0, box_set_x
);
125 scm_c_define_gsubr ("box-ref", 1, 0, 0, box_ref
);
127 /* This is new too: Since the procedures are now in a module, we
128 have to explicitly export them before they can be used. */
129 scm_c_export ("make-box", "box-set!", "box-ref", NULL
);
133 /* This is the function which gets called by scm_boot_guile after the
134 Guile library is completely initialized. */
136 inner_main (void *closure
, int argc
, char **argv
)
138 /* Unlike the example in ../box, init_box_type is not called
139 directly, but by scm_c_define_module, which will create a module
140 named (box-module) and make this module current while called
141 init_box_type, thus placing the definitions into that module. */
142 scm_c_define_module ("box-module", init_box_type
, NULL
);
144 /* ... then we start a shell, in which the box data type can be
145 used (after using the module (box-module)). */
146 scm_shell (argc
, argv
);
152 main (int argc
, char **argv
)
154 /* Initialize Guile, then call `inner_main' with the arguments 0,
156 scm_boot_guile (argc
, argv
, inner_main
, 0);
157 return 0; /* Never reached. */