Import bind-9.3.4
[dragonfly.git] / contrib / bind-9.3 / lib / bind / isc / hex.c
1 /*
2  * Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
3  * Copyright (c) 2001 by Internet Software Consortium.
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
15  * OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  */
17
18 #include <port_before.h>
19 #include <ctype.h>
20 #include <stdio.h>
21 #include <string.h>
22 #include <isc/misc.h>
23 #include <port_after.h>
24
25 static const char hex[17] = "0123456789abcdef";
26
27 int
28 isc_gethexstring(unsigned char *buf, size_t len, int count, FILE *fp,
29                  int *multiline)
30 {
31         int c, n;
32         unsigned char x;
33         char *s;
34         int result = count;
35         
36         x = 0; /* silence compiler */
37         n = 0;
38         while (count > 0) {
39                 c = fgetc(fp);
40
41                 if ((c == EOF) ||
42                     (c == '\n' && !*multiline) ||
43                     (c == '(' && *multiline) ||
44                     (c == ')' && !*multiline))
45                         goto formerr;
46                 /* comment */
47                 if (c == ';') {
48                         do {
49                                 c = fgetc(fp);
50                         } while (c != EOF && c != '\n');
51                         if (c == '\n' && *multiline)
52                                 continue;
53                         goto formerr;
54                 }
55                 /* white space */
56                 if (c == ' ' || c == '\t' || c == '\n' || c == '\r')
57                         continue;
58                 /* multiline */
59                 if ('(' == c || c == ')') {
60                         *multiline = (c == '(' /*)*/);
61                         continue;
62                 }
63                 if ((s = strchr(hex, tolower(c))) == NULL)
64                         goto formerr;
65                 x = (x<<4) | (s - hex);
66                 if (++n == 2) {
67                         if (len > 0U) {
68                                 *buf++ = x;
69                                 len--;
70                         } else
71                                 result = -1;
72                         count--;
73                         n = 0;
74                 }
75         }
76         return (result);
77
78  formerr:
79         if (c == '\n')
80                 ungetc(c, fp);
81         return (-1);
82 }
83
84 void
85 isc_puthexstring(FILE *fp, const unsigned char *buf, size_t buflen,
86                  size_t len1, size_t len2, const char *sep)
87 {
88         size_t i = 0;
89
90         if (len1 < 4U)
91                 len1 = 4;
92         if (len2 < 4U)
93                 len2 = 4;
94         while (buflen > 0U) {
95                 fputc(hex[(buf[0]>>4)&0xf], fp);
96                 fputc(hex[buf[0]&0xf], fp);
97                 i += 2;
98                 buflen--;
99                 buf++;
100                 if (i >= len1 && sep != NULL) {
101                         fputs(sep, fp);
102                         i = 0;
103                         len1 = len2;
104                 }
105         }
106 }
107
108 void
109 isc_tohex(const unsigned char *buf, size_t buflen, char *t) {
110         while (buflen > 0U) {
111                 *t++ = hex[(buf[0]>>4)&0xf];
112                 *t++ = hex[buf[0]&0xf];
113                 buf++;
114                 buflen--;
115         }
116         *t = '\0';
117 }