/* * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /** * @file picokdbg.c * * debug support knowledge base * * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland * All rights reserved. * * History: * - 2009-04-20 -- initial version * */ #include "picoos.h" #include "picoknow.h" #include "picodbg.h" #include "picokdbg.h" #ifdef __cplusplus extern "C" { #endif #if 0 } #endif #if defined(PICO_DEBUG) /** * @addtogroup picokdbg * <b> Pico Debug Support for knowledge base </b>\n * * @b Phones * overview of binary file format for dbg kb: dbg-kb = phonesyms phonesyms = {PHONESYM8}=256 PHONESYM6: 8 bytes, symbol name (must be 0 terminated), the corresponding ID corresponds to the offset in the phonesyms array */ /* maximum length of phonesym string including terminating 0 */ #define KDBG_PHONESYMLEN_MAX 8 typedef struct kdbg_subobj *kdbg_SubObj; typedef struct kdbg_subobj { picoos_uint8 *phonesyms; } kdbg_subobj_t; static pico_status_t kdbgInitialize(register picoknow_KnowledgeBase this, picoos_Common common) { kdbg_subobj_t *kdbg; PICODBG_DEBUG(("start")); if (NULL == this || NULL == this->subObj) { PICODBG_DEBUG(("2nd check failed")); return picoos_emRaiseException(common->em, PICO_ERR_OTHER, NULL, NULL); } kdbg = (kdbg_subobj_t *)this->subObj; kdbg->phonesyms = this->base; return PICO_OK; } static pico_status_t kdbgSubObjDeallocate(register picoknow_KnowledgeBase this, picoos_MemoryManager mm) { if (NULL != this) { picoos_deallocate(mm, (void *) &this->subObj); } return PICO_OK; } pico_status_t picokdbg_specializeDbgKnowledgeBase(picoknow_KnowledgeBase this, picoos_Common common) { if (NULL == this) { PICODBG_INFO(("no debug symbols loaded")); return PICO_OK; } this->subDeallocate = kdbgSubObjDeallocate; this->subObj = picoos_allocate(common->mm, sizeof(kdbg_subobj_t)); if (NULL == this->subObj) { return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM, NULL, NULL); } return kdbgInitialize(this, common); } picokdbg_Dbg picokdbg_getDbg(picoknow_KnowledgeBase this) { if (NULL == this) { return NULL; } else { return (picokdbg_Dbg)this->subObj; } } /* Dbg methods */ picoos_uint8 picokdbg_getPhoneId(const picokdbg_Dbg this, const picoos_char *phsym) { kdbg_subobj_t *kdbg; picoos_uint16 i; if (this == NULL) return 0; kdbg = (kdbg_subobj_t *)this; /* sequential search */ for (i = 0; i < 256; i++) { if (!picoos_strcmp(phsym, (picoos_char *)&(kdbg->phonesyms[i * KDBG_PHONESYMLEN_MAX]))) return (picoos_uint8)i; } return 0; } picoos_char *picokdbg_getPhoneSym(const picokdbg_Dbg this, const picoos_uint8 phid) { kdbg_subobj_t *kdbg; if (this == NULL) return NULL; kdbg = (kdbg_subobj_t *)this; return (picoos_char *)&(kdbg->phonesyms[phid * KDBG_PHONESYMLEN_MAX]); } #else /* To prevent warning about "translation unit is empty" when diagnostic output is disabled. */ static void picokdbg_dummy(void) { picokdbg_dummy(); } #endif /* defined(PICO_DEBUG) */ #ifdef __cplusplus } #endif /* end */