00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 #ifndef PLANG_TERM_PRIV_H
00021 #define PLANG_TERM_PRIV_H
00022 
00023 #include <plang/term.h>
00024 #include <limits.h>
00025 #include <config.h>
00026 #ifdef HAVE_GC_GC_H
00027 #include <gc/gc.h>
00028 #elif defined(HAVE_GC_H)
00029 #include <gc.h>
00030 #else
00031 #error "libgc is required to build plang"
00032 #endif
00033 
00034 #ifdef __cplusplus
00035 extern "C" {
00036 #endif
00037 
00038 #if defined(__cplusplus)
00039 #define P_INLINE inline
00040 #elif defined(__GNUC_GNU_INLINE__) && !defined(__NO_INLINE__)
00041 #define P_INLINE static __inline__
00042 #else
00043 #define P_INLINE static
00044 #endif
00045 
00046 #if defined(__WORDSIZE) && __WORDSIZE == 64
00047 #define P_TERM_64BIT    1
00048 #endif
00049 
00052 enum {
00053     P_TERM_RENAME       = P_TERM_INVALID,
00054 };
00055 
00056 
00057 typedef struct p_rbnode p_rbnode;
00058 typedef struct p_rbtree p_rbtree;
00059 struct p_rbtree
00060 {
00061     p_rbnode *root;
00062 };
00063 
00064 struct p_term_header {
00065 #if defined(P_TERM_64BIT)
00066     unsigned int type;
00067     unsigned int size;
00068 #else
00069     unsigned int type : 8;
00070     unsigned int size : 24;
00071 #endif
00072 };
00073 
00074 struct p_term_functor {
00075     struct p_term_header header;
00076     p_term *functor_name;               
00077     p_term *arg[1];
00078 };
00079 
00080 struct p_term_list {
00081     struct p_term_header header;
00082     p_term *head;
00083     p_term *tail;
00084 };
00085 
00086 typedef struct p_database_info p_database_info;
00087 
00088 struct p_term_atom {
00089     struct p_term_header header;
00090     p_term *next;
00091     p_database_info *db_info;
00092     char name[1];
00093 };
00094 
00095 struct p_term_string {
00096     struct p_term_header header;
00097     char name[1];
00098 };
00099 
00100 struct p_term_var {
00101     struct p_term_header header;
00102     p_term *value;
00103 };
00104 
00105 struct p_term_member_var {
00106     struct p_term_header header;
00107     p_term *value;
00108     p_term *object;
00109     p_term *name;                       
00110 };
00111 
00112 struct p_term_integer {
00113     struct p_term_header header;
00114 #if !defined(P_TERM_64BIT)
00115     int value;
00116 #endif
00117 };
00118 
00119 struct p_term_real {
00120     struct p_term_header header;
00121     double value;
00122 };
00123 
00124 struct p_term_property {
00125     p_term *name;
00126     p_term *value;
00127 };
00128 
00129 #define P_TERM_MAX_PROPS    8
00130 
00131 struct p_term_object {
00132     struct p_term_header header;
00133     p_term *next;
00134     struct p_term_property properties[P_TERM_MAX_PROPS];
00135 };
00136 
00137 #define P_TERM_INDEX_TRIGGER    4
00138 
00139 struct p_term_clause_list
00140 {
00141     struct p_term_clause *head;
00142     struct p_term_clause *tail;
00143 };
00144 
00145 struct p_term_predicate {
00146     struct p_term_header header;
00147     p_term *name;                       
00148     struct p_term_clause_list clauses;
00149     struct p_term_clause_list var_clauses;
00150     unsigned int clause_count;
00151     unsigned int index_arg : 30;
00152     unsigned int is_indexed : 1;
00153     unsigned int dont_index : 1;
00154     p_rbtree index;
00155 };
00156 
00157 #if defined(P_TERM_64BIT)
00158 #define P_TERM_DEFAULT_CLAUSE_NUM   (((unsigned int)1) << 31)
00159 #else
00160 #define P_TERM_DEFAULT_CLAUSE_NUM   (((unsigned int)1) << 23)
00161 #endif
00162 
00163 typedef union p_inst p_inst;
00164 typedef struct p_code_clause p_code_clause;
00165 struct p_code_clause
00166 {
00167     int num_xregs;
00168     int num_yregs;
00169     struct p_code_block *code;
00170 };
00171 
00172 
00173 struct p_term_clause {
00174     struct p_term_header header;
00175     struct p_term_clause *next_clause;
00176     struct p_term_clause *next_index;
00177     p_code_clause clause_code;
00178 };
00179 
00180 struct p_term_database {
00181     struct p_term_header header;
00182     p_rbtree predicates;
00183 };
00184 
00185 struct p_term_rename {
00186     struct p_term_header header;
00187     p_term *var;
00188 };
00189 
00190 struct p_term_register {
00191     struct p_term_header header;
00192     unsigned int usage_count;
00193     unsigned int goal_number : 31;
00194     unsigned int allocated : 1;
00195 };
00196 
00197 union p_term {
00198     struct p_term_header        header;
00199     struct p_term_functor       functor;
00200     struct p_term_list          list;
00201     struct p_term_atom          atom;
00202     struct p_term_string        string;
00203     struct p_term_var           var;
00204     struct p_term_member_var    member_var;
00205     struct p_term_integer       integer;
00206     struct p_term_real          real;
00207     struct p_term_object        object;
00208     struct p_term_predicate     predicate;
00209     struct p_term_clause        clause;
00210     struct p_term_database      database;
00211     struct p_term_rename        rename;
00212     struct p_term_register      reg;
00213 };
00214 
00215 #define p_term_malloc(context, type, size)  ((type *)GC_MALLOC((size)))
00216 #define p_term_new(context, type)           (GC_NEW(type))
00217 
00218 int _p_term_next_utf8(const char *str, size_t len, size_t *size);
00219 
00220 int _p_term_retract_clause
00221     (p_context *context, p_term *predicate,
00222      struct p_term_clause *clause, p_term *clause2);
00223 
00226 #ifdef __cplusplus
00227 };
00228 #endif
00229 
00230 #endif