652 lines
22 KiB
C
652 lines
22 KiB
C
/*
|
|
* Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/**
|
|
* @file picokpr.c
|
|
*
|
|
* knowledge handling for text preprocessing
|
|
*
|
|
* Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
|
|
* All rights reserved.
|
|
*
|
|
* History:
|
|
* - 2009-04-20 -- initial version
|
|
*
|
|
*/
|
|
#include "picoos.h"
|
|
#include "picodbg.h"
|
|
#include "picodata.h"
|
|
#include "picoknow.h"
|
|
#include "picokpr.h"
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif
|
|
#if 0
|
|
}
|
|
#endif
|
|
|
|
|
|
/* ************************************************************/
|
|
/* preproc */
|
|
/* ************************************************************/
|
|
|
|
/*
|
|
overview:
|
|
*/
|
|
|
|
|
|
/* ************************************************************/
|
|
/* preproc data defines */
|
|
/* ************************************************************/
|
|
|
|
#define KPR_STR_SIZE 1
|
|
#define KPR_LEXCAT_SIZE 2
|
|
#define KPR_ATTRVAL_SIZE 4
|
|
#define KPR_OUTITEM_SIZE 7
|
|
#define KPR_TOK_SIZE 16
|
|
#define KPR_PROD_SIZE 12
|
|
#define KPR_CTX_SIZE 12
|
|
|
|
#define KPR_NETNAME_OFFSET 0
|
|
#define KPR_STRARRLEN_OFFSET 4
|
|
#define KPR_LEXCATARRLEN_OFFSET 8
|
|
#define KPR_ATTRVALARRLEN_OFFSET 12
|
|
#define KPR_OUTITEMARRLEN_OFFSET 16
|
|
#define KPR_TOKARRLEN_OFFSET 20
|
|
#define KPR_PRODARRLEN_OFFSET 24
|
|
#define KPR_CTXARRLEN_OFFSET 28
|
|
|
|
#define KPR_ARRAY_START 32
|
|
|
|
#define KPR_MAX_INT32 2147483647
|
|
|
|
#define KPR_STR_OFS 0
|
|
|
|
#define KPR_LEXCAT_OFS 0
|
|
|
|
#define KPR_ATTRVAL_INT_OFS 0
|
|
#define KPR_ATTRVAL_STROFS_OFS 0
|
|
#define KPR_ATTRVAL_PRODOFS_OFS 0
|
|
#define KPR_ATTRVAL_OUTITMOFS_OFS 0
|
|
#define KPR_ATTRVAL_LEXCATOFS_OFS 0
|
|
|
|
#define KPR_OUTITEM_NEXTOFS_OFS 0
|
|
#define KPR_OUTITEM_TYPE_OFS 2
|
|
#define KPR_OUTITEM_STROFS_OFS 3
|
|
#define KPR_OUTITEM_VAL_OFS 3
|
|
#define KPR_OUTITEM_ARGOFS_OFS 3
|
|
|
|
#define KPR_TOK_SETWP_OFS 0
|
|
#define KPR_TOK_SETNP_OFS 4
|
|
#define KPR_TOK_NEXTOFS_OFS 8
|
|
#define KPR_TOK_ALTLOFS_OFS 10
|
|
#define KPR_TOK_ALTROFS_OFS 12
|
|
#define KPR_TOK_ATTRIBOFS_OFS 14
|
|
|
|
#define KPR_PROD_PRODPREFCOST_OFS 0
|
|
#define KPR_PROD_PRODNAMEOFS_OFS 4
|
|
#define KPR_PROD_ATOKOFS_OFS 8
|
|
#define KPR_PROD_ETOKOFS_OFS 10
|
|
|
|
#define KPR_CTX_CTXNAMEOFS_OFS 0
|
|
#define KPR_CTX_NETNAMEOFS_OFS 4
|
|
#define KPR_CTX_PRODNAMEOFS_OFS 8
|
|
|
|
/* ************************************************************/
|
|
/* preproc type and loading */
|
|
/* ************************************************************/
|
|
|
|
/* variable array element types */
|
|
typedef picoos_uint8 picokpr_Str[KPR_STR_SIZE];
|
|
typedef picoos_uint16 picokpr_LexCat2;
|
|
typedef picoos_uint8 picokpr_AttrVal[KPR_ATTRVAL_SIZE];
|
|
typedef picoos_uint8 picokpr_OutItem[KPR_OUTITEM_SIZE];
|
|
typedef picoos_uint8 picokpr_Tok[KPR_TOK_SIZE];
|
|
typedef picoos_uint8 picokpr_Prod[KPR_PROD_SIZE];
|
|
typedef picoos_uint8 picokpr_Ctx[KPR_CTX_SIZE];
|
|
|
|
/* variable array types */
|
|
typedef picokpr_Str * picokpr_VarStrArr;
|
|
typedef picokpr_LexCat2 * picokpr_VarLexCatArr;
|
|
typedef picokpr_AttrVal * picokpr_VarAttrValArr;
|
|
typedef picokpr_OutItem * picokpr_VarOutItemArr;
|
|
typedef picokpr_Tok * picokpr_VarTokArr;
|
|
typedef picokpr_Prod * picokpr_VarProdArr;
|
|
typedef picokpr_Ctx * picokpr_VarCtxArr;
|
|
|
|
/* ************************************************************/
|
|
/* preproc type and loading */
|
|
/* ************************************************************/
|
|
|
|
/** object : PreprocKnowledgeBase
|
|
* shortcut : kpr
|
|
* derived from : picoknow_KnowledgeBase
|
|
*/
|
|
|
|
typedef struct kpr_subobj * kpr_SubObj;
|
|
|
|
typedef struct kpr_subobj
|
|
{
|
|
picoos_uchar * rNetName;
|
|
|
|
picoos_int32 rStrArrLen;
|
|
picoos_int32 rLexCatArrLen;
|
|
picoos_int32 rAttrValArrLen;
|
|
picoos_int32 rOutItemArrLen;
|
|
picoos_int32 rTokArrLen;
|
|
picoos_int32 rProdArrLen;
|
|
picoos_int32 rCtxArrLen;
|
|
|
|
picoos_uint8 * rStrArr;
|
|
picokpr_LexCat2 * rLexCatArr;
|
|
picokpr_AttrVal * rAttrValArr;
|
|
picokpr_OutItem * rOutItemArr;
|
|
picokpr_Tok * rTokArr;
|
|
picokpr_Prod * rProdArr;
|
|
picokpr_Ctx * rCtxArr;
|
|
} kpr_subobj_t;
|
|
|
|
|
|
static picoos_uint32 kpr_getUInt32(picoos_uint8 * p)
|
|
{
|
|
return p[0] + 256*p[1] + 256*256*p[2] + 256*256*256*p[3];
|
|
}
|
|
|
|
|
|
static pico_status_t kprInitialize(register picoknow_KnowledgeBase this,
|
|
picoos_Common common)
|
|
{
|
|
picoos_uint32 offset = 0;
|
|
kpr_subobj_t * kpr;
|
|
|
|
PICODBG_DEBUG(("start"));
|
|
|
|
if (NULL == this || NULL == this->subObj) {
|
|
return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
|
|
NULL, NULL);
|
|
}
|
|
kpr = (kpr_subobj_t *) this->subObj;
|
|
|
|
kpr->rStrArrLen = kpr_getUInt32(&(this->base[KPR_STRARRLEN_OFFSET]));
|
|
kpr->rLexCatArrLen = kpr_getUInt32(&(this->base[KPR_LEXCATARRLEN_OFFSET]));
|
|
kpr->rAttrValArrLen = kpr_getUInt32(&(this->base[KPR_ATTRVALARRLEN_OFFSET]));
|
|
kpr->rOutItemArrLen = kpr_getUInt32(&(this->base[KPR_OUTITEMARRLEN_OFFSET]));
|
|
kpr->rTokArrLen = kpr_getUInt32(&(this->base[KPR_TOKARRLEN_OFFSET]));
|
|
kpr->rProdArrLen = kpr_getUInt32(&(this->base[KPR_PRODARRLEN_OFFSET]));
|
|
kpr->rCtxArrLen = kpr_getUInt32(&(this->base[KPR_CTXARRLEN_OFFSET]));
|
|
|
|
offset = KPR_ARRAY_START;
|
|
kpr->rStrArr = &(this->base[offset]);
|
|
PICODBG_DEBUG(("rStrArr : cs: %i, ss: %i, offset: %i", sizeof(picokpr_Str), KPR_STR_SIZE, offset));
|
|
offset = offset + kpr->rStrArrLen * 1;
|
|
|
|
kpr->rLexCatArr = (picokpr_LexCat2 *)&(this->base[offset]);
|
|
PICODBG_DEBUG(("rLexCatArr : cs: %i, ss: %i, offset: %i", KPR_LEXCAT_SIZE, sizeof(picokpr_LexCat2), offset));
|
|
offset = offset + kpr->rLexCatArrLen * KPR_LEXCAT_SIZE;
|
|
|
|
kpr->rAttrValArr = (picokpr_AttrVal *)&(this->base[offset]);
|
|
PICODBG_DEBUG(("rAttrValArr : cs: %i, ss: %i, offset: %i", KPR_ATTRVAL_SIZE, sizeof(picokpr_AttrVal), offset));
|
|
offset = offset + kpr->rAttrValArrLen * KPR_ATTRVAL_SIZE;
|
|
|
|
kpr->rOutItemArr = (picokpr_OutItem *)&(this->base[offset]);
|
|
PICODBG_DEBUG(("rOutItemArr : cs: %i, ss: %i, offset: %i", KPR_OUTITEM_SIZE, sizeof(picokpr_OutItem), offset));
|
|
offset = offset + kpr->rOutItemArrLen * KPR_OUTITEM_SIZE;
|
|
|
|
kpr->rTokArr = (picokpr_Tok *)&(this->base[offset]);
|
|
PICODBG_DEBUG(("rTokArr : cs: %i, ss: %i, offset: %i", KPR_TOK_SIZE, sizeof(picokpr_Tok), offset));
|
|
offset = offset + kpr->rTokArrLen * KPR_TOK_SIZE;
|
|
|
|
kpr->rProdArr = (picokpr_Prod *)&(this->base[offset]);
|
|
PICODBG_DEBUG(("rProdArr : cs: %i, ss: %i, offset: %i", KPR_PROD_SIZE, sizeof(picokpr_Prod), offset));
|
|
offset = offset + kpr->rProdArrLen * KPR_PROD_SIZE;
|
|
|
|
kpr->rCtxArr = (picokpr_Ctx *)&(this->base[offset]);
|
|
PICODBG_DEBUG(("rCtxArr : cs: %i, ss: %i, offset: %i", KPR_CTX_SIZE, sizeof(picokpr_Ctx), offset));
|
|
offset = offset + kpr->rCtxArrLen * KPR_CTX_SIZE;
|
|
|
|
kpr->rNetName = &(kpr->rStrArr[kpr_getUInt32(&(this->base[KPR_NETNAME_OFFSET]))]);
|
|
|
|
return PICO_OK;
|
|
}
|
|
|
|
|
|
static pico_status_t kprSubObjDeallocate(register picoknow_KnowledgeBase this,
|
|
picoos_MemoryManager mm)
|
|
{
|
|
if (NULL != this) {
|
|
picoos_deallocate(mm, (void *) &this->subObj);
|
|
}
|
|
return PICO_OK;
|
|
}
|
|
|
|
|
|
/* we don't offer a specialized constructor for a PreprocKnowledgeBase but
|
|
* instead a "specializer" of an allready existing generic
|
|
* picoknow_KnowledgeBase */
|
|
|
|
pico_status_t picokpr_specializePreprocKnowledgeBase(picoknow_KnowledgeBase this,
|
|
picoos_Common common)
|
|
{
|
|
if (NULL == this) {
|
|
return picoos_emRaiseException(common->em, PICO_EXC_KB_MISSING,
|
|
NULL, NULL);
|
|
}
|
|
this->subDeallocate = kprSubObjDeallocate;
|
|
this->subObj = picoos_allocate(common->mm, sizeof(kpr_subobj_t));
|
|
if (NULL == this->subObj) {
|
|
return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
|
|
NULL, NULL);
|
|
}
|
|
return kprInitialize(this, common);
|
|
}
|
|
|
|
/* ************************************************************/
|
|
/* preproc getPreproc */
|
|
/* ************************************************************/
|
|
|
|
picokpr_Preproc picokpr_getPreproc(picoknow_KnowledgeBase this)
|
|
{
|
|
if (NULL == this) {
|
|
return NULL;
|
|
} else {
|
|
return (picokpr_Preproc) this->subObj;
|
|
}
|
|
}
|
|
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for strings in StrArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picokpr_VarStrPtr picokpr_getVarStrPtr(picokpr_Preproc preproc, picokpr_StrArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rStrArr[ofs]);
|
|
|
|
return p;
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
|
|
extern picoos_bool picokpr_isEqual (picokpr_Preproc preproc, picoos_uchar str[], picoos_int32 len__9, picokpr_StrArrOffset str2)
|
|
{
|
|
picokpr_VarStrPtr lstrp;
|
|
len__9 = len__9; /*PP 13.10.08 : fix warning "var not used in this function"*/
|
|
lstrp = (picokpr_VarStrPtr)&((kpr_SubObj)preproc)->rStrArr[str2];
|
|
return picoos_strcmp((picoos_char*)lstrp,(picoos_char*)str) == 0;
|
|
}
|
|
|
|
|
|
|
|
extern picoos_bool picokpr_isEqualHead (picokpr_Preproc preproc, picoos_uchar str[], picoos_int32 len__10, picokpr_StrArrOffset head)
|
|
{
|
|
picokpr_VarStrPtr lstrp;
|
|
len__10 = len__10; /*PP 13.10.08 : fix warning "var not used in this function"*/
|
|
lstrp = (picokpr_VarStrPtr)&((kpr_SubObj)preproc)->rStrArr[head];
|
|
return (picoos_strstr((picoos_char*)str, (picoos_char*)lstrp) == (picoos_char*)str);
|
|
}
|
|
|
|
|
|
|
|
extern picoos_bool picokpr_isEqualMid (picokpr_Preproc preproc, picoos_uchar str[], picoos_int32 len__11, picokpr_StrArrOffset mid)
|
|
{
|
|
picokpr_VarStrPtr lstrp;
|
|
len__11 = len__11; /*PP 13.10.08 : fix warning "var not used in this function"*/
|
|
lstrp = (picokpr_VarStrPtr)(void *) &((kpr_SubObj)preproc)->rStrArr[mid];
|
|
return (picoos_strstr((picoos_char*)str, (picoos_char*)lstrp) != NULL);
|
|
}
|
|
|
|
|
|
|
|
extern picoos_bool picokpr_isEqualTail (picokpr_Preproc preproc, picoos_uchar str[], picoos_int32 len__12, picokpr_StrArrOffset tail)
|
|
{
|
|
picoos_int32 lstart;
|
|
picokpr_VarStrPtr lstrp;
|
|
len__12 = len__12; /* avoid warning "var not used in this function"*/
|
|
lstrp = (picokpr_VarStrPtr)&((kpr_SubObj)preproc)->rStrArr[tail];
|
|
lstart = picoos_strlen((picoos_char*)str) - picoos_strlen((picoos_char*)lstrp);
|
|
if (lstart >= 0) {
|
|
return (picoos_strstr((picoos_char*)&(str[lstart]), (picoos_char*)lstrp) != NULL);
|
|
} else {
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for lexical categories in LexCatArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picokpr_LexCat picokpr_getLexCat(picokpr_Preproc preproc, picokpr_LexCatArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rLexCatArr[ofs]);
|
|
|
|
return p[0] + 256*p[1];
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for AttrVal fields in AttrValArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picoos_int32 picokpr_getAttrValArrInt32(picokpr_Preproc preproc, picokpr_AttrValArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rAttrValArr[ofs]);
|
|
picoos_uint32 c = p[KPR_ATTRVAL_INT_OFS] +
|
|
256*p[KPR_ATTRVAL_INT_OFS+1] +
|
|
256*256*p[KPR_ATTRVAL_INT_OFS+2] +
|
|
256*256*256*p[KPR_ATTRVAL_INT_OFS+3];
|
|
|
|
if (c > KPR_MAX_INT32) {
|
|
return (c - KPR_MAX_INT32) - 1;
|
|
} else {
|
|
return (((int)c + (int) -(KPR_MAX_INT32)) - 1);
|
|
}
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for AttrVal fields in AttrValArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picokpr_OutItemArrOffset picokpr_getOutItemNextOfs(picokpr_Preproc preproc, picokpr_OutItemArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rOutItemArr[ofs]);
|
|
|
|
return p[KPR_OUTITEM_NEXTOFS_OFS+0] + 256*p[KPR_OUTITEM_NEXTOFS_OFS+1];
|
|
}
|
|
|
|
|
|
extern picoos_int32 picokpr_getOutItemType(picokpr_Preproc preproc, picokpr_OutItemArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rOutItemArr[ofs]);
|
|
|
|
return p[KPR_OUTITEM_TYPE_OFS+0];
|
|
}
|
|
|
|
|
|
extern picokpr_StrArrOffset picokpr_getOutItemStrOfs(picokpr_Preproc preproc, picokpr_OutItemArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rOutItemArr[ofs]);
|
|
|
|
return p[KPR_OUTITEM_STROFS_OFS+0] +
|
|
256*p[KPR_OUTITEM_STROFS_OFS+1] +
|
|
256*256*p[KPR_OUTITEM_STROFS_OFS+2] +
|
|
256*256*256*p[KPR_OUTITEM_STROFS_OFS+3];
|
|
}
|
|
|
|
|
|
extern picokpr_VarStrPtr picokpr_getOutItemStr(picokpr_Preproc preproc, picokpr_OutItemArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rOutItemArr[ofs]);
|
|
picoos_uint32 c = p[KPR_OUTITEM_STROFS_OFS+0] +
|
|
256*p[KPR_OUTITEM_STROFS_OFS+1] +
|
|
256*256*p[KPR_OUTITEM_STROFS_OFS+2] +
|
|
256*256*256*p[KPR_OUTITEM_STROFS_OFS+3];
|
|
|
|
return (picoos_uint8 *)&(((kpr_SubObj)preproc)->rStrArr[c]);
|
|
}
|
|
|
|
extern picoos_int32 picokpr_getOutItemVal(picokpr_Preproc preproc, picokpr_OutItemArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rOutItemArr[ofs]);
|
|
picoos_uint32 c = p[KPR_OUTITEM_VAL_OFS+0] +
|
|
256*p[KPR_OUTITEM_VAL_OFS+1] +
|
|
256*256*p[KPR_OUTITEM_VAL_OFS+2] +
|
|
256*256*256*p[KPR_OUTITEM_VAL_OFS+3];
|
|
|
|
if (c > KPR_MAX_INT32) {
|
|
return (c - KPR_MAX_INT32) - 1;
|
|
} else {
|
|
return (((int)c + (int) -(KPR_MAX_INT32)) - 1);
|
|
}
|
|
}
|
|
|
|
|
|
extern picokpr_OutItemArrOffset picokpr_getOutItemArgOfs(picokpr_Preproc preproc, picokpr_OutItemArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rOutItemArr[ofs]);
|
|
|
|
return p[KPR_OUTITEM_ARGOFS_OFS+0] +
|
|
256*p[KPR_OUTITEM_ARGOFS_OFS+1] +
|
|
256*256*p[KPR_OUTITEM_ARGOFS_OFS+2] +
|
|
256*256*256*p[KPR_OUTITEM_ARGOFS_OFS+3];
|
|
}
|
|
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for tokens in TokArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picokpr_TokSetNP picokpr_getTokSetNP(picokpr_Preproc preproc, picokpr_TokArrOffset ofs)
|
|
{
|
|
picoos_uint32 c/*, b*/;
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]) + KPR_TOK_SETNP_OFS;
|
|
/*picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]);*/
|
|
picoos_uint32 p0, p1, p2, p3;
|
|
|
|
p0 = *(p++);
|
|
p1 = *(p++);
|
|
p2 = *(p++);
|
|
p3 = *p;
|
|
|
|
c = p0 + (p1<<8) + (p2<<16) + (p3<<24);
|
|
|
|
return c;
|
|
|
|
/*
|
|
c = p[KPR_TOK_SETNP_OFS+0] +
|
|
256*p[KPR_TOK_SETNP_OFS+1] +
|
|
256*256*p[KPR_TOK_SETNP_OFS+2] +
|
|
256*256*256*p[KPR_TOK_SETNP_OFS+3];
|
|
|
|
b = 0;
|
|
i = 0;
|
|
while ((i <= 31) && (c > 0)) {
|
|
if (c % 2 == 1) {
|
|
b |= (1<<i);
|
|
}
|
|
c = c / 2;
|
|
i++;
|
|
}
|
|
|
|
return b;
|
|
*/
|
|
}
|
|
|
|
|
|
extern picokpr_TokSetWP picokpr_getTokSetWP(picokpr_Preproc preproc, picokpr_TokArrOffset ofs)
|
|
{
|
|
picoos_uint32 c/*, b*/;
|
|
/* picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]);*/
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]) + KPR_TOK_SETWP_OFS;
|
|
picoos_uint32 p0, p1, p2, p3;
|
|
|
|
p0 = *(p++);
|
|
p1 = *(p++);
|
|
p2 = *(p++);
|
|
p3 = *p;
|
|
|
|
c = p0 + (p1<<8) + (p2<<16) + (p3<<24);
|
|
return c;
|
|
|
|
/*
|
|
c = p[KPR_TOK_SETWP_OFS+0] +
|
|
256*p[KPR_TOK_SETWP_OFS+1] +
|
|
256*256*p[KPR_TOK_SETWP_OFS+2] +
|
|
256*256*256*p[KPR_TOK_SETWP_OFS+3];
|
|
|
|
b = 0;
|
|
i = 0;
|
|
while ((i <= 31) && (c > 0)) {
|
|
if (c % 2 == 1) {
|
|
b |= (1<<i);
|
|
}
|
|
c = c / 2;
|
|
i++;
|
|
}
|
|
|
|
return b;
|
|
*/
|
|
}
|
|
|
|
|
|
extern picokpr_TokArrOffset picokpr_getTokNextOfs(picokpr_Preproc preproc, picokpr_TokArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]);
|
|
|
|
return p[KPR_TOK_NEXTOFS_OFS+0] + 256*p[KPR_TOK_NEXTOFS_OFS+1];
|
|
}
|
|
|
|
|
|
extern picokpr_TokArrOffset picokpr_getTokAltLOfs(picokpr_Preproc preproc, picokpr_TokArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]) + KPR_TOK_ALTLOFS_OFS;
|
|
picokpr_TokArrOffset c = *p++;
|
|
return c + 256**p;
|
|
|
|
/*picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]);
|
|
|
|
return p[KPR_TOK_ALTLOFS_OFS+0] + 256*p[KPR_TOK_ALTLOFS_OFS+1];
|
|
*/
|
|
}
|
|
|
|
|
|
extern picokpr_TokArrOffset picokpr_getTokAltROfs(picokpr_Preproc preproc, picokpr_TokArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]) + KPR_TOK_ALTROFS_OFS;
|
|
picokpr_TokArrOffset c = *p++;
|
|
return c + 256**p;
|
|
|
|
/*picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]);
|
|
|
|
return p[KPR_TOK_ALTROFS_OFS+0] + 256*p[KPR_TOK_ALTROFS_OFS+1];*/
|
|
}
|
|
|
|
|
|
extern picokpr_AttrValArrOffset picokpr_getTokAttribOfs(picokpr_Preproc preproc, picokpr_TokArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rTokArr[ofs]);
|
|
|
|
return p[KPR_TOK_ATTRIBOFS_OFS+0] + 256*p[KPR_TOK_ATTRIBOFS_OFS+1];
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for productions in ProdArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picoos_int32 picokpr_getProdArrLen(picokpr_Preproc preproc)
|
|
{
|
|
return ((kpr_SubObj)preproc)->rProdArrLen;
|
|
}
|
|
|
|
extern picoos_int32 picokpr_getProdPrefCost(picokpr_Preproc preproc, picokpr_ProdArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rProdArr[ofs]);
|
|
picoos_uint32 c = p[KPR_PROD_PRODPREFCOST_OFS+0] +
|
|
256*p[KPR_PROD_PRODPREFCOST_OFS+1] +
|
|
256*256*p[KPR_PROD_PRODPREFCOST_OFS+2] +
|
|
256*256*256*p[KPR_PROD_PRODPREFCOST_OFS+3];
|
|
|
|
|
|
if (c > KPR_MAX_INT32) {
|
|
return (c - KPR_MAX_INT32) - 1;
|
|
} else {
|
|
return (((int)c + (int) -(KPR_MAX_INT32)) - 1);
|
|
}
|
|
}
|
|
|
|
|
|
extern picokpr_StrArrOffset picokpr_getProdNameOfs(picokpr_Preproc preproc, picokpr_ProdArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rProdArr[ofs]);
|
|
|
|
return p[KPR_PROD_PRODNAMEOFS_OFS+0] +
|
|
256*p[KPR_PROD_PRODNAMEOFS_OFS+1] +
|
|
256*256*p[KPR_PROD_PRODNAMEOFS_OFS+2] +
|
|
256*256*256*p[KPR_PROD_PRODNAMEOFS_OFS+3];
|
|
|
|
}
|
|
|
|
|
|
extern picokpr_TokArrOffset picokpr_getProdATokOfs(picokpr_Preproc preproc, picokpr_ProdArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rProdArr[ofs]);
|
|
|
|
return p[KPR_PROD_ATOKOFS_OFS+0] + 256*p[KPR_PROD_ATOKOFS_OFS+1];
|
|
}
|
|
|
|
|
|
extern picokpr_TokArrOffset picokpr_getProdETokOfs(picokpr_Preproc preproc, picokpr_ProdArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rProdArr[ofs]);
|
|
|
|
return p[KPR_PROD_ETOKOFS_OFS+0] + 256*p[KPR_PROD_ETOKOFS_OFS+1];
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for contexts in CtxArr */
|
|
/* *****************************************************************************/
|
|
|
|
extern picoos_int32 picokpr_getCtxArrLen(picokpr_Preproc preproc)
|
|
{
|
|
return ((kpr_SubObj)preproc)->rCtxArrLen;
|
|
}
|
|
|
|
extern picokpr_StrArrOffset picokpr_getCtxCtxNameOfs(picokpr_Preproc preproc, picokpr_CtxArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rCtxArr[ofs]);
|
|
|
|
return p[KPR_CTX_CTXNAMEOFS_OFS+0] +
|
|
256*p[KPR_CTX_CTXNAMEOFS_OFS+1] +
|
|
256*256*p[KPR_CTX_CTXNAMEOFS_OFS+2] +
|
|
256*256*256*p[KPR_CTX_CTXNAMEOFS_OFS+3];
|
|
}
|
|
|
|
|
|
extern picokpr_StrArrOffset picokpr_getCtxNetNameOfs(picokpr_Preproc preproc, picokpr_CtxArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rCtxArr[ofs]);
|
|
|
|
return p[KPR_CTX_NETNAMEOFS_OFS+0] +
|
|
256*p[KPR_CTX_NETNAMEOFS_OFS+1] +
|
|
256*256*p[KPR_CTX_NETNAMEOFS_OFS+2] +
|
|
256*256*256*p[KPR_CTX_NETNAMEOFS_OFS+3];
|
|
}
|
|
|
|
|
|
extern picokpr_StrArrOffset picokpr_getCtxProdNameOfs(picokpr_Preproc preproc, picokpr_CtxArrOffset ofs)
|
|
{
|
|
picoos_uint8 * p = (picoos_uint8 *)&(((kpr_SubObj)preproc)->rCtxArr[ofs]);
|
|
|
|
return p[KPR_CTX_PRODNAMEOFS_OFS+0] +
|
|
256*p[KPR_CTX_PRODNAMEOFS_OFS+1] +
|
|
256*256*p[KPR_CTX_PRODNAMEOFS_OFS+2] +
|
|
256*256*256*p[KPR_CTX_PRODNAMEOFS_OFS+3];
|
|
}
|
|
|
|
/* *****************************************************************************/
|
|
/* knowledge base access routines for networks */
|
|
/* *****************************************************************************/
|
|
|
|
extern picokpr_VarStrPtr picokpr_getPreprocNetName(picokpr_Preproc preproc)
|
|
{
|
|
return ((kpr_SubObj)preproc)->rNetName;
|
|
}
|
|
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|
|
/* end */
|