Big header file cleanup: everything that has to do with standard system
[tinc] / lib / utils.c
1 /*
2     utils.c -- gathering of some stupid small functions
3     Copyright (C) 1999-2003 Ivo Timmermans <zarq@iname.com>
4                   2000-2003 Guus Sliepen <guus@sliepen.eu.org>
5
6     This program is free software; you can redistribute it and/or modify
7     it under the terms of the GNU General Public License as published by
8     the Free Software Foundation; either version 2 of the License, or
9     (at your option) any later version.
10
11     This program is distributed in the hope that it will be useful,
12     but WITHOUT ANY WARRANTY; without even the implied warranty of
13     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14     GNU General Public License for more details.
15
16     You should have received a copy of the GNU General Public License
17     along with this program; if not, write to the Free Software
18     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
19 */
20
21 #include "system.h"
22
23 #include "../src/logger.h"
24 #include "utils.h"
25
26 #ifdef ENABLE_TRACING
27 volatile int (cp_line[]) = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
28 volatile char (*cp_file[]) = {"?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?", "?"};
29 volatile int cp_index = 0;
30 #endif
31
32 char *hexadecimals = "0123456789ABCDEF";
33
34 int charhex2bin(char c)
35 {
36         if(isdigit(c))
37                 return c - '0';
38         else
39                 return toupper(c) - 'A' + 10;
40 }
41
42
43 void hex2bin(char *src, char *dst, int length)
44 {
45         int i;
46         for(i = 0; i < length; i++)
47                 dst[i] = charhex2bin(src[i * 2]) * 16 + charhex2bin(src[i * 2 + 1]);
48 }
49
50 void bin2hex(char *src, char *dst, int length)
51 {
52         int i;
53         for(i = length - 1; i >= 0; i--) {
54                 dst[i * 2 + 1] = hexadecimals[(unsigned char) src[i] & 15];
55                 dst[i * 2] = hexadecimals[(unsigned char) src[i] >> 4];
56         }
57 }
58
59 #ifdef ENABLE_TRACING
60 void cp_trace()
61 {
62         logger(LOG_DEBUG, "Checkpoint trace: %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d <- %s:%d...",
63                    cp_file[(cp_index + 15) % 16], cp_line[(cp_index + 15) % 16],
64                    cp_file[(cp_index + 14) % 16], cp_line[(cp_index + 14) % 16],
65                    cp_file[(cp_index + 13) % 16], cp_line[(cp_index + 13) % 16],
66                    cp_file[(cp_index + 12) % 16], cp_line[(cp_index + 12) % 16],
67                    cp_file[(cp_index + 11) % 16], cp_line[(cp_index + 11) % 16],
68                    cp_file[(cp_index + 10) % 16], cp_line[(cp_index + 10) % 16],
69                    cp_file[(cp_index + 9) % 16], cp_line[(cp_index + 9) % 16],
70                    cp_file[(cp_index + 8) % 16], cp_line[(cp_index + 8) % 16],
71                    cp_file[(cp_index + 7) % 16], cp_line[(cp_index + 7) % 16],
72                    cp_file[(cp_index + 6) % 16], cp_line[(cp_index + 6) % 16],
73                    cp_file[(cp_index + 5) % 16], cp_line[(cp_index + 5) % 16],
74                    cp_file[(cp_index + 4) % 16], cp_line[(cp_index + 4) % 16],
75                    cp_file[(cp_index + 3) % 16], cp_line[(cp_index + 3) % 16],
76                    cp_file[(cp_index + 2) % 16], cp_line[(cp_index + 2) % 16],
77                    cp_file[(cp_index + 1) % 16], cp_line[(cp_index + 1) % 16],
78                    cp_file[cp_index], cp_line[cp_index]
79                 );
80 }
81 #endif