X-Git-Url: https://git.hcoop.net/bpt/guile.git/blobdiff_plain/b4309c3c5aaaf14b91c9adbec5a668e7013774fe..a48a7629fcb9a3659f30eb593af75bb804e7e352:/libguile/smob.h diff --git a/libguile/smob.h b/libguile/smob.h index fdb5d839c..95e94ecbe 100644 --- a/libguile/smob.h +++ b/libguile/smob.h @@ -2,7 +2,7 @@ #ifndef SMOBH #define SMOBH -/* Copyright (C) 1995,1996 Free Software Foundation, Inc. +/* Copyright (C) 1995,1996,1998 Free Software Foundation, Inc. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by @@ -16,7 +16,8 @@ * * You should have received a copy of the GNU General Public License * along with this software; see the file COPYING. If not, write to - * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. + * the Free Software Foundation, Inc., 59 Temple Place, Suite 330, + * Boston, MA 02111-1307 USA * * As a special exception, the Free Software Foundation gives permission * for additional uses of the text contained in its release of GUILE. @@ -40,64 +41,105 @@ * * If you write modifications of your own for GUILE, it is your choice * whether to permit this exception to apply to your modifications. - * If you do not wish that, delete this exception notice. - */ + * If you do not wish that, delete this exception notice. */ #include "libguile/__scm.h" -#include "params.h" +#include "libguile/print.h" +/* This is the internal representation of a smob type */ +typedef struct scm_smob_descriptor +{ + char *name; + scm_sizet size; + SCM (*mark) SCM_P ((SCM)); + scm_sizet (*free) SCM_P ((SCM)); + int (*print) SCM_P ((SCM exp, SCM port, scm_print_state *pstate)); + SCM (*equalp) SCM_P ((SCM, SCM)); +} scm_smob_descriptor; +/* scm_smobfuns is the argument type for the obsolete function scm_newsmob */ typedef struct scm_smobfuns { SCM (*mark) SCM_P ((SCM)); scm_sizet (*free) SCM_P ((SCM)); - int (*print) SCM_P ((SCM exp, SCM port, int writing)); + int (*print) SCM_P ((SCM exp, SCM port, scm_print_state *pstate)); SCM (*equalp) SCM_P ((SCM, SCM)); } scm_smobfuns; -typedef struct scm_ptobfuns -{ - SCM (*mark) (); - int (*free) (); - int (*print) (); - SCM (*equalp) (); - int (*fputc) (); - int (*fputs) (); - scm_sizet (*fwrite) (); - int (*fflush) (); - int (*fgetc) (); - int (*fclose) (); - - - -} scm_ptobfuns; - - -#define SCM_SMOBNUM(x) (0x0ff & (SCM_CAR(x)>>8)); -#define SCM_PTOBNUM(x) (0x0ff & (SCM_CAR(x)>>8)); +#define SCM_NEWSMOB(z, tc, data) \ +do { \ + SCM_NEWCELL (z); \ + SCM_SETCDR (z, data); \ + SCM_SETCAR (z, tc); \ +} while (0) -extern scm_sizet scm_numsmob; -extern scm_smobfuns *scm_smobs; +#define SCM_RETURN_NEWSMOB(tc, data) \ + do { SCM __SCM_smob_answer; \ + SCM_NEWSMOB (__SCM_smob_answer, tc, data); \ + return __SCM_smob_answer; \ + } while (0) - -#ifdef __STDC__ -extern long scm_newsmob (scm_smobfuns *smob); -extern void scm_smob_prehistory (void); - -#else /* STDC */ -extern long scm_newsmob (); -extern void scm_smob_prehistory (); - -#endif /* STDC */ +#define SCM_SMOB_DATA(x) SCM_CDR (x) +#define SCM_SET_SMOB_DATA(x, data) SCM_SETCDR (x, data) +#define SCM_TC2SMOBNUM(x) (0x0ff & ((x) >> 8)) +#define SCM_SMOBNUM(x) (SCM_TC2SMOBNUM (SCM_CAR (x))) +/* SCM_SMOBNAME can be 0 if name is missing */ +#define SCM_SMOBNAME(smobnum) scm_smobs[smobnum].name +extern int scm_numsmob; +extern scm_smob_descriptor *scm_smobs; + +extern SCM scm_mark0 SCM_P ((SCM ptr)); +extern SCM scm_markcdr SCM_P ((SCM ptr)); +extern scm_sizet scm_free0 SCM_P ((SCM ptr)); +extern scm_sizet scm_smob_free (SCM obj); +extern int scm_smob_print (SCM exp, SCM port, scm_print_state *pstate); + +/* These next two functions are the supported way to create new SMOB types. + + scm_make_smob_type is useful if there are no special smob functions + and the defaults work for mark,free,print,equal_p, or you want to use + scm_set_smob_{mark,free,print,equalp}, below. + + scm_make_smob_type_mfpe is ideal if you need to set one or more of + the special smob functions-- use NULL for when the default function + is fine +*/ + +extern long scm_make_smob_type (char *name, scm_sizet size); + +extern long scm_make_smob_type_mfpe (char *name, scm_sizet size, + SCM (*mark) (SCM), + scm_sizet (*free) (SCM), + int (*print) (SCM, SCM, scm_print_state*), + SCM (*equalp) (SCM, SCM)); + +extern void scm_set_smob_mark (long tc, SCM (*mark) (SCM)); +extern void scm_set_smob_free (long tc, scm_sizet (*free) (SCM)); +extern void scm_set_smob_print (long tc, int (*print) (SCM, + SCM, + scm_print_state*)); +extern void scm_set_smob_equalp (long tc, SCM (*equalp) (SCM, SCM)); +/* convenience function for registering multiple handler fns */ +extern void scm_set_smob_mfpe (long tc, + SCM (*mark) (SCM), + scm_sizet (*free) (SCM), + int (*print) (SCM, SCM, scm_print_state*), + SCM (*equalp) (SCM, SCM)); + + +extern SCM scm_make_smob (long tc); +extern void scm_smob_prehistory (void); +/* Deprecated function */ +extern long scm_newsmob (const scm_smobfuns *smob); #endif /* SMOBH */