/* File: cinterf.h
** Author(s): Jiyang Xu
** Contact: xsb-contact@cs.sunysb.edu
**
** Copyright (C) The Research Foundation of SUNY, 1986, 1993-1999
** Copyright (C) ECRC, Germany, 1990
**
** XSB is free software; you can redistribute it and/or modify it under the
** terms of the GNU Library General Public License as published by the Free
** Software Foundation; either version 2 of the License, or (at your option)
** any later version.
**
** XSB is distributed in the hope that it will be useful, but WITHOUT ANY
** WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
** FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for
** more details.
**
** You should have received a copy of the GNU Library General Public License
** along with XSB; if not, write to the Free Software Foundation,
** Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
**
** $Id: cinterf.h,v 1.19 2003/02/21 16:43:09 lfcastro Exp $
**
*/
#ifndef __XSB_CINTERF_H__
#define __XSB_CINTERF_H__
#ifdef __cplusplus
extern "C" {
#endif
#ifndef CELL_DEFS_INCLUDED
#include "cell_def_xsb.h"
#endif
/*
**
** XSB provides three different levels of C interfaces.
**
** (1) Minimal Interface
**
** This is a simple interface that can be described by the
** following specifications:
**
** types: reg_num ( integer)
** prolog_int ( int on 32 bits architectures,
** long on 64 bits architectures )
** prolog_float ( double )
**
** functions:
** Prolog (register) to C:
** ptoc_int: reg_num -> prolog_int
** ptoc_float: reg_num -> prolog_float
** ptoc_string: reg_num -> string
** C to Prolog:
** ctop_int: reg_num x prolog_int -> void
** ctop_float: reg_num x prolog_float -> void
** ctop_string: reg_num x string -> void
**
** The procedures assume correct modes and types being passed down by
** Prolog level.
**
** (2) Low level interface
**
** Low level interface does not assume types and modes, and allows
** user to access prolog term structures.
** Both the minimal interface above and the high level interface below
** can be implemented by this set of low level interface routines.
**
** types: prolog_term
** reg_num ( integer )
**
** functions:
** Register to Prolog term:
** reg_term: reg_num -> prolog_term
** C to Prolog:
** c2p_int: prolog_int x prolog_term -> xsbBool
** c2p_float: prolog_float x prolog_term -> xsbBool
** c2p_string: string x prolog_term -> xsbBool
** c2p_list: prolog_term -> xsbBool
** c2p_functor: string x int x prolog_term -> xsbBool
** c2p_nil: prolog_term -> xsbBool
** c2p_setfree: prolog_term -> void !! Dangerous
** Prolog to C:
** p2c_int: prolog_term -> prolog_int
** p2c_float: prolog_term -> prolog_float
** p2c_string: prolog_term -> string
** p2c_functor: prolog_term -> string
** p2c_arity: prolog_term -> int
** Prolog to Prolog:
** p2p_arg: prolog_term x int -> prolog_term
** p2p_car: prolog_term -> prolog_term
** p2p_cdr: prolog_term -> prolog_term
** p2p_new: void -> prolog_term
** p2p_unify: prolog_term x prolog_term -> xsbBool
** p2p_call: prolog_term -> xsbBool
** p2p_funtrail: val x fun -> void
** p2p_deref: prolog_term -> prolog_term !! uncommon
** Type/Mode checking:
** is_var: prolog_term -> xsbBool
** is_int: prolog_term -> xsbBool
** is_float: prolog_term -> xsbBool
** is_string: prolog_term -> xsbBool
** is_list: prolog_term -> xsbBool
** is_nil: prolog_term -> xsbBool
** is_functor: prolog_term -> xsbBool
**
** (3) High level Interface
** This can be viewed as an extention of the minimal interface above.
**
** types: reg_num ( integer )
** format ( string )
** caddr ( C data address )
** errno ( int )
**
** functions:
** ctop_term: format x caddr x reg_num -> errno
** ptoc_term: format x caddr x reg_num -> errno
** c2p_term: format x caddr x prolog_term -> errno
** p2c_term: format x caddr x prolog_term -> errno
**
** where format (similar to that of printf/scanf) is a string controlling the
** the conversion. The interface is so general that you can even convert
** recursive data structure between C and Prolog with a single function call.
** The format is a string containing a format descriptor (fmt) which can
** be of the following forms (fmts is a sequence of fmt; # is a digit in
** 0-9):
**
** fmt Prolog term type C data type
** ---------- ---------------- -----------
** %i integer int
** %c integer char
** %f float float
** %d float double
** %s constant string
** %[fmts] structure nested struct
** %t#(fmts) structure pointer to struct
** %l#(fmt fmt) list pointer to struct
** %# recursive structure pointer to struct
**
** (4) other facilities:
**
** type: vfile (char *, opaque pointer)
**
** vfile_open: obj x v_fprintf x v_fclose x v_putc x v_getc
** x v_ungetc -> vfile
** vfile_obj: vfile -> obj
** both file and obj are opaque pointers of type char*
*/
#include "basicdefs.h"
#include "basictypes.h"
/*======================================================================*/
/* High level C interface */
/*======================================================================*/
#include "export.h"
#include "varstring_xsb.h"
DllExport extern prolog_int call_conv ptoc_int(reg_num); /* defined in builtin.c */
DllExport extern prolog_float call_conv ptoc_float(reg_num); /* defined in builtin.c */
DllExport extern char* call_conv ptoc_string(reg_num); /* defined in builtin.c */
DllExport extern char* call_conv ptoc_longstring(reg_num); /* defined in builtin.c */
DllExport extern char* call_conv ptoc_abs(reg_num);
DllExport extern void call_conv ctop_int(reg_num, prolog_int); /* defined in builtin.c */
DllExport extern void call_conv ctop_float(reg_num, double); /* def in builtin.c */
DllExport extern void call_conv ctop_string(reg_num, char*); /* def in builtin.c */
DllExport extern int call_conv ctop_abs(reg_num, char*);
extern char* string_find(char*, int); /* defined in psc.c */
extern int ctop_term(char*, char*, reg_num);
extern int ptoc_term(char*, char*, reg_num);
/*======================================================================*/
/* Low level C interface */
/*======================================================================*/
DllExport extern prolog_term call_conv reg_term(reg_num);
DllExport extern xsbBool call_conv c2p_int(prolog_int, prolog_term);
DllExport extern xsbBool call_conv c2p_float(double, prolog_term);
DllExport extern xsbBool call_conv c2p_string(char *, prolog_term);
DllExport extern xsbBool call_conv c2p_list(prolog_term);
DllExport extern xsbBool call_conv c2p_nil(prolog_term);
DllExport extern xsbBool call_conv c2p_functor(char *, int, prolog_term);
DllExport extern void call_conv c2p_setfree(prolog_term);
DllExport extern void call_conv c2p_chars(char *str, prolog_term term);
DllExport extern prolog_int call_conv p2c_int(prolog_term);
DllExport extern prolog_float call_conv p2c_float(prolog_term);
DllExport extern char* call_conv p2c_string(prolog_term);
DllExport extern char* call_conv p2c_functor(prolog_term);
DllExport extern int call_conv p2c_arity(prolog_term);
DllExport extern char* call_conv p2c_chars(prolog_term,char *,int);
DllExport extern prolog_term call_conv p2p_arg(prolog_term, int);
DllExport extern prolog_term call_conv p2p_car(prolog_term);
DllExport extern prolog_term call_conv p2p_cdr(prolog_term);
DllExport extern prolog_term call_conv p2p_new(void);
DllExport extern xsbBool call_conv p2p_unify(prolog_term, prolog_term);
DllExport extern xsbBool call_conv p2p_call(prolog_term);
DllExport extern void call_conv p2p_funtrail(/*val, fun*/);
DllExport extern prolog_term call_conv p2p_deref(prolog_term);
DllExport extern xsbBool call_conv is_var(prolog_term);
DllExport extern xsbBool call_conv is_int(prolog_term);
DllExport extern xsbBool call_conv is_float(prolog_term);
DllExport extern xsbBool call_conv is_string(prolog_term);
DllExport extern xsbBool call_conv is_atom(prolog_term);
DllExport extern xsbBool call_conv is_list(prolog_term);
DllExport extern xsbBool call_conv is_nil(prolog_term);
DllExport extern xsbBool call_conv is_functor(prolog_term);
DllExport extern xsbBool call_conv is_charlist(prolog_term,int*);
DllExport extern xsbBool call_conv is_attv(prolog_term);
extern int c2p_term(char*, char*, prolog_term);
extern int p2c_term(char*, char*, prolog_term);
/*======================================================================*/
/* Other utilities */
/*======================================================================*/
typedef char *vfile;
extern char *vfile_open(/* vfile, func, func, func, func, func */);
extern char *vfile_obj(/* vfile */);
/*======================================================================*/
/* Routines to call xsb from C */
/*======================================================================*/
DllExport extern int call_conv xsb_init(int, char **);
DllExport extern int call_conv xsb_init_string(char *);
DllExport extern int call_conv xsb_command();
DllExport extern int call_conv xsb_command_string(char *);
DllExport extern int call_conv xsb_query();
DllExport extern int call_conv xsb_query_string(char *);
DllExport extern int call_conv xsb_query_string_string(char*,VarString*,char*);
DllExport extern int call_conv xsb_query_string_string_b(char*,char*,int,int*,char*);
DllExport extern int call_conv xsb_next();
DllExport extern int call_conv xsb_next_string(VarString*,char*);
DllExport extern int call_conv xsb_next_string_b(char*,int,int*,char*);
DllExport extern int call_conv xsb_get_last_answer_string(char*,int,int*);
DllExport extern int call_conv xsb_close_query();
DllExport extern int call_conv xsb_close();
DllExport extern void call_conv print_pterm(Cell, int, VarString*);
extern char *p_charlist_to_c_string(prolog_term term, VarString *buf,
char *in_func, char *where);
/* macros for constructing answer terms and setting and retrieving atomic
values in them. To pass or retrieve complex arguments, you must use
the lower-level ctop_* routines directly. */
/* build an answer term of arity i in reg 2 */
#define xsb_make_vars(i) c2p_functor("ret",i,reg_term(2))
/* set argument i of answer term to integer value v, for filtering */
#define xsb_set_var_int(v,i) c2p_int(v,p2p_arg(reg_term(2),i))
/* set argument i of answer term to atom value s, for filtering */
#define xsb_set_var_string(s,i) c2p_string(s,p2p_arg(reg_term(2),i))
/* set argument i of answer term to atom value f, for filtering */
#define xsb_set_var_float(f,i) c2p_float(f,p2p_arg(reg_term(2),i))
/* return integer argument i of answer term */
#define xsb_var_int(i) (p2c_int(p2p_arg(reg_term(2),i)))
/* return string (atom) argument i of answer term */
#define xsb_var_string(i) (p2c_string(p2p_arg(reg_term(2),i)))
/* return float argument i of answer term */
#define xsb_var_float(i) (p2c_float(p2p_arg(reg_term(2),i)))
#ifdef __cplusplus
}
#endif
#endif /* __XSB_CINTERF_H__ */
syntax highlighted by Code2HTML, v. 0.9.1