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