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, &ltype) &&
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, &ltype)) {
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