1b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 2b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 3b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 4b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Licensed under the Apache License, Version 2.0 (the "License"); 5b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * you may not use this file except in compliance with the License. 6b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * You may obtain a copy of the License at 7b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 8b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * http://www.apache.org/licenses/LICENSE-2.0 9b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 10b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Unless required by applicable law or agreed to in writing, software 11b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * distributed under the License is distributed on an "AS IS" BASIS, 12b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * See the License for the specific language governing permissions and 14b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * limitations under the License. 15b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 16b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 17b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @file picopr.c 18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * text preprocessor 20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved. 23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History: 25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version 26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodefs.h" 30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h" 31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picobase.h" 32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h" 33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodata.h" 34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpr.h" 35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picopr.h" 36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoktab.h" 37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" { 40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* constants */ 48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TRACE_MEM FALSE 51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TRACE_MAX_MEM FALSE 52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TRACE_PATHCOST TRUE 53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_WORK_MEM_SIZE 10000 55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_DYN_MEM_SIZE 7000 56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_ENABLED TRUE 58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_MAX_NR_ITERATIONS 1000; 60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SPEC_CHAR "\\/" 62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_ERR_CONTEXT_NOT_FOUND PICO_ERR_OTHER 64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_ERR_MAX_PREPROC_PATH_LEN_REACHED PICO_ERR_OTHER 65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define IN_BUF_SIZE 255 67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define OUT_BUF_SIZE IN_BUF_SIZE + 3 * PICODATA_ITEM_HEADSIZE + 3 68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_MAX_NR_PREPROC (1 + PICOKNOW_MAX_NUM_UTPP) 70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_MAX_PATH_LEN 130 72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_MAX_DATA_LEN IN_BUF_SIZE 73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_MAX_DATA_LEN_Z PR_MAX_DATA_LEN + 1 /* all strings in picopr should use this constant 74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen to ensure zero termination */ 75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_COST_INIT 100000 76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_COST 10 77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_EOL '\n' 78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Bit mask constants for token sets with parameters */ 80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_OUT (1<<PR_TSEOut) 81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_MIN (1<<PR_TSEMin) 82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_MAX (1<<PR_TSEMax) 83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_LEN (1<<PR_TSELen) 84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_VAL (1<<PR_TSEVal) 85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_STR (1<<PR_TSEStr) 86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_HEAD (1<<PR_TSEHead) 87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_MID (1<<PR_TSEMid) 88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_TAIL (1<<PR_TSETail) 89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_PROD (1<<PR_TSEProd) 90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_PRODEXT (1<<PR_TSEProdExt) 91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_VAR (1<<PR_TSEVar) 92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_LEX (1<<PR_TSELex) 93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_COST (1<<PR_TSECost) 94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_ID (1<<PR_TSEID) 95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_DUMMY1 (1<<PR_TSEDummy1) 96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_DUMMY2 (1<<PR_TSEDummy2) 97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_DUMMY3 (1<<PR_TSEDummy3) 98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Bit mask constants for token sets without parameters */ 100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_BEGIN (1<<PR_TSEBegin) 101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_END (1<<PR_TSEEnd) 102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_SPACE (1<<PR_TSESpace) 103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_DIGIT (1<<PR_TSEDigit) 104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_LETTER (1<<PR_TSELetter) 105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_CHAR (1<<PR_TSEChar) 106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_SEQ (1<<PR_TSESeq) 107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_CMPR (1<<PR_TSECmpr) 108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_NLZ (1<<PR_TSENLZ) 109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_ROMAN (1<<PR_TSERoman) 110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_CI (1<<PR_TSECI) 111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_CIS (1<<PR_TSECIS) 112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_AUC (1<<PR_TSEAUC) 113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_ALC (1<<PR_TSEALC) 114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_SUC (1<<PR_TSESUC) 115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_ACCEPT (1<<PR_TSEAccept) 116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_NEXT (1<<PR_TSENext) 117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_ALTL (1<<PR_TSEAltL) 118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_TSE_MASK_ALTR (1<<PR_TSEAltR) 119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_FIRST_TSE_WP PR_TSEOut 121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_SMALLER 1 123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_EQUAL 0 124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_LARGER 2 125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_SPELL_WITH_SENTENCE_BREAK -2 127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_SPELL_WITH_PHRASE_BREAK -1 128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_SPELL 0 129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_SPEED_MIN 20 131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_SPEED_MAX 500 132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_SPEED_DEFAULT 100 133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_SPEED_FACTOR_MIN 500 134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_SPEED_FACTOR_MAX 2000 135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_MIN 50 137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_MAX 200 138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_DEFAULT 100 139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_FACTOR_MIN 500 140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_FACTOR_MAX 2000 141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_ADD_MIN -100 142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_ADD_MAX 100 143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PITCH_ADD_DEFAULT 0 144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_VOLUME_MIN 0 146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_VOLUME_MAX 500 147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_VOLUME_DEFAULT 100 148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_VOLUME_FACTOR_MIN 500 149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_VOLUME_FACTOR_MAX 2000 150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_CONTEXT_DEFAULT "DEFAULT" 152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PICO_PARAGRAPH_PAUSE_DUR 500 154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* types */ 158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {PR_OStr, PR_OVar, PR_OItem, PR_OSpell, PR_ORomanToCard, PR_OVal, 161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_OLeft, PR_ORight, PR_ORLZ, PR_OIgnore, PR_OPitch, PR_OSpeed, 162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_OVolume, PR_OVoice, PR_OContext, PR_OPhonSVOXPA, PR_OPhonSAMPA, 163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_OPlay, PR_OUseSig, PR_OGenFile, PR_OAudioEdit, PR_OPara, 164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_OSent, PR_OBreak, PR_OMark, PR_OConcat, PR_OLast} pr_OutType; 165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {PR_TSEBegin, PR_TSEEnd, PR_TSESpace, PR_TSEDigit, PR_TSELetter, PR_TSEChar, PR_TSESeq, 167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_TSECmpr, PR_TSENLZ, PR_TSERoman, PR_TSECI, PR_TSECIS, PR_TSEAUC, PR_TSEALC, PR_TSESUC, 168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_TSEAccept, PR_TSENext, PR_TSEAltL, PR_TSEAltR} pr_TokSetEleNP; 169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {PR_TSEOut, PR_TSEMin, PR_TSEMax, PR_TSELen, PR_TSEVal, PR_TSEStr, PR_TSEHead, PR_TSEMid, 171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_TSETail, PR_TSEProd, PR_TSEProdExt, PR_TSEVar, PR_TSELex, PR_TSECost, PR_TSEID, 172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_TSEDummy1, PR_TSEDummy2, PR_TSEDummy3} pr_TokSetEleWP; 173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {PR_GSNoPreproc, PR_GS_START, PR_GSContinue, PR_GSNeedToken, PR_GSNotFound, PR_GSFound} pr_GlobalState; 175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {PR_LSError, PR_LSInit, PR_LSGetToken, PR_LSGetToken2, PR_LSMatch, PR_LSGoBack, 177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_LSGetProdToken, PR_LSInProd, PR_LSGetProdContToken, PR_LSInProdCont, PR_LSGetNextToken, 178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PR_LSGetAltToken} pr_LocalState; 179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {PR_MSNotMatched, PR_MSMatched, PR_MSMatchedContinue, PR_MSMatchedMulti} pr_MatchState; 181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_Prod * pr_ProdList; 183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_Prod { 184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc rNetwork; 185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_ProdArrOffset rProdOfs; 186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ProdList rNext; 187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pr_Prod; 188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_Context * pr_ContextList; 190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_Context { 191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar * rContextName; 192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ProdList rProdList; 193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList rNext; 194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pr_Context; 195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* used, but to be checked */ 198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define MaxNrShortStrParams 2 200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define MaxPhoneLen 14 201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define ShortStrParamLen (2 * MaxPhoneLen) 202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef picoos_uchar ShortStrParam[ShortStrParamLen]; 203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_ioItem * pr_ioItemPtr; 206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_ioItem { 207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr next; 208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 val; 209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen struct picodata_itemhead head; 210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar * strci; 211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar * strcis; 212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool alc; 213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool auc; 214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool suc; 215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar data[PR_MAX_DATA_LEN_Z]; 216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pr_ioItem; 217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_ioItem2 { 219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr next; 220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 val; 221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen struct picodata_itemhead head; 222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar * strci; 223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar * strcis; 224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool alc; 225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool auc; 226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool suc; 227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pr_ioItem2; 228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define PR_IOITEM_MIN_SIZE sizeof(pr_ioItem2) 230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef picoos_uint32 pr_MemState; 232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef enum {pr_DynMem, pr_WorkMem} pr_MemTypes; 233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_OutItemVar * pr_OutItemVarPtr; 237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstruct pr_OutItemVar { 238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr first; 239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr last; 240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 id; 241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr next; 242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}; 243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstruct pr_WorkItem { 246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr rit; 247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}; 248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef pr_ioItemPtr pr_WorkItems[PR_MAX_PATH_LEN+1]; 249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstruct pr_PathEle { 251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc rnetwork; 252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 ritemid; 253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 rcompare; 254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 rdepth; 255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokArrOffset rtok; 256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_StrArrOffset rprodname; 257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 rprodprefcost; 258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_LocalState rlState; 259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}; 260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_Path { 262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 rcost; 263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 rlen; 264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen struct pr_PathEle rele[PR_MAX_PATH_LEN]; 265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pr_Path; 266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** subobject : PreprocUnit 270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * shortcut : pr 271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct pr_subobj 273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr rinItemList; 275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr rlastInItem; 276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr routItemList; 277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr rlastOutItem; 278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_GlobalState rgState; 279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_Path ractpath; 280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_Path rbestpath; 281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 rnritems; 282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_WorkItems ritems; 283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 rignore; 284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 spellMode; 285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 maxPathLen; 286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool insidePhoneme; 287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 inBuf[IN_BUF_SIZE+PICODATA_ITEM_HEADSIZE]; /* internal input buffer */ 289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 inBufLen; 290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 outBuf[OUT_BUF_SIZE]; /* internal output buffer */ 292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outReadPos; /* next pos to read from outBuf */ 293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 outWritePos; /* next pos to write to outBuf */ 294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc preproc[PR_MAX_NR_PREPROC]; 296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList ctxList; 297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ProdList prodList; 298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList actCtx; 300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool actCtxChanged; 301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar tmpStr1[PR_MAX_DATA_LEN_Z]; 303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar tmpStr2[PR_MAX_DATA_LEN_Z]; 304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 pr_WorkMem[PR_WORK_MEM_SIZE]; 306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 workMemTop; 307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 maxWorkMemTop; 308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 pr_DynMem[PR_DYN_MEM_SIZE]; 309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager dynMemMM; 310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 dynMemSize; 311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 maxDynMemSize; 312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool outOfMemory; 314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool forceOutput; 316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 nrIterations; 317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar lspaces[128]; 319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar saveFile[IN_BUF_SIZE]; 320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItem tmpItem; 322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picotrns_SimpleTransducer transducer; 324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* kbs */ 326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoktab_Graphs graphs; 328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokfst_FST xsampa_parser; 329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokfst_FST svoxpa_parser; 330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokfst_FST xsampa2svoxpa_mapper; 331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} pr_subobj_t; 333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* prototypes */ 336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_getOutputItemList (picodata_ProcessingUnit this, pr_subobj_t * pr, 338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc network, 339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_OutItemArrOffset outitem, 340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr vars, 341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr * first, pr_ioItemPtr * last); 342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define pr_iABS(X) (((X) < 0) ? (-(X)) : (X)) 346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* module internal memory managment for dynamic and working memory using memory 349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen partitions allocated with pr_subobj_t. 350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Dynamic memory is allocated in pr_subobj_t->pr_DynMem. Dynamic memory has 351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen to be deallocated again with pr_DEALLOCATE. 352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen Working memory is allocated in pr_subobj_t->pr_WorkMem. Working memory is stack 353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen based and may not to be deallocated with pr_DEALLOCATE, but with pr_resetMemState 354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen to a state previously saved with pr_getMemState. 355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_ALLOCATE (picodata_ProcessingUnit this, pr_MemTypes mType, void * * adr, unsigned int byteSize) 358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* allocates 'byteSize' bytes in the memery partition given by 'mType' */ 359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 incrUsedBytes, prevmaxDynMemSize; 362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (mType == pr_WorkMem) { 364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->workMemTop + byteSize) < PR_WORK_MEM_SIZE) { 365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*adr) = (void *)(&(pr->pr_WorkMem[pr->workMemTop])); 366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen byteSize = ((byteSize + PICOOS_ALIGN_SIZE - 1) / PICOOS_ALIGN_SIZE) * PICOOS_ALIGN_SIZE; 367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->workMemTop += byteSize; 368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MEM 369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pr_WorkMem: +%u, tot:%i of %i", byteSize, pr->workMemTop, PR_WORK_MEM_SIZE)); 370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->workMemTop > pr->maxWorkMemTop) { 373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->maxWorkMemTop = pr->workMemTop; 374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MAX_MEM 375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("new max pr_WorkMem: %i of %i", pr->workMemTop, PR_WORK_MEM_SIZE)); 376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*adr) = NULL; 381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("pr out of working memory")); 382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_OUT_OF_MEM, (picoos_char *)"pr out of dynamic memory", (picoos_char *)""); 383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outOfMemory = TRUE; 384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if (mType == pr_DynMem) { 387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*adr) = picoos_allocate(pr->dynMemMM, byteSize); 388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((*adr) != NULL) { 389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen prevmaxDynMemSize = pr->maxDynMemSize; 390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_getMemUsage(pr->dynMemMM, 1, &pr->dynMemSize, &incrUsedBytes, &pr->maxDynMemSize); 391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MEM 392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pr_DynMem : +%i, tot:%i of %i", incrUsedBytes, pr->dynMemSize, PR_DYN_MEM_SIZE)); 393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MAX_MEM 396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->maxDynMemSize > prevmaxDynMemSize) { 397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("new max pr_DynMem : %i of %i", pr->maxDynMemSize, PR_DYN_MEM_SIZE)); 398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("pr out of dynamic memory")); 403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_OUT_OF_MEM, (picoos_char *)"pr out of dynamic memory", (picoos_char *)""); 404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outOfMemory = TRUE; 405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*adr) = NULL; 409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_DEALLOCATE (picodata_ProcessingUnit this, pr_MemTypes mType, void * * adr) 414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 incrUsedBytes; 417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (mType == pr_WorkMem) { 418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("not possible; use pr_resetMemState instead")); 419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if (mType == pr_DynMem) { 421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(pr->dynMemMM, &(*adr)); 422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_getMemUsage(pr->dynMemMM, 1, &pr->dynMemSize, &incrUsedBytes, &pr->maxDynMemSize); 423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MEM 424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pr_DynMem : %i, tot:%i of %i: adr: %u", incrUsedBytes, pr->dynMemSize, PR_DYN_MEM_SIZE, *adr)); 425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*adr) = NULL; 429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_getMemState(picodata_ProcessingUnit this, pr_MemTypes mType, picoos_uint32 *lmemState) 434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mType = mType; /* avoid warning "var not used in this function"*/ 437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *lmemState = pr->workMemTop; 438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_resetMemState(picodata_ProcessingUnit this, pr_MemTypes mType, picoos_uint32 lmemState) 442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MEM 446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pr_WorkMem: -%i, tot:%i of %i", pr->workMemTop-lmemState, lmemState, PR_WORK_MEM_SIZE)); 447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mType = mType; /* avoid warning "var not used in this function"*/ 449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->workMemTop = lmemState; 450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* string operations */ 455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_int32 pr_strlen(const picoos_uchar * str) 457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i=0; 461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i<PR_MAX_DATA_LEN) && (str[i] != 0)) { 462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return i; 465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 pr_strcpy(picoos_uint8 * dest, const picoos_uint8 * src) 469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i<PR_MAX_DATA_LEN) && (src[i] != 0)) { 474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[i] = src[i]; 475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[i] = 0; 478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return i; 479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 pr_strcat(picoos_uint8 * dest, const picoos_uint8 * src) 483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i, j; 485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i<PR_MAX_DATA_LEN) && (dest[i] != 0)) { 488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j = 0; 491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i<PR_MAX_DATA_LEN) && (j<PR_MAX_DATA_LEN) && (src[j] != 0)) { 492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[i] = src[j]; 493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j++; 495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[i] = 0; 497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return i; 498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_getTermPartStr (picoos_uchar string[], picoos_int32 * ind, picoos_uchar termCh, picoos_uchar str[], picoos_bool * done) 502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen int j; 504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool done1; 505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen done1 = TRUE; 507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j = 0; 508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((*ind < PR_MAX_DATA_LEN) && (string[*ind] != termCh) && (string[*ind] != 0)) { 509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (j < PR_MAX_DATA_LEN) { 510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[j] = string[*ind]; 511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j++; 512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen done1 = FALSE; 514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*ind)++; 516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (j < PR_MAX_DATA_LEN) { 518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[j] = 0; 519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *done = ((*ind < PR_MAX_DATA_LEN) && (string[*ind] == termCh)); 521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (*done) { 522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*ind)++; 523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *done = *done && done1; 525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_int32 pr_removeSubstring (int pos, int len, unsigned char str[]) 529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen int i; 531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen int length; 532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen length = pr_strlen(str); 534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pos >= length) { 535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return length; 536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = pos + len; 538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (i < length) { 539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[pos] = str[i]; 540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos++; 542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[pos] = 0; 544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pos; 545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_strEqual(picoos_uchar * str1, picoos_uchar * str2) 550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (picoos_strcmp((picoos_char *)str1, (picoos_char *)str2) == 0); 552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_int_to_string(picoos_int32 n, picoos_uchar * str, picoos_int32 maxstrlen) 556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i, len; 558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool negative=FALSE; 559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len = 0; 561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[0] = 0; 562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (n<0) { 563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen negative = TRUE; 564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen n = -n; 565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len++; 566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = n; 568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (i>0) { 570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = i / 10; 571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len++; 572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (len<maxstrlen) { 575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[len] = 0; 576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = n; 577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i>0) && (len>0)) { 578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len--; 579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[len] = i % 10 + '0'; 580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = i / 10; 581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (negative) { 583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len--; 584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[len] = '-'; 585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_firstLetterToLowerCase (const picoos_uchar src[], picoos_uchar dest[]) 591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 j; 595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 l; 596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool done; 597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j = 0; 600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = picobase_det_utf8_length(src[0]); 601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i < l) && (j < PR_MAX_DATA_LEN)) { 602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[j] = src[i]; 603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j++; 605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (j < PR_MAX_DATA_LEN) { 607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[j] = 0; 608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_lowercase_utf8_str(dest, (picoos_char*)dest, PR_MAX_DATA_LEN, &done); 610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j = picobase_det_utf8_length(dest[0]); 611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = pr_strlen(src); 612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i < l) && (j < PR_MAX_DATA_LEN)) { 613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[j] = src[i]; 614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j++; 616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[j] = 0; 618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_int32 tok_tokenDigitStrToInt (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_uchar stokenStr[]) 622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 i; 624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 l; 625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 id; 626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 val; 627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 n; 628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_utf8char utf8char; 629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen val = 0; 631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = pr_strlen(stokenStr); 633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (i < l) { 634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_get_next_utf8char(stokenStr, PR_MAX_DATA_LEN, & i, utf8char); 635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen id = picoktab_graphOffset(pr->graphs, utf8char); 636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (id > 0) { 637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoktab_getIntPropValue(pr->graphs, id, &n)) { 638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen val = (10 * val) + n; 639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen val = ((10 * val) + (int)((int)utf8char[0] - (int)'0')); 641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((utf8char[0] >= '0') && (utf8char[0] <= '9')) { 643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen val = 10 * val + ((int)utf8char[0] - (int)'0'); 644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return val; 647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_isLatinNumber (picoos_uchar str[], picoos_int32 * val) 651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 li; 654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 llen; 655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar lact; 656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar lnext; 657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar lprev; 658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinI; 659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinV; 660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinX; 661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinL; 662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinC; 663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinD; 664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar llatinM; 665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lseq; 666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_utf8char utf8; 667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = 0; 669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llen = picobase_utf8_length(str, PR_MAX_DATA_LEN); 670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (llen > 0) { 671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_get_next_utf8char(str, PR_MAX_DATA_LEN, & li,utf8); 673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picobase_is_utf8_uppercase(utf8, PICOBASE_UTF8_MAXLEN)) { 674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinI = 'I'; 675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinV = 'V'; 676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinX = 'X'; 677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinL = 'L'; 678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinC = 'C'; 679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinD = 'D'; 680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinM = 'M'; 681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinI = 'i'; 683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinV = 'v'; 684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinX = 'x'; 685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinL = 'l'; 686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinC = 'c'; 687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinD = 'd'; 688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llatinM = 'm'; 689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 1000; 691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (li < llen) { 693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (li > 0) { 694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lprev = str[li - 1]; 695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lprev = 0; 697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lact = str[li]; 699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (li < (llen - 1)) { 700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnext = str[li + 1]; 701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnext = 0; 703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lseq > 1) && (lact == llatinI)) { 705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lprev != lact) && (lseq >= 4)) { 706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lnext == llatinV) { 707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 4; 708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 1; 710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (lnext == llatinX) { 711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 9; 712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 1; 714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 1; 716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 3; 717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 1; 720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = lseq - 1; 721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((lseq > 5) && (lact == llatinV)) { 723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 5; 724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 5; 725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((lseq > 10) && (lact == llatinX)) { 726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lprev != lact) && (lseq >= 40)) { 727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lnext == llatinL) { 728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 40; 729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 10; 731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (lnext == llatinC) { 732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 90; 733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 10; 735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 10; 737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 30; 738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 10; 741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = lseq - 10; 742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((lseq > 50) && (lact == llatinL)) { 744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 50; 745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 50; 746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((lseq > 100) && (lact == llatinC)) { 747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lprev != lact) && (lseq >= 400)) { 748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lnext == llatinD) { 749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 400; 750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 100; 752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (lnext == llatinM) { 753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 900; 754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 100; 756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 100; 758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 300; 759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 100; 762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = lseq - 100; 763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((lseq > 500) && (lact == llatinD)) { 765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 500; 766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lseq = 500; 767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((lseq >= 1000) && (lact == llatinM)) { 768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *val = *val + 1000; 769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_isSUC (picoos_uchar str[]) 780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lis; 784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_utf8char lutf; 785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lj; 786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ll; 787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool luc; 788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lis = TRUE; 791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen luc = TRUE; 792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lis && (li < PR_MAX_DATA_LEN) && (str[li] != 0)) { 793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lj = 0; 794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ll = picobase_det_utf8_length(str[li]); 795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lj < ll) { 796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lutf[lj] = str[li]; 797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lj++; 798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lutf[lj] = 0; 801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (luc) { 802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lis = lis && picobase_is_utf8_uppercase(lutf,PICOBASE_UTF8_MAXLEN+1); 803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lis = lis && picobase_is_utf8_lowercase(lutf,PICOBASE_UTF8_MAXLEN+1); 805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen luc = FALSE; 807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return lis; 809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_isCmdType (pr_ioItemPtr it, picoos_uint8 type) 814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((it != NULL) && (it->head.type == PICODATA_ITEM_CMD) && (it->head.info1 == type)) { 816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_isCmdInfo2 (pr_ioItemPtr it, picoos_uint8 info2) 824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((it != NULL) && (it->head.type == PICODATA_ITEM_CMD) && (it->head.info2 == info2)) { 826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_initPathEle (struct pr_PathEle * ele) 834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rnetwork = NULL; 836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rtok = 0; 837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->ritemid = -1; 838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rdepth = 1; 839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rlState = PR_LSInit; 840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rcompare = -1; 841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rprodname = 0; 842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ele->rprodprefcost = 0; 843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_disposeProdList (register picodata_ProcessingUnit this, pr_ProdList * prodList) 848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ProdList p; 850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((*prodList) != NULL) { 852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen p = (*prodList); 853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*prodList) = (*prodList)->rNext; 854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &p); 855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_Status pr_addContext (register picodata_ProcessingUnit this, pr_subobj_t * pr, pr_ContextList * ctxList, picokpr_VarStrPtr contextNamePtr, picokpr_VarStrPtr netNamePtr, picokpr_VarStrPtr prodNamePtr) 860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc net; 862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList ctx; 863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ProdList prod; 864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen int i; 865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr strp; 866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lprodarrlen; 867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx = (*ctxList); 869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((ctx != NULL) && !(pr_strEqual(contextNamePtr, ctx->rContextName))) { 870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx = ctx->rNext; 871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (ctx == NULL) { 873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx = picoos_allocate(this->common->mm, sizeof(pr_Context)); 874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (ctx == NULL) { 875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_EXC_OUT_OF_MEM; 876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx->rNext = (*ctxList); 878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx->rProdList = NULL; 879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx->rContextName = contextNamePtr; 880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*ctxList) = ctx; 881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen net = pr->preproc[i]; 884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i<PR_MAX_NR_PREPROC) && (net != NULL) && !(pr_strEqual(netNamePtr, picokpr_getPreprocNetName(net)))) { 885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen net = pr->preproc[i]; 887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (net != NULL) { 889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen strp = picokpr_getVarStrPtr(net, picokpr_getProdNameOfs(net, i)); 891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lprodarrlen = picokpr_getProdArrLen(net); 892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i < lprodarrlen) && !(pr_strEqual(prodNamePtr, strp))) { 893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (i < lprodarrlen) { 895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen strp = picokpr_getVarStrPtr(net, picokpr_getProdNameOfs(net, i)); 896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (i < lprodarrlen) { 899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen prod = picoos_allocate(this->common->mm, sizeof(pr_Prod)); 900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (prod == NULL) { 901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_EXC_OUT_OF_MEM; 902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen prod->rNetwork = net; 904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen prod->rProdOfs = i; 905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen prod->rNext = ctx->rProdList; 906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx->rProdList = prod; 907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_Status pr_createContextList (register picodata_ProcessingUnit this) 914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr ctxNamePtr; 917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr netNamePtr; 918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr prodNamePtr; 919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 p, i, n; 920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_Status status; 921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ctxList = NULL; 923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (p=0; p<PR_MAX_NR_PREPROC; p++) { 924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->preproc[p] != NULL) { 925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen n = picokpr_getCtxArrLen(pr->preproc[p]); 926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i = 1; i<n; i++) { 927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctxNamePtr = picokpr_getVarStrPtr(pr->preproc[p], picokpr_getCtxCtxNameOfs(pr->preproc[p], i)); 928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen netNamePtr = picokpr_getVarStrPtr(pr->preproc[p], picokpr_getCtxNetNameOfs(pr->preproc[p], i)); 929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen prodNamePtr = picokpr_getVarStrPtr(pr->preproc[p], picokpr_getCtxProdNameOfs(pr->preproc[p], i)); 930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = pr_addContext(this, pr, &pr->ctxList, ctxNamePtr,netNamePtr, prodNamePtr); 931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (status != PICO_OK) { 932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return status; 933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_disposeContextList (register picodata_ProcessingUnit this) 942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList c; 945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (pr->ctxList != NULL) { 947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen c = pr->ctxList; 948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ctxList = pr->ctxList->rNext; 949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeProdList(this, & c->rProdList); 950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &c); 951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_ContextList pr_findContext (pr_ContextList contextList, picoos_uchar contextName[]) 956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList context; 958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen context = contextList; 960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((context != NULL) && !(pr_strEqual(context->rContextName,contextName))) { 961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen context = context->rNext; 962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return context; 964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_setContext (register picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_uchar context[]) 968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ContextList ctx; 971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ctx = pr_findContext(pr->ctxList,context); 973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (ctx != NULL) { 974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->actCtx = ctx; 975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->actCtxChanged = TRUE; 976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("context '%s' not found; no change",context)); 978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em, PICO_ERR_CONTEXT_NOT_FOUND, (picoos_char*)"context '%s' not found; no change",(picoos_char*)context); 979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* item handling routines */ 984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint32 pr_copyData(picoos_uint8 * dest, const picoos_uint8 * src, picoos_int32 nrBytes, picoos_bool zeroTerm) 987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i=0; 989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((src != NULL) && (dest != NULL)) { 991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i<nrBytes) && (i<PR_MAX_DATA_LEN)) { 993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[i] = src[i]; 994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (zeroTerm) { 997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen dest[i] = 0; 998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return i; 1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_initItem(picodata_ProcessingUnit this, pr_ioItem * item) 1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->next = NULL; 1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->val = 0; 1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->head.len = 0; 1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->strci = NULL; 1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->strcis = NULL; 1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->suc = FALSE; 1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->alc = FALSE; 1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->auc = FALSE; 1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_newItem (picodata_ProcessingUnit this, pr_MemTypes mType, pr_ioItemPtr * item, picoos_uint8 itemType, picoos_int32 size, picoos_bool inItem) 1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (mType == pr_WorkMem) { 1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ALLOCATE(this, mType, (void * *) & (*item),PR_IOITEM_MIN_SIZE+size+1); 1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, *item); 1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if ((mType == pr_DynMem) && inItem) { 1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ALLOCATE(this, mType, (void * *) & (*item), PR_IOITEM_MIN_SIZE+3*size+3); 1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, *item); 1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (itemType == PICODATA_ITEM_TOKEN) { 1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*item)->strci = &((*item)->data[size+1]); 1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*item)->strcis = &((*item)->data[2*size+2]); 1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*item)->strci[0] = 0; 1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*item)->strcis[0] = 0; 1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if ((mType == pr_DynMem) && !inItem) { 1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ALLOCATE(this, mType, (void * *) & (*item), PR_IOITEM_MIN_SIZE+size+1); 1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, *item); 1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*item)->data[0] = 0; 1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_copyItemContent (picodata_ProcessingUnit this, pr_ioItem * inItem, pr_ioItem * outItem) 1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (outItem != NULL) { 1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem->next = inItem->next; 1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem->val = inItem->val; 1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem->head = inItem->head; 1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem->suc = inItem->suc; 1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem->alc = inItem->alc; 1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem->auc = inItem->auc; 1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (inItem->head.len > 0 ) { 1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyData(outItem->data, inItem->data, inItem->head.len, /*zeroTerm*/TRUE); 1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyData(outItem->strci, inItem->strci, inItem->head.len, /*zeroTerm*/TRUE); 1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyData(outItem->strcis, inItem->strcis, inItem->head.len, /*zeroTerm*/TRUE); 1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_copyItem (picodata_ProcessingUnit this, pr_MemTypes mType, pr_ioItemPtr inItem, pr_ioItemPtr * outItem) 1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr = (pr_subobj_t *) this->subObj; 1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (inItem != NULL) { 1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, mType,& (*outItem), inItem->head.type, inItem->head.len, FALSE); 1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItemContent(this, inItem, *outItem); 1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outItem = NULL; 1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_startItemList (pr_ioItemPtr * firstItem, pr_ioItemPtr * lastItem) 1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *firstItem = NULL; 1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *lastItem = NULL; 1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_appendItem (picodata_ProcessingUnit this, pr_ioItemPtr * firstItem, pr_ioItemPtr * lastItem, pr_ioItemPtr item) 1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (item != NULL) { 1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->next = NULL; 1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((*lastItem) == NULL) { 1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *firstItem = item; 1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*lastItem)->next = item; 1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*lastItem) = item; 1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_disposeItem (picodata_ProcessingUnit this, pr_ioItemPtr * item) 1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((*item) != NULL) { 1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_DEALLOCATE(this, pr_DynMem, (void * *) & (*item)); 1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_putItem (picodata_ProcessingUnit this, pr_subobj_t * pr, 1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr * first, pr_ioItemPtr * last, 1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 itemType, picoos_uint8 info1, picoos_uint8 info2, 1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 val, 1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar str[]) 1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr item; 1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.next = NULL; 1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = 0; 1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = itemType; 1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = info1; 1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = info2; 1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (itemType) { 1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_CMD: 1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (info1) { 1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_CONTEXT: 1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_VOICE: 1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_MARKER: 1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PLAY: 1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_SAVE: 1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_UNSAVE: 1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PROSDOMAIN: 1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = picoos_strlen((picoos_char*)str); 1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<pr->tmpItem.head.len; i++) { 1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[i] = str[i]; 1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, & item); 1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),item); 1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_IGNSIG: 1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_IGNORE: 1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_FLUSH: 1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 0; 1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, & item); 1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),item); 1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_SPEED: 1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PITCH: 1153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_VOLUME: 1154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_SPELL: 1155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_SIL: 1156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 2; 1157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[0] = val % 256; 1158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[1] = val / 256; 1159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, & item); 1160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),item); 1162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_CMD_PHONEME: 1164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("phoneme command not yet implemented")); 1165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("pr_putItem: unknown command type")); 1168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_TOKEN: 1171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = picoos_strlen((picoos_char*)str); 1172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<pr->tmpItem.head.len; i++) { 1173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[i] = str[i]; 1174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, & item); 1176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),item); 1178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("pr_putItem: unknown item type")); 1181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_appendItemToOutItemList (picodata_ProcessingUnit this, pr_subobj_t * pr, 1186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr * firstItem, pr_ioItemPtr * lastItem, pr_ioItemPtr item) 1187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr litem; 1189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 1190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li2; 1191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lid; 1192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ln; 1193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ln2; 1194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 ltype; 1195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 lsubtype; 1196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar lstr[10]; 1197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool ldone; 1198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen item->next = NULL; 1200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((pr->spellMode != 0) && (item->head.type == PICODATA_ITEM_TOKEN) && (item->head.info1 != PICODATA_ITEMINFO1_TOKTYPE_SPACE))) { 1201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 1202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = pr_strlen(item->data); 1203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (li < ln) { 1204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln2 = picobase_det_utf8_length(item->data[li]); 1205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (li2 = 0; li2<ln2; li2++) { 1206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstr[li2] = item->data[li]; 1207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 1208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstr[ln2] = 0; 1210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lid = picoktab_graphOffset(pr->graphs, lstr); 1211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lid > 0) && picoktab_getIntPropTokenType(pr->graphs, lid, <ype) && 1212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ((ltype == PICODATA_ITEMINFO1_TOKTYPE_LETTERV) /*|| (ltype == PICODATA_ITEMINFO1_TOKTYPE_DIGIT)*/)) { 1213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln2 = pr_strcat(lstr,(picoos_uchar*)SPEC_CHAR); 1214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoktab_getIntPropTokenSubType(pr->graphs,lid, &lsubtype); 1215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 1217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ltype = PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED; 1218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lsubtype = -(1); 1219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, pr_DynMem,& litem, PICODATA_ITEM_TOKEN, ln2, /*inItem*/FALSE); 1221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.type = PICODATA_ITEM_TOKEN; 1223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info1 = item->head.info1; 1224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info2 = item->head.info2; 1225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(litem->data, lstr); 1226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->data[ln2] = 0; 1227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.len = ln2; 1228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (litem->head.info1 == PICODATA_ITEMINFO1_TOKTYPE_DIGIT) { 1229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->val = tok_tokenDigitStrToInt(this, pr, litem->data); 1230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->val = 0; 1232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_lowercase_utf8_str(litem->data,litem->strci,PR_MAX_DATA_LEN, &ldone); 1234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_firstLetterToLowerCase(litem->data,litem->strcis); 1235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->alc = picobase_is_utf8_lowercase(litem->data,PR_MAX_DATA_LEN); 1236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->auc = picobase_is_utf8_uppercase(litem->data,PR_MAX_DATA_LEN); 1237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->suc = pr_isSUC(litem->data); 1238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, firstItem, lastItem, litem); 1240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->spellMode == PR_SPELL_WITH_SENTENCE_BREAK) { 1241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, pr_DynMem,& litem, PICODATA_ITEM_TOKEN, 2, /*inItem*/FALSE); 1242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.type = PICODATA_ITEM_TOKEN; 1244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info1 = PICODATA_ITEMINFO1_TOKTYPE_CHAR; 1245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info2 = -1; 1246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.len = 1; 1247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->data[0] = ','; 1248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->data[1] = 0; 1249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->strci[0] = ','; 1250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->strci[1] = 0; 1251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->strcis[0] = ','; 1252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->strcis[1] = 0; 1253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->val = 0; 1254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, firstItem, lastItem, litem); 1255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->spellMode == PR_SPELL_WITH_SENTENCE_BREAK) { 1256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, pr_DynMem,& litem, PICODATA_ITEM_CMD, 0, /*inItem*/FALSE); 1257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.type = PICODATA_ITEM_CMD; 1259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info1 = PICODATA_ITEMINFO1_CMD_FLUSH; 1260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info2 = PICODATA_ITEMINFO2_NA; 1261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.len = 0; 1262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, firstItem, lastItem,litem); 1263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->spellMode > 0) { 1264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, pr_DynMem,& litem, PICODATA_ITEM_CMD, 2, /*inItem*/FALSE); 1265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.type = PICODATA_ITEM_CMD; 1267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info1 = PICODATA_ITEMINFO1_CMD_SIL; 1268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.info2 = PICODATA_ITEMINFO2_NA; 1269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->head.len = 2; 1270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->data[0] = pr->spellMode % 256; 1271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem->data[1] = pr->spellMode / 256; 1272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, firstItem, lastItem, litem); 1273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & item); 1276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(item, PICODATA_ITEMINFO1_CMD_SPELL) && pr_isCmdInfo2(item, PICODATA_ITEMINFO2_CMD_START)) { 1277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->spellMode = item->data[0]+256*item->data[1]; 1278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & item); 1279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(item, PICODATA_ITEMINFO1_CMD_SPELL) && pr_isCmdInfo2(item, PICODATA_ITEMINFO2_CMD_END)) { 1280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->spellMode = 0; 1281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & item); 1282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, firstItem,lastItem,item); 1284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 1289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_OutItemVarPtr pr_findVariable (pr_OutItemVarPtr vars, picoos_int32 id) 1291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((vars != NULL) && (vars->id != id)) { 1293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vars = vars->next; 1294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((vars != NULL)) { 1296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return vars; 1297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 1299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_genCommands (picodata_ProcessingUnit this, pr_subobj_t * pr, 1304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc network, picokpr_OutItemArrOffset outitem, pr_OutItemVarPtr vars, pr_ioItemPtr * first, pr_ioItemPtr * last) 1305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr litem; 1308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr lvar; 1309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 lcmd; 1310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 linfo2; 1311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool ldone; 1312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 1313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lphontype; 1314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 1315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 1316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lnum; 1317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lf; 1318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr ll; 1319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lf0beg; 1320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lf0end; 1321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ShortStrParam lxfadebeg; 1322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ShortStrParam lxfadeend; 1323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lout; 1324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ltype; 1325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 argOfs; 1326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 nextOfs; 1327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 nextOfs2; 1328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 nextOfs3; 1329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 nextOfs4; 1330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar alphabet[32]; 1331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = 0; 1333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = 0; 1334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = NULL; 1335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ltype = picokpr_getOutItemType(network, outitem); 1336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (ltype) { 1337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OIgnore: 1338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemVal(network, outitem) == 0) { 1339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last),PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_IGNORE,PICODATA_ITEMINFO2_CMD_START,0,(picoos_uchar*)""); 1340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last),PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_IGNORE,PICODATA_ITEMINFO2_CMD_END,0,(picoos_uchar*)""); 1342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OPitch: case PR_OSpeed: case PR_OVolume: 1345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (ltype) { 1346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OPitch: 1347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_PITCH; 1348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = PICO_PITCH_DEFAULT; 1349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OSpeed: 1351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_SPEED; 1352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = PICO_SPEED_DEFAULT; 1353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVolume: 1355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_VOLUME; 1356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = PICO_VOLUME_DEFAULT; 1357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picokpr_getOutItemArgOfs(network, outitem) != 0)) { 1362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (picokpr_getOutItemType(network, picokpr_getOutItemArgOfs(network, outitem))) { 1363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVal: 1364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, lcmd,PICODATA_ITEMINFO2_CMD_ABSOLUTE, picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem)),(picoos_uchar*)""); 1365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVar: 1367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(vars,picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem))); 1368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lvar != NULL) && (lvar->first != NULL) && (lvar->first->head.type == PICODATA_ITEM_TOKEN)) { 1369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,PICODATA_ITEMINFO2_CMD_ABSOLUTE,picoos_atoi((picoos_char*)lvar->first->data),(picoos_uchar*)""); 1370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, outitem),vars,& lf,& ll); 1375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN))) { 1377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,PICODATA_ITEMINFO2_CMD_ABSOLUTE,picoos_atoi((picoos_char*)lf->data),(picoos_uchar*)""); 1378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,PICODATA_ITEMINFO2_CMD_ABSOLUTE,lnum,(picoos_uchar*)""); 1383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OPhonSVOXPA: case PR_OPhonSAMPA: 1387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemArgOfs(network, outitem) != 0) { 1388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (ltype == PR_OPhonSVOXPA) { 1389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_strlcpy(alphabet, PICODATA_SVOXPA, sizeof(alphabet)); 1390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 1392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_strlcpy(alphabet, PICODATA_SAMPA, sizeof(alphabet)); 1393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, outitem),vars,& lf,& ll); 1396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lf != NULL) { 1398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldone = FALSE; 1399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lf->head.type == PICODATA_ITEM_TOKEN) { 1400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picodata_mapPAStrToPAIds(pr->transducer, this->common, pr->xsampa_parser, pr->svoxpa_parser, pr->xsampa2svoxpa_mapper, lf->data, alphabet, pr->tmpStr1, sizeof(pr->tmpStr1)-1) == PICO_OK) { 1401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_PHONEME, 1402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_ITEMINFO2_CMD_START, 0, pr->tmpStr1); 1403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldone = TRUE; 1404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 1406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("cannot map phonetic string '%s'; synthesizeing text instead", lf->data)); 1407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em, PICO_ERR_OTHER,(picoos_char*)"", (picoos_char*)"cannot map phonetic string '%s'; synthesizing text instead", lf->data); 1408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (ldone) { 1411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 1412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lf != NULL) { 1413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lf->head.type == PICODATA_ITEM_TOKEN) { 1414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_TOKEN, PICODATA_ITEMINFO1_CMD_PHONEME, 1415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_ITEMINFO2_CMD_END, 0, (picoos_char *)""); 1416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 1418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_PHONEME, 1420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_ITEMINFO2_CMD_END, 0, (picoos_char *)""); 1421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OSent: 1427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_FLUSH, PICODATA_ITEMINFO2_NA, 0, (picoos_uchar*)""); 1428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OPara: 1430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_FLUSH, PICODATA_ITEMINFO2_NA, 0, (picoos_uchar*)""); 1431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemVal(network, outitem) == 1) { 1432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_SIL, PICODATA_ITEMINFO2_NA, PICO_PARAGRAPH_PAUSE_DUR, (picoos_uchar*)""); 1433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OBreak: 1436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picokpr_getOutItemArgOfs(network, outitem) != 0)) { 1437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (picokpr_getOutItemType(network, picokpr_getOutItemArgOfs(network, outitem))) { 1438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVal: 1439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_SIL, PICODATA_ITEMINFO2_NA, picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem)), (picoos_uchar*)""); 1440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVar: 1442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(vars,picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem))); 1443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lvar != NULL) && (lvar->first != NULL) && (lvar->first->head.type == PICODATA_ITEM_TOKEN)) { 1444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_SIL, PICODATA_ITEMINFO2_NA, picoos_atoi((picoos_char*)lvar->first->data), (picoos_uchar*)""); 1445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, outitem),vars,& lf,& ll); 1450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN))) { 1452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr, & (*first),& (*last), PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_SIL, PICODATA_ITEMINFO2_NA, picoos_atoi((picoos_char*)lf->data), (picoos_uchar*)""); 1453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVoice: case PR_OContext: case PR_OMark: 1459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemType(network, outitem) == PR_OVoice) { 1460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_VOICE; 1461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = 1; 1463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (picokpr_getOutItemType(network, outitem) == PR_OContext) { 1464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_CONTEXT; 1465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(pr->tmpStr1, (picoos_uchar*)PICO_CONTEXT_DEFAULT); 1466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = 1; 1467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((picokpr_getOutItemType(network, outitem) == PR_OMark)) { 1468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_MARKER; 1469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = 0; 1471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemArgOfs(network, outitem) != 0) { 1473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (picokpr_getOutItemType(network, picokpr_getOutItemArgOfs(network, outitem))) { 1474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVar: 1475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(vars,picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem))); 1476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lvar != NULL) { 1477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = lvar->first; 1478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (litem != NULL) { 1481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (litem->head.type == PICODATA_ITEM_TOKEN) { 1482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcat(pr->tmpStr1,litem->data); 1483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = litem->next; 1485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, lcmd,lnum,0,pr->tmpStr1); 1487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OStr: 1489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemStrOfs(network, picokpr_getOutItemArgOfs(network, outitem)) != 0) { 1490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getOutItemStr(network, picokpr_getOutItemArgOfs(network, outitem)); 1491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,lnum,0,lstrp); 1492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, outitem),vars,& lf,& ll); 1497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN))) { 1499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,lnum,0,lf->data); 1500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,lnum,0,pr->tmpStr1); 1505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OGenFile: 1508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemArgOfs(network, outitem) != 0) { 1509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_SAVE; 1510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_UNSAVE; 1512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lnum = 0; 1515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemArgOfs(network, outitem) != 0) { 1516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (picokpr_getOutItemType(network, picokpr_getOutItemArgOfs(network, outitem))) { 1517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVar: 1518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(vars,picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem))); 1519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lvar != NULL) { 1520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = lvar->first; 1521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (litem != NULL) { 1524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (litem->head.type == PICODATA_ITEM_TOKEN) { 1525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcat(pr->tmpStr1,litem->data); 1526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = litem->next; 1528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lnum = picodata_getPuTypeFromExtension(pr->tmpStr1, /*input*/FALSE)) != PICODATA_ITEMINFO2_CMD_TO_UNKNOWN) { 1530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->saveFile[0] != 0) { 1531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_UNSAVE, 1532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_getPuTypeFromExtension(pr->saveFile, /*input*/FALSE),0,pr->saveFile); 1533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, lcmd,lnum,0,pr->tmpStr1); 1535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(pr->saveFile, pr->tmpStr1); 1536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OStr: 1539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemStrOfs(network, picokpr_getOutItemArgOfs(network, outitem)) != 0) { 1540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getOutItemStr(network, picokpr_getOutItemArgOfs(network, outitem)); 1541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lnum = picodata_getPuTypeFromExtension(lstrp, /*input*/FALSE)) != PICODATA_ITEMINFO2_CMD_TO_UNKNOWN) { 1542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->saveFile[0] != 0) { 1543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_UNSAVE, 1544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_getPuTypeFromExtension(pr->saveFile, /*input*/FALSE),0,pr->saveFile); 1545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, lcmd,lnum,0,lstrp); 1547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(pr->saveFile, lstrp); 1548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,lnum,0,lstrp); 1550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, outitem),vars,& lf,& ll); 1555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN))) { 1557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lnum = picodata_getPuTypeFromExtension(lf->data, /*input*/FALSE)) != PICODATA_ITEMINFO2_CMD_TO_UNKNOWN) { 1558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->saveFile[0] != 0) { 1559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_UNSAVE, 1560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_getPuTypeFromExtension(pr->saveFile, /*input*/FALSE),0,pr->saveFile); 1561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, lcmd,lnum,0,lf->data); 1563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(pr->saveFile, lf->data); 1564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 1569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,lnum,0,pr->tmpStr1); 1571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 1572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OUseSig: case PR_OPlay: 1575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lout = FALSE; 1576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0beg = -(1); 1577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0end = -(1); 1578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lxfadebeg[0] = 0; 1579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lxfadeend[0] = 0; 1580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picokpr_getOutItemType(network, outitem) == PR_OUseSig)) { 1582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_IGNSIG; 1583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lcmd = PICODATA_ITEMINFO1_CMD_IGNORE; 1585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemArgOfs(network, outitem) != 0) { 1587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen linfo2 = PICODATA_ITEMINFO2_CMD_START; 1588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen linfo2 = PICODATA_ITEMINFO2_CMD_END; 1590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemArgOfs(network, outitem) != 0) { 1592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (picokpr_getOutItemType(network, picokpr_getOutItemArgOfs(network, outitem))) { 1593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVar: 1594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(vars,picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, outitem))); 1595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lvar != NULL) { 1596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = lvar->first; 1597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpStr1[0] = 0; 1599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (litem != NULL) { 1600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (litem->head.type == PICODATA_ITEM_TOKEN) { 1601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcat(pr->tmpStr1,litem->data); 1602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen litem = litem->next; 1604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD, PICODATA_ITEMINFO1_CMD_PLAY, 1606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_getPuTypeFromExtension(pr->tmpStr1, /*input*/TRUE),0, pr->tmpStr1); 1607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lout = TRUE; 1608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OStr: 1610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemStrOfs(network, picokpr_getOutItemArgOfs(network, outitem)) != 0) { 1611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getOutItemStr(network, picokpr_getOutItemArgOfs(network, outitem)); 1612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(pr->tmpStr1, lstrp); 1613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lout = TRUE; 1614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, outitem),vars,& lf,& ll); 1619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN)) { 1621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(pr->tmpStr1, lf->data); 1622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lout = TRUE; 1623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen argOfs = picokpr_getOutItemArgOfs(network, outitem); 1628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (argOfs != 0) { 1629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nextOfs = picokpr_getOutItemNextOfs(network, outitem); 1630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nextOfs != 0) { 1631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemType(network, nextOfs) == PR_OVal) { 1632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0beg = picokpr_getOutItemVal(network, nextOfs); 1633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nextOfs2 = picokpr_getOutItemNextOfs(network, nextOfs); 1635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nextOfs2 != 0) { 1636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picokpr_getOutItemType(network, nextOfs2) == PR_OVal) { 1637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf0end = picokpr_getOutItemVal(network, nextOfs2); 1638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nextOfs3 = picokpr_getOutItemNextOfs(network, nextOfs2); 1640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nextOfs3 != 0) { 1641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picokpr_getOutItemType(network, nextOfs3) == PR_OStr) && (picokpr_getOutItemStrOfs(network, nextOfs3) != 0)) { 1642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getOutItemStr(network, nextOfs3); 1643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(lxfadebeg, lstrp); 1644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nextOfs4 = picokpr_getOutItemNextOfs(network, nextOfs3); 1646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (nextOfs4 != 0) { 1647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((picokpr_getOutItemType(network, nextOfs4) == PR_OStr) && (picokpr_getOutItemStrOfs(network, nextOfs4) != 0)) { 1648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getOutItemStr(network, nextOfs4); 1649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_strcpy(lxfadeend, lstrp); 1650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lout) { 1657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,PICODATA_ITEMINFO1_CMD_PLAY, 1658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_getPuTypeFromExtension(pr->tmpStr1, /*input*/TRUE),0,pr->tmpStr1); 1659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_putItem(this, pr,& (*first),& (*last),PICODATA_ITEM_CMD,lcmd,linfo2,0,(picoos_uchar*)""); 1661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("unknown command")); 1664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_getOutputItemList (picodata_ProcessingUnit this, 1670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr, 1671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_Preproc network, 1672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_OutItemArrOffset outitem, 1673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr vars, 1674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr * first, 1675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr * last) 1676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_OutItemArrOffset lo; 1679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 llen; 1680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 llen2; 1681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 1682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lval32; 1683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 1684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li2; 1685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ln; 1686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ln2; 1687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr litem2; 1688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lf; 1689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr ll; 1690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lid; 1691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 ltype; 1692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 lsubtype; 1693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr lvar; 1694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lspellmode; 1695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 largOfs; 1696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lnextOfs; 1697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lo = outitem; 1700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lo != 0) { 1701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (picokpr_getOutItemType(network, lo)) { 1702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OStr: 1703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getOutItemStr(network, lo); 1704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_TOKEN; 1707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED; 1708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = -1; 1709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = pr_strcpy(pr->tmpItem.data, lstrp); 1710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVar: 1715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(vars,picokpr_getOutItemVal(network, lo)); 1716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lvar != NULL) { 1717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lvar->first; 1718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = NULL; 1720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lf != NULL) { 1722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem,& (*lf),& litem2); 1723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 1726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OSpell: 1729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lspellmode = PR_SPELL; 1730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen largOfs = picokpr_getOutItemArgOfs(network, lo); 1731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((largOfs!= 0) && ((lnextOfs = picokpr_getOutItemNextOfs(network, largOfs)) != 0)) { 1732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lspellmode = picokpr_getOutItemVal(network, lnextOfs); 1733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,largOfs,vars,& lf,& ll); 1736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lf != NULL) { 1738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (lf->head.type) { 1739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_TOKEN: 1740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 1741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = pr_strlen(lf->data); 1742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (li < ln) { 1743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_TOKEN; 1746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = lf->head.info1; 1747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = lf->head.info2; 1748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = picobase_det_utf8_length(lf->data[li]); 1749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (li2 = 0; li2 < pr->tmpItem.head.len; li2++) { 1750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[li2] = lf->data[li]; 1751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 1752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[pr->tmpItem.head.len] = 0; 1754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = 0; 1755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lid = picoktab_graphOffset(pr->graphs,pr->tmpItem.data); 1756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lid > 0) { 1757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoktab_getIntPropTokenType(pr->graphs, lid, <ype)) { 1758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((ltype == PICODATA_ITEMINFO1_TOKTYPE_LETTERV)/* || (ltype == PICODATA_ITEMINFO1_TOKTYPE_DIGIT)*/) { 1759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = pr_strcat(pr->tmpItem.data,(picoos_uchar*)SPEC_CHAR); 1760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoktab_getIntPropTokenSubType(pr->graphs, lid, &lsubtype); 1763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 1764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ltype = PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED; 1765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lsubtype = -(1); 1766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last), litem2); 1770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lspellmode == PR_SPELL_WITH_PHRASE_BREAK) { 1771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_TOKEN; 1773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = PICODATA_ITEMINFO1_TOKTYPE_CHAR; 1774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = lsubtype; 1775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 1; 1776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[0] = ','; 1777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[1] = 0; 1778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = 0; 1779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (lspellmode == PR_SPELL_WITH_SENTENCE_BREAK) { 1783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_CMD; 1785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = PICODATA_ITEMINFO1_CMD_FLUSH; 1786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = PICODATA_ITEMINFO2_NA; 1787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 0; 1788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (lspellmode > 0) { 1792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_TOKEN; 1794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = PICODATA_ITEMINFO1_TOKTYPE_CHAR; 1795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = lsubtype; 1796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 1; 1797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[0] = ','; 1798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[1] = 0; 1799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = 0; 1800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem,& (*lf),& litem2); 1808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ll = lf; 1813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 1814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ll->next = NULL; 1815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OConcat: 1818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, lo),vars,& lf,& ll); 1820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_TOKEN; 1823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED; 1824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = -(1); 1825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 0; 1826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[0] = 0; 1827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = 0; 1828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lf != NULL) { 1829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (lf->head.type) { 1830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_TOKEN: 1831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = pr_strcat(pr->tmpItem.data,lf->data); 1832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEM_CMD: 1834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, lf, &litem2); 1839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.type = PICODATA_ITEM_TOKEN; 1844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info1 = PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED; 1845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.info2 = -(1); 1846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = 0; 1847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[0] = 0; 1848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = 0; 1849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 1854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_ORomanToCard: 1860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemArgOfs(network, lo),vars,& lf,& ll); 1862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN)) { 1864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItemContent(this, lf, &pr->tmpItem); 1866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_isLatinNumber(lf->data, & lval32)) { 1867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_int_to_string(lval32, (picoos_char *)pr->tmpItem.data, PR_MAX_DATA_LEN_Z); 1868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = pr_strlen(pr->tmpItem.data); 1869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.val = lval32; 1870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OVal: 1876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OLeft: 1878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemNextOfs(network, picokpr_getOutItemArgOfs(network, lo)),vars,& lf,& ll); 1880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN)) { 1882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItemContent(this, lf, &pr->tmpItem); 1884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llen = lf->head.len; 1885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llen2 = picobase_utf8_length(pr->tmpItem.data,PR_MAX_DATA_LEN); 1886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = 0; 1887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln2 = 0; 1888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen largOfs = picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, lo)); 1889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((ln < llen) && (ln2 < llen2) && (ln2 < largOfs)) { 1890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = ln + picobase_det_utf8_length(pr->tmpItem.data[ln]); 1891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln2++; 1892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.data[ln] = 0; 1894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = ln; 1895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, &litem2); 1896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_ORight: 1901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemNextOfs(network, picokpr_getOutItemArgOfs(network, lo)),vars,& lf,& ll); 1903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN)) { 1905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItemContent(this, lf, & pr->tmpItem); 1907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llen = lf->head.len; 1908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llen2 = picobase_utf8_length(pr->tmpItem.data,PR_MAX_DATA_LEN); 1909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = 0; 1910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln2 = 0; 1911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((ln < llen) && (ln2 < llen2) && (ln2 < (llen2 - picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, lo))))) { 1912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = ln + picobase_det_utf8_length(pr->tmpItem.data[ln]); 1913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln2++; 1914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = pr_removeSubstring(0,ln,pr->tmpItem.data); 1916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, & litem2); 1917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OItem: 1922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network,picokpr_getOutItemNextOfs(network, picokpr_getOutItemArgOfs(network, lo)),vars,& lf,& ll); 1924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = picokpr_getOutItemVal(network, picokpr_getOutItemArgOfs(network, lo)); 1926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 1; 1927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((li < ln) && (lf != NULL)) { 1928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 1929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 1930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lf != NULL) && (li == ln) && (lf->head.type == PICODATA_ITEM_TOKEN)) { 1932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, lf, & litem2); 1933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_ORLZ: 1938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lf,& ll); 1939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, network, picokpr_getOutItemArgOfs(network, lo),vars,& lf,& ll); 1940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((lf != NULL) && (lf->head.type == PICODATA_ITEM_TOKEN)) { 1942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initItem(this, &pr->tmpItem); 1943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItemContent(this, lf, & pr->tmpItem); 1944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 1945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((li < lf->head.len) && (pr->tmpItem.data[li] == '0')) { 1946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li++; 1947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->tmpItem.head.len = pr_removeSubstring(0,li,pr->tmpItem.data); 1949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem, &pr->tmpItem, & litem2); 1950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*first),& (*last),litem2); 1952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OIgnore: case PR_OPitch: case PR_OSpeed: case PR_OVolume: case PR_OPhonSVOXPA: case PR_OPhonSAMPA: case PR_OBreak: case PR_OMark: case PR_OPara: case PR_OSent: case PR_OPlay: 1955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_OUseSig: case PR_OGenFile: case PR_OAudioEdit: case PR_OContext: case PR_OVoice: 1956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_genCommands(this, pr, network,lo,vars,& (*first),& (*last)); 1957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 1958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 1960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("unkown command")); 1961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 1962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lo = picokpr_getOutItemNextOfs(network, lo); 1964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_int32 pr_attrVal (picokpr_Preproc network, picokpr_TokArrOffset tok, pr_TokSetEleWP type) 1969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_TokSetEleWP tse; 1972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 n; 1973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetWP set; 1974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen n = 0; 1976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen tse = PR_FIRST_TSE_WP; 1977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen set = picokpr_getTokSetWP(network, tok); 1978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (tse < type) { 1979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((1<<tse) & set) != 0) { 1980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen n++; 1981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen tse = (pr_TokSetEleWP)((picoos_int32)tse+1); 1983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokpr_getAttrValArrInt32(network, picokpr_getTokAttribOfs(network, tok) + n); 1985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_getOutput (picodata_ProcessingUnit this, pr_subobj_t * pr, 1989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 * i, picoos_int32 d, pr_ioItemPtr * o, pr_ioItemPtr * ol) 1990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 1993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr lvars; 1994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_OutItemVarPtr lvar; 1995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lit; 1996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr ldit; 1997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr ldlit; 1998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lfirst; 1999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lcopy; 2000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetWP wpset; 2001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset; 2002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 2003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfirst = TRUE; 2005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*i)++; 2006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = NULL; 2007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvars = NULL; 2008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldit = NULL; 2009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldlit = NULL; 2010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((*i) < pr->rbestpath.rlen) { 2011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->rbestpath.rele[*i]; 2012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 2013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (*i > 0) { 2014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((li < 127) && (li < pr->rbestpath.rele[*i].rdepth)) { 2015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->lspaces[li++] = ' '; 2016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->lspaces[li] = 0; 2019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (with__0->rprodname != 0) { 2020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp path :%s%s(", pr->lspaces, picokpr_getVarStrPtr(with__0->rnetwork,with__0->rprodname))); 2021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->ritems[with__0->ritemid+1] != NULL) && (pr->ritems[with__0->ritemid+1]->head.type == PICODATA_ITEM_TOKEN)) { 2023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp in (1): %s'%s'", pr->lspaces, pr->ritems[with__0->ritemid+1]->data)); 2024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->ritems[with__0->ritemid+1] != NULL)) { 2026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((pr->rinItemList != NULL) && (pr->rinItemList != pr->ritems[with__0->ritemid+1]) && (pr->rinItemList->head.type != PICODATA_ITEM_TOKEN)) { 2027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = pr->rinItemList; 2028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rinItemList = pr->rinItemList->next; 2029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->next = NULL; 2030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_WorkMem,& (*lit),& lcopy); 2031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & lit); 2033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & (*o),& (*ol),lcopy); 2034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rinItemList != NULL) { 2036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = pr->rinItemList; 2037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rinItemList = pr->rinItemList->next; 2038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->next = NULL; 2039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = NULL; 2041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = picokpr_getTokSetWP(with__0->rnetwork, with__0->rtok); 2044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = picokpr_getTokSetNP(with__0->rnetwork, with__0->rtok); 2045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_PROD & wpset) != 0) { 2047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_VAR & wpset) != 0) { 2048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(lvars,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEVar)); 2049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lvar == NULL) { 2050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ALLOCATE(this, pr_WorkMem, (void *) & lvar,(sizeof (*lvar))); 2051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->next = lvars; 2052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->id = pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEVar); 2053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvars = lvar; 2054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& lvar->first,& lvar->last); 2056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutput(this, pr, & (*i),(d + 1),& lvar->first,& lvar->last); 2057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& ldit,& ldlit); 2060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutput(this, pr, & (*i),(d + 1),& ldit,& ldlit); 2061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*i)++; 2064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PR_TSE_MASK_VAR & wpset) != 0) { 2065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar = pr_findVariable(lvars,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEVar)); 2066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lvar == NULL) { 2067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ALLOCATE(this, pr_WorkMem, (void *) & lvar,(sizeof (*lvar))); 2068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->next = lvars; 2069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->id = pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEVar); 2070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvars = lvar; 2071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_LEX & wpset) != 0) && ((PR_TSE_MASK_LETTER & npset) == 0)) { 2073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lfirst) { 2074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, pr_WorkMem,& lit, PICODATA_ITEM_TOKEN, sizeof(struct pr_ioItem), /*inItem*/FALSE); 2075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->head.type = PICODATA_ITEM_TOKEN; 2077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->head.info1 = pr->ritems[with__0->ritemid+1]->head.info1; 2078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->head.info2 = pr->ritems[with__0->ritemid+1]->head.info2; 2079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->ritems[with__0->ritemid+1]->head.info1 == PICODATA_ITEMINFO1_TOKTYPE_SPACE) { 2080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->head.len = pr_strcpy(lit->data, (picoos_uchar*)"_"); 2081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->head.len = pr_strcpy(lit->data, pr->ritems[with__0->ritemid+1]->data); 2083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->first = lit; 2085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->last = lit; 2086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfirst = FALSE; 2087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->ritems[with__0->ritemid+1]->head.info1 == PICODATA_ITEMINFO1_TOKTYPE_SPACE)) { 2089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->last->head.len = pr_strcat(lvar->last->data,(picoos_uchar*)"_"); 2090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->last->head.len = pr_strcat(lvar->last->data,pr->ritems[with__0->ritemid+1]->data); 2092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->last->head.info1 = PICODATA_ITEMINFO1_TOKTYPE_UNDEFINED; 2094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->last->head.info2 = -(1); 2095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->first = pr->ritems[with__0->ritemid+1]; 2098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lvar->last = pr->ritems[with__0->ritemid+1]; 2099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*i)++; 2101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PR_TSE_MASK_OUT & wpset) != 0) { 2102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutputItemList(this, pr, with__0->rnetwork,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEOut),lvars,& (*o),& (*ol)); 2103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*i)++; 2105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (((*i) < (pr->rbestpath.rlen - 1)) && (d != pr->rbestpath.rele[(*i) + 1].rdepth)) { 2106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((*i > 0) && (with__0->rdepth-1) == pr->rbestpath.rele[*i + 1].rdepth) { 2107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 2108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((li < 127) && (li < with__0->rdepth-1)) { 2109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->lspaces[li++] = ' '; 2110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->lspaces[li] = 0; 2112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp path :%s)", pr->lspaces)); 2113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return; 2115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*i)++; 2117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_LEX & wpset) == 0) { 2119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfirst = TRUE; 2120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = 0; 2123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((li < 127) && (li < pr->rbestpath.rele[*i].rdepth-1)) { 2124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->lspaces[li++] = ' '; 2125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->lspaces[li] = 0; 2127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp path :%s)", pr->lspaces)); 2128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_outputPath (picodata_ProcessingUnit this, pr_subobj_t * pr) 2132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 2135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lf; 2136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr ll; 2137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lit; 2138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lit2; 2139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_MemState lmemState; 2140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lastPlayFileFound; 2141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getMemState(this, pr_WorkMem, & lmemState); 2143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = NULL; 2144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ll = NULL; 2145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = -(1); 2146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getOutput(this, pr, & li,1,& lf,& ll); 2147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lastPlayFileFound = TRUE; 2149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lf != NULL) { 2150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = lf; 2151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lf = lf->next; 2152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->next = NULL; 2153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PLAY)) { 2154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lastPlayFileFound = picoos_FileExists(this->common, (picoos_char*)lit->data); 2155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!lastPlayFileFound) { 2156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("file '%s' not found; synthesizing enclosed text instead", lit->data)); 2157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em, PICO_EXC_CANT_OPEN_FILE, (picoos_char*)"", (picoos_char*)"file '%s' not found; synthesizing enclosed text instead",lit->data); 2158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PHONEME) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_START)) { 2161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = TRUE; 2162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PHONEME)&& pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_END)) { 2163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = FALSE; 2164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PLAY) && !lastPlayFileFound)) { 2166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNORE) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_START)) { 2167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lastPlayFileFound) { 2168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rignore++; 2169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNORE) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_END)) { 2171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lastPlayFileFound) { 2172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rignore > 0) { 2173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rignore--; 2174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNSIG) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_START) && !lastPlayFileFound) { 2177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNSIG) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_END) && !lastPlayFileFound) { 2178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_CONTEXT)) { 2179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rignore <= 0) { 2180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_setContext(this, pr, lit->data); 2181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_VOICE)) { 2183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rignore <= 0) { 2184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_DynMem,lit,& lit2); 2185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & pr->routItemList,& pr->rlastOutItem, lit2); 2187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->rignore <= 0) && !(pr->insidePhoneme && (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PLAY) || 2190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNSIG)))) { 2191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp out(1): '%s'", lit->data)); 2192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_copyItem(this, pr_DynMem,lit,& lit2); 2193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItemToOutItemList(this, pr, & pr->routItemList,& pr->rlastOutItem,lit2); 2195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 2196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (li = 0; li<pr->rbestpath.rlen; li++) { 2200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->rbestpath.rele[li]; 2201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & pr->ritems[with__0->ritemid+1]); 2202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_resetMemState(this, pr_WorkMem, lmemState); 2204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 2207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_compare (picoos_uchar str1lc[], picoos_uchar str2[], picoos_int16 * result) 2209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 2212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 j; 2213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 l; 2214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 pos; 2215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool finished1; 2216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool finished2; 2217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool done; 2218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_utf8char utf8char; 2219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 0; 2221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = picobase_get_next_utf8char(str2, PR_MAX_DATA_LEN, & pos,utf8char); 2222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_lowercase_utf8_str(utf8char,(picoos_char*)utf8char,PICOBASE_UTF8_MAXLEN+1, &done); 2223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = picobase_det_utf8_length(utf8char[0]); 2224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j = 0; 2225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 2226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((i < PR_MAX_DATA_LEN) && (str1lc[i] != 0) && (l > 0) && (j <= 3) && (str1lc[i] == utf8char[j])) { 2227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 2228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j++; 2229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (j >= l) { 2230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = picobase_get_next_utf8char(str2, PR_MAX_DATA_LEN, & pos,utf8char); 2231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_lowercase_utf8_str(utf8char,(picoos_char*)utf8char,PICOBASE_UTF8_MAXLEN+1, &done); 2232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = picobase_det_utf8_length(utf8char[0]); 2233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen j = 0; 2234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen finished1 = (i >= PR_MAX_DATA_LEN) || (str1lc[i] == 0); 2237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen finished2 = (j > 3) || (utf8char[j] == 0); 2238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (finished1 && finished2) { 2239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *result = PR_EQUAL; 2240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (finished1) { 2241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *result = PR_SMALLER; 2242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (finished2) { 2243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *result = PR_LARGER; 2244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (str1lc[i] < utf8char[j]) { 2246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *result = PR_SMALLER; 2247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *result = PR_LARGER; 2249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_hasToken (picokpr_TokSetWP * tswp, picokpr_TokSetNP * tsnp) 2255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (((( PR_TSE_MASK_SPACE | PR_TSE_MASK_DIGIT | PR_TSE_MASK_LETTER | PR_TSE_MASK_SEQ 2257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen | PR_TSE_MASK_CHAR | PR_TSE_MASK_BEGIN | PR_TSE_MASK_END) & (*tsnp)) != 0) || 2258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ((PR_TSE_MASK_LEX & (*tswp)) != 0)); 2259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getNextToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 len; 2266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset; 2267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len = pr->ractpath.rlen; 2269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[len - 1]; 2270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = picokpr_getTokSetNP(with__0->rnetwork, with__0->rtok); 2271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((len > 0) && (pr->ractpath.rlen < PR_MAX_PATH_LEN) && ((PR_TSE_MASK_NEXT & npset) != 0)) { 2272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initPathEle(& pr->ractpath.rele[len]); 2273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rnetwork = with__0->rnetwork; 2274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rtok = picokpr_getTokNextOfs(with__0->rnetwork, with__0->rtok); 2275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rdepth = with__0->rdepth; 2276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen++; 2277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (len >= PR_MAX_PATH_LEN) { 2280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max path len reached (pr_getNextToken)")); 2281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getAltToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokArrOffset lTok; 2291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset; 2292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->ractpath.rlen > 0) && (pr->ractpath.rlen < PR_MAX_PATH_LEN)) { 2296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = picokpr_getTokSetNP(with__0->rnetwork, with__0->rtok); 2297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (with__0->rcompare == PR_SMALLER) { 2298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_ALTL & npset) != 0) { 2299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lTok = picokpr_getTokAltLOfs(with__0->rnetwork, with__0->rtok); 2300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_ALTR & npset) != 0) { 2305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lTok = picokpr_getTokAltROfs(with__0->rnetwork, with__0->rtok); 2306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSInit; 2311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rtok = lTok; 2312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->ritemid = -1; 2313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rcompare = -1; 2314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rprodname = 0; 2315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rprodprefcost = 0; 2316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->ractpath.rlen >= PR_MAX_PATH_LEN) { 2319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max path len reached (pr_getAltToken)")); 2320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_findProduction (picodata_ProcessingUnit this, pr_subobj_t * pr, 2327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar str[], picokpr_Preproc * network, picokpr_TokArrOffset * tokOfs) 2328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool found; 2330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 p; 2331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ind; 2332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 2333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool done; 2334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 2335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lprodarrlen; 2336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ind = 0; 2338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getTermPartStr(str,& ind,'.',pr->tmpStr1,& done); 2339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getTermPartStr(str,& ind,'.',pr->tmpStr2,& done); 2340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen found = FALSE; 2341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (p=0; p<PR_MAX_NR_PREPROC; p++) { 2343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!found && (pr->preproc[p] != NULL)) { 2344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_strEqual(pr->tmpStr1, picokpr_getPreprocNetName(pr->preproc[p]))) { 2345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 2346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lprodarrlen = picokpr_getProdArrLen(pr->preproc[p]); 2347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (!found && (i <= (lprodarrlen - 1))) { 2348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getVarStrPtr(pr->preproc[p],picokpr_getProdNameOfs(pr->preproc[p], i)); 2349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_strEqual(pr->tmpStr2, lstrp)) { 2350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *network = pr->preproc[p]; 2351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *tokOfs = picokpr_getProdATokOfs(pr->preproc[p], i); 2352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i++; 2355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getProdToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 2367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetWP wpset; 2368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->ractpath.rlen > 0) && (pr->ractpath.rlen < PR_MAX_PATH_LEN)) { 2370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = picokpr_getTokSetWP(with__0->rnetwork, with__0->rtok); 2372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_PROD & wpset) != 0) { 2373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_PRODEXT & wpset) != 0) { 2374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initPathEle(& pr->ractpath.rele[pr->ractpath.rlen]); 2375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getVarStrPtr(with__0->rnetwork, pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEProdExt)); 2376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_findProduction(this, pr, lstrp,& pr->ractpath.rele[pr->ractpath.rlen].rnetwork,& pr->ractpath.rele[pr->ractpath.rlen].rtok)) { 2377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rprodname = picokpr_getProdNameOfs(with__0->rnetwork, pr_attrVal(with__0->rnetwork, with__0->rtok,PR_TSEProd)); 2378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rprodprefcost = picokpr_getProdPrefCost(with__0->rnetwork, pr_attrVal(with__0->rnetwork,with__0->rtok,PR_TSEProd)); 2379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rdepth = with__0->rdepth + 1; 2380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen++; 2381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initPathEle(& pr->ractpath.rele[pr->ractpath.rlen]); 2387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rnetwork = with__0->rnetwork; 2388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rtok = picokpr_getProdATokOfs(with__0->rnetwork, pr_attrVal(with__0->rnetwork, with__0->rtok,PR_TSEProd)); 2389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rprodname = picokpr_getProdNameOfs(with__0->rnetwork, pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEProd)); 2390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rprodprefcost = picokpr_getProdPrefCost(with__0->rnetwork, pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEProd)); 2391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rdepth = with__0->rdepth + 1; 2392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen++; 2393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->ractpath.rlen >= PR_MAX_PATH_LEN) { 2398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max path len reached (pr_getProdToken)")); 2399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getProdContToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 2407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li = pr->ractpath.rlen - 1; 2409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((li > 0) && !((pr->ractpath.rele[li].rdepth == (pr->ractpath.rele[pr->ractpath.rlen - 1].rdepth - 1)) && ((PR_TSE_MASK_PROD &picokpr_getTokSetWP(pr->ractpath.rele[li].rnetwork, pr->ractpath.rele[li].rtok)) != 0))) { 2410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen li--; 2411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((li >= 0) && (pr->ractpath.rlen < PR_MAX_PATH_LEN) && (PR_TSE_MASK_NEXT &picokpr_getTokSetNP(pr->ractpath.rele[li].rnetwork, pr->ractpath.rele[li].rtok)) != 0)) { 2413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initPathEle(& pr->ractpath.rele[pr->ractpath.rlen]); 2414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rnetwork = pr->ractpath.rele[li].rnetwork; 2415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rtok = picokpr_getTokNextOfs(pr->ractpath.rele[li].rnetwork, pr->ractpath.rele[li].rtok); 2416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rdepth = pr->ractpath.rele[li].rdepth; 2417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen++; 2418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->ractpath.rlen >= PR_MAX_PATH_LEN) { 2421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max path len reached (pr_getProdContToken)")); 2422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 2428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getTopLevelToken (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_bool firstprod) 2430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (firstprod) { 2432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->actCtx != NULL) { 2433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->prodList = pr->actCtx->rProdList; 2434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->prodList = NULL; 2436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->prodList != NULL) { 2438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->prodList = pr->prodList->rNext; 2439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->prodList != NULL) && (pr->prodList->rProdOfs != 0) && (picokpr_getProdATokOfs(pr->prodList->rNetwork, pr->prodList->rProdOfs) != 0)) { 2441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_initPathEle(& pr->ractpath.rele[pr->ractpath.rlen]); 2442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rdepth = 1; 2443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rnetwork = pr->prodList->rNetwork; 2444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rtok = picokpr_getProdATokOfs(pr->prodList->rNetwork, pr->prodList->rProdOfs); 2445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rlState = PR_LSInit; 2446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rcompare = -1; 2447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rprodname = picokpr_getProdNameOfs(pr->prodList->rNetwork, pr->prodList->rProdOfs); 2448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen].rprodprefcost = picokpr_getProdPrefCost(pr->prodList->rNetwork, pr->prodList->rProdOfs); 2449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen++; 2450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 ln; 2460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lid; 2461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = (pr->ractpath.rlen - 2); 2463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((ln >= 0) && (pr->ractpath.rele[ln].ritemid == -1)) { 2464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ln = ln - 1; 2465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (ln >= 0) { 2467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lid = pr->ractpath.rele[ln].ritemid + 1; 2468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lid = 0; 2470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lid < pr->rnritems) { 2472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen - 1].ritemid = lid; 2473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[pr->ractpath.rlen - 1].ritemid = -1; 2475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (lid < pr->rnritems); 2477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_bool pr_getNextMultiToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 len; 2483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len = pr->ractpath.rlen; 2485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((len > 0) && (len < PR_MAX_PATH_LEN)) { 2486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rtok = pr->ractpath.rele[len - 1].rtok; 2487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].ritemid = -(1); 2488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rcompare = pr->ractpath.rele[len - 1].rcompare; 2489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rdepth = pr->ractpath.rele[len - 1].rdepth; 2490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rele[len].rlState = PR_LSInit; 2491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen++; 2492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return TRUE; 2493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (len >= PR_MAX_PATH_LEN) { 2495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max path len reached (pr_getNextMultiToken)")); 2496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 2500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchMultiToken (picodata_ProcessingUnit this, pr_subobj_t * pr, 2504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lcontinue=FALSE; 2507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lmatch=FALSE; 2508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lmatch) { 2510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatchedMulti; 2511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (lcontinue) { 2512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatchedContinue; 2513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr = pr; /* avoid warning "var not used in this function"*/ 2517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = npset; /* avoid warning "var not used in this function"*/ 2518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = wpset; /* avoid warning "var not used in this function"*/ 2519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensSpace (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_int32 cmpres, 2524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 llen; 2528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lulen; 2529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 2530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 2531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 leol; 2532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_SPACE & npset) == 0) { 2535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = (picokpr_VarStrPtr)&pr->ritems[with__0->ritemid+1]->data; 2538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lulen = picobase_utf8_length(lstrp,PR_MAX_DATA_LEN); 2539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_LEN & wpset) != 0) && (lulen != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSELen))) { 2540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MIN & wpset) != 0) && (lulen < pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMin))) { 2543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MAX & wpset) != 0) && (lulen > pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMax))) { 2546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && (cmpres != PR_EQUAL)) { 2549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_VAL & wpset) != 0) { 2552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen leol = 0; 2553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen llen = pr_strlen(lstrp); 2554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (li = 0; li < llen; li++) { 2555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lstrp[li] == PR_EOL) { 2556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen leol++; 2557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (leol != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEVal)) { 2560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ID & wpset) != 0) && (pr->ritems[with__0->ritemid+1]->head.info2 != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEID))) { 2564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensDigit (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_int32 cmpres, 2571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lulen; 2575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lval; 2576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 2577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_DIGIT & npset) == 0) { 2580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = (picokpr_VarStrPtr)&pr->ritems[with__0->ritemid+1]->data; 2583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lulen = picobase_utf8_length(lstrp,PR_MAX_DATA_LEN); 2584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((((PR_TSE_MASK_LEN & wpset) != 0) && (lulen != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSELen)))) { 2585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lval = pr->ritems[with__0->ritemid+1]->val; 2588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MIN & wpset) != 0) && (lval < pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMin))) { 2589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MAX & wpset) != 0) && (lval > pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMax))) { 2592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && (cmpres != PR_EQUAL)) { 2595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_VAL & wpset) != 0) && (lval != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEVal))) { 2598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((((PR_TSE_MASK_NLZ & npset) != 0) && lstrp[0] == '0')) { 2601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_HEAD & wpset) != 0) && !(picokpr_isEqualHead(with__0->rnetwork,lstrp,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEHead)))) { 2604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MID & wpset) != 0) && !(picokpr_isEqualMid(with__0->rnetwork,lstrp,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMid)))) { 2607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_TAIL & wpset) != 0) && !(picokpr_isEqualTail(with__0->rnetwork,lstrp,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSETail)))) { 2610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ID & wpset) != 0) && (pr->ritems[with__0->ritemid+1]->head.info2 != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEID))) { 2613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensSeq (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_int32 cmpres, 2620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lulen; 2625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 2626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!((PR_TSE_MASK_SEQ & npset) != 0)) { 2630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = (picokpr_VarStrPtr)(void *) &pr->ritems[with__0->ritemid+1]->data; 2633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lulen = picobase_utf8_length(lstrp,PR_MAX_DATA_LEN); 2634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_LEN & wpset) != 0) && (lulen != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSELen))) { 2635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MIN & wpset) != 0) && (lulen < pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMin))) { 2638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MAX & wpset) != 0) && (lulen > pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMax))) { 2641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && (cmpres != PR_EQUAL)) { 2644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_HEAD & wpset) != 0) && !(picokpr_isEqualHead(with__0->rnetwork,lstrp,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEHead)))) { 2647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MID & wpset) != 0) && !(picokpr_isEqualMid(with__0->rnetwork,lstrp,PR_MAX_DATA_LEN ,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMid)))) { 2650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_TAIL & wpset) != 0) && !(picokpr_isEqualTail(with__0->rnetwork,lstrp,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSETail)))) { 2653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ID & wpset) != 0) && (pr->ritems[with__0->ritemid+1]->head.info2 != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEID))) { 2656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensChar (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_int32 cmpres, 2663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!((PR_TSE_MASK_CHAR & npset) != 0)) { 2670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && (cmpres != PR_EQUAL)) { 2673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ID & wpset) != 0) && (pr->ritems[with__0->ritemid+1]->head.info2 != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEID))) { 2676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensLetter (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_int32 cmpres, 2683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lulen; 2688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lromanval; 2689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ( !((PR_TSE_MASK_LETTER & npset) != 0)) { 2693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lulen = picobase_utf8_length(pr->ritems[with__0->ritemid+1]->data, PR_MAX_DATA_LEN); 2696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_LEN & wpset) != 0) && (lulen != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSELen))) { 2697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MIN & wpset) != 0) && (lulen < pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMin))) { 2700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MAX & wpset) != 0) && (lulen > pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMax))) { 2703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_CI & npset) != 0) { 2706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && (cmpres != PR_EQUAL)) { 2707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_HEAD & wpset) != 0) && !(picokpr_isEqualHead(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strci,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEHead)))) { 2710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MID & wpset) != 0) && !(picokpr_isEqualMid(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strci,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMid)))) { 2713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_TAIL & wpset) != 0) && !(picokpr_isEqualTail(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strci,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSETail)))) { 2716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PR_TSE_MASK_CIS & npset) != 0) { 2719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && !(picokpr_isEqual(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strcis,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEStr)))) { 2720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_HEAD & wpset) != 0) && !(picokpr_isEqualHead(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strcis,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEHead)))) { 2723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MID & wpset) != 0) && !(picokpr_isEqualMid(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strcis,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMid)))) { 2726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_TAIL & wpset) != 0) && !(picokpr_isEqualTail(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->strcis,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSETail)))) { 2729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_STR & wpset) != 0) && !(picokpr_isEqual(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->data,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEStr)))) { 2733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_HEAD & wpset) != 0) && !(picokpr_isEqualHead(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->data,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEHead)))) { 2736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_MID & wpset) != 0) && !(picokpr_isEqualMid(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->data,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEMid)))) { 2739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_TAIL & wpset) != 0) && !(picokpr_isEqualTail(with__0->rnetwork,pr->ritems[with__0->ritemid+1]->data,PR_MAX_DATA_LEN,pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSETail)))) { 2742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_AUC & npset) != 0) && !(pr->ritems[with__0->ritemid+1]->auc)) { 2746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ALC & npset) != 0) && !(pr->ritems[with__0->ritemid+1]->alc)) { 2749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_SUC & npset) != 0) && !(pr->ritems[with__0->ritemid+1]->suc)) { 2752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ROMAN & npset) != 0) && !(pr_isLatinNumber(pr->ritems[with__0->ritemid+1]->data,& lromanval))) { 2755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_ID & wpset) != 0) && (pr->ritems[with__0->ritemid+1]->head.info2 != pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEID))) { 2758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensBegin (picodata_ProcessingUnit this, pr_subobj_t * pr, 2765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = npset; /* avoid warning "var not used in this function"*/ 2768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = wpset; /* avoid warning "var not used in this function"*/ 2769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_BEGIN &picokpr_getTokSetNP(pr->ractpath.rele[pr->ractpath.rlen - 1].rnetwork, pr->ractpath.rele[pr->ractpath.rlen - 1].rtok)) != 0) { 2770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokensEnd (picodata_ProcessingUnit this, pr_subobj_t * pr, 2779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset, picokpr_TokSetWP wpset) 2780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = npset; /* avoid warning "var not used in this function"*/ 2782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = wpset; /* avoid warning "var not used in this function"*/ 2783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_END &picokpr_getTokSetNP(pr->ractpath.rele[pr->ractpath.rlen - 1].rnetwork, pr->ractpath.rele[pr->ractpath.rlen - 1].rtok)) != 0) { 2784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSMatched; 2785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pr_MatchState pr_matchTokens (picodata_ProcessingUnit this, pr_subobj_t * pr, picoos_int16 * cmpres) 2792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_VarStrPtr lstrp; 2796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset; 2797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetWP wpset; 2798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = picokpr_getTokSetNP(with__0->rnetwork, with__0->rtok); 2801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = picokpr_getTokSetWP(with__0->rnetwork, with__0->rtok); 2802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *cmpres = PR_EQUAL; 2804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_STR & wpset) != 0) { 2805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lstrp = picokpr_getVarStrPtr(with__0->rnetwork, pr_attrVal(with__0->rnetwork, with__0->rtok, PR_TSEStr)); 2806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_compare(pr->ritems[with__0->ritemid+1]->strci,lstrp,cmpres); 2807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_LEX & wpset) == PR_TSE_MASK_LEX) && ((PR_TSE_MASK_LETTER & npset) == 0)) { 2809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchMultiToken(this, pr, npset, wpset); 2810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pr->ritems[with__0->ritemid+1]->head.info1) { 2812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_BEGIN: 2813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensBegin(this, pr, npset, wpset); 2814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_END: 2816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensEnd(this, pr, npset, wpset); 2817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_SPACE: 2819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensSpace(this, pr, *cmpres, npset, wpset); 2820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_DIGIT: 2822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensDigit(this, pr, *cmpres, npset, wpset); 2823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_LETTER: 2825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensLetter(this, pr, *cmpres, npset, wpset); 2826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_SEQ: 2828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensSeq(this, pr, *cmpres, npset, wpset); 2829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICODATA_ITEMINFO1_TOKTYPE_CHAR: 2831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return pr_matchTokensChar(this, pr, *cmpres, npset, wpset); 2832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pr_matchTokens: unknown token type")); 2835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PR_MSNotMatched; 2836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_calcPathCost (struct pr_Path * path) 2843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 2845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool lfirst; 2846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetWP wpset; 2847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset; 2848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_PATHCOST 2849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar str[1000]; 2850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uchar * strp; 2851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 2852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_PATHCOST 2854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen str[0] = 0; 2855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 2856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfirst = TRUE; 2858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen path->rcost = PR_COST_INIT; 2859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (li = 0; li < path->rlen; li++) { 2860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (li == 0) { 2861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen path->rcost = path->rcost + path->rele[li].rprodprefcost; 2862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = picokpr_getTokSetWP(path->rele[li].rnetwork, path->rele[li].rtok); 2864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = picokpr_getTokSetNP(path->rele[li].rnetwork, path->rele[li].rtok); 2865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_COST & wpset) != 0) { 2866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((PR_TSE_MASK_LEX & wpset) == PR_TSE_MASK_LEX) && ((PR_TSE_MASK_LETTER & npset) == 0)) { 2867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lfirst) { 2868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen path->rcost = path->rcost - PR_COST + pr_attrVal(path->rele[li].rnetwork, path->rele[li].rtok, PR_TSECost); 2869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen path->rcost = path->rcost - PR_COST; 2871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfirst = FALSE; 2873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen path->rcost = path->rcost - PR_COST + pr_attrVal(path->rele[li].rnetwork, path->rele[li].rtok, PR_TSECost); 2875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lfirst = TRUE; 2876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_hasToken(& wpset,& npset)) { 2878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen path->rcost = path->rcost - PR_COST; 2879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_PATHCOST 2881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((path->rele[li].rprodname != 0)) { 2882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen strp = picokpr_getVarStrPtr(path->rele[li].rnetwork, path->rele[li].rprodname); 2883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_strcat(str, (picoos_char *)" "); 2884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_strcat(str, strp); 2885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 2887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_PATHCOST 2889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp cost: %i %s", path->rcost, str)); 2890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 2891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 2892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid pr_processToken (picodata_ProcessingUnit this, pr_subobj_t * pr) 2895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 2896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register struct pr_PathEle * with__0; 2897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool ldummy; 2898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 li; 2899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetNP npset; 2900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picokpr_TokSetWP wpset; 2901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 2902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen do { 2903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSContinue; 2904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->ractpath.rlen == 0)) { 2905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_getTopLevelToken(this, pr, FALSE)) { 2906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSContinue; 2907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->rbestpath.rlen == 0) { 2908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSNotFound; 2909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSFound; 2911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->maxPathLen < pr->ractpath.rlen) { 2914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->maxPathLen = pr->ractpath.rlen; 2915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0 = & pr->ractpath.rele[pr->ractpath.rlen - 1]; 2917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (with__0->rlState) { 2918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSInit: 2919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen npset = picokpr_getTokSetNP(with__0->rnetwork, with__0->rtok); 2920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen wpset = picokpr_getTokSetWP(with__0->rnetwork, with__0->rtok); 2921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PR_TSE_MASK_ACCEPT & npset) != 0){ 2922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (with__0->rdepth == 1) { 2923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_calcPathCost(&pr->ractpath); 2924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->rbestpath.rlen == 0) || (pr->ractpath.rcost < pr->rbestpath.rcost)) { 2925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rlen = pr->ractpath.rlen; 2926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rcost = pr->ractpath.rcost; 2927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (li = 0; li < pr->ractpath.rlen; li++) { 2928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rele[li] = pr->ractpath.rele[li]; 2929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetNextToken; 2932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetProdContToken; 2934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PR_TSE_MASK_PROD & wpset) != 0) { 2936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetProdToken; 2937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PR_TSE_MASK_OUT & wpset) != 0) { 2938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetNextToken; 2939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_hasToken(& wpset,& npset)) { 2940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetToken; 2941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetNextToken; 2943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGetProdToken: 2946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetAltToken; 2947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldummy = pr_getProdToken(this, pr); 2948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGetProdContToken: 2950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetAltToken; 2951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldummy = pr_getProdContToken(this, pr); 2952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGoBack: 2954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen--; 2955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGetToken: 2957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_getToken(this, pr)) { 2958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSMatch; 2959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->forceOutput) { 2960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetAltToken; 2961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetToken2; 2963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSNeedToken; 2964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGetToken2: 2967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_getToken(this, pr)) { 2968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSMatch; 2969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 2970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGoBack; 2971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSMatch: 2974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pr_matchTokens(this, pr, & with__0->rcompare)) { 2975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_MSMatched: 2976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetNextToken; 2977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_MSMatchedContinue: 2979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetAltToken; 2980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldummy = pr_getNextMultiToken(this, pr); 2981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_MSMatchedMulti: 2983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetNextToken; 2984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldummy = pr_getNextMultiToken(this, pr); 2985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 2987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetAltToken; 2988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 2990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGetNextToken: 2992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGetAltToken; 2993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldummy = pr_getNextToken(this, pr); 2994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_LSGetAltToken: 2996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen with__0->rlState = PR_LSGoBack; 2997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen ldummy = pr_getAltToken(this, pr); 2998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 2999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("unhandled local state")); 3001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->nrIterations--; 3005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } while ((pr->rgState == PR_GSContinue) && (pr->nrIterations > 0)); 3006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid pr_process (picodata_ProcessingUnit this, pr_subobj_t * pr) 3010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (pr->rgState) { 3012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_GS_START: 3013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_GSFound: 3014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_GSNotFound: 3015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen = 0; 3016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rcost = PR_COST_INIT; 3017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rlen = 0; 3018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rcost = PR_COST_INIT; 3019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_getTopLevelToken(this, pr, TRUE)) { 3020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSContinue; 3021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSNotFound; 3023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_GSContinue: 3026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_processToken(this, pr); 3027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PR_GSNeedToken: 3029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSContinue; 3030b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 3032b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GS_START; 3033b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 3034b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3036b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3037b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3038b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_prepareItem (picodata_ProcessingUnit this, pr_subobj_t * pr, pr_ioItemPtr item) 3039b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ritems[pr->rnritems + 1] = item; 3041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rnritems++; 3042b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3043b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3044b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void pr_processItems (picodata_ProcessingUnit this, pr_subobj_t * pr) 3046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lit; 3048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_MemState lmemState; 3049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_getMemState(this, pr_WorkMem,& lmemState); 3051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((pr->rinItemList != NULL) && (pr->rinItemList->head.type != PICODATA_ITEM_TOKEN)) { 3053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = pr->rinItemList; 3054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp in (0)")); 3055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp out(0)")); 3056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rinItemList = pr->rinItemList->next; 3057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->next = NULL; 3058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PHONEME) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_START)) { 3059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = TRUE; 3060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PHONEME) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_END)) { 3061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = FALSE; 3062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->insidePhoneme && (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PLAY) || pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNSIG))) { 3064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & lit); 3065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_CONTEXT)) { 3066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_setContext(this, pr, lit->data); 3067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & lit); 3068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->rignore <= 0) { 3069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItemToOutItemList(this, pr, & pr->routItemList,& pr->rlastOutItem,lit); 3070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 3071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & lit); 3073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GS_START; 3075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rinItemList != NULL) { 3077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_process(this, pr); 3078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rgState == PR_GSNotFound) { 3079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = pr->rinItemList; 3080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rinItemList = pr->rinItemList->next; 3081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit->next = NULL; 3082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp in (2): '%s'", lit->data)); 3083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rignore <= 0) { 3084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp out(2): '%s'", lit->data)); 3085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PHONEME) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_START)) { 3088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = TRUE; 3089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PHONEME) && pr_isCmdInfo2(lit, PICODATA_ITEMINFO2_CMD_END)) { 3090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = FALSE; 3091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (((pr->rignore <= 0) && !((pr->insidePhoneme && (pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_PLAY) || pr_isCmdType(lit,PICODATA_ITEMINFO1_CMD_IGNSIG)))))) { 3093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItemToOutItemList(this, pr, & pr->routItemList,& pr->rlastOutItem,lit); 3094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 3095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, & lit); 3097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GS_START; 3099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rnritems = 0; 3100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->rgState == PR_GSFound) { 3101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_outputPath(this, pr); 3102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return; 3103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GS_START; 3104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rnritems = 0; 3105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rinItemList == NULL) { 3108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rlastInItem = NULL; 3109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (pr->rnritems == 0) { 3110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = pr->rinItemList; 3111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lit != NULL) { 3112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lit->head.type == PICODATA_ITEM_TOKEN) { 3113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_prepareItem(this, pr, lit); 3114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = lit->next; 3116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_resetMemState(this, pr_WorkMem,lmemState); 3119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern void pr_treatItem (picodata_ProcessingUnit this, pr_subobj_t * pr, pr_ioItemPtr item) 3124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr lit; 3126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_startItemList(& pr->routItemList,& pr->rlastOutItem); 3128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!PR_ENABLED || (pr->rgState == PR_GSNoPreproc)) { 3130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* preprocessing disabled or no preproc networks available: 3131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen append items directly to output item list */ 3132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp in (3): '%s'", item->data)); 3133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("pp out(3): '%s'", item->data)); 3134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItemToOutItemList(this, pr, & pr->routItemList,& pr->rlastOutItem,item); 3135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->actCtxChanged) { 3138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GS_START; 3139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rcost = PR_COST_INIT; 3140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen = 0; 3141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rcost = PR_COST_INIT; 3142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rlen = 0; 3143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->prodList = NULL; 3144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rnritems = 0; 3145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->actCtxChanged = FALSE; 3146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_isCmdType(item , PICODATA_ITEMINFO1_CMD_CONTEXT) || pr_isCmdType(item, PICODATA_ITEMINFO1_CMD_FLUSH)) { 3148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* context switch or flush: force processing and empty input item list */ 3149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->forceOutput = TRUE; 3150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_appendItem(this, & pr->rinItemList,& pr->rlastInItem, item); 3152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rnritems == 0) { 3153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = pr->rinItemList; 3154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (lit != NULL) { 3155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (lit->head.type == PICODATA_ITEM_TOKEN) { 3156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_prepareItem(this, pr, lit); 3157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lit = lit->next; 3159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (item->head.type == PICODATA_ITEM_TOKEN) { 3161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_prepareItem(this, pr, item); 3162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 3167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 3168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* *****************************************************************************/ 3169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3171e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivipico_status_t prReset(register picodata_ProcessingUnit this, picoos_int32 resetMode) 3172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 31737bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi 3174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 3175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr; 3176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 3178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 3179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr = (pr_subobj_t *) this->subObj; 3181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rinItemList = NULL; 3183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rlastInItem = NULL; 3184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->routItemList = NULL; 3185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rlastOutItem = NULL; 3186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rcost = PR_COST_INIT; 3187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ractpath.rlen = 0; 3188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rcost = PR_COST_INIT; 3189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rbestpath.rlen = 0; 3190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rnritems = 0; 3191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->ritems[0] = NULL; 3192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rignore = 0; 3193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->spellMode = 0; 3194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->maxPathLen = 0; 3195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->insidePhoneme = FALSE; 3196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->saveFile[0] = 0; 3197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outReadPos = 0; 3199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outWritePos = 0; 3200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->inBufLen = 0; 3201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GSNoPreproc; 3203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<PR_MAX_NR_PREPROC; i++) { 3204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->preproc[i] != NULL) { 3205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rgState = PR_GS_START; 3206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->actCtx = pr_findContext(pr->ctxList, (picoos_uchar*)PICO_CONTEXT_DEFAULT); 3209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->actCtxChanged = FALSE; 3210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->prodList = NULL; 3211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3212d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland if (((uintptr_t)pr->pr_WorkMem % PICOOS_ALIGN_SIZE) == 0) { 3213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->workMemTop = 0; 3214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3216d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland pr->workMemTop = PICOOS_ALIGN_SIZE - ((uintptr_t)pr->pr_WorkMem % PICOOS_ALIGN_SIZE); 3217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->maxWorkMemTop=0; 3219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->dynMemSize=0; 3220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->maxDynMemSize=0; 3221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* this is ok to be in 'initialize' because it is a private memory within pr. Creating a new mm 3222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * here amounts to resetting this internal memory 3223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 3224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->dynMemMM = picoos_newMemoryManager((void *)pr->pr_DynMem, PR_DYN_MEM_SIZE, 3225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*enableMemProt*/ FALSE); 3226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outOfMemory = FALSE; 3227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->forceOutput = FALSE; 3229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3230e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi if (resetMode == PICO_RESET_SOFT) { 32317bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi /*following initializations needed only at startup or after a full reset*/ 32327bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi return PICO_OK; 32337bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi } 3234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->xsampa_parser = picokfst_getFST(this->voice->kbArray[PICOKNOW_KBID_FST_XSAMPA_PARSE]); 3236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->svoxpa_parser = picokfst_getFST(this->voice->kbArray[PICOKNOW_KBID_FST_SVOXPA_PARSE]); 3238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->xsampa2svoxpa_mapper = picokfst_getFST(this->voice->kbArray[PICOKNOW_KBID_FST_XSAMPA2SVOXPA]); 3240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 3244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3247e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivipico_status_t prInitialize(register picodata_ProcessingUnit this, picoos_int32 resetMode) 3248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 3250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 3251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 3252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 3254e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi return prReset(this, resetMode); 3255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t prTerminate(register picodata_ProcessingUnit this) 3259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 3261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_step_result_t prStep(register picodata_ProcessingUnit this, picoos_int16 mode, picoos_uint16 * numBytesOutput); 3264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t prSubObjDeallocate(register picodata_ProcessingUnit this, 3266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_MemoryManager mm) 3267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr; 3269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 3271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr = (pr_subobj_t *) this->subObj; 3272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mm = mm; /* avoid warning "var not used in this function"*/ 3273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max pr_WorkMem: %i of %i", pr->maxWorkMemTop, PR_WORK_MEM_SIZE)); 3274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max pr_DynMem: %i of %i", pr->maxDynMemSize, PR_DYN_MEM_SIZE)); 3275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeContextList(this); 3277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &this->subObj); 3278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 3280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_ProcessingUnit picopr_newPreprocUnit(picoos_MemoryManager mm, picoos_Common common, 3283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_CharBuffer cbIn, picodata_CharBuffer cbOut, 3284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Voice voice) 3285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 i; 3287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_subobj_t * pr; 3288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picodata_ProcessingUnit this = picodata_newProcessingUnit(mm, common, cbIn, cbOut, voice); 3291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this == NULL) { 3292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 3293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->initialize = prInitialize; 3296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("set this->step to prStep")); 3297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->step = prStep; 3298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->terminate = prTerminate; 3299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subDeallocate = prSubObjDeallocate; 3300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->subObj = picoos_allocate(mm, sizeof(pr_subobj_t)); 3301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MEM || PR_TRACE_MAX_MEM 3302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("preproc alloc: %i", sizeof(pr_subobj_t))); 3303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("max dyn size: %i", PR_MAX_PATH_LEN*((((PR_IOITEM_MIN_SIZE+2) + PICOOS_ALIGN_SIZE - 1) / PICOOS_ALIGN_SIZE) * PICOOS_ALIGN_SIZE + 16))); 3304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 3305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this->subObj == NULL) { 3306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *)&this); 3307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 3308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr = (pr_subobj_t *) this->subObj; 3310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->graphs = picoktab_getGraphs(this->voice->kbArray[PICOKNOW_KBID_TAB_GRAPHS]); 3312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->preproc[0] = picokpr_getPreproc(this->voice->kbArray[PICOKNOW_KBID_TPP_MAIN]); 3313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<PICOKNOW_MAX_NUM_UTPP; i++) { 3314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->preproc[1+i] = picokpr_getPreproc(this->voice->kbArray[PICOKNOW_KBID_TPP_USER_1+i]); 3315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr_createContextList(this) != PICO_OK) { 3318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeContextList(this); 3319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm, (void *)&this); 3320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return NULL; 3321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 33227bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi prInitialize(this, PICO_RESET_FULL); 3323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return this; 3324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 3327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * fill up internal buffer 3328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 3329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_step_result_t prStep(register picodata_ProcessingUnit this, 3330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int16 mode, picoos_uint16 * numBytesOutput) 3331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 3332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen register pr_subobj_t * pr; 3333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_ioItemPtr it; 3334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 len, i; 3335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t rv; 3336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 id; 3337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 info1; 3338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 info2; 3339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 nrUtfChars; 3340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 pos; 3341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_utf8char inUtf8char, outUtf8char; 3342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 inUtf8charlen, outUtf8charlen; 3343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int32 lenpos; 3344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool ldone; 3345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_bool split; 3346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == this->subObj) { 3348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 3349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr = (pr_subobj_t *) this->subObj; 3351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return PICODATA_PU_ERROR; 3353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen mode = mode; /* avoid warning "var not used in this function"*/ 3355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->nrIterations = PR_MAX_NR_ITERATIONS; 3356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *numBytesOutput = 0; 3358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (1) { /* exit via return */ 3359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->outWritePos - pr->outReadPos) > 0) { 3360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* deliver the data in the output buffer */ 3361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picodata_cbPutItem(this->cbOut, &pr->outBuf[pr->outReadPos], pr->outWritePos - pr->outReadPos, numBytesOutput) == PICO_OK) { 3362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outReadPos += *numBytesOutput; 3363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outWritePos == pr->outReadPos) { 3364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outWritePos = 0; 3365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outReadPos = 0; 3366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_OUT_FULL; 3370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if (pr->routItemList != NULL) { 3373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* there are item(s) in the output item list, move them to the output buffer */ 3374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it = pr->routItemList; 3375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->routItemList = pr->routItemList->next; 3376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->routItemList == NULL) { 3377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->rlastOutItem = NULL; 3378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (it->head.type == PICODATA_ITEM_TOKEN) { 3380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((it->head.info1 != PICODATA_ITEMINFO1_TOKTYPE_SPACE) && (it->head.len > 0)) { 3381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen nrUtfChars = picobase_utf8_length(it->data, PR_MAX_DATA_LEN); 3382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((nrUtfChars == 1) 3383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && (((id = picoktab_graphOffset(pr->graphs, it->data)) > 0)) 3384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen && picoktab_getIntPropPunct(pr->graphs, id, &info1, &info2)) { 3385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* single punctuation chars have to be delivered as PICODATA_ITEM_PUNC items 3386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen instead as PICODATA_ITEM_WORDGRAPH items */ 3387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEM_PUNC; 3388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = info1; 3389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = info2; 3390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = 0; 3391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG], 3392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint8 *)"pr: ", pr->outBuf, pr->outWritePos); 3393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* do subgraphs substitutions and deliver token items as PICODATA_ITEM_WORDGRAPH 3396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen items to the output buffer */ 3397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen split = FALSE; 3398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEM_WORDGRAPH; 3399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEMINFO1_NA; 3400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEMINFO2_NA; 3401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lenpos=pr->outWritePos; 3402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = 0; 3403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pos = 0; 3404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen len = pr_strlen(it->data); 3405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (pos < (picoos_uint32)len) { 3406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picobase_get_next_utf8char(it->data, it->head.len, &pos, inUtf8char)) { 3407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (inUtf8char[0] <= 32) { 3408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* do not add whitespace characters to the output buffer, 3409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen but initiate token splitting instead 3410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 3412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen split = TRUE; 3413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if (((id = picoktab_graphOffset(pr->graphs, inUtf8char)) > 0) && picoktab_getStrPropGraphsubs1(pr->graphs, id, outUtf8char)) { 3415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (split) { 3416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* split the token, eg. start a new item */ 3417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEM_WORDGRAPH; 3418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEMINFO1_NA; 3419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEMINFO2_NA; 3420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lenpos=pr->outWritePos; 3421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = 0; 3422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outUtf8charlen = picobase_det_utf8_length(outUtf8char[0]); 3424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<outUtf8charlen; i++) { 3425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = outUtf8char[i]; 3426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[lenpos]++; 3427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoktab_getStrPropGraphsubs2(pr->graphs, id, outUtf8char)) { 3429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen outUtf8charlen = picobase_det_utf8_length(outUtf8char[0]); 3430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<outUtf8charlen; i++) { 3431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = outUtf8char[i]; 3432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[lenpos]++; 3433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen split = FALSE; 3436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (split) { 3439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* split the token, eg. start a new item */ 3440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEM_WORDGRAPH; 3441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEMINFO1_NA; 3442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = PICODATA_ITEMINFO2_NA; 3443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen lenpos=pr->outWritePos; 3444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = 0; 3445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen inUtf8charlen = picobase_det_utf8_length(inUtf8char[0]); 3447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<inUtf8charlen; i++) { 3448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = inUtf8char[i]; 3449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[lenpos]++; 3450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen split = FALSE; 3452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG], 3456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint8 *)"pr: ", pr->outBuf, pr->outWritePos); 3457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* handle all other item types and put them to the output buffer */ 3462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = it->head.type; 3463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = it->head.info1; 3464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = it->head.info2; 3465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = it->head.len; 3466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<it->head.len; i++) { 3467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->outBuf[pr->outWritePos++] = it->data[i]; 3468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG], 3470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_uint8 *)"pr: ", pr->outBuf, pr->outWritePos); 3471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_disposeItem(this, &it); 3473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if (pr->forceOutput) { 3475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_processItems(this, pr); 3476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->rinItemList == NULL) { 3477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->forceOutput = FALSE; 3478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if ((pr->rgState != PR_GSNeedToken) && (pr->rinItemList != NULL)) { 3481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_processItems(this, pr); 3482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else if (pr->inBufLen > 0) { 3484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* input data is available in the input buffer, copy it to an input item 3485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen and treat it */ 3486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->dynMemSize < (45*PR_DYN_MEM_SIZE / 100)) { 3487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_newItem(this, pr_DynMem, &it, pr->inBuf[0], pr->inBuf[3], /*inItem*/TRUE); 3488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return PICODATA_PU_ERROR; 3489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->head.type = pr->inBuf[0]; 3490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->head.info1 = pr->inBuf[1]; 3491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->head.info2 = pr->inBuf[2]; 3492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->head.len = pr->inBuf[3]; 3493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<pr->inBuf[3]; i++) { 3494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->data[i] = pr->inBuf[4+i]; 3495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->data[pr->inBuf[3]] = 0; 3497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((pr->inBuf[0] == PICODATA_ITEM_TOKEN) && ((pr->inBuf[1] == PICODATA_ITEMINFO1_TOKTYPE_DIGIT))) { 3498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->val = tok_tokenDigitStrToInt(this, pr, it->data); 3499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->val = 0; 3501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->inBuf[0] == PICODATA_ITEM_TOKEN) { 3503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picobase_lowercase_utf8_str(it->data,it->strci,PR_MAX_DATA_LEN, &ldone); 3504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_firstLetterToLowerCase(it->data,it->strcis); 3505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->alc = picobase_is_utf8_lowercase(it->data,PR_MAX_DATA_LEN); 3506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->auc = picobase_is_utf8_uppercase(it->data,PR_MAX_DATA_LEN); 3507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it->suc = pr_isSUC(it->data); 3508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_treatItem(this, pr, it); 3511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->outOfMemory) return PICODATA_PU_ERROR; 3512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr_processItems(this, pr); 3513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->inBufLen = 0; 3514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->forceOutput = TRUE; 3517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen else { 3520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* there is not data in the output buffer and there is no data in the output item list, so 3521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen check whether input data is available */ 3522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen rv = picodata_cbGetItem(this->cbIn, pr->inBuf, IN_BUF_SIZE+PICODATA_ITEM_HEADSIZE, &pr->inBufLen); 3523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == rv) { 3524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (PICO_EOF == rv) { 3525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* there was no item in the char buffer */ 3526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_IDLE; 3527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if ((PICO_EXC_BUF_UNDERFLOW == rv) || (PICO_EXC_BUF_OVERFLOW == rv)) { 3528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->inBufLen = 0; 3529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("problem getting item")); 3530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, rv, NULL, NULL); 3531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 3532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 3533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pr->inBufLen = 0; 3534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("problem getting item, unhandled")); 3535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, rv, NULL, NULL); 3536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 3537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if PR_TRACE_MEM 3540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_INFO(("memory: dyn=%u, work=%u", pr->dynMemSize, pr->workMemTop)); 3541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 3542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (pr->nrIterations <= 0) { 3543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_BUSY; 3544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 3545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } /* while */ 3546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICODATA_PU_ERROR; 3547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 3550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 3551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 3552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 3555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */ 3556