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 } 118 119 /*! \file */ 120