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 picokdbg.c
18b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
19b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * debug support knowledge base
20b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
21b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * Copyright (C) 2008-2009 SVOX AG, Baslerstr. 30, 8048 Zuerich, Switzerland
22b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * All rights reserved.
23b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
24b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * History:
25b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * - 2009-04-20 -- initial version
26b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
27b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen */
28b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
29b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoos.h"
30b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picoknow.h"
31b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picodbg.h"
32b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#include "picokdbg.h"
33b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
34b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
35b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenextern "C" {
36b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
37b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if 0
38b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
39b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
40b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
41b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#if defined(PICO_DEBUG)
42b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
43b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/**
44b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @addtogroup picokdbg
45b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
46b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * <b> Pico Debug Support for knowledge base </b>\n
47b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen *
48b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
49b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * @b Phones
50b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
51b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen * overview of binary file format for dbg kb:
52b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
53b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    dbg-kb = phonesyms
54b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
55b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    phonesyms = {PHONESYM8}=256
56b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
57b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PHONESYM6: 8 bytes, symbol name (must be 0 terminated), the
58b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               corresponding ID corresponds to the offset in the
59b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen               phonesyms array
60b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen*/
61b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
62b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* maximum length of phonesym string including terminating 0 */
63b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#define KDBG_PHONESYMLEN_MAX 8
64b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
65b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
66b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct kdbg_subobj *kdbg_SubObj;
67b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
68b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chentypedef struct kdbg_subobj {
69b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint8 *phonesyms;
70b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen} kdbg_subobj_t;
71b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
72b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
73b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdbgInitialize(register picoknow_KnowledgeBase this,
74b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                    picoos_Common common) {
75b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg_subobj_t *kdbg;
76b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
77b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    PICODBG_DEBUG(("start"));
78b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
79b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this || NULL == this->subObj) {
80b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_DEBUG(("2nd check failed"));
81b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_ERR_OTHER, NULL, NULL);
82b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
83b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg = (kdbg_subobj_t *)this->subObj;
84b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg->phonesyms = this->base;
85b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
86b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
87b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
88b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
89b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic pico_status_t kdbgSubObjDeallocate(register picoknow_KnowledgeBase this,
90b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                          picoos_MemoryManager mm) {
91b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL != this) {
92b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        picoos_deallocate(mm, (void *) &this->subObj);
93b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
94b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return PICO_OK;
95b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
96b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
97b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
98b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpico_status_t picokdbg_specializeDbgKnowledgeBase(picoknow_KnowledgeBase this,
99b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                                  picoos_Common common) {
100b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
101b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        PICODBG_INFO(("no debug symbols loaded"));
102b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return PICO_OK;
103b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
104b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subDeallocate = kdbgSubObjDeallocate;
105b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    this->subObj = picoos_allocate(common->mm, sizeof(kdbg_subobj_t));
106b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this->subObj) {
107b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return picoos_emRaiseException(common->em, PICO_EXC_OUT_OF_MEM,
108b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                       NULL, NULL);
109b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
110b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return kdbgInitialize(this, common);
111b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
112b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
113b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
114b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicokdbg_Dbg picokdbg_getDbg(picoknow_KnowledgeBase this) {
115b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (NULL == this) {
116b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
117b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    } else {
118b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return (picokdbg_Dbg)this->subObj;
119b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
120b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
121b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
122b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
123b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* Dbg methods */
124b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
125b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_uint8 picokdbg_getPhoneId(const picokdbg_Dbg this,
126b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                 const picoos_char *phsym) {
127b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg_subobj_t *kdbg;
128b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picoos_uint16 i;
129b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
130b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this == NULL)
131b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return 0;
132b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
133b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg = (kdbg_subobj_t *)this;
134b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    /* sequential search */
135b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    for (i = 0; i < 256; i++) {
136b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        if (!picoos_strcmp(phsym,
137b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen             (picoos_char *)&(kdbg->phonesyms[i * KDBG_PHONESYMLEN_MAX])))
138b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen            return (picoos_uint8)i;
139b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    }
140b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return 0;
141b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
142b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
143b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
144b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenpicoos_char *picokdbg_getPhoneSym(const picokdbg_Dbg this,
145b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen                                  const picoos_uint8 phid) {
146b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg_subobj_t *kdbg;
147b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
148b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    if (this == NULL)
149b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen        return NULL;
150b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
151b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    kdbg = (kdbg_subobj_t *)this;
152b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    return (picoos_char *)&(kdbg->phonesyms[phid * KDBG_PHONESYMLEN_MAX]);
153b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
154b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
155b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
156b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
157b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#else
158b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
159b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* To prevent warning about "translation unit is empty" when
160b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen   diagnostic output is disabled. */
161b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chenstatic void picokdbg_dummy(void) {
162b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen    picokdbg_dummy();
163b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
164b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
165b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
166b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif /* defined(PICO_DEBUG) */
167b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
168b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#ifdef __cplusplus
169b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen}
170b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen#endif
171b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
172b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen
173b190149a69b110e6719ce0a41877a683f8db7ae7Charles Chen/* end */
174