1 /*
2 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 * http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16 /**
17 * @file picokdbg.c
18 *
19 * debug support knowledge base
20 *
21 * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
22 * All rights reserved.
23 *
24 * History:
25 * - 2009-04-20 -- initial version
26 *
27 */
28
29 #include "picoos.h"
30 #include "picoknow.h"
31 #include "picodbg.h"
32 #include "picokdbg.h"
33
34 #ifdef __cplusplus
35 extern "C" {
36 #endif
37 #if 0
38 }
39 #endif
40
41 #if defined(PICO_DEBUG)
42
43 /**
44 * @addtogroup picokdbg
45
46 * <b> Pico Debug Support for knowledge base </b>\n
47 *
48
49 * @b Phones
50
51 * overview of binary file format for dbg kb:
52
53 dbg-kb = phonesyms
54
55 phonesyms = {PHONESYM8}=256
56
57 PHONESYM6: 8 bytes, symbol name (must be 0 terminated), the
58 corresponding ID corresponds to the offset in the
59 phonesyms array
60 */
61
62 /* maximum length of phonesym string including terminating 0 */
63 #define KDBG_PHONESYMLEN_MAX 8
64
65
66 typedef struct kdbg_subobj *kdbg_SubObj;
67
68 typedef struct kdbg_subobj {
69 picoos_uint8 *phonesyms;
70 } kdbg_subobj_t;
71
72
kdbgInitialize(register picoknow_KnowledgeBase this,picoos_Common common)73 static pico_status_t kdbgInitialize(register picoknow_KnowledgeBase this,
74 picoos_Common common) {
75 kdbg_subobj_t *kdbg;
76
77 PICODBG_DEBUG(("start"));
78
79 if (NULL == this || NULL == this->subObj) {
80 PICODBG_DEBUG(("2nd check failed"));
81 return picoos_emRaiseException(common->em, PICO_ERR_OTHER, NULL, NULL);
82 }
83 kdbg = (kdbg_subobj_t *)this->subObj;
84 kdbg->phonesyms = this->base;
85 return PICO_OK;
86 }
87
88
kdbgSubObjDeallocate(register picoknow_KnowledgeBase this,picoos_MemoryManager mm)89 static pico_status_t kdbgSubObjDeallocate(register picoknow_KnowledgeBase this,
90 picoos_MemoryManager mm) {
91 if (NULL != this) {
92 picoos_deallocate(mm, (void *) &this->subObj);
93 }
94 return PICO_OK;
95 }
96
97
picokdbg_specializeDbgKnowledgeBase(picoknow_KnowledgeBase this,picoos_Common common)98 pico_status_t picokdbg_specializeDbgKnowledgeBase(picoknow_KnowledgeBase this,
99 picoos_Common common) {
100 if (NULL == this) {
101 PICODBG_INFO(("no debug symbols loaded"));
102 return PICO_OK;
103 }
104 this->subDeallocate = kdbgSubObjDeallocate;
105 this->subObj = picoos_allocate(common->mm, sizeof(kdbg_subobj_t));
106 if (NULL == this->subObj) {
107 return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
108 NULL, NULL);
109 }
110 return kdbgInitialize(this, common);
111 }
112
113
picokdbg_getDbg(picoknow_KnowledgeBase this)114 picokdbg_Dbg picokdbg_getDbg(picoknow_KnowledgeBase this) {
115 if (NULL == this) {
116 return NULL;
117 } else {
118 return (picokdbg_Dbg)this->subObj;
119 }
120 }
121
122
123 /* Dbg methods */
124
picokdbg_getPhoneId(const picokdbg_Dbg this,const picoos_char * phsym)125 picoos_uint8 picokdbg_getPhoneId(const picokdbg_Dbg this,
126 const picoos_char *phsym) {
127 kdbg_subobj_t *kdbg;
128 picoos_uint16 i;
129
130 if (this == NULL)
131 return 0;
132
133 kdbg = (kdbg_subobj_t *)this;
134 /* sequential search */
135 for (i = 0; i < 256; i++) {
136 if (!picoos_strcmp(phsym,
137 (picoos_char *)&(kdbg->phonesyms[i * KDBG_PHONESYMLEN_MAX])))
138 return (picoos_uint8)i;
139 }
140 return 0;
141 }
142
143
picokdbg_getPhoneSym(const picokdbg_Dbg this,const picoos_uint8 phid)144 picoos_char *picokdbg_getPhoneSym(const picokdbg_Dbg this,
145 const picoos_uint8 phid) {
146 kdbg_subobj_t *kdbg;
147
148 if (this == NULL)
149 return NULL;
150
151 kdbg = (kdbg_subobj_t *)this;
152 return (picoos_char *)&(kdbg->phonesyms[phid * KDBG_PHONESYMLEN_MAX]);
153 }
154
155
156
157 #else
158
159 /* To prevent warning about "translation unit is empty" when
160 diagnostic output is disabled. */
161 static void picokdbg_dummy(void) {
162 picokdbg_dummy();
163 }
164
165
166 #endif /* defined(PICO_DEBUG) */
167
168 #ifdef __cplusplus
169 }
170 #endif
171
172
173 /* end */
174