1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121
|
/*
* $Id: $
* $Version: $
*
* Copyright (c) Tanel Tammet 2004,2005,2006,2007,2008,2009,2010
*
* Contact: tanel.tammet@gmail.com
*
* This file is part of WhiteDB
*
* WhiteDB is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* WhiteDB 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with WhiteDB. If not, see <http://www.gnu.org/licenses/>.
*
*/
/** @file clterm.h
* Procedures for building clauses/terms and fetching parts.
*/
#ifndef DEFINED_CLTERM_H
#define DEFINED_CLTERM_H
#ifdef _WIN32
#include "../config-w32.h"
#else
#include "../config.h"
#endif
#include "../Db/dballoc.h"
#include "types.h"
#include "glb.h"
/* ============= term and record header structure =============== */
/*
// Record header structure. Position 0 is always reserved
// for size.
#define RECORD_HEADER_GINTS 3
#define RECORD_META_POS 1 // metainfo, reserved for future use /
#define RECORD_BACKLINKS_POS 2 // backlinks structure offset /
#define LITTLEENDIAN 1 ///< (intel is little-endian) difference in encoding tinystr
//#define USETINYSTR 1 ///< undef to prohibit usage of tinystr
// Record meta bits.
#define RECORD_META_NOTDATA 0x1 // Record is a "special" record (not data)
#define RECORD_META_MATCH 0x2 // "match" record (needs NOTDATA as well)
#define is_special_record(r) (*((gint *) r + RECORD_META_POS) &\
RECORD_META_NOTDATA)
*/
#define CLAUSE_EXTRAHEADERLEN 1
//#define TERM_EXTRAHEADERLEN 1 // nr of gints in datarec before terms start
// we use (g->unify_firstuseterm) instead with the same meaning
//#define RECORD_META_NOTDATA 0x1 // Record is a "special" record (not data)
//#define RECORD_META_MATCH 0x2
#define RECORD_META_RULE_CLAUSE (1<<3) // should be notdata as well
#define RECORD_META_FACT_CLAUSE (1<<4) // should be notdata as well
#define RECORD_META_ATOM (1<<5) // should be notdata as well
#define RECORD_META_TERM (1<<6) // should be notdata as well
#define ATOM_META_NEG encode_smallint(1)
/* ============= external funs defs ============ */
/* ==== macros ===== */
#define LIT_WIDTH 2 //meta gint plus atom gint is width 2
#define LIT_META_POS 0
#define LIT_ATOM_POS 1
#define get_field(r,n) (*(((gint*)(r))+RECORD_HEADER_GINTS+(n)))
#define set_field(r,n,d) (*(((gint*)record)+RECORD_HEADER_GINTS+fieldnr)=(d))
#define get_record_len(r) (((gint)(getusedobjectwantedgintsnr(*((gint*)(r)))))-RECORD_HEADER_GINTS)
#define decode_record(db,d) ((void*)(offsettoptr(db,decode_datarec_offset((d)))))
#define encode_record(db,d) ((gint)(encode_datarec_offset(ptrtooffset((db),(d)))))
#define wg_rec_is_rule_clause(db,rec) (*((gint*)(rec)+RECORD_META_POS) & RECORD_META_RULE_CLAUSE)
#define wg_rec_is_fact_clause(db,rec) (*((gint*)(rec)+RECORD_META_POS) & RECORD_META_FACT_CLAUSE)
#define wg_rec_is_atom_rec(db,rec) (*((gint*)(rec)+RECORD_META_POS) & RECORD_META_ATOM)
#define wg_rec_is_term_rec(db,rec) (*((gint*)(rec)+RECORD_META_POS) & RECORD_META_TERM)
#define wg_get_rule_clause_atom_meta(db,rec,litnr) get_field((rec), (CLAUSE_EXTRAHEADERLEN+((litnr)*LIT_WIDTH)))
#define wg_get_rule_clause_atom(db,rec,litnr) get_field((rec), (CLAUSE_EXTRAHEADERLEN+((litnr)*LIT_WIDTH)+1))
#define wg_atom_meta_is_neg(db,meta) ((meta) & ATOM_META_NEG)
#define litmeta_negpolarities(meta1,meta2) (((meta1) & ATOM_META_NEG)!=((meta2) & ATOM_META_NEG))
#define wg_count_clause_atoms(db,clause) ((get_record_len((clause))-CLAUSE_EXTRAHEADERLEN)/LIT_WIDTH)
/* ==== Protos ==== */
gptr wr_create_raw_record(glb* g, gint length, gint meta, gptr buffer);
void* wr_create_rule_clause(glb* g, int litnr);
void* wr_create_fact_clause(glb* g, int litnr);
void* wr_create_atom(glb* g, int termnr);
void* wr_create_term(glb* g, int termnr);
void* wr_convert_atom_fact_clause(glb* g, void* atom, int isneg);
int wr_set_rule_clause_atom(glb* g, void* clause, int litnr, gint atom);
int wr_set_rule_clause_atom_meta(glb* g, void* clause, int litnr, gint meta);
int wr_set_atom_subterm(glb* g, void* atom, int termnr, gint subterm);
int wr_set_term_subterm(glb* g, void* term, int termnr, gint subterm);
#endif
|