Develop and Download Open Source Software

Browse CVS Repository

Contents of /jyugem/jyusecs/bee/beelib.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Revision Graph Revision Graph


Revision 1.9 - (show annotations) (download) (as text)
Sat Aug 14 14:48:42 2004 UTC (19 years, 7 months ago) by fukasawa
Branch: MAIN
CVS Tags: HEAD
Changes since 1.8: +70 -11 lines
File MIME type: text/x-c++src
メモリリークの解消。
接続モード(ACTIVE/PASSIVE)をパラメータで指定可能とした。
ダンプメッセージをVERBOSE_LITEモードで出力。

1 // $Id: beelib.cpp,v 1.8 2004/06/21 16:25:47 fukasawa Exp $
2
3 //=============================================================================
4 /**
5 * @file beelib.cpp
6 *
7 * @author Fukasawa Mitsuo
8 *
9 *
10 * Copyright (C) 1998-2004 BEE Co.,Ltd. All rights reserved.
11 *
12 * This program is free software; you can redistribute it and/or
13 * modify it under the terms of the GNU General Public License
14 * as published by the Free Software Foundation; either version 2
15 * of the License, or (at your option) any later version.
16 *
17 * This program is distributed in the hope that it will be useful,
18 * but WITHOUT ANY WARRANTY; without even the implied warranty of
19 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
20 * GNU General Public License for more details.
21 *
22 * You should have received a copy of the GNU General Public License
23 * along with this program; if not, write to the Free Software
24 * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
25 */
26 //=============================================================================
27
28 #define BEE_BUILD_DLL
29
30 #include <stdio.h>
31 #include <stdlib.h>
32 #include <malloc.h>
33 #include <string.h>
34 #include <stdarg.h>
35 #include "b_ace.h"
36 #include "beelib.h"
37
38 #define PRINT_BUFSIZE (ACE_MAXLOGMSGLEN - 256)
39
40 bool _ARG_CHECK = true;
41
42 /*---------------------------------------------------------------------------*/
43 /* Panic and Assert function for C language */
44 /*---------------------------------------------------------------------------*/
45 BEE_Export void _Panic(BCHAR * msg, BCHAR * fname, int lineNum)
46 {
47 Panic<runtime_error>(msg, fname, lineNum);
48 }
49
50 BEE_Export void _Assert(BCHAR * fname, int lineNum, BCHAR * astr)
51 {
52 if (_ARG_CHECK)
53 {
54 BCHAR lbuf[16];
55 string s;
56 sprintf(lbuf, "(%d): ", lineNum);
57 s += (strrchr(fname, DIR_SEPARATOR_CHAR) + 1);
58 s += lbuf;
59 s += "ASSERT(";
60 s += astr;
61 s += ")";
62 throw runtime_error(s);
63 }
64 }
65
66 /*---------------------------------------------------------------------------*/
67 /* Trace level code */
68 /*---------------------------------------------------------------------------*/
69 static int _bee_traceLevel = TRL_VIEW;
70
71 void b_setTraceLevel(int level)
72 {
73 _bee_traceLevel = level;
74 }
75
76 int b_getTraceLevel()
77 {
78 return _bee_traceLevel;
79 }
80
81 /*---------------------------------------------------------------------------*/
82 /* bit pattern / num */
83 /*---------------------------------------------------------------------------*/
84 unsigned int BitTable[32] =
85 {
86 0x00000001, 0x00000002, 0x00000004, 0x00000008,
87 0x00000010, 0x00000020, 0x00000040, 0x00000080,
88 0x00000100, 0x00000200, 0x00000400, 0x00000800,
89 0x00001000, 0x00002000, 0x00004000, 0x00008000,
90 0x00010000, 0x00020000, 0x00040000, 0x00080000,
91 0x00100000, 0x00200000, 0x00400000, 0x00800000,
92 0x01000000, 0x02000000, 0x04000000, 0x08000000,
93 0x10000000, 0x20000000, 0x40000000, 0x80000000,
94 };
95
96 unsigned int bit_encode(unsigned int bit)
97 {
98 UINT i;
99 for (i = 0; i < 32; i++)
100 {
101 if (bit == BitTable[i])
102 break;
103 }
104 return ((i >= 32) ? 0xFFFFFFFF: i);
105 }
106
107 unsigned int bit_decode(unsigned int bitCode)
108 {
109 if (bitCode > 31)
110 throw out_of_range("bit_decode()");
111 return BitTable[bitCode];
112 }
113
114
115 /*---------------------------------------------------------------------------*/
116 /* delete blank code */
117 /*---------------------------------------------------------------------------*/
118 void del_space(BCHAR * bufp)
119 {
120 BCHAR c;
121 BCHAR *srcp, *dstp;
122
123 if (bufp)
124 {
125 /* */
126 srcp = dstp = bufp;
127 while ((c = *dstp) == ' ' || c == '\t' || c == '\n')
128 dstp++;
129 while (*dstp)
130 *srcp++ = *dstp++;
131 *srcp = '\0';
132
133 /* */
134 srcp = bufp + _tcslen((BCHAR const * )bufp);
135 while (srcp != bufp)
136 {
137 if ((c = *(srcp - 1)) != ' ' && c != '\t' && c != '\n')
138 break;
139 else
140 srcp--;
141 }
142 *srcp = '\0';
143 }
144 return ;
145 }
146
147 /*---------------------------------------------------------------------------*/
148 /* */
149 /* hex dump */
150 /* */
151 /*---------------------------------------------------------------------------*/
152 #ifndef BOUNDARY
153 #define BOUNDARY 0
154 #define NO_BOUNDARY 1
155 #endif
156
157 BCHAR lower_code[] = _TX("0123456789abcdef");
158 BCHAR upper_code[] = _TX("0123456789ABCDEF");
159
160 #define BYTE_FORMAT
161 #ifndef BYTE_FORMAT
162
163 #define HEX_POINT 0
164 #define SEPARATE_POINT 44
165 #define CHAR_POINT 47
166 static BCHAR linebuf[] =
167 _TX("1234 1234 1234 1234 1234 1234 1234 1234 : 1234 1234 1234 1234\n");
168
169 /*---------------------------------------------------------------------------*/
170 /* word format */
171 /*---------------------------------------------------------------------------*/
172 void mem_dump(BCHAR * startp, BCHAR * endp, ULONG base, int mode)
173 {
174 BCHAR * curptr;
175 UINT dumpnt;
176 BCHAR c;
177 BCHAR * hexp;
178 BCHAR * charp;
179 BCHAR * hexcodep;
180
181 if (mode == BOUNDARY)
182 { /* */
183 curptr = (BCHAR *)((ULONG)startp & ~0x0F);
184 base &= ~0x0F;
185 }
186 else
187 curptr = startp;
188
189 hexcodep = (BCHAR *)lower_code; /* */
190
191 /*---------------------------------------------------------------------------*/
192 /* dump hex data */
193 /*---------------------------------------------------------------------------*/
194 for ( ; curptr < endp; curptr += 16)
195 {
196 hexp = (BCHAR *)(linebuf + HEX_POINT);
197 charp = (BCHAR *)(linebuf + CHAR_POINT);
198
199 for (dumpnt = 0; *(hexp + dumpnt) != '\n'; dumpnt++)
200 *(hexp + dumpnt) = ' ';
201 *(hexp + SEPARATE_POINT) = ':';
202
203 for (dumpnt = 0; dumpnt < 16; dumpnt++)
204 {
205 c = *(curptr + dumpnt);
206 if (dumpnt != 0 && (dumpnt & 0x01) == 0)
207 hexp++;
208 if (dumpnt != 0 && (dumpnt & 0x03) == 0)
209 {
210 hexp++;
211 charp++;
212 }
213 /*---------------------------------------------------------------------------*/
214 /* dump character */
215 /*---------------------------------------------------------------------------*/
216 if ((curptr + dumpnt) < startp || (curptr + dumpnt) >= endp)
217 {
218 hexp += 2;
219 charp++;
220 }
221 else
222 {
223 *hexp++ = hexcodep[(c >> 4) & 0x0F];
224 *hexp++ = hexcodep[c & 0x0F];
225 if (c < ' ' || c > '~')
226 *charp++ = '.';
227 else
228 *charp++ = c;
229 }
230 }
231 b_printf("%8lx %s", base, linebuf);
232 base += 16;
233 }
234 }
235 #else
236
237 #define HEX_POINT 0
238 #define SEPARATE_POINT 50
239 #define CHAR_POINT 52
240 static BCHAR linebuf[] =
241 _TX("12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 : 12345678 12345678 \n");
242
243 /*---------------------------------------------------------------------------*/
244 /* byte format */
245 /*---------------------------------------------------------------------------*/
246 void mem_dump(BCHAR * startp, BCHAR * endp, ULONG base, int mode)
247 {
248 BCHAR * curptr;
249 UINT dumpnt;
250 BCHAR c;
251 BCHAR * hexp;
252 BCHAR * charp;
253 BCHAR * hexcodep;
254
255 if (mode == BOUNDARY)
256 {
257 curptr = (BCHAR *)((unsigned long)startp & ~0x0F);
258 base &= ~0x0F;
259 }
260 else
261 curptr = startp;
262
263 hexcodep = (BCHAR *)lower_code;
264
265 /*---------------------------------------------------------------------------*/
266 /* dump hex data */
267 /*---------------------------------------------------------------------------*/
268 for ( ; curptr < endp; curptr += 16)
269 {
270 hexp = (BCHAR *)(linebuf + HEX_POINT);
271 charp = (BCHAR *)(linebuf + CHAR_POINT);
272
273 for (dumpnt = 0; *(hexp + dumpnt) != '\n'; dumpnt++)
274 *(hexp + dumpnt) = ' ';
275 *(hexp + SEPARATE_POINT) = ':';
276
277 for (dumpnt = 0; dumpnt < 16; dumpnt++)
278 {
279 c = *(curptr + dumpnt);
280 hexp++;
281 if (dumpnt != 0 && (dumpnt & 0x07) == 0)
282 {
283 hexp++;
284 charp++;
285 }
286 /*---------------------------------------------------------------------------*/
287 /* dump character */
288 /*---------------------------------------------------------------------------*/
289 if ((curptr + dumpnt) < startp || (curptr + dumpnt) >= endp)
290 {
291 hexp += 2;
292 charp++;
293 }
294 else
295 {
296 *hexp++ = hexcodep[(c >> 4) & 0x0F];
297 *hexp++ = hexcodep[c & 0x0F];
298 if (c < ' ' || c > '~')
299 *charp++ = '.';
300 else
301 *charp++ = c;
302 }
303 }
304 b_printf(_TX("%08lx %s"), base, linebuf);
305 base += 16;
306 }
307 }
308 #endif
309
310 /*---------------------------------------------------------------------------*/
311 /* */
312 /* hex dump */
313 /* */
314 /*---------------------------------------------------------------------------*/
315 static void _dumpword(BCHAR * startp, size_t size, string& hexstr,
316 BCHAR * hexcodep, int mode);
317 static void _dumpbyte(BCHAR * startp, size_t size, string& hexstr,
318 BCHAR * hexcodep, int mode);
319
320 #ifndef DUMP_BYTE
321 #define DUMP_BYTE 0x0000
322 #define DUMP_WORD 0x0001
323 #define DUMP_LOWER 0x0000
324 #define DUMP_UPPER 0x0002
325 #define DUMP_OFFSET 0x1000
326 #define DUMP_CHAR 0x2000
327 #define DUMP_CONT 0x4000
328 #define DUMP_NEWLINE 0x8000
329 #define DUMP_TCL (DUMP_OFFSET | DUMP_CONT | DUMP_NEWLINE)
330 #endif
331
332 void hex_dump(BCHAR * startp, size_t size, string& hexstr, int mode)
333 {
334 BCHAR * hexcodep = (mode & DUMP_UPPER) ? upper_code : lower_code;
335 if (mode & DUMP_WORD)
336 {
337 _dumpword(startp, size, hexstr, hexcodep, mode);
338 }
339 else
340 {
341 _dumpbyte(startp, size, hexstr, hexcodep, mode);
342 }
343 }
344
345
346 #define WORD_HEX_POINT 0
347 #define WORD_SEPARATE_POINT 43
348 #define WORD_CHAR_POINT 45
349 static BCHAR line_word[] =
350 _TX("1234 1234 1234 1234 1234 1234 1234 1234 : 1234 1234 1234 1234");
351
352 /*---------------------------------------------------------------------------*/
353 /* word format */
354 /*---------------------------------------------------------------------------*/
355 void _dumpword(BCHAR * startp, size_t size, string& hexstr, BCHAR * hexcodep,
356 int mode)
357 {
358 BCHAR * endp = startp + size;
359 BCHAR * curptr;
360 UINT dumpnt;
361 BCHAR c;
362 BCHAR * hexp;
363 BCHAR * charp;
364 BCHAR linebuf[128];
365 long base = 0; // offset position
366
367 hexstr = _TX("");
368 curptr = startp;
369
370 strcpy(linebuf, line_word);
371 //------------------------------------------------------------------
372 // dump hex data
373 //------------------------------------------------------------------
374 for ( ; curptr < endp; curptr += 16)
375 {
376 hexp = (BCHAR *)(linebuf + WORD_HEX_POINT);
377 charp = (BCHAR *)(linebuf + WORD_CHAR_POINT);
378
379 for (dumpnt = 0; *(hexp + dumpnt) != '\0'; dumpnt++)
380 *(hexp + dumpnt) = ' ';
381 *(hexp + WORD_SEPARATE_POINT) = ':';
382
383 for (dumpnt = 0; dumpnt < 16; dumpnt++)
384 {
385 c = *(curptr + dumpnt);
386 if (dumpnt != 0 && (dumpnt & 0x01) == 0)
387 hexp++;
388 if (dumpnt != 0 && (dumpnt & 0x03) == 0)
389 {
390 hexp++;
391 charp++;
392 }
393 //----------------------------------------------------------
394 // dump character
395 //----------------------------------------------------------
396 if ((curptr + dumpnt) < startp || (curptr + dumpnt) >= endp)
397 {
398 hexp += 2;
399 charp++;
400 }
401 else
402 {
403 *hexp++ = hexcodep[(c >> 4) & 0x0F];
404 *hexp++ = hexcodep[c & 0x0F];
405 if (c < ' ' || c > '~')
406 *charp++ = '.';
407 else
408 *charp++ = c;
409 }
410 }
411
412 //--------------------------------------------------------------
413 // formatting
414 //--------------------------------------------------------------
415 if (! (mode & DUMP_CHAR))
416 { // Cut printed character code
417 linebuf[WORD_SEPARATE_POINT] = '\0';
418 }
419 if (mode & DUMP_OFFSET)
420 {
421 BCHAR buf[128];
422 sprintf(buf, "%08lx ", base);
423 hexstr += buf;
424 }
425
426 hexstr += linebuf; // copy hex data
427
428 if ((mode & DUMP_CHAR) || (mode & DUMP_NEWLINE))
429 {
430 if (mode & DUMP_CONT)
431 {
432 hexstr += DIR_SEPARATOR_STRING;
433 }
434 hexstr += _TX("\n");
435 }
436
437 base += 8;
438 }
439 }
440
441
442 #define BYTE_HEX_POINT 0
443 #define BYTE_SEPARATE_POINT 49
444 #define BYTE_CHAR_POINT 51
445 static BCHAR line_byte[] =
446 _TX("12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 12 : 12345678 12345678");
447
448 /*---------------------------------------------------------------------------*/
449 /* byte format */
450 /*---------------------------------------------------------------------------*/
451 void _dumpbyte(BCHAR * startp, size_t size, string& hexstr, BCHAR * hexcodep,
452 int mode)
453 {
454 BCHAR * endp = startp + size;
455 BCHAR * curptr;
456 UINT dumpnt;
457 BCHAR c;
458 BCHAR * hexp;
459 BCHAR * charp;
460 BCHAR linebuf[128];
461 long base = 0; // offset position
462
463 hexstr = "";
464 curptr = startp;
465
466 strcpy(linebuf, line_byte);
467 //------------------------------------------------------------------
468 // dump hex data
469 //------------------------------------------------------------------
470 for ( ; curptr < endp; curptr += 16)
471 {
472 hexp = (BCHAR *)(linebuf + BYTE_HEX_POINT);
473 charp = (BCHAR *)(linebuf + BYTE_CHAR_POINT);
474
475 for (dumpnt = 0; *(hexp + dumpnt) != '\0'; dumpnt++)
476 *(hexp + dumpnt) = ' ';
477 *(hexp + BYTE_SEPARATE_POINT) = ':';
478
479 for (dumpnt = 0; dumpnt < 16; dumpnt++)
480 {
481 c = *(curptr + dumpnt);
482 hexp++;
483 if (dumpnt != 0 && (dumpnt & 0x07) == 0)
484 {
485 hexp++;
486 charp++;
487 }
488 //----------------------------------------------------------
489 // dump character
490 //----------------------------------------------------------
491 if ((curptr + dumpnt) < startp || (curptr + dumpnt) >= endp)
492 {
493 hexp += 2;
494 charp++;
495 }
496 else
497 {
498 *hexp++ = hexcodep[(c >> 4) & 0x0F];
499 *hexp++ = hexcodep[c & 0x0F];
500 if (c < ' ' || c > '~')
501 *charp++ = '.';
502 else
503 *charp++ = c;
504 }
505 }
506 //--------------------------------------------------------------
507 // formatting
508 //--------------------------------------------------------------
509 if (! (mode & DUMP_CHAR))
510 { // Cut printed character code
511 linebuf[BYTE_SEPARATE_POINT] = '\0';
512 }
513 if (mode & DUMP_OFFSET)
514 {
515 BCHAR buf[128];
516 sprintf(buf, _TX("%08lx "), base);
517 hexstr += buf;
518 }
519
520 hexstr += linebuf; // copy hex data
521
522 if ((mode & DUMP_CHAR) || (mode & DUMP_NEWLINE))
523 {
524 if (mode & DUMP_CONT)
525 {
526 hexstr += DIR_SEPARATOR_STRING;
527 }
528 hexstr += _TX("\n");
529 }
530
531 base += 16;
532 }
533 }
534
535 /*---------------------------------------------------------------------------*/
536 /* printf wrapper */
537 /*---------------------------------------------------------------------------*/
538 int _ACE_Log_Output = 0;
539
540 int b_printf(BCHAR *fmt, ...)
541 {
542 va_list arglist;
543 va_start(arglist, fmt);
544
545 #ifdef ACE_ACE_H
546 BCHAR buffer[PRINT_BUFSIZE+1];
547 if (_ACE_Log_Output == 1)
548 {
549 _vsntprintf(buffer, PRINT_BUFSIZE, fmt, arglist);
550 ACE_DEBUG((LM_DEBUG, buffer));
551 }
552 else
553 {
554 _vtprintf((const BCHAR *)fmt, arglist);
555 }
556 #else
557 _vtprintf((const BCHAR *)fmt, arglist);
558 #endif
559
560 return 1;
561 }
562
563 /*---------------------------------------------------------------------------*/
564 int b_sprintf(void * ar, BCHAR *fmt, ...)
565 {
566 va_list arglist;
567 va_start(arglist, fmt);
568
569 #ifdef _TCL // defined by tcl.h
570 BCHAR buffer[PRINT_BUFSIZE+1];
571 Tcl_Interp * interp = (Tcl_Interp *)ar;
572 _vsntprintf(buffer, PRINT_BUFSIZE, fmt, arglist);
573 Tcl_AppendResult(interp, buffer, NULL);
574 #else
575 _vstprintf((BCHAR *)ar, (const BCHAR *)fmt, arglist);
576 #endif
577 return 1;
578 }
579
580 /*---------------------------------------------------------------------------*/
581 void b_abort(BCHAR *fmt, ...)
582 {
583 va_list arglist;
584 va_start(arglist, fmt);
585
586 #ifdef ACE_ACE_H
587 BCHAR buffer[PRINT_BUFSIZE+1];
588 _vsntprintf(buffer, PRINT_BUFSIZE, fmt, arglist);
589 ACE_DEBUG((LM_DEBUG, buffer));
590 #else
591 _vtprintf((const BCHAR *)fmt, arglist);
592 #endif
593
594 exit(-1);
595 }
596
597 /*---------------------------------------------------------------------------*/
598 //
599 void b_error(BCHAR * fmt, ...)
600 {
601 va_list arglist;
602 va_start(arglist, fmt);
603
604 #ifdef ACE_ACE_H
605 BCHAR buffer[PRINT_BUFSIZE+1];
606 _vsntprintf(buffer, PRINT_BUFSIZE, fmt, arglist);
607
608 ACE_ERROR((LM_ERROR, buffer));
609 #else
610 _vtprintf((const BCHAR *)fmt, arglist);
611 #endif
612 return ;
613 }
614
615 /*---------------------------------------------------------------------------*/
616 //
617 void b_debug(BCHAR * fmt, ...)
618 {
619 va_list arglist;
620 va_start(arglist, fmt);
621
622 #ifdef ACE_ACE_H
623 BCHAR buffer[PRINT_BUFSIZE+1];
624 _vsntprintf(buffer, PRINT_BUFSIZE, fmt, arglist);
625
626 ACE_DEBUG((LM_DEBUG, buffer));
627 #else
628 _vtprintf((const BCHAR *)fmt, arglist);
629 #endif
630 return ;
631 }
632
633 #ifdef ACE_ACE_H
634 //-----------------------------------------------------------------------------
635 // Trace function class
636 //-----------------------------------------------------------------------------
637 int _FunctionTracer::printf(BCHAR * fmt, ...)
638 {
639 va_list arglist;
640 va_start(arglist, fmt);
641
642 if (_ACE_Log_Output == 1)
643 {
644 BCHAR buffer[PRINT_BUFSIZE+1];
645 _stprintf(buffer, _TX("%s: "), m_funcname);
646 size_t q = _tcslen(buffer);
647
648 _vsntprintf(buffer + q, PRINT_BUFSIZE - q, fmt, arglist);
649 ACE_DEBUG((LM_DEBUG, buffer));
650 }
651 else
652 {
653 _tprintf("%s: ", m_funcname);
654 _vtprintf(fmt, arglist);
655 }
656 return 1;
657 }
658
659 //
660 void _FunctionTracer::error(BCHAR * fmt, ...)
661 {
662 va_list arglist;
663 va_start(arglist, fmt);
664
665 BCHAR buffer[PRINT_BUFSIZE+1];
666 _stprintf(buffer, _TX("%s: "), m_funcname);
667 size_t q = _tcslen(buffer);
668
669 _vsntprintf(buffer + q, PRINT_BUFSIZE - q, fmt, arglist);
670 ACE_ERROR((LM_ERROR, buffer));
671 return ;
672 }
673
674 //
675 void _FunctionTracer::debug(BCHAR * fmt, ...)
676 {
677 va_list arglist;
678 va_start(arglist, fmt);
679
680 BCHAR buffer[PRINT_BUFSIZE+1];
681 _stprintf(buffer, _TX("%s: "), m_funcname);
682 size_t q = _tcslen(buffer);
683
684 _vsntprintf(buffer + q, PRINT_BUFSIZE - q, fmt, arglist);
685 ACE_DEBUG((LM_DEBUG, buffer));
686 return ;
687 }
688 #endif
689

Back to OSDN">Back to OSDN
ViewVC Help
Powered by ViewVC 1.1.26