summaryrefslogtreecommitdiffstats
path: root/pico/lib/picokdbg.c
diff options
context:
space:
mode:
Diffstat (limited to 'pico/lib/picokdbg.c')
-rw-r--r--pico/lib/picokdbg.c173
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 */