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 picoacph.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * accentuation and phrasing
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 "picoos.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picobase.h"
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodata.h"
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoacph.h"
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdt.h"
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoklex.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/* PU acphStep states */
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_STEPSTATE_COLLECT       0
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_STEPSTATE_PROCESS_PHR  12
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_STEPSTATE_PROCESS_ACC  13
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_STEPSTATE_FEED          2
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* boundary strength state */
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_BOUNDSTRENGTH_SSEP      0 /* sentence separator */
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SA_BOUNDSTRENGTH_PPHR      1 /* primary phrase separator */
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*  subobject    : AccPhrUnit
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  shortcut     : acph
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *  context size : one phrase, max. 30 non-PUNC items, for non-processed items
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *                 one item if internal input empty
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picoacph
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * <b> Pico Accentuation and Phrasing </b>\n
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  internal buffers:
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - headx : array for extended item heads of fixed size (head plus
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    index for content, plus two fields for boundary strength/type)
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - cbuf : buffer for item contents (referenced by index in
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    headx).
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  0. bottom up filling of items in headx and cbuf
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  1. phrasing (right-to-left):
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     e.g. from      WP WP WP       WP WP PUNC  WP WP PUNC        WP WP WP PUNC  FLUSH    \n
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     e.g. to  BSBEG WP WP WP BPHR3 WP WP BPHR1 WP WP BSEND BSBEG WP WP WP BSEND BTERM    \n
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen              |1                         |2                |3                   |4        \n
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     2-level bound state: The internal buffer contains one primary phrase (sometimes forced, if buffer
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     allmost full), with the trailing PUNCT item included (last item).\n
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     If the trailing PUNC is a a primary phrase separator, the
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       item is not output, but instead, the bound state is set to PPHR, so that the correct BOUND can
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       be output at the start of the next primary phrase.\n
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     Otherwise,
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       the item is converted to the corresponding BOUND and output. the bound state is set to SSEP,
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       so that a BOUND of type SBEG is output at the start of the next primary phrase.
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     trailing PUNC item       bound states                                    \n
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                              SSEP           PPHR                            \n
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       PUNC(SENTEND, X)       B(B,X)>SSEP    B(P1,X)>SSEP  (X = T | Q | E)    \n
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       PUNC(FLUSH, T)         B(B,T)>SSEP*    B(P1,T)>SSEP                    \n
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       PUNC(PHRASEEND, P)     B(B,P)>PPHR    B(P1,P)>PPHR                    \n
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       PUNC(PHRASEEND, FORC)  B(B,P)>PPHR    B(P1,P)>PPHR                    \n
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    If more than one sentence separators follow each other (e.g. SEND-FLUSH, SEND-SEND) then
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     all but the first will be treated as an (empty) phrase containing just this item.
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen     If this (single) item is a flush, creation of SBEG is suppressed.
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - dtphr phrasing tree ("subphrasing")
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    determines
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen      - BOUND_PHR2
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen      - BOUND_PHR3
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - boundary strenghts are determined for every word (except the
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    first one) from right-to-left. The boundary types mark the phrase
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    type of the phrase following the boundary.
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - number of items actually changed (new BOUND items added): because
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    of fixed size without content, two fields are contained in headx
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    to indicate if a BOUND needs to be added to the LEFT of the item.
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    -> headx further extended with boundary strength and type info to
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    indicate that to the left of the headx ele a BOUND needs to be
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    inserted when outputting.
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  2. accentuation:
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  - number of items unchanged, content unchanged, only head info changes
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen  -> changed in place in headx
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct {
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_itemhead_t head;
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 cind;
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 boundstrength;  /* bstrength to the left, 0 if not set */
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 boundtype;      /* btype for following phrase, 0 if not set */
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picoacph_headx_t;
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct acph_subobj {
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 procState; /* for next processing step decision */
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 boundStrengthState;    /* boundary strength state */
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 inspaceok;      /* flag: headx/cbuf has space for an item */
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 needsmoreitems; /* flag: need more items */
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 tmpbuf[PICODATA_MAX_ITEMSIZE];  /* tmp. location for an item */
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoacph_headx_t headx[PICOACPH_MAXNR_HEADX];
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 headxBottom; /* bottom */
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 headxLen;    /* length, 0 if empty */
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 cbuf[PICOACPH_MAXSIZE_CBUF];
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 cbufBufSize; /* actually allocated size */
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 cbufLen;     /* length, 0 if empty */
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* tab knowledge base */
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoktab_Phones tabphones;
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* dtphr knowledge base */
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokdt_DtPHR dtphr;
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* dtacc knowledge base */
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokdt_DtACC dtacc;
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} acph_subobj_t;
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
160e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivistatic pico_status_t acphInitialize(register picodata_ProcessingUnit this, picoos_int32 resetMode) {
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph_subobj_t * acph;
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("calling"));
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em,
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       PICO_ERR_NULLPTR_ACCESS, NULL, NULL);
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph = (acph_subobj_t *) this->subObj;
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->procState = SA_STEPSTATE_COLLECT;
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->boundStrengthState = SA_BOUNDSTRENGTH_SSEP;
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->inspaceok = TRUE;
175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->needsmoreitems = TRUE;
176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->headxBottom = 0;
178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->headxLen = 0;
179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->cbufBufSize = PICOACPH_MAXSIZE_CBUF;
180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->cbufLen = 0;
181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* init headx, cbuf */
183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOACPH_MAXNR_HEADX; i++){
184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].head.type = 0;
185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].head.info1 = 0;
186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].head.info2 = 0;
187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].head.len = 0;
188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].cind = 0;
189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].boundstrength = 0;
190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].boundtype = 0;
191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < PICOACPH_MAXSIZE_CBUF; i++) {
193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->cbuf[i] = 0;
194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
196e9f72c8954f29f10cb4feb16d328a1b5c1fd7169Jean-Michel Trivi    if (resetMode == PICO_RESET_SOFT) {
1977bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        /*following initializations needed only at startup or after a full reset*/
1987bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi        return PICO_OK;
1997bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi    }
2007bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi
201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* kb tabphones */
202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->tabphones =
203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoktab_getPhones(this->voice->kbArray[PICOKNOW_KBID_TAB_PHONES]);
204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (acph->tabphones == NULL) {
205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING,
206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("got tabphones"));
209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef PICO_DEBUG_1
211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    {
212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_uint16 itmp;
213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        for (itmp = 0; itmp < 256; itmp++) {
214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_hasVowelProp(acph->tabphones, itmp)) {
215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones hasVowel: %d", itmp));
216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_hasDiphthProp(acph->tabphones, itmp)) {
218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones hasDiphth: %d", itmp));
219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_hasGlottProp(acph->tabphones, itmp)) {
221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones hasGlott: %d", itmp));
222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_hasNonsyllvowelProp(acph->tabphones, itmp)) {
224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones hasNonsyllvowel: %d", itmp));
225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_hasSyllconsProp(acph->tabphones, itmp)) {
227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones hasSyllcons: %d", itmp));
228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_isPrimstress(acph->tabphones, itmp)) {
231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones isPrimstress: %d", itmp));
232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_isSecstress(acph->tabphones, itmp)) {
234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones isSecstress: %d", itmp));
235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_isSyllbound(acph->tabphones, itmp)) {
237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones isSyllbound: %d", itmp));
238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (picoktab_isPause(acph->tabphones, itmp)) {
240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("tabphones isPause: %d", itmp));
241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("tabphones primstressID: %d",
245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       picoktab_getPrimstressID(acph->tabphones)));
246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("tabphones secstressID: %d",
247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       picoktab_getSecstressID(acph->tabphones)));
248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("tabphones syllboundID: %d",
249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       picoktab_getSyllboundID(acph->tabphones)));
250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("tabphones pauseID: %d",
251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       picoktab_getPauseID(acph->tabphones)));
252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* kb dtphr */
257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->dtphr = picokdt_getDtPHR(this->voice->kbArray[PICOKNOW_KBID_DT_PHR]);
258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (acph->dtphr == NULL) {
259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING,
260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("got dtphr"));
263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* kb dtacc */
265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph->dtacc = picokdt_getDtACC(this->voice->kbArray[PICOKNOW_KBID_DT_ACC]);
266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (acph->dtacc == NULL) {
267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(this->common->em, PICO_EXC_KB_MISSING,
268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("got dtacc"));
271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t acphStep(register picodata_ProcessingUnit this,
276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_int16 mode,
277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint16 *numBytesOutput);
278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t acphTerminate(register picodata_ProcessingUnit this)
280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{
281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t acphSubObjDeallocate(register picodata_ProcessingUnit this,
285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        picoos_MemoryManager mm) {
286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    mm = mm;        /* avoid warning "var not used in this function"*/
287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(this->common->mm, (void *) &this->subObj);
289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicodata_ProcessingUnit picoacph_newAccPhrUnit(picoos_MemoryManager mm,
295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                              picoos_Common common,
296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                              picodata_CharBuffer cbIn,
297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                              picodata_CharBuffer cbOut,
298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                              picorsrc_Voice voice) {
299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_ProcessingUnit this;
300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this = picodata_newProcessingUnit(mm, common, cbIn, cbOut, voice);
302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this == NULL) {
303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->initialize = acphInitialize;
307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("set this->step to acphStep"));
308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->step = acphStep;
309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->terminate = acphTerminate;
310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subDeallocate = acphSubObjDeallocate;
311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subObj = picoos_allocate(mm, sizeof(acph_subobj_t));
312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this->subObj == NULL) {
313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm, (void *)&this);
314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM, NULL, NULL);
315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
3187bc39b0d41efe0d8733490d54e14bc392d9f0b6dJean-Michel Trivi    acphInitialize(this, PICO_RESET_FULL);
319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return this;
320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* PROCESS_PHR/ACC support functions */
325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphGetNrSylls(register picodata_ProcessingUnit this,
329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 register acph_subobj_t *acph,
330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 const picoos_uint16 ind) {
331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 ch;
333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 count;
334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    count = 1;
336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < acph->headx[ind].head.len; i++) {
337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        ch = acph->cbuf[acph->headx[ind].cind + i];
338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (picoktab_isSyllbound(acph->tabphones, ch)) {
339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            count++;
340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return count;
343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* PROCESS_PHR functions */
348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* find next POS to the left of 'ind' and return its POS and index */
352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphPhrItemSeqGetPosLeft(register picodata_ProcessingUnit this,
353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           register acph_subobj_t *acph,
354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           const picoos_uint16 ind,
355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           picoos_uint16 *leftind) {
356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 val;
357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    val = PICOKDT_EPSILON;
360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = ind - 1; ((val == PICOKDT_EPSILON) && (i >= 0)); i--) {
361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((acph->headx[i].head.type == PICODATA_ITEM_WORDPHON)) {
362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            val = acph->headx[i].head.info1;
363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *leftind = i + 1;
366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return val;
367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* right-to-left, for each WORDPHON do phr */
371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t acphSubPhrasing(register picodata_ProcessingUnit this,
372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   register acph_subobj_t *acph) {
373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokdt_classify_result_t dtres;
374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 valbuf[5];
375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrwordspre;
376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrwordsfol;
377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrsyllsfol;
378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lastprev2; /* last index of POS(es) found to the left */
379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 curpos;     /* POS(es) of current word */
380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 upbound;   /* index of last WORDPHON item (with POS) */
381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 okay;
382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 nosubphrases;
383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set initial values */
386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    okay = TRUE;
387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nosubphrases = TRUE;
388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    curpos = PICOKDT_EPSILON;   /* needs to be in 2^8 */
389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set upbound to last WORDPHON, don't worry about first one */
391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    upbound = acph->headxLen - 1;
392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((upbound > 0) &&
393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (acph->headx[upbound].head.type != PICODATA_ITEM_WORDPHON)) {
394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        upbound--;
395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* zero or one WORDPHON, no subphrasing needed, but handling of
398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen       BOUND strength state is needed */
399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (upbound <= 0) {
400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* phrase not containing more than one WORDPHON */
401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("less than two WORDPHON in phrase -> no subphrasing"));
402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lastprev2 = upbound;
405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set initial nr pre/fol words/sylls, upbound is ind of last WORDPHON */
407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrwordsfol = 0;
408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrsyllsfol = 0;
409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrwordspre = 0;
410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < upbound; i++) {
411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (acph->headx[i].head.type == PICODATA_ITEM_WORDPHON) {
412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            nrwordspre++;
413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrwordspre++;    /* because we later have a decrement before being used */
417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set POS of current word in valbuf[1], will be shifted right afterwards */
420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    valbuf[1] = acph->headx[upbound].head.info1;
421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* find first POS to the left and set valbuf[0] */
422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    valbuf[0] = acphPhrItemSeqGetPosLeft(this, acph, lastprev2, &lastprev2);
423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 2; i < 5; i++) {
424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[i] = PICOKDT_EPSILON;
425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("headxLen: %d", acph->headxLen));
428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* at least two WORDPHON items */
430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* process from right-to-left all items in headx, except for 1st WORDPHON */
431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = upbound; (i > 0) && (nrwordspre > 1); i--) {
432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        okay = TRUE;
433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("iter: %d, type: %c", i, acph->headx[i].head.type));
435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* if not (WORDPHON) */
437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((acph->headx[i].head.type != PICODATA_ITEM_WORDPHON)) {
438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            continue;
439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("iter: %d, curpos: %d", i, acph->headx[i].head.info1));
442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* get and set POS of current item, must be WORDPHON */
444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        curpos = acph->headx[i].head.info1;
445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* no continue so far => at [i] we have a WORDPHON item */
447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* shift all POS elements one position to the right */
448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[4] = valbuf[3];
449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[3] = valbuf[2];
450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[2] = valbuf[1];
451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[1] = valbuf[0];
452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* find next POS to the left and set valbuf[0] */
453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[0] = acphPhrItemSeqGetPosLeft(this, acph, lastprev2, &lastprev2);
454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* better check double than never */
456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (curpos != valbuf[2]) {
457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("syncing POS"));
458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR,
459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            valbuf[2] = curpos;
461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        nrwordsfol++;
464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        nrsyllsfol += acphGetNrSylls(this, acph, i);
465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        nrwordspre--;
466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("%d: [%d,%d|%d|%d,%d|%d,%d,%d]",
468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       i, valbuf[0], valbuf[1], valbuf[2], valbuf[3],
469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       valbuf[4], nrwordspre, nrwordsfol, nrsyllsfol));
470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* no continue so far => subphrasing needed */
472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* construct input vector, which is set in dtphr */
473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!picokdt_dtPHRconstructInVec(acph->dtphr, valbuf[0], valbuf[1],
474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         valbuf[2], valbuf[3], valbuf[4],
475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         nrwordspre, nrwordsfol, nrsyllsfol)) {
476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* error constructing invec */
477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem with invec"));
478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR,
479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* classify */
483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (okay && (!picokdt_dtPHRclassify(acph->dtphr))) {
484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* error doing classification */
485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem classifying"));
486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_CLASSIFICATION,
487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* decompose */
491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (okay && (!picokdt_dtPHRdecomposeOutClass(acph->dtphr, &dtres))) {
492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* error decomposing */
493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem decomposing"));
494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_OUTVECTOR,
495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (okay && dtres.set) {
500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("%d - inpos: %d, out: %d", i,valbuf[2],dtres.class));
501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem determining subphrase boundary strength"));
503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtres.class = PICODATA_ITEMINFO1_ERR;
504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (dtres.class > 255) {
507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("dt class outside valid range, setting to PHR0"));
508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtres.class = PICODATA_ITEMINFO1_BOUND_PHR0;
509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[i].boundstrength = (picoos_uint8)dtres.class;
511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((dtres.class == PICODATA_ITEMINFO1_BOUND_PHR2) ||
512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (dtres.class == PICODATA_ITEMINFO1_BOUND_PHR3)) {
513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (nosubphrases) {
514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* it's the last secondary phrase in the primary phrase */
515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* add type info */
516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                switch (acph->headx[acph->headxLen - 1].head.info2) {
517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case PICODATA_ITEMINFO2_PUNC_SENT_T:
518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[i].boundtype =
519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODATA_ITEMINFO2_BOUNDTYPE_T;
520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case PICODATA_ITEMINFO2_PUNC_SENT_Q:
522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[i].boundtype =
523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODATA_ITEMINFO2_BOUNDTYPE_Q;
524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case PICODATA_ITEMINFO2_PUNC_SENT_E:
526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[i].boundtype =
527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODATA_ITEMINFO2_BOUNDTYPE_E;
528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case PICODATA_ITEMINFO2_PUNC_PHRASE:
530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    case PICODATA_ITEMINFO2_PUNC_PHRASE_FORCED:
531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[i].boundtype =
532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODATA_ITEMINFO2_BOUNDTYPE_P;
533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    default:
535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_WARN(("invalid boundary type, not set"));
536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        break;
537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                nosubphrases = FALSE;
539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headx[i].boundtype =
542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODATA_ITEMINFO2_BOUNDTYPE_P;
543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* reset nr following words and sylls counters */
545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            nrwordsfol = 0;
546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            nrsyllsfol = 0;
547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* process first item, add bound-info */
551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (acph->boundStrengthState) {
552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case SA_BOUNDSTRENGTH_SSEP:
553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            acph->headx[0].boundstrength =
554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODATA_ITEMINFO1_BOUND_SBEG;
555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case SA_BOUNDSTRENGTH_PPHR:
557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            acph->headx[0].boundstrength =
558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODATA_ITEMINFO1_BOUND_PHR1;
559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("invalid boundary strength, not set"));
562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set boundary strength state */
566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    switch (acph->headx[acph->headxLen - 1].head.info1) {
567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEMINFO1_PUNC_SENTEND:
568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEMINFO1_PUNC_FLUSH:
569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            acph->boundStrengthState = SA_BOUNDSTRENGTH_SSEP;
570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        case PICODATA_ITEMINFO1_PUNC_PHRASEEND:
572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            acph->boundStrengthState = SA_BOUNDSTRENGTH_PPHR;
573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        default:
575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("invalid boundary strength state, not changed"));
576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            break;
577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (nosubphrases) {
580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* process first item, add type info */
581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (acph->headx[acph->headxLen - 1].head.info2) {
582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEMINFO2_PUNC_SENT_T:
583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headx[0].boundtype =
584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODATA_ITEMINFO2_BOUNDTYPE_T;
585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEMINFO2_PUNC_SENT_Q:
587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headx[0].boundtype =
588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODATA_ITEMINFO2_BOUNDTYPE_Q;
589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEMINFO2_PUNC_SENT_E:
591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headx[0].boundtype =
592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODATA_ITEMINFO2_BOUNDTYPE_E;
593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEMINFO2_PUNC_PHRASE:
595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case PICODATA_ITEMINFO2_PUNC_PHRASE_FORCED:
596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headx[0].boundtype =
597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODATA_ITEMINFO2_BOUNDTYPE_P;
598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_WARN(("invalid boundary type, not set"));
601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        acph->headx[0].boundtype =
605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODATA_ITEMINFO2_BOUNDTYPE_P;
606b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* PROCESS_ACC functions */
614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* find next POS to the left of 'ind' and return its POS and index */
617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphAccItemSeqGetPosLeft(register picodata_ProcessingUnit this,
618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           register acph_subobj_t *acph,
619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           const picoos_uint16 ind,
620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           picoos_uint16 *leftind) {
621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 val;
622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    val = PICOKDT_EPSILON;
625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = ind - 1; ((val == PICOKDT_EPSILON) && (i >= 0)); i--) {
626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((acph->headx[i].head.type == PICODATA_ITEM_WORDPHON)) {
627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            val = acph->headx[i].head.info1;
628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *leftind = i + 1;
631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return val;
632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* s1: nr sylls in word before the first primary stressed syll,
636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   s2: nr sylls in word after (but excluding) the first primary stressed syll */
637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphAccNrSyllParts(register picodata_ProcessingUnit this,
638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     register acph_subobj_t *acph,
639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     const picoos_uint16 ind,
640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint8 *s1,
641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint8 *s2) {
642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 pind;
643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 pend;    /* phone string start+len */
644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 afterprim;
645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* check ind is in valid range */
647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (ind >= acph->headxLen) {
648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *s1 = 0;
652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *s2 = 0;
653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    afterprim = FALSE;
654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pend = acph->headx[ind].cind + acph->headx[ind].head.len;
655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (pind = acph->headx[ind].cind; pind < pend; pind++) {
656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (picoktab_isPrimstress(acph->tabphones, acph->cbuf[pind])) {
657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            afterprim = TRUE;
658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else if (picoktab_isSyllbound(acph->tabphones, acph->cbuf[pind])) {
659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (afterprim) {
660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (*s2)++;
661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (*s1)++;
663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (afterprim) {
667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*s2)++;
668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*s1)++;
670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* exclude the stressed syllable */
673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((*s2) > 0) {
674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*s2)--;
675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* handle the case when there is no primstress */
677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (!afterprim) {
678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*s2) = (*s1);
679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphAccGetNrsRight(register picodata_ProcessingUnit this,
685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     register acph_subobj_t *acph,
686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     const picoos_uint16 ind,
687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint16 *nrwordsfol,
688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint16 *nrsyllsfol,
689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint16 *footwordsfol,
690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint16 *footsyllsfol) {
691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 s1;
693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 s2;
694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (!acphAccNrSyllParts(this, acph, ind, &s1, &s2)) {
696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *nrwordsfol = 0;
700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *nrsyllsfol = s2;
701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = ind + 1;
702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i < acph->headxLen) &&
703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (acph->headx[i].boundstrength == PICODATA_ITEMINFO1_BOUND_PHR0)) {
704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (acph->headx[i].head.type == PICODATA_ITEM_WORDPHON) {
705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*nrwordsfol)++;
706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *nrsyllsfol += acphGetNrSylls(this, acph, i);
707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *footwordsfol = 0;
712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *footsyllsfol = s2;
713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = ind + 1;
714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i < acph->headxLen) &&
715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (acph->headx[i].head.info2 != PICODATA_ACC1)) {
716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (acph->headx[i].head.type == PICODATA_ITEM_WORDPHON) {
717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*footwordsfol)++;
718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *footsyllsfol += acphGetNrSylls(this, acph, i);
719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i++;
721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((i < acph->headxLen) && (acph->headx[i].head.info2 == PICODATA_ACC1)) {
723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!acphAccNrSyllParts(this, acph, i, &s1, &s2)) {
724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return FALSE;
725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *footsyllsfol += s1;
727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphAccGetNrsLeft(register picodata_ProcessingUnit this,
733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    register acph_subobj_t *acph,
734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    const picoos_uint16 ind,
735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_uint16 *nrwordspre,
736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_uint16 *nrsyllspre) {
737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 i;
738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 s1;
739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 s2;
740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (!acphAccNrSyllParts(this, acph, ind, &s1, &s2)) {
742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *nrwordspre = 0;
746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *nrsyllspre = s1;
747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    i = ind - 1;
748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((i >= 0) &&
749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (acph->headx[i].boundstrength == PICODATA_ITEMINFO1_BOUND_PHR0)) {
750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (acph->headx[i].head.type == PICODATA_ITEM_WORDPHON) {
751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (*nrwordspre)++;
752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            *nrsyllspre += acphGetNrSylls(this, acph, i);
753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i--;
755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if ((acph->headx[i].boundstrength != PICODATA_ITEMINFO1_BOUND_PHR0) &&
758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (acph->headx[i].head.type == PICODATA_ITEM_WORDPHON)) {
759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        (*nrwordspre)++;
760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *nrsyllspre += acphGetNrSylls(this, acph, i);
761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* return TRUE if wordphon contains no stress, FALSE otherwise */
767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphIsWordWithoutStress(register picodata_ProcessingUnit this,
768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          register acph_subobj_t *acph,
769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          const picoos_uint16 ind) {
770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 i;
771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 pos;
772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pos = acph->headx[ind].cind;
774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < acph->headx[ind].head.len; i++) {
775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (picoktab_isPrimstress(acph->tabphones, acph->cbuf[pos + i]) ||
776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoktab_isSecstress(acph->tabphones, acph->cbuf[pos + i])) {
777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return FALSE;
778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* right-to-left, for each WORDPHON do acc */
785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t acphAccentuation(register picodata_ProcessingUnit this,
786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    register acph_subobj_t *acph) {
787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokdt_classify_result_t dtres;
788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 valbuf[5];
789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 hist1;
790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 hist2;
791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrwordspre;
792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrsyllspre;
793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrwordsfol;
794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 nrsyllsfol;
795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 footwordsfol;
796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 footsyllsfol;
797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 lastprev2; /* last index of POS(es) found to the left */
798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 curpos;     /* POS(es) of current word */
799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 prevout;
800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 okay;
801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_int32 upbound;   /* index of last WORDPHON item (with POS) */
802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set initial values */
805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    okay = TRUE;
806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    curpos = PICOKDT_EPSILON;    /* needs to be < 2^8 */
807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set upbound to last WORDPHON */
809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    upbound = acph->headxLen - 1;
810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while ((upbound >= 0) &&
811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen           (acph->headx[upbound].head.type != PICODATA_ITEM_WORDPHON)) {
812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        upbound--;
813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (upbound < 0) {
816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* phrase containing zero WORDPHON */
817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("no WORDPHON in phrase -> no accentuation"));
818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    lastprev2 = upbound;
822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set initial history values */
824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    prevout = PICOKDT_HISTORY_ZERO;
825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    hist1 = PICOKDT_HISTORY_ZERO;
826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    hist2 = PICOKDT_HISTORY_ZERO;
827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set initial nr pre/fol words/sylls, upbound is ind of last WORDPHON */
829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrwordsfol = 0;
830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrsyllsfol = 0;
831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    footwordsfol = 0;
832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    footsyllsfol = 0;
833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrwordspre = 0;
834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    nrsyllspre = 0;
835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* set POS of current word in valbuf[1], will be shifted right afterwards */
837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    valbuf[1] = acph->headx[upbound].head.info1;
838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* find first POS to the left and set valbuf[0] */
839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    valbuf[0] = acphAccItemSeqGetPosLeft(this, acph, lastprev2, &lastprev2);
840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 2; i < 5; i++) {
841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[i] = PICOKDT_EPSILON;
842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_TRACE(("headxLen: %d", acph->headxLen));
845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* process from right-to-left all items in headx */
847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = upbound+1; i > 0; ) {
848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        i--;
849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        okay = TRUE;
851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("iter: %d, type: %c", i, acph->headx[i].head.type));
853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* if not (WORDPHON) */
855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((acph->headx[i].head.type != PICODATA_ITEM_WORDPHON)) {
856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            continue;
857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("iter: %d, curpos: %d", i, acph->headx[i].head.info1));
860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* get and set POS of current item, must be WORDPHON */
862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        curpos = acph->headx[i].head.info1;
863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* no continue so far => at [i] we have a WORDPHON item */
865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* shift all POS elements one position to the right */
866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[4] = valbuf[3];
867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[3] = valbuf[2];
868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[2] = valbuf[1];
869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[1] = valbuf[0];
870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* find next POS to the left and set valbuf[0] */
871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        valbuf[0] = acphAccItemSeqGetPosLeft(this, acph, lastprev2, &lastprev2);
872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* better check double than never */
874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (curpos != valbuf[2]) {
875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("syncing POS"));
876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR,
877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            valbuf[2] = curpos;
879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* set history values */
882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        hist2 = hist1;
883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        hist1 = prevout;
884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* ************************************************************ */
886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* many speedups possible by avoiding double calc of attribtues */
887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* ************************************************************ */
888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* get distances */
890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if ((!acphAccGetNrsRight(this, acph, i, &nrwordsfol, &nrsyllsfol,
891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               &footwordsfol, &footsyllsfol)) ||
892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            (!acphAccGetNrsLeft(this, acph, i, &nrwordspre, &nrsyllspre))) {
893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem setting distances in invec"));
894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR,
895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_TRACE(("%d: [%d,%d,%d,%d,%d|%d,%d|%d,%d,%d,%d|%d,%d]", i,
900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       valbuf[0], valbuf[1], valbuf[2], valbuf[3], valbuf[4],
901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       hist1, hist2, nrwordspre, nrsyllspre,
902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       nrwordsfol, nrsyllsfol, footwordsfol, footsyllsfol));
903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* no continue so far => accentuation needed */
905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* construct input vector, which is set in dtacc */
906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!picokdt_dtACCconstructInVec(acph->dtacc, valbuf[0], valbuf[1],
907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         valbuf[2], valbuf[3], valbuf[4],
908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         hist1, hist2, nrwordspre, nrsyllspre,
909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         nrwordsfol, nrsyllsfol, footwordsfol,
910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                         footsyllsfol)) {
911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* error constructing invec */
912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem with invec"));
913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_INVECTOR,
914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* classify */
918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (okay && (!picokdt_dtACCclassify(acph->dtacc, &prevout))) {
919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* error doing classification */
920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem classifying"));
921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_CLASSIFICATION,
922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        /* decompose */
926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (okay && (!picokdt_dtACCdecomposeOutClass(acph->dtacc, &dtres))) {
927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* error decomposing */
928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem decomposing"));
929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            picoos_emRaiseWarning(this->common->em, PICO_WARN_OUTVECTOR,
930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  NULL, NULL);
931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            okay = FALSE;
932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (dtres.class > 255) {
935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("dt class outside valid range, setting to ACC0"));
936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtres.class = PICODATA_ACC0;
937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (okay && dtres.set) {
940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("%d - inpos: %d, out: %d", i,valbuf[2],dtres.class));
941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            if (acphIsWordWithoutStress(this, acph, i)) {
942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (dtres.class != PICODATA_ACC0) {
943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[i].head.info2 = PICODATA_ACC3;
944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[i].head.info2 = (picoos_uint8)dtres.class;
946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            } else {
948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headx[i].head.info2 = (picoos_uint8)dtres.class;
949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_DEBUG(("%d - after-nostress-corr: %d",
951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           i, acph->headx[i].head.info2));
952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } else {
953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            PICODBG_WARN(("problem determining accentuation level"));
954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            dtres.class = PICODATA_ITEMINFO1_ERR;
955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        }
956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* acphStep support functions */
964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 acphPutBoundItem(register picodata_ProcessingUnit this,
967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   register acph_subobj_t *acph,
968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   const picoos_uint8 strength,
969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   const picoos_uint8 type,
970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   picoos_uint8 *dopuoutfull,
971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   picoos_uint16 *numBytesOutput) {
972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t rv = PICO_OK;
973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 blen = 0;
974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picodata_itemhead_t tmphead;
975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *dopuoutfull = FALSE;
977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* construct BOUND item in tmpbuf and put item */
979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    tmphead.type = PICODATA_ITEM_BOUND;
980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    tmphead.info1 = strength;
981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    tmphead.info2 = type;
982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    tmphead.len = 0;
983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    rv = picodata_put_itemparts(&tmphead, NULL, 0, acph->tmpbuf,
984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODATA_MAX_ITEMSIZE, &blen);
985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (rv != PICO_OK) {
986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("problem creating BOUND item"));
987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em, rv, NULL, NULL);
988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* put constructed item to ext. charbuf */
991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    rv = picodata_cbPutItem(this->cbOut, acph->tmpbuf, blen, &blen);
992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *numBytesOutput += blen;
994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (rv == PICO_EXC_BUF_OVERFLOW) {
995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("overflow in cb output buffer"));
996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        *dopuoutfull = TRUE;    /* ie. do PU_OUT_FULL later */
997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else if (rv != PICO_OK) {
999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_ERROR(("problem putting BOUND item"));
1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_emRaiseException(this->common->em, rv, NULL, NULL);
1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return FALSE;
1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG],
1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       (picoos_uint8 *)"acph: ", acph->tmpbuf, blen);
1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return TRUE;
1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*                          acphStep function                              */
1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ***********************************************************************/
1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/*
1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chencomplete phrase processed in one step, if not fast enough -> rework
1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Cheninit, collect into internal buffer, process, and then feed to
1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenoutput buffer
1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Cheninit state: INIT ext           ext
1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstate trans:     in hc1  hc2   out
1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenINIT | putItem   =  0    0    +1      | BUSY  -> COLL (put B-SBEG item,
1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                   set do-init to false)
1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    inspace-ok-hc1
1029b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  needs-more-items-(phrase-or-flush)
1030b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenCOLL1 |getItems -n +n             0 1 | ATOMIC -> PPOSD     (got items,
1031b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                      if flush set do-init)
1032b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenCOLL2 |getItems -n +n             1 0 | ATOMIC -> PPOSD (got items, forced)
1033b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenCOLL3 |getItems -n +n             1 1 | IDLE          (got items, need more)
1034b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenCOLL4 |getItems  =  =             1 1 | IDLE             (got no items)
1035b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1036b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenPPOSD | posd     = ~n~n               | BUSY     -> PWP     (posd done)
1037b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenPWP   | lex/g2p  = ~n-n  0+n          | BUSY     -> PPHR    (lex/g2p done)
1038b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenPPHR  | phr      = -n 0 +m=n          | BUSY     -> PACC    (phr done, m>=n)
1039b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenPACC  | acc      =  0 0 ~m=n          | BUSY     -> FEED    (acc done)
1040b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1041b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  doinit-flag
1042b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenFEED | putItems  0  0 0 -m-n  +m  0   | BUSY -> COLL    (put items)
1043b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenFEED | putItems  0  0 0 -m-n  +m  1   | BUSY -> INIT    (put items)
1044b190149a69b110e6719ce0a41877a683f8db7ae7Charles ChenFEED | putItems  0  0 0 -d-d  +d      | OUT_FULL        (put some items)
1045b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
1046b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1047b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picodata_step_result_t acphStep(register picodata_ProcessingUnit this,
1048b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_int16 mode,
1049b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     picoos_uint16 *numBytesOutput) {
1050b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    register acph_subobj_t *acph;
1051b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t rv = PICO_OK;
1052b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    pico_status_t rvP = PICO_OK;
1053b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 blen = 0;
1054b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 clen = 0;
1055b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
1056b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1057b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1058b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
1059b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICODATA_PU_ERROR;
1060b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
1061b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    acph = (acph_subobj_t *) this->subObj;
1062b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    mode = mode;        /* avoid warning "var not used in this function"*/
1063b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    *numBytesOutput = 0;
1064b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    while (1) { /* exit via return */
1065b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("doing state %i, hLen|c1Len: %d|%d",
1066b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       acph->procState, acph->headxLen, acph->cbufLen));
1067b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1068b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        switch (acph->procState) {
1069b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1070b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* *********************************************************/
1071b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* collect state: get item(s) from charBuf and store in
1072b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             * internal buffers, need a complete punctuation-phrase
1073b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             */
1074b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case SA_STEPSTATE_COLLECT:
1075b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1076b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                while (acph->inspaceok && acph->needsmoreitems && (PICO_OK ==
1077b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                (rv = picodata_cbGetItem(this->cbIn, acph->tmpbuf,
1078b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODATA_MAX_ITEMSIZE, &blen)))) {
1079b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    rvP = picodata_get_itemparts(acph->tmpbuf,
1080b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODATA_MAX_ITEMSIZE, &(acph->headx[acph->headxLen].head),
1081b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            &(acph->cbuf[acph->cbufLen]), acph->cbufBufSize
1082b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    - acph->cbufLen, &clen);
1083b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (rvP != PICO_OK) {
1084b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_ERROR(("problem getting item parts"));
1085b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        picoos_emRaiseException(this->common->em, rvP,
1086b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        NULL, NULL);
1087b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return PICODATA_PU_ERROR;
1088b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1089b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1090b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* if CMD(...FLUSH...) -> PUNC(...FLUSH...),
1091b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                     construct PUNC-FLUSH item in headx */
1092b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if ((acph->headx[acph->headxLen].head.type
1093b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            == PICODATA_ITEM_CMD)
1094b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            && (acph->headx[acph->headxLen].head.info1
1095b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    == PICODATA_ITEMINFO1_CMD_FLUSH)) {
1096b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[acph->headxLen].head.type
1097b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                = PICODATA_ITEM_PUNC;
1098b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[acph->headxLen].head.info1
1099b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                = PICODATA_ITEMINFO1_PUNC_FLUSH;
1100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[acph->headxLen].head.info2
1101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                = PICODATA_ITEMINFO2_PUNC_SENT_T;
1102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[acph->headxLen].head.len = 0;
1103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* check/set needsmoreitems */
1106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (acph->headx[acph->headxLen].head.type
1107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            == PICODATA_ITEM_PUNC) {
1108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->needsmoreitems = FALSE;
1109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* check/set inspaceok, keep spare slot for forcing */
1112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if ((acph->headxLen >= (PICOACPH_MAXNR_HEADX - 2))
1113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            || ((acph->cbufBufSize - acph->cbufLen)
1114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    < PICODATA_MAX_ITEMSIZE)) {
1115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->inspaceok = FALSE;
1116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (clen > 0) {
1119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[acph->headxLen].cind = acph->cbufLen;
1120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->cbufLen += clen;
1121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    } else {
1122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        acph->headx[acph->headxLen].cind = 0;
1123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headxLen++;
1125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (!acph->needsmoreitems) {
1128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* 1, phrase buffered */
1129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->procState = SA_STEPSTATE_PROCESS_PHR;
1130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_ATOMIC;
1131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if (!acph->inspaceok) {
1132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* 2, forced phrase end */
1133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* at least one slot is still free, use it to
1134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       force a trailing PUNC item */
1135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[acph->headxLen].head.type = PICODATA_ITEM_PUNC;
1136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[acph->headxLen].head.info1 =
1137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODATA_ITEMINFO1_PUNC_PHRASEEND;
1138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[acph->headxLen].head.info2 =
1139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODATA_ITEMINFO2_PUNC_PHRASE_FORCED;
1140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[acph->headxLen].head.len = 0;
1141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->needsmoreitems = FALSE; /* not really needed for now */
1142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headxLen++;
1143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_WARN(("forcing phrase end, added PUNC_PHRASEEND"));
1144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    picoos_emRaiseWarning(this->common->em,
1145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          PICO_WARN_FALLBACK, NULL,
1146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          (picoos_char *)"forced phrase end");
1147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->procState = SA_STEPSTATE_PROCESS_PHR;
1148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_ATOMIC;
1149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if (rv == PICO_EOF) {
1150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* 3, 4 */
1151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_IDLE;
1152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if ((rv == PICO_EXC_BUF_UNDERFLOW) ||
1153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                           (rv == PICO_EXC_BUF_OVERFLOW)) {
1154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* error, no valid item in cb (UNDER) */
1155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /*        or tmpbuf not large enough, not possible (OVER) */
1156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* no exception raised, left for ctrl to handle */
1157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_ERROR(("buffer under/overflow, rv: %d", rv));
1158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_ERROR;
1159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else {
1160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* error, only possible if cbGetItem implementation
1161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       changes without this function being adapted*/
1162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_ERROR(("untreated return value, rv: %d", rv));
1163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_ERROR;
1164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* *********************************************************/
1171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* process phr state: process items in headx and modify
1172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             * headx in place
1173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             */
1174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case SA_STEPSTATE_PROCESS_PHR:
1175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* ensure there is an item in inBuf */
1176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (acph->headxLen > 0) {
1177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* we have a phrase in headx, cbuf1 (can be
1178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       single PUNC item), do phrasing and modify headx */
1179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (PICO_OK != acphSubPhrasing(this, acph)) {
1181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        picoos_emRaiseException(this->common->em,
1182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                PICO_ERR_OTHER, NULL, NULL);
1183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return PICODATA_PU_ERROR;
1184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->procState = SA_STEPSTATE_PROCESS_ACC;
1186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if (acph->headxLen == 0) {    /* no items in inBuf */
1187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_WARN(("no items in inBuf"));
1188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->procState = SA_STEPSTATE_COLLECT;
1189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_BUSY;
1190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined (PICO_DEBUG_NOTNEEDED)
1193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (1) {
1194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    picoos_uint8 i, j, ittype;
1195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    for (i = 0; i < acph->headxLen; i++) {
1196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((acph->headx[i].boundstrength != 0) &&
1197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            (acph->headx[i].boundstrength !=
1198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                             PICODATA_ITEMINFO1_BOUND_PHR0)) {
1199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_INFO(("acph-p: boundstrength '%c', "
1200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          "boundtype '%c'",
1201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          acph->headx[i].boundstrength,
1202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          acph->headx[i].boundtype));
1203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        ittype = acph->headx[i].head.type;
1206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_INFO_CTX();
1207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_INFO_MSG(("acph-p: ("));
1208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_INFO_MSG(("'%c',", ittype));
1209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((32 <= acph->headx[i].head.info1) &&
1210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            (acph->headx[i].head.info1 < 127) &&
1211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            (ittype != PICODATA_ITEM_WORDPHON)) {
1212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_INFO_MSG(("'%c',",acph->headx[i].head.info1));
1213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else {
1214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_INFO_MSG(("%3d,", acph->headx[i].head.info1));
1215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if ((32 <= acph->headx[i].head.info2) &&
1217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            (acph->headx[i].head.info2 < 127)) {
1218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_INFO_MSG(("'%c',",acph->headx[i].head.info2));
1219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        } else {
1220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_INFO_MSG(("%3d,", acph->headx[i].head.info2));
1221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_INFO_MSG(("%3d)", acph->headx[i].head.len));
1223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        for (j = 0; j < acph->headx[i].head.len; j++) {
1225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if ((ittype == PICODATA_ITEM_CMD)) {
1226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODBG_INFO_MSG(("%c",
1227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        acph->cbuf[acph->headx[i].cind+j]));
1228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            } else {
1229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODBG_INFO_MSG(("%4d",
1230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        acph->cbuf[acph->headx[i].cind+j]));
1231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        PICODBG_INFO_MSG(("\n"));
1234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* *********************************************************/
1242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* process acc state: process items in headx and modify
1243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             * headx in place
1244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             */
1245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case SA_STEPSTATE_PROCESS_ACC:
1246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* ensure there is an item in inBuf */
1247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (acph->headxLen > 0) {
1248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* we have a phrase in headx, cbuf (can be
1249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                       single PUNC item), do accentuation and modify headx */
1250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (PICO_OK != acphAccentuation(this, acph)) {
1251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        picoos_emRaiseException(this->common->em,
1252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                PICO_ERR_OTHER, NULL, NULL);
1253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        return PICODATA_PU_ERROR;
1254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->procState = SA_STEPSTATE_FEED;
1256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } else if (acph->headxLen == 0) {    /* no items in inBuf */
1257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    PICODBG_WARN(("no items in inBuf"));
1258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->procState = SA_STEPSTATE_COLLECT;
1259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    return PICODATA_PU_BUSY;
1260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* *********************************************************/
1265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            /* feed state: copy item in internal outBuf to output charBuf */
1266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            case SA_STEPSTATE_FEED: {
1267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_uint16 indupbound;
1268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                picoos_uint8 dopuoutfull;
1269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                PICODBG_DEBUG(("put out items (bot, len): (%d, %d)",
1271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               acph->headxBottom, acph->headxLen));
1272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                indupbound = acph->headxBottom + acph->headxLen;
1274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                dopuoutfull = FALSE;
1275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                if (acph->headxBottom == 0) {
1277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* construct first BOUND item in tmpbuf and put item */
1278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    /* produce BOUND unless it is followed by a term/flush) */
1279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    if (acph->headx[0].head.info1
1280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            != PICODATA_ITEMINFO1_PUNC_FLUSH) {
1281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        if (!acphPutBoundItem(this, acph,
1282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                acph->headx[0].boundstrength,
1283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                acph->headx[0].boundtype, &dopuoutfull,
1284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                numBytesOutput)) {
1285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if (dopuoutfull) {
1286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODBG_DEBUG(("feeding overflow"));
1287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                return PICODATA_PU_OUT_FULL;
1288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            } else {
1289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                /* ERR-msg and exception done in acphPutBoundItem */
1290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                return PICODATA_PU_ERROR;
1291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        }
1293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    }
1294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* for all items in headx, cbuf */
1297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                for (i = acph->headxBottom; i < indupbound; i++) {
1298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    switch (acph->headx[i].head.type) {
1300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        case PICODATA_ITEM_PUNC:
1301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /* if sentence end, put SEND bound */
1302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if ((acph->headx[i].head.info1 ==
1303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 PICODATA_ITEMINFO1_PUNC_SENTEND) &&
1304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                (i == (indupbound - 1))) {
1305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                /* construct and put BOUND item */
1306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                if (!acphPutBoundItem(this, acph,
1307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODATA_ITEMINFO1_BOUND_SEND,
1308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODATA_ITEMINFO2_NA,
1309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &dopuoutfull, numBytesOutput)) {
1310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (dopuoutfull) {
1311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICODBG_DEBUG(("feeding overflow"));
1312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_OUT_FULL;
1313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    } else {
1314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /* ERR-msg and exception done
1315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           in acphPutBoundItem */
1316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_ERROR;
1317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                }
1319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            } else if ((acph->headx[i].head.info1 ==
1320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 PICODATA_ITEMINFO1_PUNC_FLUSH) &&
1321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                (i == (indupbound - 1))) {
1322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                /* construct and put BOUND item */
1323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                if (!acphPutBoundItem(this, acph,
1324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODATA_ITEMINFO1_BOUND_TERM,
1325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            PICODATA_ITEMINFO2_NA,
1326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &dopuoutfull, numBytesOutput)) {
1327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (dopuoutfull) {
1328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICODBG_DEBUG(("feeding overflow"));
1329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_OUT_FULL;
1330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    } else {
1331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /* ERR-msg and exception done
1332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           in acphPutBoundItem */
1333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_ERROR;
1334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                }
1336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /* else, good-bye PUNC, not needed anymore */
1338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            break;
1339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                        default:
1340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /* PHR2/3 maybe existing, check and add
1342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                               BOUND item now, if needed */
1343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if ((acph->headx[i].boundstrength ==
1344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 PICODATA_ITEMINFO1_BOUND_PHR2) ||
1345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                (acph->headx[i].boundstrength ==
1346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 PICODATA_ITEMINFO1_BOUND_PHR3)) {
1347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                if (!acphPutBoundItem(this, acph,
1348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            acph->headx[i].boundstrength,
1349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            acph->headx[i].boundtype,
1350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                            &dopuoutfull, numBytesOutput)) {
1351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    if (dopuoutfull) {
1352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        PICODBG_DEBUG(("feeding overflow"));
1353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_OUT_FULL;
1354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    } else {
1355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        /* ERR-msg and exception done
1356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                           in acphPutBoundItem */
1357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                        return PICODATA_PU_ERROR;
1358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    }
1359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                }
1360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            /* copy item unmodified */
1363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            rv = picodata_put_itemparts(&(acph->headx[i].head),
1364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     &(acph->cbuf[acph->headx[i].cind]),
1365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     acph->headx[i].head.len,
1366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     acph->tmpbuf, PICODATA_MAX_ITEMSIZE,
1367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                     &blen);
1368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            rvP = picodata_cbPutItem(this->cbOut, acph->tmpbuf,
1370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    PICODATA_MAX_ITEMSIZE, &clen);
1371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            *numBytesOutput += clen;
1373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODBG_DEBUG(("put item, status: %d", rvP));
1375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            if (rvP == PICO_OK) {
1377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                acph->headxBottom++;
1378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                acph->headxLen--;
1379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            } else if (rvP == PICO_EXC_BUF_OVERFLOW) {
1380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                /* try again next time, but PHR2/3
1381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   bound already added if existing,
1382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   ensure it's not output a 2nd
1383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                   time */
1384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODBG_DEBUG(("feeding overflow"));
1385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                acph->headx[i].boundstrength = 0;
1386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                return PICODATA_PU_OUT_FULL;
1387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            } else {
1388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                /* error, should never happen */
1389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                PICODBG_ERROR(("untreated return value, rvP: %d", rvP));
1390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                return PICODATA_PU_ERROR;
1391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            }
1392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            PICODATA_INFO_ITEM(this->voice->kbArray[PICOKNOW_KBID_DBG],
1394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               (picoos_uint8 *)"acph: ",
1395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                               acph->tmpbuf, PICODATA_MAX_ITEMSIZE);
1396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                            break;
1398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    } /*switch*/
1399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                } /*for*/
1400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* reset headx, cbuf */
1402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headxBottom = 0;
1403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->headxLen = 0;
1404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->cbufLen = 0;
1405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                for (i = 0; i < PICOACPH_MAXNR_HEADX; i++) {
1406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                    acph->headx[i].boundstrength = 0;
1407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                }
1408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                /* reset collect state support variables */
1410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->inspaceok = TRUE;
1411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->needsmoreitems = TRUE;
1412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                acph->procState = SA_STEPSTATE_COLLECT;
1414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                return PICODATA_PU_BUSY;
1415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            }
1417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            default:
1419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                break;
1420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        } /* switch */
1421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } /* while */
1423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* should be never reached */
1425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_ERROR(("reached end of function"));
1426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_emRaiseException(this->common->em, PICO_ERR_OTHER, NULL, NULL);
1427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICODATA_PU_ERROR;
1428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
1431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
1432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
1433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
1435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */
1436