This library contains code that extends and simplifies different operations
for C language based programs.
Revisión | c137b058d1fdf2effa357f963201ddf8a3e3141e (tree) |
---|---|
Tiempo | 2014-10-02 17:46:21 |
Autor | s.gusarov |
Commiter | s.gusarov |
Initial commit.
Added files from the digital_phone/firmware repository.
trace.h and trace.cpp added from the maska_router_all/le920d repository.
@@ -0,0 +1,52 @@ | ||
1 | +/* | |
2 | + * @author Sergey Gusarov <sgusarow@mail.ru> | |
3 | + * @section LICENSE | |
4 | + * Copyright (c) 2013 by SPT Ltd | |
5 | + * | |
6 | + * This software is copyrighted by and is the sole property of SPT Ltd. | |
7 | + * All rights, title, ownership, or other interests | |
8 | + * in the software remain the property of SPT Ltd. This | |
9 | + * software may only be used in accordance with the corresponding | |
10 | + * license agreement. Any unauthorized use, duplication, transmission, | |
11 | + * distribution, or disclosure of this software is forbidden. | |
12 | + * | |
13 | + * This Copyright notice may not be removed or modified without prior | |
14 | + * written consent of SPT Ltd. | |
15 | + * | |
16 | + * SPT Ltd reserves the right to modify this software without notice | |
17 | + * | |
18 | + * @section DESCRIPTION | |
19 | + * | |
20 | + */ | |
21 | + | |
22 | +#pragma once | |
23 | + | |
24 | +#include <stdbool.h> | |
25 | + | |
26 | +/* | |
27 | + We don't use c99 asserts because they don't provide infinite loop and | |
28 | + don't signal hereby to watchdog timer | |
29 | +*/ | |
30 | + | |
31 | +#if USE_SPT_ASSERTS | |
32 | +# define SPT_ASSERT(condition, ...)\ | |
33 | + do\ | |
34 | + {\ | |
35 | + if (!(condition))\ | |
36 | + {\ | |
37 | + TRACE_PERM_WP("ASSERT failed: " __VA_ARGS__);\ | |
38 | + while (1);\ | |
39 | + }\ | |
40 | + }\ | |
41 | + while (false) | |
42 | +# define RETURN_WITHOUT_ASSERT(result) | |
43 | +#else | |
44 | +# define SPT_ASSERT(expr, ...) do {((void)(expr));} while (0) | |
45 | +# define RETURN_WITHOUT_ASSERT(result) return result | |
46 | +#endif | |
47 | + | |
48 | +#define UNIQUE_NAME MAKE_NAME(__LINE__) | |
49 | +#define MAKE_NAME(line) MAKE_NAME2(line) | |
50 | +#define MAKE_NAME2(line) constraint_ ## line | |
51 | + | |
52 | +#define COMPILE_TIME_ASSERT(expr) struct UNIQUE_NAME {unsigned int bf : expr;} |
@@ -0,0 +1,39 @@ | ||
1 | +#pragma once | |
2 | + | |
3 | +#include <stdint.h> | |
4 | + | |
5 | +/* | |
6 | + * Binary constant generator macros evaluating to compile-time constants | |
7 | + * | |
8 | + * Based on work by Tom Torfs donated to the public domain | |
9 | + * | |
10 | + * Sample usage: | |
11 | + * | |
12 | + * B8(01010101) = 85 | |
13 | + * B16(10101010,01010101) = 43605 | |
14 | + * B32(10000000,11111111,10101010,01010101) = 2164238933 | |
15 | + */ | |
16 | + | |
17 | +/* | |
18 | + * For up to 8-bit binary constants | |
19 | + */ | |
20 | +#define B8(b) ((uint8_t)B8__(HEX__(b))) | |
21 | + | |
22 | +/* | |
23 | + * For up to 16-bit binary constants, MSB first | |
24 | + */ | |
25 | +#define B16(b1, b0) (((uint16_t)B8(b1) << 8) | B8(b0)) | |
26 | + | |
27 | +/* | |
28 | + * For up to 32-bit binary constants, MSB first | |
29 | + */ | |
30 | +#define B32(b3, b2, b1, b0) (((uint32_t)B8(b3) << 24) | ((uint32_t)B8(b2) << 16) |\ | |
31 | + ((uint32_t)B8(b1) << 8) | B8(b0)) | |
32 | + | |
33 | +/* | |
34 | + * Helper macros not to be used directly | |
35 | + */ | |
36 | +#define HEX__(n) 0x##n##UL | |
37 | +#define B8__(x) (((x&0x0000000FUL)?0x01:0) | ((x&0x000000F0UL)?0x02:0) | ((x&0x00000F00UL)?0x04:0) |\ | |
38 | + ((x&0x0000F000UL)?0x08:0) | ((x&0x000F0000UL)?0x10:0) | ((x&0x00F00000UL)?0x20:0) |\ | |
39 | + ((x&0x0F000000UL)?0x40:0) | ((x&0xF0000000UL)?0x80:0)) |
@@ -0,0 +1,22 @@ | ||
1 | +/* | |
2 | + * Source: http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-c | |
3 | + * [01.10.2013] | |
4 | + * With modifications | |
5 | + */ | |
6 | + | |
7 | +#pragma once | |
8 | + | |
9 | +/* a = target variable, b = bit number to act upon 0-n */ | |
10 | +#define BIT_SET(a, b) ((a) |= (1 << (b))) | |
11 | +#define BIT_CLEAR(a, b) ((a) &= ~(1 << (b))) | |
12 | +#define BIT_FLIP(a, b) ((a) ^= (1 << (b))) | |
13 | +#define BIT_CHECK(a, b) ((a) & (1 << (b))) | |
14 | + | |
15 | +/* x = target variable, y = mask */ | |
16 | +#define BITMASK_SET(x, y) ((x) |= (y)) | |
17 | +#define BITMASK_CLEAR(x, y) ((x) &= (~(y))) | |
18 | +#define BITMASK_FLIP(x, y) ((x) ^= (y)) | |
19 | +#define BITMASK_CHECK(x, y) ((x) & (y)) | |
20 | + | |
21 | +/* x = target variable, y = mask, z = new bits */ | |
22 | +#define BITS_REPLACE(x, y, z) (((x) & (~(y))) | ((z) & (y))) |
@@ -0,0 +1,46 @@ | ||
1 | +#ifndef _NANOLAT_C_CALLSTACK_H_ | |
2 | +#define _NANOLAT_C_CALLSTACK_H_ (1) | |
3 | + | |
4 | +/************************************************************************** | |
5 | +// | |
6 | +// Copyright 2013 Kangmo Kim, Nanolat Software. | |
7 | +// | |
8 | +// e-mail : kangmo@nanolat.com | |
9 | +// | |
10 | +// Licensed under the Apache License, Version 2.0 (the "License"); | |
11 | +// you may not use this file except in compliance with the License. | |
12 | +// You may obtain a copy of the License at | |
13 | +// | |
14 | +// http://www.apache.org/licenses/LICENSE-2.0 | |
15 | +// | |
16 | +// Unless required by applicable law or agreed to in writing, software | |
17 | +// distributed under the License is distributed on an "AS IS" BASIS, | |
18 | +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
19 | +// See the License for the specific language governing permissions and | |
20 | +// limitations under the License. | |
21 | +// | |
22 | +// c-callstack.h : Show Java-like callstack in C/C++ projects. | |
23 | +// | |
24 | +***************************************************************************/ | |
25 | + | |
26 | +#include "trace.h" | |
27 | + | |
28 | +#if defined(NDEBUG) /* Release Mode */ | |
29 | + | |
30 | +#define NL_RETURN(rc) do {return (rc);} while (false) | |
31 | + | |
32 | +#else /* Debug Mode */ | |
33 | + | |
34 | +#define NL_RETURN(rc) \ | |
35 | + { \ | |
36 | + if ((rc)) { \ | |
37 | + TRACE_ERROR( \ | |
38 | + "Error(code:%d) at : %s (%s:%d)\n", \ | |
39 | + (rc), __PRETTY_FUNCTION__, __FILE__, __LINE__); \ | |
40 | + } \ | |
41 | + return (rc); \ | |
42 | + } | |
43 | + | |
44 | +#endif /* NDEBUG */ | |
45 | + | |
46 | +#endif /* _NANOLAT_C_CALLSTACK_H_ */ |
@@ -0,0 +1,30 @@ | ||
1 | +/* | |
2 | + * @author Sergey Gusarov <sgusarow@mail.ru> | |
3 | + * @section LICENSE | |
4 | + * Copyright (c) 2013 by SPT Ltd | |
5 | + * | |
6 | + * This software is copyrighted by and is the sole property of SPT Ltd. | |
7 | + * All rights, title, ownership, or other interests | |
8 | + * in the software remain the property of SPT Ltd. This | |
9 | + * software may only be used in accordance with the corresponding | |
10 | + * license agreement. Any unauthorized use, duplication, transmission, | |
11 | + * distribution, or disclosure of this software is forbidden. | |
12 | + * | |
13 | + * This Copyright notice may not be removed or modified without prior | |
14 | + * written consent of SPT Ltd. | |
15 | + * | |
16 | + * SPT Ltd reserves the right to modify this software without notice | |
17 | + * | |
18 | + * @section DESCRIPTION | |
19 | + * | |
20 | + */ | |
21 | + | |
22 | +#pragma once | |
23 | + | |
24 | +#include "binary_const.h" | |
25 | + | |
26 | +typedef unsigned int uint; | |
27 | + | |
28 | +#ifndef __GNUC__ | |
29 | +typedef long ssize_t; | |
30 | +#endif |
@@ -0,0 +1,388 @@ | ||
1 | +/* | |
2 | + * @author Sergey Gusarov <sgusarow@mail.ru> | |
3 | + * @section LICENSE | |
4 | + * Copyright (c) 2013 by SPT Ltd | |
5 | + * | |
6 | + * This software is copyrighted by and is the sole property of SPT Ltd. | |
7 | + * All rights, title, ownership, or other interests | |
8 | + * in the software remain the property of SPT Ltd. This | |
9 | + * software may only be used in accordance with the corresponding | |
10 | + * license agreement. Any unauthorized use, duplication, transmission, | |
11 | + * distribution, or disclosure of this software is forbidden. | |
12 | + * | |
13 | + * This Copyright notice may not be removed or modified without prior | |
14 | + * written consent of SPT Ltd. | |
15 | + * | |
16 | + * SPT Ltd reserves the right to modify this software without notice | |
17 | + * | |
18 | + * @section DESCRIPTION | |
19 | + * This file was taken from the at91lib_20100901_softpack_1_9_v_1_0_svn_v15011.zip file | |
20 | + * (latest available at91lib from Atmel's site). Many things are not actual for new projects. | |
21 | + * Because of this file was completely reworked. C++ support is added. | |
22 | + * Now it requires C99/C++98 compalible compiler. | |
23 | + */ | |
24 | + | |
25 | +/* --------------------------------------------------------------------------------------------------------------------- | |
26 | + * ATMEL Microcontroller Software Support | |
27 | + * --------------------------------------------------------------------------------------------------------------------- | |
28 | + * Copyright (c) 2008, Atmel Corporation | |
29 | + * | |
30 | + * All rights reserved. | |
31 | + * | |
32 | + * Redistribution and use in source and binary forms, with or without | |
33 | + * modification, are permitted provided that the following conditions are met: | |
34 | + * | |
35 | + * - Redistributions of source code must retain the above copyright notice, | |
36 | + * this list of conditions and the disclaimer below. | |
37 | + * | |
38 | + * Atmel's name may not be used to endorse or promote products derived from | |
39 | + * this software without specific prior written permission. | |
40 | + * | |
41 | + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR | |
42 | + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
43 | + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | |
44 | + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, | |
45 | + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
46 | + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | |
47 | + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
48 | + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
49 | + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | |
50 | + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
51 | + * --------------------------------------------------------------------------------------------------------------------- | |
52 | + */ | |
53 | + | |
54 | +#pragma once | |
55 | + | |
56 | +// --------------------------------------------------------------------------------------------------------------------- | |
57 | +/// \unit | |
58 | +/// | |
59 | +/// !Purpose | |
60 | +/// | |
61 | +/// Standard output methods for reporting debug information, warnings and | |
62 | +/// errors, which can be easily be turned on/off. | |
63 | +/// | |
64 | +/// !Usage | |
65 | +/// -# Uses the TRACE_DEBUG(), TRACE_INFO(), TRACE_WARNING(), TRACE_ERROR() | |
66 | +/// TRACE_FATAL() macros to output traces throughout the program. | |
67 | +/// -# Each type of trace has a level : Debug 5, Info 4, Warning 3, Error 2 | |
68 | +/// and Fatal 1. Disable a group of traces by changing the value of | |
69 | +/// TRACE_LEVEL during compilation; traces with a level bigger than TRACE_LEVEL | |
70 | +/// are not generated. To generate no trace, use the reserved value 0. | |
71 | +/// -# Trace disabling can be static or dynamic. If dynamic disabling is selected | |
72 | +/// the trace level can be modified in runtime. If static disabling is selected | |
73 | +/// the disabled traces are not compiled. | |
74 | +/// | |
75 | +/// !Trace level description | |
76 | +/// -# TRACE_DEBUG (5): Traces whose only purpose is for debugging the program, | |
77 | +/// and which do not produce meaningful information otherwise. | |
78 | +/// -# TRACE_INFO (4): Informational trace about the program execution. Should | |
79 | +/// enable the user to see the execution flow. | |
80 | +/// -# TRACE_WARNING (3): Indicates that a minor error has happened. In most case | |
81 | +/// it can be discarded safely; it may even be expected. | |
82 | +/// -# TRACE_ERROR (2): Indicates an error which may not stop the program execution, | |
83 | +/// but which indicates there is a problem with the code. | |
84 | +/// -# TRACE_FATAL (1): Indicates a major error which prevents the program from going | |
85 | +/// any further. | |
86 | +/// | |
87 | +/// Traces compile time setup | |
88 | +/// TRACE_LEVEL_NO_TRACE can be defined to turn off all the traces. | |
89 | +/// TRACE_SYSLOG or TRACE_TERMINAL or TRACE_SYSLOG_AND_TERMINAL must be defined to point the traces direction. | |
90 | +/// TRACE_PLACEMENT can be defined if trace location (file name and line) is needed. | |
91 | + | |
92 | +#if defined(linux) || defined(__linux__) | |
93 | +# define TRACE_LINUX | |
94 | +#else | |
95 | +# undef TRACE_LINUX | |
96 | +#endif | |
97 | + | |
98 | +#ifdef TRACE_LINUX | |
99 | +# include <syslog.h> | |
100 | +#endif | |
101 | + | |
102 | +#ifndef TRACE_LEVEL_NO_TRACE | |
103 | +# if !defined(TRACE_SYSLOG) && !defined(TRACE_TERMINAL) && !defined(TRACE_SYSLOG_AND_TERMINAL) | |
104 | +# error TRACE_SYSLOG or TRACE_TERMINAL or TRACE_SYSLOG_AND_TERMINAL must be defined | |
105 | +# endif | |
106 | + | |
107 | +# if defined(TRACE_SYSLOG) && defined(TRACE_TERMINAL) | |
108 | +# error TRACE_SYSLOG or TRACE_TERMINAL must be defined, but not both | |
109 | +# endif | |
110 | + | |
111 | +# if defined(TRACE_SYSLOG_AND_TERMINAL) && defined(TRACE_TERMINAL) | |
112 | +# error TRACE_SYSLOG_AND_TERMINAL or TRACE_TERMINAL must be defined, but not both | |
113 | +# endif | |
114 | + | |
115 | +# if defined(TRACE_SYSLOG_AND_TERMINAL) && defined(TRACE_SYSLOG) | |
116 | +# error TRACE_SYSLOG_AND_TERMINAL or TRACE_SYSLOG must be defined, but not both | |
117 | +# endif | |
118 | +#endif | |
119 | + | |
120 | +#ifdef __cplusplus | |
121 | + | |
122 | +# include <cstdio> | |
123 | +# include <cstdbool> | |
124 | + | |
125 | +static inline void traceFatalAction(void) noexcept | |
126 | +{ | |
127 | +} | |
128 | + | |
129 | +/* *INDENT-OFF* */ | |
130 | + | |
131 | +namespace trace { | |
132 | + extern "C" { | |
133 | + | |
134 | +/* *INDENT-ON* */ | |
135 | + | |
136 | +#else | |
137 | + | |
138 | +# include <stdio.h> | |
139 | +# include <stdbool.h> | |
140 | + | |
141 | +static inline void traceFatalAction(void) | |
142 | +{ | |
143 | + while (true) | |
144 | + ; | |
145 | +} | |
146 | + | |
147 | +#endif /* ifdef __cplusplus */ | |
148 | + | |
149 | +#define ENDL "\r\n" | |
150 | + | |
151 | +#define TRACE_LEVEL_DEBUG 5 | |
152 | +#define TRACE_LEVEL_INFO 4 | |
153 | +#define TRACE_LEVEL_WARNING 3 | |
154 | +#define TRACE_LEVEL_ERROR 2 | |
155 | +#define TRACE_LEVEL_FATAL 1 | |
156 | +#define TRACE_LEVEL_NO_TRACE 0 | |
157 | + | |
158 | +// By default, all traces are output except the debug one. | |
159 | +#if !defined (TRACE_LEVEL) | |
160 | +# define TRACE_LEVEL TRACE_LEVEL_INFO | |
161 | +#endif | |
162 | + | |
163 | +// By default, trace level is static (not dynamic) | |
164 | +#if !defined (DYN_TRACES) | |
165 | +# define DYN_TRACES 0 | |
166 | +#endif | |
167 | + | |
168 | +#if defined (NOTRACE) | |
169 | +# error "Error: NOTRACE has to be not defined!" | |
170 | +#endif | |
171 | + | |
172 | +#undef NOTRACE | |
173 | +#if (DYN_TRACES == 0) | |
174 | +# if (TRACE_LEVEL == TRACE_LEVEL_NO_TRACE) | |
175 | +# define NOTRACE | |
176 | +# endif | |
177 | +#endif | |
178 | + | |
179 | +/* | |
180 | + * There are linking troubles when fprintf, flush and other such functions are used with Keil armcc | |
181 | + */ | |
182 | +#if defined (__arm__) && !defined(TRACE_LINUX) | |
183 | +# define TRACE_FATAL_STREAM | |
184 | +# define TRACE_ERROR_STREAM | |
185 | +# define TRACE_WARNING_STREAM | |
186 | +# define TRACE_INFO_STREAM | |
187 | +# define TRACE_DEBUG_STREAM | |
188 | +# define TRACE_PERM_STREAM | |
189 | +# if defined(TRACE_TERMINAL) || defined(TRACE_SYSLOG_AND_TERMINAL) | |
190 | +# define streamedPrintf(stream, ...) do {printf(__VA_ARGS__);} while (false) | |
191 | +# else | |
192 | +# define streamedPrintf(stream, ...) do {} while (false) | |
193 | +# endif | |
194 | +#else | |
195 | +/* !(defined (__arm__) && !defined(TRACE_LINUX)) */ | |
196 | +# define TRACE_FATAL_STREAM stderr | |
197 | +# define TRACE_ERROR_STREAM stderr | |
198 | +# define TRACE_WARNING_STREAM stderr | |
199 | +# define TRACE_INFO_STREAM stdout | |
200 | +# define TRACE_DEBUG_STREAM stdout | |
201 | +# define TRACE_PERM_STREAM stdout | |
202 | +# if defined(TRACE_TERMINAL) || defined(TRACE_SYSLOG_AND_TERMINAL) | |
203 | +# define streamedPrintf(stream, ...) do {fprintf(stream, __VA_ARGS__); fflush(stream);} while (false) | |
204 | +# else | |
205 | +# define streamedPrintf(stream, ...) do {} while (false) | |
206 | +# endif | |
207 | +#endif | |
208 | + | |
209 | +/* | |
210 | + * Wrapper over the printf(). | |
211 | + * One gcc extension is used here. | |
212 | + * It seems that armcc is also supports it. | |
213 | + */ | |
214 | + | |
215 | +#ifdef TRACE_PLACEMENT | |
216 | +# define dprintf(stream, arg1, arg2, ...)\ | |
217 | + do {\ | |
218 | + streamedPrintf(stream, ENDL arg1 "%s:%d " arg2, __FILE__, __LINE__, ## __VA_ARGS__);\ | |
219 | + }\ | |
220 | + while (false) | |
221 | +#else | |
222 | +# define dprintf(stream, arg1, arg2, ...)\ | |
223 | + do {\ | |
224 | + streamedPrintf(stream, ENDL arg1 arg2, ## __VA_ARGS__);\ | |
225 | + }\ | |
226 | + while (false) | |
227 | +#endif | |
228 | + | |
229 | +/* | |
230 | + * It is supposed that only daemons should write to syslog (if they want). | |
231 | + * This feature is available in POSIX but so far supported only for Linux | |
232 | + * @param level: one of LOG_EMERG, LOG_ALERT, LOG_CRIT, LOG_ERR, LOG_WARNING, LOG_NOTICE, LOG_INFO, LOG_DEBUG. | |
233 | + * Associations: | |
234 | + * TRACE_DEBUG ~ LOG_DEBUG | |
235 | + * TRACE_INFO ~ LOG_INFO | |
236 | + * TRACE_WARNING ~ LOG_WARNING | |
237 | + * TRACE_ERROR ~ LOG_ERR | |
238 | + * TRACE_FATAL ~ LOG_EMERG | |
239 | + * | |
240 | + * TODO: add associations checking | |
241 | + */ | |
242 | +#if (defined(TRACE_SYSLOG) || defined(TRACE_SYSLOG_AND_TERMINAL)) && defined(TRACE_LINUX) | |
243 | +# ifdef TRACE_PLACEMENT | |
244 | +# define dsyslog(level, arg1, ...)\ | |
245 | + do {\ | |
246 | + syslog(LOG_DAEMON | level, "%s:%d " arg1, __FILE__, __LINE__, ## __VA_ARGS__);\ | |
247 | + }\ | |
248 | + while (false) | |
249 | +# else | |
250 | +# define dsyslog(level, arg1, ...)\ | |
251 | + do {\ | |
252 | + syslog(LOG_DAEMON | level, arg1, ## __VA_ARGS__);\ | |
253 | + }\ | |
254 | + while (false) | |
255 | +# endif | |
256 | +#else | |
257 | +# define dsyslog(level, message, ...) do {} while (false) | |
258 | +#endif | |
259 | + | |
260 | +// --------------------------------------------------------------------------------------------------------------------- | |
261 | +/// Outputs a formatted string using <printf> if the log level is high | |
262 | +/// enough. Can be disabled by defining TRACE_LEVEL = 0 during compilation. | |
263 | +/// \param format Formatted string to output. | |
264 | +/// \param ... Additional parameters depending on formatted string. | |
265 | +// --------------------------------------------------------------------------------------------------------------------- | |
266 | +#if defined (NOTRACE) | |
267 | + | |
268 | +// Empty macro | |
269 | +#define TRACE_DEBUG(...) do {} while (false) | |
270 | +#define TRACE_INFO(...) do {} while (false) | |
271 | +#define TRACE_WARNING(...) do {} while (false) | |
272 | +#define TRACE_ERROR(...) do {} while (false) | |
273 | +#define TRACE_FATAL(...) do {traceFatalAction();} while (false) | |
274 | +#define TRACE_PERM(...) do {} while (false) | |
275 | + | |
276 | +#define TRACE_DEBUG_WP(...) do {} while (false) | |
277 | +#define TRACE_INFO_WP(...) do {} while (false) | |
278 | +#define TRACE_WARNING_WP(...) do {} while (false) | |
279 | +#define TRACE_ERROR_WP(...) do {} while (false) | |
280 | +#define TRACE_FATAL_WP(...) do {traceFatalAction();} while (false) | |
281 | +#define TRACE_PERM_WP(...) do {} while (false) | |
282 | + | |
283 | +#define TRACE_FUNC(arg1) do {} while (false) | |
284 | + | |
285 | +#elif (DYN_TRACES == 1) | |
286 | + | |
287 | +// Trace output depends on traceLevel value | |
288 | +#define TRACE_DEBUG(...) do {if (traceLevel >= TRACE_LEVEL_DEBUG) {dsyslog(LOG_DEBUG, __VA_ARGS__); dprintf(TRACE_DEBUG_STREAM, "-D- ", __VA_ARGS__);}} while (false) | |
289 | + | |
290 | +#define TRACE_INFO(...) do {if (traceLevel >= TRACE_LEVEL_INFO) {dsyslog(LOG_INFO, __VA_ARGS__); dprintf(TRACE_INFO_STREAM, "-I- ", __VA_ARGS__);}} while (false) | |
291 | +#define TRACE_WARNING(...) do {if (traceLevel >= TRACE_LEVEL_WARNING) {dsyslog(LOG_WARNING, __VA_ARGS__); dprintf(TRACE_WARNING_STREAM, "-W- ", __VA_ARGS__);}} while (false) | |
292 | +#define TRACE_ERROR(...) do {if (traceLevel >= TRACE_LEVEL_ERROR) {dsyslog(LOG_ERR, __VA_ARGS__); dprintf(TRACE_ERROR_STREAM, "-E- ", __VA_ARGS__);}} while (false) | |
293 | +#define TRACE_FATAL(...) do {if (traceLevel >= TRACE_LEVEL_FATAL) {dsyslog(LOG_EMERG, __VA_ARGS__); dprintf(TRACE_FATAL_STREAM, "-F- ", __VA_ARGS__); traceFatalAction();}} while (false) | |
294 | +#define TRACE_PERM(...) do {dsyslog(LOG_NOTICE, __VA_ARGS__); dprintf(TRACE_PERM_STREAM, "-P- ", __VA_ARGS__);} while (false) | |
295 | + | |
296 | +#define TRACE_DEBUG_WP(...) do {if (traceLevel >= TRACE_LEVEL_DEBUG) {dsyslog(LOG_DEBUG, __VA_ARGS__); dprintf(TRACE_DEBUG_STREAM, "", __VA_ARGS__);}} while (false) | |
297 | +#define TRACE_INFO_WP(...) do {if (traceLevel >= TRACE_LEVEL_INFO) {dsyslog(LOG_INFO, __VA_ARGS__); dprintf(TRACE_INFO_STREAM, "", __VA_ARGS__);}} while (false) | |
298 | +#define TRACE_WARNING_WP(...) do {if (traceLevel >= TRACE_LEVEL_WARNING) {dsyslog(LOG_WARNING, __VA_ARGS__); dprintf(TRACE_WARNING_STREAM, "", __VA_ARGS__);}} while (false) | |
299 | +#define TRACE_ERROR_WP(...) do {if (traceLevel >= TRACE_LEVEL_ERROR) {dsyslog(LOG_ERR, __VA_ARGS__); dprintf(TRACE_ERROR_STREAM, "", __VA_ARGS__);}} while (false) | |
300 | +#define TRACE_FATAL_WP(...) do {if (traceLevel >= TRACE_LEVEL_FATAL) {dsyslog(LOG_EMERG, __VA_ARGS__); dprintf(TRACE_FATAL_STREAM, "", __VA_ARGS__); traceFatalAction();}} while (false) | |
301 | +#define TRACE_PERM_WP(...) do {dsyslog(LOG_NOTICE, __VA_ARGS__); dprintf(TRACE_PERM_STREAM, "", __VA_ARGS__);} while (false) | |
302 | + | |
303 | +#define TRACE_FUNC(arg1) do {if (traceLevel >= TRACE_LEVEL_DEBUG) {dsyslog(LOG_DEBUG, arg1); streamedPrintf(TRACE_DEBUG_STREAM, "%s: %s" ENDL, __PRETTY_FUNCTION__, arg1);}} while (false) | |
304 | + | |
305 | +#else | |
306 | +/* !defined (NOTRACE) */ | |
307 | + | |
308 | +// Trace compilation depends on TRACE_LEVEL value | |
309 | +#if (TRACE_LEVEL >= TRACE_LEVEL_DEBUG) | |
310 | +#define TRACE_DEBUG(...) do {dsyslog(LOG_DEBUG, __VA_ARGS__); dprintf(TRACE_DEBUG_STREAM, "-D- ", __VA_ARGS__);} while (false) | |
311 | +#define TRACE_DEBUG_WP(...) do {dsyslog(LOG_DEBUG, __VA_ARGS__); dprintf(TRACE_DEBUG_STREAM, "", __VA_ARGS__);} while (false) | |
312 | +#define TRACE_FUNC(arg1) do {dsyslog(LOG_DEBUG, arg1); streamedPrintf(TRACE_DEBUG_STREAM, "%s: %s" ENDL, __PRETTY_FUNCTION__, arg1);} while (false) | |
313 | +#else | |
314 | +#define TRACE_DEBUG(...) do {} while (false) | |
315 | +#define TRACE_DEBUG_WP(...) do {} while (false) | |
316 | +#define TRACE_FUNC(arg1) do {} while (false) | |
317 | +#endif | |
318 | + | |
319 | +#if (TRACE_LEVEL >= TRACE_LEVEL_INFO) | |
320 | +#define TRACE_INFO(...) do {dsyslog(LOG_INFO, __VA_ARGS__); dprintf(TRACE_INFO_STREAM, "-I- ", __VA_ARGS__);} while (false) | |
321 | +#define TRACE_INFO_WP(...) do {dsyslog(LOG_INFO, __VA_ARGS__); dprintf(TRACE_INFO_STREAM, "", __VA_ARGS__);} while (false) | |
322 | +#else | |
323 | +#define TRACE_INFO(...) do {} while (false) | |
324 | +#define TRACE_INFO_WP(...) do {} while (false) | |
325 | +#endif | |
326 | + | |
327 | +#if (TRACE_LEVEL >= TRACE_LEVEL_WARNING) | |
328 | +#define TRACE_WARNING(...) do {dsyslog(LOG_WARNING, __VA_ARGS__); dprintf(TRACE_WARNING_STREAM, "-W- ", __VA_ARGS__);} while (false) | |
329 | +#define TRACE_WARNING_WP(...) do {dsyslog(LOG_WARNING, __VA_ARGS__); dprintf(TRACE_WARNING_STREAM, "", __VA_ARGS__);} while (false) | |
330 | +#else | |
331 | +#define TRACE_WARNING(...) do {} while (false) | |
332 | +#define TRACE_WARNING_WP(...) do {} while (false) | |
333 | +#endif | |
334 | + | |
335 | +#if (TRACE_LEVEL >= TRACE_LEVEL_ERROR) | |
336 | +#define TRACE_ERROR(...) do {dsyslog(LOG_ERR, __VA_ARGS__); dprintf(TRACE_ERROR_STREAM, "-E- ", __VA_ARGS__);} while (false) | |
337 | +#define TRACE_ERROR_WP(...) do {dsyslog(LOG_ERR, __VA_ARGS__); dprintf(TRACE_ERROR_STREAM, "", __VA_ARGS__);} while (false) | |
338 | +#else | |
339 | +#define TRACE_ERROR(...) do {} while (false) | |
340 | +#define TRACE_ERROR_WP(...) do {} while (false) | |
341 | +#endif | |
342 | + | |
343 | +#if (TRACE_LEVEL >= TRACE_LEVEL_FATAL) | |
344 | +#define TRACE_FATAL(...) do {dsyslog(LOG_EMERG, __VA_ARGS__); dprintf(TRACE_FATAL_STREAM, "-F- ", __VA_ARGS__); traceFatalAction();} while (false) | |
345 | +#define TRACE_FATAL_WP(...) do {dsyslog(LOG_EMERG, __VA_ARGS__); dprintf(TRACE_FATAL_STREAM, "", __VA_ARGS__); traceFatalAction();} while (false) | |
346 | +#else | |
347 | +#define TRACE_FATAL(...) do {traceFatalAction();} while (false) | |
348 | +#define TRACE_FATAL_WP(...) do {traceFatalAction();} while (false) | |
349 | +#endif | |
350 | + | |
351 | +#define TRACE_PERM(...) do {dsyslog(LOG_NOTICE, __VA_ARGS__); dprintf(TRACE_PERM_STREAM, "-P ", __VA_ARGS__);} while (false) | |
352 | +#define TRACE_PERM_WP(...) do {dsyslog(LOG_NOTICE, __VA_ARGS__); dprintf(TRACE_PERM_STREAM, "", __VA_ARGS__);} while (false) | |
353 | + | |
354 | +#endif /* defined (NOTRACE) */ | |
355 | + | |
356 | +#undef NOTRACE | |
357 | + | |
358 | +// --------------------------------------------------------------------------------------------------------------------- | |
359 | +// Exported variables | |
360 | +// --------------------------------------------------------------------------------------------------------------------- | |
361 | +// Depending on DYN_TRACES, traceLevel is a modifiable runtime variable | |
362 | +// or a define | |
363 | +#if !defined (NOTRACE) && (DYN_TRACES == 1) | |
364 | +extern unsigned int traceLevel; | |
365 | +#endif | |
366 | + | |
367 | +// --------------------------------------------------------------------------------------------------------------------- | |
368 | +// Global Functions | |
369 | +// --------------------------------------------------------------------------------------------------------------------- | |
370 | + | |
371 | +extern void TRACE_DumpFrame(const unsigned char* const pFrame, unsigned int size); | |
372 | + | |
373 | +extern void TRACE_DumpMemory(unsigned char* pBuffer, unsigned int size, unsigned int address); | |
374 | + | |
375 | +extern unsigned char TRACE_GetInteger(unsigned int* pValue); | |
376 | + | |
377 | +extern unsigned char TRACE_GetIntegerMinMax(unsigned int* pValue, unsigned int min, unsigned int max); | |
378 | + | |
379 | +extern unsigned char TRACE_GetHexa32(unsigned int* pValue); | |
380 | + | |
381 | +/* *INDENT-OFF* */ | |
382 | + | |
383 | +#ifdef __cplusplus | |
384 | + } /* extern "C" */ | |
385 | +} /* namespace trace */ | |
386 | +#endif /* ifdef __cplusplus */ | |
387 | + | |
388 | +/* *INDENT-ON* */ |
@@ -0,0 +1,29 @@ | ||
1 | +/* | |
2 | + * @author Sergey Gusarov <sgusarow@mail.ru> | |
3 | + * @section LICENSE | |
4 | + * Copyright (c) 2013 by SPT Ltd | |
5 | + * | |
6 | + * This software is copyrighted by and is the sole property of SPT Ltd. | |
7 | + * All rights, title, ownership, or other interests | |
8 | + * in the software remain the property of SPT Ltd. This | |
9 | + * software may only be used in accordance with the corresponding | |
10 | + * license agreement. Any unauthorized use, duplication, transmission, | |
11 | + * distribution, or disclosure of this software is forbidden. | |
12 | + * | |
13 | + * This Copyright notice may not be removed or modified without prior | |
14 | + * written consent of SPT Ltd. | |
15 | + * | |
16 | + * SPT Ltd reserves the right to modify this software without notice | |
17 | + * | |
18 | + * @section DESCRIPTION | |
19 | + * | |
20 | + */ | |
21 | + | |
22 | +#pragma once | |
23 | + | |
24 | +#define SPT_UNUSED(var)\ | |
25 | + do\ | |
26 | + {\ | |
27 | + (void)var;\ | |
28 | + }\ | |
29 | + while (0) |
@@ -0,0 +1,27 @@ | ||
1 | +=================== | |
2 | +Репозиторий c_tools | |
3 | +=================== | |
4 | + | |
5 | +Общие сведения | |
6 | +-------------- | |
7 | + | |
8 | +Содержит код, расширяющий и упрощающий различные операции в программах на языке C. | |
9 | +То есть содержит программные инструменты, которые можно использовать в любой развитой | |
10 | +программе на языке C. Весь код по возможности совместим со стандартом C99, | |
11 | +поэтому легко может также использоваться в c++ программах. | |
12 | + | |
13 | + | |
14 | +Целевые конфигурации | |
15 | +-------------------- | |
16 | + | |
17 | +Любые, на которых работают компиляторы C99. Библиотека должна работать как на ограниченных | |
18 | +в ресурсах платформах (микроконтроллерах без ОС) так и под управлением современных ОС. | |
19 | + | |
20 | +Сборка | |
21 | +------ | |
22 | + | |
23 | +В рамках данного репозитория не осуществляется, т.к. она практически | |
24 | +является header-only библиотекой. | |
25 | +Сборкой должен заниматься тот проект, который использует эту библиотеку. | |
26 | +Для этого он должен указать путь для поиска заголовочных файлов include | |
27 | +и линковать все файлы из src. |
@@ -0,0 +1,283 @@ | ||
1 | +/* | |
2 | + * @author Sergey Gusarov <sgusarow@mail.ru> | |
3 | + * @section LICENSE | |
4 | + * Copyright (c) 2013 by SPT Ltd | |
5 | + * | |
6 | + * This software is copyrighted by and is the sole property of SPT Ltd. | |
7 | + * All rights, title, ownership, or other interests | |
8 | + * in the software remain the property of SPT Ltd. This | |
9 | + * software may only be used in accordance with the corresponding | |
10 | + * license agreement. Any unauthorized use, duplication, transmission, | |
11 | + * distribution, or disclosure of this software is forbidden. | |
12 | + * | |
13 | + * This Copyright notice may not be removed or modified without prior | |
14 | + * written consent of SPT Ltd. | |
15 | + * | |
16 | + * SPT Ltd reserves the right to modify this software without notice | |
17 | + * | |
18 | + * @section DESCRIPTION | |
19 | + * This file was taken from the at91lib_20100901_softpack_1_9_v_1_0_svn_v15011.zip file | |
20 | + * (latest available at91lib from Atmel's site). Many things are not actual for new projects. | |
21 | + * Because of this file was completely reworked. C++ support is added. | |
22 | + * Now it requires C99/C++98 compalible compiler. | |
23 | + */ | |
24 | + | |
25 | +/* --------------------------------------------------------------------------------------------------------------------- | |
26 | + * ATMEL Microcontroller Software Support | |
27 | + * --------------------------------------------------------------------------------------------------------------------- | |
28 | + * Copyright (c) 2008, Atmel Corporation | |
29 | + * | |
30 | + * All rights reserved. | |
31 | + * | |
32 | + * Redistribution and use in source and binary forms, with or without | |
33 | + * modification, are permitted provided that the following conditions are met: | |
34 | + * | |
35 | + * - Redistributions of source code must retain the above copyright notice, | |
36 | + * this list of conditions and the disclaimer below. | |
37 | + * | |
38 | + * Atmel's name may not be used to endorse or promote products derived from | |
39 | + * this software without specific prior written permission. | |
40 | + * | |
41 | + * DISCLAIMER: THIS SOFTWARE IS PROVIDED BY ATMEL "AS IS" AND ANY EXPRESS OR | |
42 | + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF | |
43 | + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT ARE | |
44 | + * DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT, INDIRECT, | |
45 | + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
46 | + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, | |
47 | + * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF | |
48 | + * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING | |
49 | + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, | |
50 | + * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
51 | + * --------------------------------------------------------------------------------------------------------------------- | |
52 | + */ | |
53 | + | |
54 | +// --------------------------------------------------------------------------------------------------------------------- | |
55 | +// Headers | |
56 | +// --------------------------------------------------------------------------------------------------------------------- | |
57 | + | |
58 | +#include "core/trace.h" | |
59 | + | |
60 | +/* *INDENT-OFF* */ | |
61 | + | |
62 | +#ifdef __cplusplus | |
63 | +namespace trace { | |
64 | + extern "C" { | |
65 | +#endif /* ifdef __cplusplus */ | |
66 | + | |
67 | +/* *INDENT-ON* */ | |
68 | + | |
69 | +// --------------------------------------------------------------------------------------------------------------------- | |
70 | +// Internal variables | |
71 | +// --------------------------------------------------------------------------------------------------------------------- | |
72 | + | |
73 | +/// Trace level can be set at applet initialization | |
74 | +#if !defined (NOTRACE) && (DYN_TRACES == 1) | |
75 | +unsigned int traceLevel = TRACE_LEVEL; | |
76 | +#endif | |
77 | + | |
78 | +// --------------------------------------------------------------------------------------------------------------------- | |
79 | +// Local Functions | |
80 | +// --------------------------------------------------------------------------------------------------------------------- | |
81 | + | |
82 | +// --------------------------------------------------------------------------------------------------------------------- | |
83 | +/// Print char if printable. If not print a point | |
84 | +/// \param c char to | |
85 | +// --------------------------------------------------------------------------------------------------------------------- | |
86 | +static inline void printChar(const unsigned char c) | |
87 | +{ | |
88 | + if ((/*c >= 0x00 && */ c <= 0x1F) || (c >= 0xB0 && c <= 0xDF)) | |
89 | + printf("."); | |
90 | + else | |
91 | + printf("%c", c); | |
92 | +} | |
93 | + | |
94 | +// --------------------------------------------------------------------------------------------------------------------- | |
95 | +// Global Functions | |
96 | +// --------------------------------------------------------------------------------------------------------------------- | |
97 | + | |
98 | +// --------------------------------------------------------------------------------------------------------------------- | |
99 | +/// Displays the content of the given frame on the Trace interface. | |
100 | +/// \param pBuffer Pointer to the frame to dump. | |
101 | +/// \param size Buffer size in bytes. | |
102 | +// --------------------------------------------------------------------------------------------------------------------- | |
103 | +void TRACE_DumpFrame(const unsigned char* const pFrame, const unsigned int size) | |
104 | +{ | |
105 | + unsigned int i; | |
106 | + | |
107 | + for (i = 0; i < size; i++) | |
108 | + { | |
109 | + printf("%02X ", pFrame[i]); | |
110 | + } | |
111 | + | |
112 | + printf(ENDL); | |
113 | +} | |
114 | + | |
115 | +// --------------------------------------------------------------------------------------------------------------------- | |
116 | +/// Displays the content of the given buffer on the Trace interface. | |
117 | +/// \param pBuffer Pointer to the buffer to dump. | |
118 | +/// \param size Buffer size in bytes. | |
119 | +/// \param address Start address to display | |
120 | +// --------------------------------------------------------------------------------------------------------------------- | |
121 | +void TRACE_DumpMemory(unsigned char* pBuffer, unsigned int size, unsigned int address) | |
122 | +{ | |
123 | + unsigned int i, j; | |
124 | + unsigned int lastLineStart; | |
125 | + unsigned char* pTmp; | |
126 | + | |
127 | + for (i = 0; i < (size / 16); i++) | |
128 | + { | |
129 | + printf("0x%08X (%04x): ", address + (i * 16), (i * 16)); | |
130 | + pTmp = (unsigned char*)&pBuffer[i * 16]; | |
131 | + for (j = 0; j < 4; j++) | |
132 | + { | |
133 | + printf("%02X%02X%02X%02X ", pTmp[0], pTmp[1], pTmp[2], pTmp[3]); | |
134 | + pTmp += 4; | |
135 | + } | |
136 | + | |
137 | + pTmp = (unsigned char*)&pBuffer[i * 16]; | |
138 | + for (j = 0; j < 16; j++) | |
139 | + { | |
140 | + printChar(*pTmp++); | |
141 | + } | |
142 | + | |
143 | + printf(ENDL); | |
144 | + } | |
145 | + | |
146 | + if ((size % 16) != 0) | |
147 | + { | |
148 | + lastLineStart = size - (size % 16); | |
149 | + printf("0x%08X: ", address + lastLineStart); | |
150 | + | |
151 | + for (j = lastLineStart; j < lastLineStart + 16; j++) | |
152 | + { | |
153 | + if ((j != lastLineStart) && (j % 4 == 0)) | |
154 | + printf(" "); | |
155 | + if (j < size) | |
156 | + printf("%02X", pBuffer[j]); | |
157 | + else | |
158 | + printf(" "); | |
159 | + } | |
160 | + | |
161 | + printf(" "); | |
162 | + for (j = lastLineStart; j < size; j++) | |
163 | + { | |
164 | + printChar(pBuffer[j]); | |
165 | + } | |
166 | + | |
167 | + printf(ENDL); | |
168 | + } | |
169 | +} | |
170 | + | |
171 | +// --------------------------------------------------------------------------------------------------------------------- | |
172 | +/// Reads an integer | |
173 | +// --------------------------------------------------------------------------------------------------------------------- | |
174 | +unsigned char TRACE_GetInteger(unsigned int* pValue) | |
175 | +{ | |
176 | + unsigned char key; | |
177 | + unsigned char nbNb = 0; | |
178 | + unsigned int value = 0; | |
179 | + | |
180 | + while (1) | |
181 | + { | |
182 | + key = getchar(); | |
183 | + // putchar(key); // echo | |
184 | + if (key >= '0' && key <= '9') | |
185 | + { | |
186 | + value = (value * 10) + (key - '0'); | |
187 | + nbNb++; | |
188 | + } | |
189 | + else if (key == 0x0D || key == ' ') | |
190 | + { | |
191 | + if (nbNb == 0) | |
192 | + { | |
193 | + printf(ENDL "Write a number and press ENTER or SPACE!" ENDL); | |
194 | + | |
195 | + return 0; | |
196 | + } | |
197 | + else | |
198 | + { | |
199 | + printf(ENDL); | |
200 | + *pValue = value; | |
201 | + | |
202 | + return 1; | |
203 | + } | |
204 | + } | |
205 | + else | |
206 | + { | |
207 | + printf(ENDL "'%c' not a number!" ENDL, key); | |
208 | + | |
209 | + return 0; | |
210 | + } | |
211 | + } | |
212 | +} | |
213 | + | |
214 | +// --------------------------------------------------------------------------------------------------------------------- | |
215 | +/// Reads an integer and check the value | |
216 | +// --------------------------------------------------------------------------------------------------------------------- | |
217 | +unsigned char TRACE_GetIntegerMinMax(unsigned int* pValue, unsigned int min, unsigned int max) | |
218 | +{ | |
219 | + unsigned int value = 0; | |
220 | + | |
221 | + if (TRACE_GetInteger(&value) == 0) | |
222 | + return 0; | |
223 | + | |
224 | + if (value < min || value > max) | |
225 | + { | |
226 | + printf(ENDL "The number have to be between %d and %d" ENDL, (int)min, (int)max); | |
227 | + | |
228 | + return 0; | |
229 | + } | |
230 | + | |
231 | + printf(ENDL); | |
232 | + *pValue = value; | |
233 | + | |
234 | + return 1; | |
235 | +} | |
236 | + | |
237 | +// --------------------------------------------------------------------------------------------------------------------- | |
238 | +/// Reads an hexadecimal number | |
239 | +// --------------------------------------------------------------------------------------------------------------------- | |
240 | +unsigned char TRACE_GetHexa32(unsigned int* pValue) | |
241 | +{ | |
242 | + unsigned char key; | |
243 | + unsigned int i = 0; | |
244 | + unsigned int value = 0; | |
245 | + | |
246 | + for (i = 0; i < 8; i++) | |
247 | + { | |
248 | + key = getchar(); | |
249 | + putchar(key); | |
250 | + if (key >= '0' && key <= '9') | |
251 | + { | |
252 | + value = (value * 16) + (key - '0'); | |
253 | + } | |
254 | + else if (key >= 'A' && key <= 'F') | |
255 | + { | |
256 | + value = (value * 16) + (key - 'A' + 10); | |
257 | + } | |
258 | + else if (key >= 'a' && key <= 'f') | |
259 | + { | |
260 | + value = (value * 16) + (key - 'a' + 10); | |
261 | + } | |
262 | + else | |
263 | + { | |
264 | + printf(ENDL "It is not a hexa character!" ENDL); | |
265 | + | |
266 | + return 0; | |
267 | + } | |
268 | + } | |
269 | + | |
270 | + printf(ENDL); | |
271 | + *pValue = value; | |
272 | + | |
273 | + return 1; | |
274 | +} | |
275 | + | |
276 | +/* *INDENT-OFF* */ | |
277 | + | |
278 | +#ifdef __cplusplus | |
279 | + } /* extern "C" */ | |
280 | +} /* namespace trace */ | |
281 | +#endif /* ifdef __cplusplus */ | |
282 | + | |
283 | +/* *INDENT-ON* */ |