Version 0.10
[gnuk/gnuk.git] / src / debug.c
1 /*
2  * debug.c -- Debuging with virtual COM port
3  *
4  * Copyright (C) 2010 Free Software Initiative of Japan
5  * Author: NIIBE Yutaka <gniibe@fsij.org>
6  *
7  * This file is a part of Gnuk, a GnuPG USB Token implementation.
8  *
9  * Gnuk is free software: you can redistribute it and/or modify it
10  * under the terms of the GNU General Public License as published by
11  * the Free Software Foundation, either version 3 of the License, or
12  * (at your option) any later version.
13  *
14  * Gnuk is distributed in the hope that it will be useful, but WITHOUT
15  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
16  * or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public
17  * License for more details.
18  *
19  * You should have received a copy of the GNU General Public License
20  * along with this program.  If not, see <http://www.gnu.org/licenses/>.
21  *
22  */
23
24 #include "config.h"
25 #include "ch.h"
26 #include "gnuk.h"
27
28 static void
29 put_hex (uint8_t nibble)
30 {
31   uint8_t c;
32
33   if (nibble < 0x0a)
34     c = '0' + nibble;
35   else
36     c = 'a' + nibble - 0x0a;
37
38   _write ((const char *)&c, 1);
39 }
40
41 void
42 put_byte (uint8_t b)
43 {
44   put_hex (b >> 4);
45   put_hex (b &0x0f);
46   _write ("\r\n", 2);
47 }
48
49 void
50 put_byte_with_no_nl (uint8_t b)
51 {
52   _write (" ", 1);
53   put_hex (b >> 4);
54   put_hex (b &0x0f);
55 }
56
57 void
58 put_short (uint16_t x)
59 {
60   put_hex (x >> 12);
61   put_hex ((x >> 8)&0x0f);
62   put_hex ((x >> 4)&0x0f);
63   put_hex (x & 0x0f);
64   _write ("\r\n", 2);
65 }
66
67 void
68 put_word (uint32_t x)
69 {
70   put_hex (x >> 28);
71   put_hex ((x >> 24)&0x0f);
72   put_hex ((x >> 20)&0x0f);
73   put_hex ((x >> 16)&0x0f);
74   put_hex ((x >> 12)&0x0f);
75   put_hex ((x >> 8)&0x0f);
76   put_hex ((x >> 4)&0x0f);
77   put_hex (x & 0x0f);
78   _write ("\r\n", 2);
79 }
80
81 void
82 put_int (uint32_t x)
83 {
84   char s[10];
85   int i;
86
87   for (i = 0; i < 10; i++)
88     {
89       s[i] = '0' + (x % 10);
90       x /= 10;
91       if (x == 0)
92         break;
93     }
94
95   while (i)
96     {
97       _write (s+i, 1);
98       i--;
99     }
100
101   _write (s, 1);
102   _write ("\r\n", 2);
103 }
104
105 void
106 put_binary (const char *s, int len)
107 {
108   int i;
109
110   for (i = 0; i < len; i++)
111     {
112       put_byte_with_no_nl (s[i]);
113       if ((i & 0x0f) == 0x0f)
114         _write ("\r\n", 2);
115       }
116   _write ("\r\n", 2);
117 }
118
119 void
120 put_string (const char *s)
121 {
122   _write (s, strlen (s));
123 }
124
125