diff options
Diffstat (limited to 'pico/lib/picokdbg.c')
-rw-r--r-- | pico/lib/picokdbg.c | 173 |
1 files changed, 173 insertions, 0 deletions
diff --git a/pico/lib/picokdbg.c b/pico/lib/picokdbg.c new file mode 100644 index 0000000..c0336ba --- /dev/null +++ b/pico/lib/picokdbg.c @@ -0,0 +1,173 @@ +/* + * 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 */ |