Installed revised and updated translation
[gnupg.git] / common / convert.c
1 /* convert.c - Hex conversion functions.
2  *      Copyright (C) 2006 Free Software Foundation, Inc.
3  *
4  * This file is part of GnuPG.
5  *
6  * GnuPG 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  * GnuPG 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
19  * USA.
20  */
21
22 #include <config.h>
23 #include <stdlib.h>
24 #include <errno.h>
25 #include <ctype.h>
26
27 #include "util.h"
28
29
30 #define tohex(n) ((n) < 10 ? ((n) + '0') : (((n) - 10) + 'A'))
31
32
33 /* Convert STRING consisting of hex characters into its binary
34    representation and store that at BUFFER.  BUFFER needs to be of
35    LENGTH bytes.  The function check that the STRING will convert
36    exactly to LENGTH bytes. The string is delimited by either end of
37    string or a white space character.  The function returns -1 on
38    error or the length of the parsed string.  */
39 int
40 hex2bin (const char *string, void *buffer, size_t length)
41 {
42   int i;
43   const char *s = string;
44
45   for (i=0; i < length; )
46     {
47       if (!hexdigitp (s) || !hexdigitp (s+1))
48         return -1;           /* Invalid hex digits. */
49       ((unsigned char*)buffer)[i++] = xtoi_2 (s);
50       s += 2;
51     }
52   if (*s && (!isascii (*s) || !isspace (*s)) )
53     return -1;             /* Not followed by Nul or white space.  */
54   if (i != length)
55     return -1;             /* Not of expected length.  */
56   if (*s)
57     s++; /* Skip the delimiter. */
58   return s - string;
59 }
60
61
62 /* Convert STRING consisting of hex characters into its binary representation
63    and store that at BUFFER.  BUFFER needs to be of LENGTH bytes.  The
64    function check that the STRING will convert exactly to LENGTH
65    bytes. Colons inbetween the hex digits are allowed, if one colon
66    has been given a colon is expected very 2 characters. The string
67    is delimited by either end of string or a white space character.
68    The function returns -1 on error or the length of the parsed
69    string.  */
70 int
71 hexcolon2bin (const char *string, void *buffer, size_t length)
72 {
73   int i;
74   const char *s = string;
75   int need_colon = 0;
76
77   for (i=0; i < length; )
78     {
79       if (i==1 && *s == ':')  /* Skip colons between hex digits.  */
80         {
81           need_colon = 1;
82           s++;
83         }
84       else if (need_colon && *s == ':')
85         s++;
86       else if (need_colon)
87         return -1;           /* Colon expected. */
88       if (!hexdigitp (s) || !hexdigitp (s+1))
89         return -1;           /* Invalid hex digits. */
90       ((unsigned char*)buffer)[i++] = xtoi_2 (s);
91       s += 2;
92     }
93   if (*s == ':')
94     return -1;             /* Trailing colons are not allowed.  */
95   if (*s && (!isascii (*s) || !isspace (*s)) )
96     return -1;             /* Not followed by Nul or white space.  */
97   if (i != length)
98     return -1;             /* Not of expected length.  */
99   if (*s)
100     s++; /* Skip the delimiter. */
101   return s - string;
102 }
103
104
105 static char *
106 do_bin2hex (const void *buffer, size_t length, char *stringbuf, int with_colon)
107 {
108   const unsigned char *s;
109   char *p;
110   
111   if (!stringbuf)
112     {
113       /* Not really correct for with_colon but we don't care about the
114          one wasted byte. */
115       size_t n = with_colon? 3:2; 
116       size_t nbytes = n * length + 1; 
117       if (length &&  (nbytes-1) / n != length) 
118         {
119           errno = ENOMEM;
120           return NULL;
121         }
122       stringbuf = xtrymalloc (nbytes);
123       if (!stringbuf)
124         return NULL;
125     }
126   
127   for (s = buffer, p = stringbuf; length; length--, s++)
128     {
129       if (with_colon && s != buffer)
130         *p++ = ':';
131       *p++ = tohex ((*s>>4)&15);
132       *p++ = tohex (*s&15);
133     }
134   *p = 0;
135
136   return stringbuf;
137 }
138
139
140 /* Convert LENGTH bytes of data in BUFFER into hex encoding and store
141    that at the provided STRINGBUF.  STRINGBUF must be allocated of at
142    least (2*LENGTH+1) bytes or be NULL so that the function mallocs an
143    appropriate buffer.  Returns STRINGBUF or NULL on error (which may
144    only occur if STRINGBUF has been NULL and the internal malloc
145    failed). */
146 char *
147 bin2hex (const void *buffer, size_t length, char *stringbuf)
148 {
149   return do_bin2hex (buffer, length, stringbuf, 0);
150 }
151
152 /* Convert LENGTH bytes of data in BUFFER into hex encoding and store
153    that at the provided STRINGBUF.  STRINGBUF must be allocated of at
154    least (3*LENGTH+1) bytes or be NULL so that the function mallocs an
155    appropriate buffer.  Returns STRINGBUF or NULL on error (which may
156    only occur if STRINGBUF has been NULL and the internal malloc
157    failed). */
158 char *
159 bin2hexcolon (const void *buffer, size_t length, char *stringbuf)
160 {
161   return do_bin2hex (buffer, length, stringbuf, 1);
162 }
163
164