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