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 picorsrc.c 18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland 20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved. 21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History: 23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version 24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodefs.h" 28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h" 29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h" 30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* knowledge layer */ 32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoknow.h" 33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdt.h" 35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoklex.h" 36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokfst.h" 37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpdf.h" 38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoktab.h" 39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokpr.h" 40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picorsrc.h" 42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" { 45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0 47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG) 52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdbg.h" 53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** object : Resource 57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * shortcut : rsrc 58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_resource { 61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 magic; /* magic number used to validate handles */ 62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* next connects all active resources of a resource manager and the garbaged resources of the manager's free list */ 63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource next; 64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_resource_type_t type; 65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_resource_name_t name; 66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_int8 lockCount; /* count of current subscribers of this resource */ 67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_File file; 68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 * raw_mem; /* pointer to allocated memory. NULL if preallocated. */ 69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* picoos_uint32 size; */ 70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 * start; /* start of content (after header) */ 71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase kbList; 72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picorsrc_resource_t; 73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define MAGIC_MASK 0x7049634F /* pIcO */ 76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define SET_MAGIC_NUMBER(res) \ 78d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland (res)->magic = ((picoos_uint32) (uintptr_t) (res)) ^ MAGIC_MASK 79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define CHECK_MAGIC_NUMBER(res) \ 81d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland ((res)->magic == (((picoos_uint32) (uintptr_t) (res)) ^ MAGIC_MASK)) 82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** 86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Returns non-zero if 'this' is a valid resource handle, zero otherwise. 87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_int16 picoctrl_isValidResourceHandle(picorsrc_Resource this) 89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (this != NULL) && CHECK_MAGIC_NUMBER(this); 91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picorsrc_Resource picorsrc_newResource(picoos_MemoryManager mm) 95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource this = picoos_allocate(mm, sizeof(*this)); 97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen SET_MAGIC_NUMBER(this); 99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* initialize */ 100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->name[0] = NULLC; 101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* picoos_strlcpy(this->name, name,PICORSRC_MAX_RSRC_NAME_SIZ); */ 102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->next = NULL; 103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->type = PICORSRC_TYPE_NULL; 104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->lockCount = 0; 105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->file = NULL; 106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->raw_mem = NULL; 107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->start = NULL; 108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->kbList = NULL; 109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* this->size=0; */ 110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return this; 112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_disposeResource(picoos_MemoryManager mm, picorsrc_Resource * this) 115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != (*this)) { 117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*this)->magic ^= 0xFFFEFDFC; 118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* we have to explicitly free 'raw_mem' here because in testing 119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen scenarios (where memory protection functionality is enabled) 120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen it might be allocated aside from normal memory */ 121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((*this)->raw_mem != NULL) { 122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocProtMem(mm, (void *) &(*this)->raw_mem); 123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm,(void * *)this); 125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_initializeVoice(picorsrc_Voice this) 132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 i; 134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* initialize */ 136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i<PICORSRC_KB_ARRAY_SIZE; i++) { 137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->kbArray[i] = NULL; 138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numResources = 0; 140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->next = NULL; 141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picorsrc_Voice picorsrc_newVoice(picoos_MemoryManager mm) 145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Voice this = (picorsrc_Voice) picoos_allocate(mm,sizeof(*this)); 147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_initializeVoice(this); 148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return this; 149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_disposeVoice(picoos_MemoryManager mm, picorsrc_Voice * this) 153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != (*this)) { 155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm,(void *)this); 157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** object : VoiceDefinition 163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * shortcut : vdef 164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_voice_definition * picorsrc_VoiceDefinition; 168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_voice_definition { 170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char voiceName[PICO_MAX_VOICE_NAME_SIZE]; 171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 numResources; 172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_resource_name_t resourceName[PICO_MAX_NUM_RSRC_PER_VOICE]; 173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition next; 174b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picorsrc_voice_definition_t; 175b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 176b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 177b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picorsrc_VoiceDefinition picorsrc_newVoiceDefinition(picoos_MemoryManager mm) 178b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 179b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* picoos_uint8 i; */ 180b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition this = (picorsrc_VoiceDefinition) picoos_allocate(mm,sizeof(*this)); 181b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 182b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* initialize */ 183b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voiceName[0] = NULLC; 184b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numResources = 0; 185b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* 186b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i=0; i < PICO_MAX_NUM_RSRC_PER_VOICE; i++) { 187b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->resourceName[i][0] = NULLC; 188b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 189b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 190b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->next = NULL; 191b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 192b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return this; 193b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 194b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 195b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* 196b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picorsrc_disposeVoiceDefinition(picoos_MemoryManager mm, picorsrc_VoiceDefinition * this) 197b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 198b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != (*this)) { 199b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 200b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm,(void *)this); 201b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 202b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 203b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/ 204b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 205b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 206b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 207b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/** object : ResourceManager 208b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * shortcut : rm 209b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * 210b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */ 211b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct picorsrc_resource_manager { 212b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_Common common; 213b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 numResources; 214b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource resources, freeResources; 215b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 numVoices; 216b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Voice voices, freeVoices; 217b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 numVdefs; 218b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition vdefs, freeVdefs; 219b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 numKbs; 220b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase freeKbs; 221b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_header_string_t tmpHeader; 222b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} picorsrc_resource_manager_t; 223b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 224b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createDefaultResource(picorsrc_ResourceManager this /*, 225b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource * resource */); 226b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 227b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 228b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicorsrc_ResourceManager picorsrc_newResourceManager(picoos_MemoryManager mm, picoos_Common common /* , picoos_char * configFile */) 229b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 230b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_ResourceManager this = picoos_allocate(mm,sizeof(*this)); 231b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != this) { 232b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* initialize */ 233b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->common = common; 234b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numResources = 0; 235b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->resources = NULL; 236b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeResources = NULL; 237b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numVoices = 0; 238b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->voices = NULL; 239b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeVoices = NULL; 240b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numVdefs = 0; 241b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->vdefs = NULL; 242b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeVdefs = NULL; 243b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 244b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return this; 245b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 246b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 247b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenvoid picorsrc_disposeResourceManager(picoos_MemoryManager mm, picorsrc_ResourceManager * this) 248b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 249b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != (*this)) { 250b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* terminate */ 251b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(mm,(void *)this); 252b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 253b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 254b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 255b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 256b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******* accessing resources **************************************/ 257b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 258b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 259b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t findResource(picorsrc_ResourceManager this, picoos_char * resourceName, picorsrc_Resource * rsrc) { 260b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource r; 261b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 262b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 263b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 264b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r = this->resources; 265b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (NULL != r && (0 != picoos_strcmp(r->name,resourceName))) { 266b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r = r->next; 267b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 268b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *rsrc = r; 269b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 270b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 271b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 272b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic picoos_uint8 isResourceLoaded(picorsrc_ResourceManager this, picoos_char * resourceName) { 273b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource res; 274b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 275b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == findResource(this, resourceName,&res)){ 276b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return (NULL != res); 277b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 278b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return FALSE; 279b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 280b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 281b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 282b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t parse_resource_name(picoos_char * fileName) 283b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 284b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("analysing file name %s",fileName)); 285b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoos_has_extension(fileName, 286b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_char *)PICO_BIN_EXTENSION)) { 287b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 288b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 289b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_EXC_UNEXPECTED_FILE_TYPE; 290b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 291b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 292b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 293b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 294b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 295b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t readHeader(picorsrc_ResourceManager this, 296b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_FileHeader header, picoos_uint32 * headerlen, picoos_File file) 297b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 298b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 299b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 hdrlen1; 300b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 n; 301b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t status; 302b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 303b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 304b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* read PICO header */ 305b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picoos_readPicoHeader(file, headerlen); 306b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 307b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 308b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 309b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,status,NULL,(picoos_char *)"problem reading file header"); 310b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 311b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* read header length (excluding length itself) */ 312b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picoos_read_pi_uint16(file,&hdrlen1); 313b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("got header size %d",hdrlen1)); 314b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 315b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 316b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *headerlen += 2; 317b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = (hdrlen1 <= PICOOS_MAX_HEADER_STRING_LEN-1) ? PICO_OK : PICO_ERR_OTHER; 318b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 319b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen n = hdrlen1; 320b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoos_ReadBytes(file, (picoos_uint8 *) this->tmpHeader, &n) && hdrlen1 == n) { 321b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->tmpHeader[hdrlen1] = NULLC; 322b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *headerlen += hdrlen1; 323b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("got header <%s>",this->tmpHeader)); 324b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 325b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_OK; 326b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 327b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_ERR_OTHER; 328b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 329b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 330b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 331b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picoos_hdrParseHeader(header, this->tmpHeader); 332b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 333b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 334b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return status; 335b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 336b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 337b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_createKnowledgeBase( 338b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_ResourceManager this, 339b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 * data, 340b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 size, 341b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_kb_id_t kbid, 342b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase * kb) 343b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 344b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*kb) = picoknow_newKnowledgeBase(this->common->mm); 345b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == (*kb)) { 346b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_EXC_OUT_OF_MEM; 347b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 348b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*kb)->base = data; 349b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*kb)->size = size; 350b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*kb)->id = kbid; 351b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen switch (kbid) { 352b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_TPP_MAIN: 353b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_TPP_USER_1: 354b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_TPP_USER_2: 355b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokpr_specializePreprocKnowledgeBase(*kb, this->common); 356b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 357b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_TAB_GRAPHS: 358b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoktab_specializeGraphsKnowledgeBase(*kb, this->common); 359b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 360b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_TAB_PHONES: 361b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoktab_specializePhonesKnowledgeBase(*kb, this->common); 362b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 363b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_TAB_POS: 364b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoktab_specializePosKnowledgeBase(*kb, this->common); 365b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 366b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FIXED_IDS: 367b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoktab_specializeIdsKnowledgeBase(*kb, this->common); 368b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 369b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_LEX_MAIN: 370b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_LEX_USER_1: 371b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_LEX_USER_2: 372b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoklex_specializeLexKnowledgeBase(*kb, this->common); 373b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 374b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_POSP: 375b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdt_specializeDtKnowledgeBase(*kb, this->common, 376b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKDT_KDTTYPE_POSP); 377b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 378b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_POSD: 379b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdt_specializeDtKnowledgeBase(*kb, this->common, 380b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKDT_KDTTYPE_POSD); 381b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 382b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_G2P: 383b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdt_specializeDtKnowledgeBase(*kb, this->common, 384b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKDT_KDTTYPE_G2P); 385b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 386b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_PHR: 387b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdt_specializeDtKnowledgeBase(*kb, this->common, 388b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKDT_KDTTYPE_PHR); 389b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 390b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_ACC: 391b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdt_specializeDtKnowledgeBase(*kb, this->common, 392b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKDT_KDTTYPE_ACC); 393b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 394b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_1: 395b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_2: 396b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_3: 397b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_4: 398b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_5: 399b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_6: 400b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_7: 401b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_8: 402b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_9: 403b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SPHO_10: 404b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_WPHO_1: 405b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_WPHO_2: 406b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_WPHO_3: 407b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_WPHO_4: 408b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_WPHO_5: 409b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_SVOXPA_PARSE: 410b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_XSAMPA_PARSE: 411b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_FST_XSAMPA2SVOXPA: 412b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 413b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokfst_specializeFSTKnowledgeBase(*kb, this->common); 414b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 415b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 416b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_DUR: 417b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_LFZ1: 418b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_LFZ2: 419b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_LFZ3: 420b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_LFZ4: 421b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_LFZ5: 422b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_MGC1: 423b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_MGC2: 424b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_MGC3: 425b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_MGC4: 426b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DT_MGC5: 427b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdt_specializeDtKnowledgeBase(*kb, this->common, 428b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKDT_KDTTYPE_PAM); 429b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 430b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_PDF_DUR: 431b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokpdf_specializePdfKnowledgeBase(*kb, this->common, 432b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKPDF_KPDFTYPE_DUR); 433b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 434b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 435b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_PDF_LFZ: 436b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokpdf_specializePdfKnowledgeBase(*kb, this->common, 437b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKPDF_KPDFTYPE_MUL); 438b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 439b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_PDF_MGC: 440b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokpdf_specializePdfKnowledgeBase(*kb, this->common, 441b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKPDF_KPDFTYPE_MUL); 442b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 443b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_PDF_PHS: 444b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokpdf_specializePdfKnowledgeBase(*kb, this->common, 445b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICOKPDF_KPDFTYPE_PHS); 446b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 447b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 448b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 449b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 450b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG) 451b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen case PICOKNOW_KBID_DBG: 452b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picokdbg_specializeDbgKnowledgeBase(*kb, this->common); 453b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 454b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 455b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 456b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen default: 457b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen break; 458b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 459b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 460b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 461b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 462b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 463b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_releaseKnowledgeBase( 464b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_ResourceManager this, 465b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase * kb) 466b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 467b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*kb) = NULL; 468b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 469b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 470b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 471b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_getKbList(picorsrc_ResourceManager this, 472b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 * data, 473b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 datalen, 474b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase * kbList) 475b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 476b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 477b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t status = PICO_OK; 478b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 curpos = 0, offset, size; 479b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i, numKbs, kbid; 480b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char str[PICOKNOW_MAX_KB_NAME_SIZ]; 481b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase kb; 482b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 483b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *kbList = NULL; 484b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen datalen = datalen; 485b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* read number of fields */ 486b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen numKbs = data[curpos++]; 487b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("number of kbs (unrestricted) = %i",numKbs)); 488b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = (numKbs <= PICOKNOW_MAX_NUM_RESOURCE_KBS) ? PICO_OK : PICO_EXC_FILE_CORRUPT; 489b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* read in all kb names */ 490b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("number of kbs = %i",numKbs)); 491b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 492b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((PICO_OK == status) && (i++ < numKbs)) { 493b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = (picoos_get_str((picoos_char *)data,&curpos,str,PICOOS_MAX_FIELD_STRING_LEN)) ? PICO_OK : PICO_EXC_FILE_CORRUPT; 494b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("contains knowledge base %s (status: %i)",str, status)); 495b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 496b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* consume termination of last str */ 497b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen curpos++; 498b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen i = 0; 499b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((PICO_OK == status) && (i++ < numKbs)) { 500b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kbid = data[curpos++]; 501b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("got kb id %i, curpos now %i",kbid, curpos)); 502b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picoos_read_mem_pi_uint32(data,&curpos,&offset); 503b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("got kb offset %i, curpos now %i",offset, curpos)); 504b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picoos_read_mem_pi_uint32(data,&curpos,&size); 505b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("got kb size %i, curpos now %i",size, curpos)); 506b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 507b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (0 == offset) { 508b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* currently we consider a kb mentioned in resource but with offset 0 (no knowledge) as 509b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * different form a kb not mentioned at all. We might reconsider that later. */ 510b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG((" kb (id %i) is mentioned but empty (base:%i, size:%i)",kb->id, kb->base, kb->size)); 511b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picorsrc_createKnowledgeBase(this, NULL, size, (picoknow_kb_id_t)kbid, &kb); 512b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 513b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picorsrc_createKnowledgeBase(this, data+offset, size, (picoknow_kb_id_t)kbid, &kb); 514b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 515b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("found kb (id %i) starting at %i with size %i",kb->id, kb->base, kb->size)); 516b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 517b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kb->next = *kbList; 518b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *kbList = kb; 519b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 520b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 521b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 522b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK != status) { 523b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kb = *kbList; 524b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (NULL != kb) { 525b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_releaseKnowledgeBase(this,&kb); 526b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 527b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 528b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 529b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return status; 530b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 531b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 532b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 533b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* load resource file. the type of resource file etc. are in the header, 534b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * then follows the directory, then the knowledge bases themselves (as byte streams) */ 535b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 536b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_loadResource(picorsrc_ResourceManager this, 537b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char * fileName, picorsrc_Resource * resource) 538b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 539b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource res; 540b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint32 headerlen, len,maxlen; 541b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_file_header_t header; 542b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 rem; 543b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t status = PICO_OK; 544b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 545b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (resource == NULL) { 546b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 547b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 548b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *resource = NULL; 549b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 550b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 551b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res = picorsrc_newResource(this->common->mm); 552b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 553b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == res) { 554b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL); 555b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 556b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 557b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_MAX_NUM_RESOURCES <= this->numResources) { 558b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &res); 559b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i resources",PICO_MAX_NUM_RESOURCES); 560b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 561b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 562b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* ***************** parse file name for file type and parameters */ 563b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 564b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK != parse_resource_name(fileName)) { 565b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm, (void *) &res); 566b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_EXC_UNEXPECTED_FILE_TYPE; 567b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 568b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 569b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* ***************** get header info */ 570b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 571b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* open binary file for reading (no key, nrOfBufs, bufSize) */ 572b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("trying to open file %s",fileName)); 573b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!picoos_OpenBinary(this->common, &res->file, fileName)) { 574b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* open didn't succeed */ 575b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_EXC_CANT_OPEN_FILE; 576b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("can't open file %s",fileName)); 577b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, PICO_EXC_CANT_OPEN_FILE, 578b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen NULL, (picoos_char *) "%s", fileName); 579b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 580b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 581b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = readHeader(this, &header, &headerlen, res->file); 582b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* res->file now positioned at first pos after header */ 583b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 584b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 585b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* ***************** check header values */ 586b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status && isResourceLoaded(this, header.field[PICOOS_HEADER_NAME].value)) { 587b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* lingware is allready loaded, do nothing */ 588b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN((">>> lingware '%s' allready loaded",header.field[PICOOS_HEADER_NAME].value)); 589b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em,PICO_WARN_RESOURCE_DOUBLE_LOAD,NULL,(picoos_char *)"%s",header.field[PICOOS_HEADER_NAME].value); 590b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_WARN_RESOURCE_DOUBLE_LOAD; 591b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 592b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 593b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 594b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* get data length */ 595b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picoos_read_pi_uint32(res->file, &len); 596b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("found net resource len of %i",len)); 597b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* allocate memory */ 598b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 599b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_TRACE((">>> 2")); 600b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen maxlen = len + PICOOS_ALIGN_SIZE; /* once would be sufficient? */ 601b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->raw_mem = picoos_allocProtMem(this->common->mm, maxlen); 602b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* res->size = maxlen; */ 603b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = (NULL == res->raw_mem) ? PICO_EXC_OUT_OF_MEM : PICO_OK; 604b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 605b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 606d12fa9eb428db88f399a89566772eaed99b2fe58Marcus Oakland rem = (uintptr_t) res->raw_mem % PICOOS_ALIGN_SIZE; 607b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (rem > 0) { 608b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->start = res->raw_mem + (PICOOS_ALIGN_SIZE - rem); 609b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 610b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->start = res->raw_mem; 611b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 612b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 613b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* read file contents into memory */ 614b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = (picoos_ReadBytes(res->file, res->start, &len)) ? PICO_OK 615b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen : PICO_ERR_OTHER; 616b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* resources are read-only; the following write protection 617b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen has an effect in test configurations only */ 618b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_protectMem(this->common->mm, res->start, len, /*enable*/TRUE); 619b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 620b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* note resource unique name */ 621b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 622b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoos_strlcpy(res->name,header.field[PICOOS_HEADER_NAME].value,PICORSRC_MAX_RSRC_NAME_SIZ) < PICORSRC_MAX_RSRC_NAME_SIZ) { 623b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("assigned name %s to resource",res->name)); 624b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_OK; 625b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 626b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_ERR_INDEX_OUT_OF_RANGE; 627b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("failed assigning name %s to resource", 628b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->name)); 629b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseException(this->common->em, 630b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICO_ERR_INDEX_OUT_OF_RANGE, NULL, 631b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (picoos_char *)"resource %s",res->name); 632b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 633b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 634b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 635b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* get resource type */ 636b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 637b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_TEXTANA)) { 638b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->type = PICORSRC_TYPE_TEXTANA; 639b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_SIGGEN)) { 640b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->type = PICORSRC_TYPE_SIGGEN; 641b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_SIGGEN)) { 642b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->type = PICORSRC_TYPE_USER_LEX; 643b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (!picoos_strcmp(header.field[PICOOS_HEADER_CONTENT_TYPE].value, PICORSRC_FIELD_VALUE_SIGGEN)) { 644b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->type = PICORSRC_TYPE_USER_PREPROC; 645b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 646b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->type = PICORSRC_TYPE_OTHER; 647b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 648b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 649b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 650b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 651b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* create kb list from resource */ 652b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picorsrc_getKbList(this, res->start, len, &res->kbList); 653b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 654b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 655b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 656b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (status == PICO_OK) { 657b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* add resource to rm */ 658b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->next = this->resources; 659b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->resources = res; 660b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numResources++; 661b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *resource = res; 662b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("done loading resource %s from %s", res->name, fileName)); 663b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 664b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_disposeResource(this->common->mm, &res); 665b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("failed to load resource")); 666b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 667b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 668b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (status < 0) { 669b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return status; 670b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 671b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 672b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 673b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 674b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 675b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t picorsrc_releaseKbList(picorsrc_ResourceManager this, picoknow_KnowledgeBase * kbList) 676b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 677b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase kbprev, kb; 678b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kb = *kbList; 679b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (NULL != kb) { 680b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kbprev = kb; 681b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kb = kb->next; 682b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_disposeKnowledgeBase(this->common->mm,&kbprev); 683b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 684b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *kbList = NULL; 685b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 686b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 687b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 688b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* unload resource file. (if resource file is busy, warn and don't unload) */ 689b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_unloadResource(picorsrc_ResourceManager this, picorsrc_Resource * resource) { 690b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 691b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource r1, r2, rsrc; 692b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 693b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (resource == NULL) { 694b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 695b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 696b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen rsrc = *resource; 697b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 698b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 699b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (rsrc->lockCount > 0) { 700b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_EXC_RESOURCE_BUSY; 701b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 702b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* terminate */ 703b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (rsrc->file != NULL) { 704b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_CloseBinary(this->common, &rsrc->file); 705b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 706b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != rsrc->raw_mem) { 707b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocProtMem(this->common->mm, (void *) &rsrc->raw_mem); 708b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("deallocated raw mem")); 709b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 710b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 711b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r1 = NULL; 712b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r2 = this->resources; 713b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (r2 != NULL && r2 != rsrc) { 714b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r1 = r2; 715b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r2 = r2->next; 716b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 717b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == r1) { 718b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->resources = rsrc->next; 719b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else if (NULL == r2) { 720b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* didn't find resource in rm! */ 721b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_OTHER; 722b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 723b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen r1->next = rsrc->next; 724b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 725b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 726b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != rsrc->kbList) { 727b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_releaseKbList(this, &rsrc->kbList); 728b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 729b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 730b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_deallocate(this->common->mm,(void **)resource); 731b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numResources--; 732b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 733b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 734b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 735b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 736b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 737b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createDefaultResource(picorsrc_ResourceManager this 738b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /*, picorsrc_Resource * resource */) 739b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 740b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource res; 741b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen pico_status_t status = PICO_OK; 742b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 743b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 744b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* *resource = NULL; */ 745b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 746b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_MAX_NUM_RESOURCES <= this->numResources) { 747b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i resources",PICO_MAX_NUM_RESOURCES); 748b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 749b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 750b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res = picorsrc_newResource(this->common->mm); 751b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 752b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == res) { 753b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL); 754b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 755b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 756b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoos_strlcpy(res->name,PICOKNOW_DEFAULT_RESOURCE_NAME,PICORSRC_MAX_RSRC_NAME_SIZ) < PICORSRC_MAX_RSRC_NAME_SIZ) { 757b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("assigned name %s to default resource",res->name)); 758b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_OK; 759b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 760b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("failed assigning name %s to default resource",res->name)); 761b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = PICO_ERR_INDEX_OUT_OF_RANGE; 762b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 763b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen status = picorsrc_createKnowledgeBase(this, NULL, 0, (picoknow_kb_id_t)PICOKNOW_KBID_FIXED_IDS, &res->kbList); 764b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 765b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK == status) { 766b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen res->next = this->resources; 767b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->resources = res; 768b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numResources++; 769b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* *resource = res; */ 770b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 771b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 772b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 773b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 774b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return status; 775b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 776b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 777b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 778b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_rsrcGetName(picorsrc_Resource this, 779b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char * name, picoos_uint32 maxlen) { 780b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!picoctrl_isValidResourceHandle(this)) { 781b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_INVALID_ARGUMENT; 782b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 783b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_strlcpy(name, this->name,maxlen); 784b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 785b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 786b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 787b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 788b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******* accessing voice definitions **************************************/ 789b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 790b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 791b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t findVoiceDefinition(picorsrc_ResourceManager this, 792b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen const picoos_char * voiceName, picorsrc_VoiceDefinition * vdef) 793b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 794b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition v; 795b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("finding voice name %s",voiceName)); 796b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 797b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 798b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 799b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v = this->vdefs; 800b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (NULL != v && (0 != picoos_strcmp(v->voiceName,voiceName))) { 801b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("%s doesnt match",v->voiceName)); 802b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v = v->next; 803b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 804b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *vdef = v; 805b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (v == NULL) { 806b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("didnt find voice name %s",voiceName)); 807b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 808b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("found voice name %s",voiceName)); 809b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 810b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 811b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 812b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 813b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 814b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_addResourceToVoiceDefinition(picorsrc_ResourceManager this, 815b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char * voiceName, picoos_char * resourceName) 816b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 817b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition vdef; 818b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 819b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 820b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("this is NULL")); 821b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 822b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 823b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PICO_OK == findVoiceDefinition(this,voiceName,&vdef)) && (NULL != vdef)) { 824b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_MAX_NUM_RSRC_PER_VOICE <= vdef->numResources) { 825b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i resources per voice",PICO_MAX_NUM_RSRC_PER_VOICE); 826b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 827b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoos_strlcpy(vdef->resourceName[vdef->numResources++], resourceName, 828b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICORSRC_MAX_RSRC_NAME_SIZ) < PICORSRC_MAX_RSRC_NAME_SIZ) { 829b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("vdef added resource '%s' to voice '%s'",resourceName,voiceName)); 830b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 831b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 832b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("illegal name (%s)",resourceName)); 833b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_ILLEGAL,NULL,(picoos_char *)"%s",resourceName); 834b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 835b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 836b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 837b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_UNDEFINED,NULL,(picoos_char *)"%s",voiceName); 838b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 839b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 840b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 841b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 842b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createVoiceDefinition(picorsrc_ResourceManager this, 843b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char * voiceName) 844b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 845b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition vdef; 846b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 847b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 848b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("this is NULL")); 849b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 850b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 851b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if ((PICO_OK == findVoiceDefinition(this,voiceName,&vdef)) && (NULL != vdef)) { 852b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("voice %s allready defined",voiceName)); 853b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_CONFLICT,NULL,NULL); 854b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 855b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_MAX_NUM_VOICE_DEFINITIONS <= this->numVdefs) { 856b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("max number of vdefs exceeded (%i)",this->numVdefs)); 857b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i voice definitions",PICO_MAX_NUM_VOICE_DEFINITIONS); 858b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 859b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this->freeVdefs) { 860b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vdef = picorsrc_newVoiceDefinition(this->common->mm); 861b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 862b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vdef = this->freeVdefs; 863b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeVdefs = vdef->next; 864b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vdef->voiceName[0] = NULLC; 865b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vdef->numResources = 0; 866b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vdef->next = NULL; 867b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 868b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == vdef) { 869b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_OUT_OF_MEM,NULL,NULL); 870b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 871b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (picoos_strlcpy(vdef->voiceName, voiceName, 872b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICO_MAX_VOICE_NAME_SIZE) < PICO_MAX_VOICE_NAME_SIZE) { 873b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen vdef->next = this->vdefs; 874b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->vdefs = vdef; 875b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numVdefs++; 876b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICO_OK != picorsrc_addResourceToVoiceDefinition(this,voiceName,PICOKNOW_DEFAULT_RESOURCE_NAME)) { 877b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_ERR_OTHER,NULL,(picoos_char *)"problem loading default resource %s",voiceName); 878b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 879b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("vdef created (%s)",voiceName)); 880b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 881b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 882b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("illegal name (%s)",voiceName)); 883b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_ILLEGAL,NULL,(picoos_char *)"%s",voiceName); 884b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 885b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 886b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 887b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 888b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_releaseVoiceDefinition(picorsrc_ResourceManager this, 889b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_char *voiceName) 890b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 891b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition v, l; 892b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 893b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (this == NULL) { 894b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 895b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 896b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 897b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = NULL; 898b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v = this->vdefs; 899b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while ((v != NULL) && (picoos_strcmp(v->voiceName, voiceName) != 0)) { 900b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l = v; 901b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v = v->next; 902b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 903b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (v != NULL) { 904b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* remove v from vdefs list */ 905b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (l != NULL) { 906b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen l->next = v->next; 907b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 908b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->vdefs = v->next; 909b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 910b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* insert v at head of freeVdefs list */ 911b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v->next = this->freeVdefs; 912b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeVdefs = v; 913b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numVdefs--; 914b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 915b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 916b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* we should rather return a warning, here */ 917b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_UNDEFINED,"%s", NULL); */ 918b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 919b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 920b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 921b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 922b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 923b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 924b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* ******* accessing voices **************************************/ 925b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 926b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 927b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* create voice, given a voice name. the corresponding lock counts are incremented */ 928b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 929b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_createVoice(picorsrc_ResourceManager this, const picoos_char * voiceName, picorsrc_Voice * voice) { 930b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 931b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_VoiceDefinition vdef; 932b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Resource rsrc; 933b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint8 i, required; 934b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoknow_KnowledgeBase kb; 935b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* pico_status_t status = PICO_OK; */ 936b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 937b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("creating voice %s",voiceName)); 938b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 939b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this) { 940b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("this is NULL")); 941b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 942b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 943b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 944b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* check number of voices */ 945b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (PICORSRC_MAX_NUM_VOICES <= this->numVoices) { 946b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("PICORSRC_MAX_NUM_VOICES exceeded")); 947b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_MAX_NUM_EXCEED,NULL,(picoos_char *)"no more than %i voices",PICORSRC_MAX_NUM_VOICES); 948b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 949b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 950b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* find voice definition for that name */ 951b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (!(PICO_OK == findVoiceDefinition(this,voiceName,&vdef)) || (NULL == vdef)) { 952b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("no voice definition for %s",voiceName)); 953b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_NAME_UNDEFINED,NULL,(picoos_char *)"voice definition %s",voiceName); 954b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 955b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 956b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("found voice definition for %s",voiceName)); 957b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 958b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* check that resources are loaded */ 959b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i = 0; i < vdef->numResources; i++) { 960b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen required = (NULLC != vdef->resourceName[i][0]); 961b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (required && !isResourceLoaded(this,vdef->resourceName[i])) { 962b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_ERROR(("resource missing")); 963b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em,PICO_EXC_RESOURCE_MISSING,NULL,(picoos_char *)"resource %s for voice %s",vdef->resourceName[i],voiceName); 964b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 965b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 966b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 967b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* allocate new voice */ 968b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this->freeVoices) { 969b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *voice = picorsrc_newVoice(this->common->mm); 970b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } else { 971b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *voice = this->freeVoices; 972b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeVoices = (*voice)->next; 973b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_initializeVoice(*voice); 974b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 975b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (*voice == NULL) { 976b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return picoos_emRaiseException(this->common->em, PICO_EXC_OUT_OF_MEM, NULL, NULL); 977b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 978b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numVoices++; 979b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 980b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen /* copy resource kb pointers into kb array of voice */ 981b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i = 0; i < vdef->numResources; i++) { 982b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen required = (NULLC != vdef->resourceName[i][0]); 983b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (required) { 984b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen findResource(this,vdef->resourceName[i],&rsrc); 985b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*voice)->resourceArray[(*voice)->numResources++] = rsrc; 986b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen rsrc->lockCount++; 987b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kb = rsrc->kbList; 988b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen while (NULL != kb) { 989b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL != (*voice)->kbArray[kb->id]) { 990b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_emRaiseWarning(this->common->em,PICO_WARN_KB_OVERWRITE,NULL, (picoos_char *)"%i", kb->id); 991b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_WARN(("overwriting knowledge base of id %i", kb->id)); 992b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 993b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 994b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen PICODBG_DEBUG(("setting knowledge base of id %i", kb->id)); 995b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 996b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen (*voice)->kbArray[kb->id] = kb; 997b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen kb = kb->next; 998b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 999b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1000b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } /* for */ 1001b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1002b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1003b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1004b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1005b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* dispose voice. the corresponding lock counts are decremented. */ 1006b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1007b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picorsrc_releaseVoice(picorsrc_ResourceManager this, picorsrc_Voice * voice) 1008b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen{ 1009b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picoos_uint16 i; 1010b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen picorsrc_Voice v = *voice; 1011b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen if (NULL == this || NULL == v) { 1012b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_ERR_NULLPTR_ACCESS; 1013b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1014b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen for (i = 0; i < v->numResources; i++) { 1015b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v->resourceArray[i]->lockCount--; 1016b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen } 1017b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen v->next = this->freeVoices; 1018b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->freeVoices = v; 1019b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen this->numVoices--; 1020b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1021b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen return PICO_OK; 1022b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1023b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1024b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus 1025b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} 1026b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif 1027b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen 1028b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end picorsrc.c */ 1029