cinterf.h

00001 /* File:      cinterf.h
00002 ** Author(s): Jiyang Xu
00003 ** Contact:   xsb-contact@cs.sunysb.edu
00004 ** 
00005 ** Copyright (C) The Research Foundation of SUNY, 1986, 1993-1999
00006 ** Copyright (C) ECRC, Germany, 1990
00007 ** 
00008 ** XSB is free software; you can redistribute it and/or modify it under the
00009 ** terms of the GNU Library General Public License as published by the Free
00010 ** Software Foundation; either version 2 of the License, or (at your option)
00011 ** any later version.
00012 ** 
00013 ** XSB is distributed in the hope that it will be useful, but WITHOUT ANY
00014 ** WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
00015 ** FOR A PARTICULAR PURPOSE.  See the GNU Library General Public License for
00016 ** more details.
00017 ** 
00018 ** You should have received a copy of the GNU Library General Public License
00019 ** along with XSB; if not, write to the Free Software Foundation,
00020 ** Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
00021 **
00022 ** $Id: cinterf.h,v 1.32 2006/07/02 18:36:28 tswift Exp $
00023 ** 
00024 */
00025 
00026 #include "context.h"
00027 
00028 #ifndef __XSB_CINTERF_H__
00029 #define __XSB_CINTERF_H__
00030 
00031 #ifdef __cplusplus
00032 extern "C" {
00033 #endif
00034 
00035 #ifndef CELL_DEFS_INCLUDED
00036 #include "cell_def_xsb.h"
00037 #endif
00038 
00039 
00040 /*
00041 **  
00042 **  XSB provides three different levels of C interfaces.
00043 **  
00044 **  (1) Minimal Interface
00045 **  
00046 **  This is a simple interface that can be described by the   
00047 **  following specifications:
00048 **  
00049 **      types:  reg_num ( integer)
00050 **              prolog_int ( int  on 32 bits architectures,
00051 **                           long on 64 bits architectures )
00052 **              prolog_float ( double )
00053 **  
00054 **      functions:
00055 **         Prolog (register) to C:
00056 **              ptoc_int:       reg_num -> prolog_int
00057 **              ptoc_float:     reg_num -> prolog_float
00058 **              ptoc_string:    reg_num -> string
00059 **         C  to Prolog:
00060 **              ctop_int:       reg_num x prolog_int -> void
00061 **              ctop_float:     reg_num x prolog_float -> void
00062 **              ctop_string:    reg_num x string -> void
00063 **  
00064 **  The procedures assume correct modes and types being passed down by
00065 **  Prolog level.
00066 **  
00067 **  (2) Low level interface
00068 **  
00069 **  Low level interface does not assume types and modes, and allows
00070 **  user to access prolog term structures.
00071 **  Both the minimal interface above and the high level interface below
00072 **  can be implemented by this set of low level interface routines.
00073 **  
00074 **      types:  prolog_term
00075 **              reg_num  ( integer )
00076 **  
00077 **      functions:
00078 **          Register to Prolog term:
00079 **              reg_term:       reg_num -> prolog_term
00080 **          C to Prolog:                
00081 **              c2p_int:        prolog_int x prolog_term -> xsbBool
00082 **              c2p_float:      prolog_float x prolog_term -> xsbBool
00083 **              c2p_string:     string x prolog_term -> xsbBool
00084 **              c2p_list:       prolog_term -> xsbBool
00085 **              c2p_functor:    string x int x prolog_term -> xsbBool
00086 **              c2p_nil:        prolog_term -> xsbBool
00087 **              c2p_setfree:    prolog_term -> void  !! Dangerous
00088 **          Prolog to C:
00089 **              p2c_int:        prolog_term -> prolog_int
00090 **              p2c_float:      prolog_term -> prolog_float
00091 **              p2c_string:     prolog_term -> string
00092 **              p2c_functor:    prolog_term -> string
00093 **              p2c_arity:      prolog_term -> int
00094 **          Prolog to Prolog:
00095 **              p2p_arg:        prolog_term x int -> prolog_term
00096 **              p2p_car:        prolog_term -> prolog_term
00097 **              p2p_cdr:        prolog_term -> prolog_term
00098 **              p2p_new:        void -> prolog_term
00099 **              p2p_unify:      prolog_term x prolog_term -> xsbBool
00100 **              p2p_call:       prolog_term -> xsbBool
00101 **              p2p_funtrail:   val x fun -> void
00102 **              p2p_deref:      prolog_term -> prolog_term   !! uncommon
00103 **          Type/Mode checking:
00104 **              is_var:         prolog_term -> xsbBool
00105 **              is_int:         prolog_term -> xsbBool
00106 **              is_float:       prolog_term -> xsbBool
00107 **              is_string:      prolog_term -> xsbBool
00108 **              is_list:        prolog_term -> xsbBool
00109 **              is_nil:         prolog_term -> xsbBool
00110 **              is_functor:     prolog_term -> xsbBool
00111 **  
00112 **  (3) High level Interface
00113 **     This can be viewed as an extention of the minimal interface above.
00114 **  
00115 **      types:  reg_num  ( integer )
00116 **              format ( string )
00117 **              caddr ( C data address )
00118 **              errno ( int )
00119 **  
00120 **      functions:
00121 **              ctop_term:      format x caddr x reg_num -> errno
00122 **              ptoc_term:      format x caddr x reg_num -> errno
00123 **              c2p_term:       format x caddr x prolog_term -> errno
00124 **              p2c_term:       format x caddr x prolog_term -> errno
00125 **  
00126 **  where format (similar to that of printf/scanf) is a string controlling the 
00127 **  the conversion. The interface is so general that you can even convert
00128 **  recursive data structure between C and Prolog with a single function call.
00129 **  The format is a string containing a format descriptor (fmt) which can
00130 **  be of the following forms (fmts is a sequence of fmt; # is a digit in
00131 **  0-9):
00132 **  
00133 **      fmt                     Prolog term type        C data type
00134 **      ----------              ----------------        -----------
00135 **      %i                      integer                 int
00136 **      %c                      integer                 char
00137 **      %f                      float                   float
00138 **      %d                      float                   double
00139 **      %s                      constant                string
00140 **      %[fmts]                 structure               nested struct
00141 **      %t#(fmts)               structure               pointer to struct
00142 **      %l#(fmt fmt)            list                    pointer to struct
00143 **      %#                      recursive structure     pointer to struct
00144 **  
00145 **  (4) other facilities:
00146 **  
00147 **     type:  vfile (char *, opaque pointer)
00148 **  
00149 **      vfile_open:  obj x v_fprintf x v_fclose x v_putc x v_getc 
00150 **                      x v_ungetc -> vfile
00151 **      vfile_obj:  vfile -> obj                
00152 **              both file and obj are opaque pointers of type char*
00153 */
00154 
00155 #include "basicdefs.h"
00156 #include "basictypes.h"
00157 
00158 
00159 /*======================================================================*/
00160 /* High level C interface                                               */
00161 /*======================================================================*/
00162 
00163 #include "export.h"
00164 #include "varstring_xsb.h"
00165 
00166 #define extern_ctop_abs(reg_num,val) ctop_abs(CTXTc reg_num,val) 
00167 #define extern_ctop_float(reg_num, val) ctop_float(CTXTc reg_num, val) 
00168 #define extern_ctop_int(reg_num,val) ctop_int(CTXTc reg_num,val) 
00169 
00170 #define extern_ptoc_abs(reg_num) ptoc_abs(CTXTc reg_num) 
00171 #define extern_ptoc_float(reg_num) ptoc_float(CTXTc reg_num) 
00172 #define extern_ptoc_int(reg_num) ptoc_int(CTXTc reg_num) 
00173 #define extern_ptoc_longstring(reg_num) ptoc_longstring(CTXTc reg_num) 
00174 #define extern_ptoc_string(reg_num) ptoc_string(CTXTc reg_num) 
00175 
00176 #define extern_c2p_chars(cstr, regs_to_protect, pterm) \
00177   c2p_chars(CTXTc cstr, regs_to_protect, pterm) 
00178 #define extern_c2p_float(dbl, pterm)  c2p_float(CTXTc dbl, pterm)
00179 #define extern_c2p_functor(functor,arity,var) \
00180   c2p_functor(CTXTc functor,arity,var)
00181 #define extern_c2p_int(pint,pterm) c2p_int(CTXTc pint, pterm)
00182 #define extern_c2p_list(var) c2p_list(CTXTc var)
00183 #define extern_c2p_nil(var) c2p_nil(CTXTc var)
00184 #define extern_c2p_string(val,var) c2p_string(CTXTc val,var)
00185 
00186 #define extern_p2c_arity(term) p2c_arity(term)
00187 #define extern_p2c_chars(term,cptr,pint) p2c_chars(CTXTc term,cptr,pint)
00188 #define extern_p2c_float(term) p2c_float(term)
00189 #define extern_p2c_functor(term) p2c_functor(term)
00190 #define extern_p2c_int(term) p2c_int(term)
00191 #define extern_p2c_string(term) p2c_string(term)
00192 
00193 #define extern_p2p_arg(term,argno) p2p_arg(term,argno)
00194 #define extern_p2p_car(term) p2p_car(term)
00195 #define extern_p2p_cdr(term) p2p_cdr(term)
00196 #define extern_p2p_deref(term) p2p_deref(term)
00197 #define extern_p2p_new() p2p_new(CTXT)
00198 #define extern_p2p_unify(term1, term2) p2p_unify(CTXTc term1, term2)
00199 
00200 #define extern_print_pterm(Cell, int, VS) print_pterm(CTXTc Cell, int, VS)
00201 
00202 #define extern_reg_term(regnum) reg_term(CTXTc regnum)
00203 
00204 /*======================================================================*/
00205 
00206 DllExport extern prolog_int call_conv ptoc_int(CTXTdeclc reg_num);      
00207                                                 /* defined in builtin.c */
00208 DllExport extern prolog_float call_conv ptoc_float(CTXTdeclc reg_num);
00209                                                 /* defined in builtin.c */
00210 DllExport extern char* call_conv ptoc_string(CTXTdeclc reg_num);
00211                                                 /* defined in builtin.c */
00212 DllExport extern char* call_conv ptoc_longstring(CTXTdeclc reg_num);
00213                                                 /* defined in builtin.c */
00214 DllExport extern char* call_conv ptoc_abs(reg_num);
00215 
00216 DllExport extern void  call_conv ctop_int(CTXTdeclc reg_num, prolog_int);
00217                                                 /* defined in builtin.c */
00218 DllExport extern void  call_conv ctop_float(CTXTdeclc reg_num, double);
00219                                                 /* def in builtin.c */
00220 DllExport extern void  call_conv ctop_string(CTXTdeclc reg_num, char*);
00221                                                 /* def in builtin.c */
00222 DllExport extern void  call_conv extern_ctop_string(CTXTdeclc reg_num, char*);
00223                                                 /* def in builtin.c */
00224 DllExport extern int   call_conv ctop_abs(reg_num, char*);
00225 
00226 extern char* string_find(char*, int);           /* defined in psc.c     */
00227 
00228 extern int   ctop_term(CTXTdeclc char*, char*, reg_num);
00229 extern int   ptoc_term(CTXTdeclc char*, char*, reg_num);
00230 
00231 /*======================================================================*/
00232 /* Low level C interface                                                */
00233 /*======================================================================*/
00234 
00235 
00236 DllExport extern prolog_term call_conv reg_term(CTXTdeclc reg_num);
00237 
00238 DllExport extern xsbBool call_conv c2p_int(CTXTdeclc prolog_int, prolog_term);
00239 DllExport extern xsbBool call_conv c2p_float(CTXTdeclc double, prolog_term);
00240 DllExport extern xsbBool call_conv c2p_string(CTXTdeclc char *, prolog_term);
00241 DllExport extern xsbBool call_conv c2p_list(CTXTdeclc prolog_term);
00242 DllExport extern xsbBool call_conv c2p_nil(CTXTdeclc prolog_term);
00243 DllExport extern void call_conv ensure_heap_space(CTXTdeclc int, int);
00244 DllExport extern xsbBool call_conv c2p_functor(CTXTdeclc char *, int, prolog_term);
00245 DllExport extern void call_conv c2p_setfree(prolog_term);
00246 DllExport extern void call_conv c2p_chars(CTXTdeclc char *str, int regs_to_protect, prolog_term term);
00247 
00248 
00249 DllExport extern prolog_int   call_conv p2c_int(prolog_term);
00250 DllExport extern double   call_conv p2c_float(prolog_term);
00251 DllExport extern char*    call_conv p2c_string(prolog_term);
00252 DllExport extern char*    call_conv p2c_functor(prolog_term);
00253 DllExport extern int      call_conv p2c_arity(prolog_term);
00254 DllExport extern char*    call_conv p2c_chars(CTXTdeclc prolog_term,char *,int);
00255 
00256 DllExport extern prolog_term call_conv p2p_arg(prolog_term, int);
00257 DllExport extern prolog_term call_conv p2p_car(prolog_term);
00258 DllExport extern prolog_term call_conv p2p_cdr(prolog_term);
00259 DllExport extern prolog_term call_conv p2p_new(CTXTdecl);
00260 DllExport extern xsbBool        call_conv p2p_unify(CTXTdeclc prolog_term, prolog_term);
00261 DllExport extern xsbBool        call_conv p2p_call(prolog_term);
00262 DllExport extern void        call_conv p2p_funtrail(/*val, fun*/);
00263 DllExport extern prolog_term call_conv p2p_deref(prolog_term);
00264 
00265 DllExport extern xsbBool call_conv is_var(prolog_term);
00266 DllExport extern xsbBool call_conv is_int(prolog_term);
00267 DllExport extern xsbBool call_conv is_float(prolog_term);
00268 DllExport extern xsbBool call_conv is_string(prolog_term);
00269 DllExport extern xsbBool call_conv is_atom(prolog_term);
00270 DllExport extern xsbBool call_conv is_list(prolog_term);
00271 DllExport extern xsbBool call_conv is_nil(prolog_term);
00272 DllExport extern xsbBool call_conv is_functor(prolog_term);
00273 DllExport extern xsbBool call_conv is_charlist(prolog_term,int*);
00274 DllExport extern xsbBool call_conv is_attv(prolog_term);
00275 
00276 extern int   c2p_term(CTXTdeclc char*, char*, prolog_term);
00277 extern int   p2c_term(CTXTdeclc char*, char*, prolog_term);
00278 
00279 /*======================================================================*/
00280 /* Other utilities                                                      */
00281 /*======================================================================*/
00282 
00283 typedef char *vfile;
00284 
00285 extern char *vfile_open(/* vfile, func, func, func, func, func */);
00286 extern char *vfile_obj(/* vfile */);
00287 
00288 /*======================================================================*/
00289 /* Routines to call xsb from C                                          */
00290 /*======================================================================*/
00291 
00292 DllExport extern int call_conv xsb_init(CTXTdeclc int, char **);
00293 DllExport extern int call_conv xsb_init_string(CTXTdeclc char *);
00294 DllExport extern int call_conv xsb_command(CTXTdecl);
00295 DllExport extern int call_conv xsb_command_string(CTXTdeclc char *);
00296 DllExport extern int call_conv xsb_query(CTXTdecl);
00297 DllExport extern int call_conv xsb_query_string(CTXTdeclc char *);
00298 DllExport extern int call_conv xsb_query_string_string(CTXTdeclc char*,VarString*,char*);
00299 DllExport extern int call_conv xsb_query_string_string_b(CTXTdeclc char*,char*,int,int*,char*);
00300 DllExport extern int call_conv xsb_next(CTXTdecl);
00301 DllExport extern int call_conv xsb_next_string(CTXTdeclc VarString*,char*);
00302 DllExport extern int call_conv xsb_next_string_b(CTXTdeclc char*,int,int*,char*);
00303 DllExport extern int call_conv xsb_get_last_answer_string(CTXTdeclc char*,int,int*);
00304 DllExport extern int call_conv xsb_close_query(CTXTdecl);
00305 DllExport extern int call_conv xsb_close(CTXTdecl);
00306 DllExport extern int call_conv xsb_get_last_error_string(char*,int,int*);
00307 
00308 DllExport extern void call_conv print_pterm(CTXTdeclc Cell, int, VarString*);
00309 extern char *p_charlist_to_c_string(CTXTdeclc prolog_term term, VarString *buf,
00310                                     char *in_func, char *where);
00311 
00312 /* macros for constructing answer terms and setting and retrieving atomic
00313 values in them. To pass or retrieve complex arguments, you must use
00314 the lower-level ctop_* routines directly. */
00315 
00316 /* build an answer term of arity i in reg 2 */
00317 #define xsb_make_vars(i)   c2p_functor("ret",i,reg_term(2))
00318 
00319 /* set argument i of answer term to integer value v, for filtering */
00320 #define xsb_set_var_int(v,i) c2p_int(v,p2p_arg(reg_term(2),i))
00321 
00322 /* set argument i of answer term to atom value s, for filtering */
00323 #define xsb_set_var_string(s,i) c2p_string(s,p2p_arg(reg_term(2),i))
00324 
00325 /* set argument i of answer term to atom value f, for filtering */
00326 #define xsb_set_var_float(f,i) c2p_float(f,p2p_arg(reg_term(2),i))
00327 
00328 
00329 /* return integer argument i of answer term */
00330 #define xsb_var_int(i) (p2c_int(p2p_arg(reg_term(2),i)))
00331 
00332 /* return string (atom) argument i of answer term */
00333 #define xsb_var_string(i) (p2c_string(p2p_arg(reg_term(2),i)))
00334 
00335 /* return float argument i of answer term */
00336 #define xsb_var_float(i) (p2c_float(p2p_arg(reg_term(2),i)))
00337 
00338 #ifdef __cplusplus
00339 }
00340 #endif
00341 
00342 #endif /* __XSB_CINTERF_H__ */

Generated on Wed Jul 26 13:30:40 2006 for XSB by  doxygen 1.4.5