hex.c revision 6098d364b690cb9dabf96e9664c4689c8559bd2e
f89adb2c2a52b505501c3eaa2aec9fd4df6bd60aTinderbox User * Copyright (C) 2004, 2005, 2007 Internet Systems Consortium, Inc. ("ISC")
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * Copyright (C) 2000-2003 Internet Software Consortium.
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * Permission to use, copy, modify, and/or distribute this software for any
0c27b3fe77ac1d5094ba3521e8142d9e7973133fMark Andrews * purpose with or without fee is hereby granted, provided that the above
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * copyright notice and this permission notice appear in all copies.
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * PERFORMANCE OF THIS SOFTWARE.
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki/* $Id: hex.c,v 1.19 2008/09/24 02:46:23 marka Exp $ */
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki#define RETERR(x) do { \
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * BEW: These static functions are copied from lib/dns/rdata.c.
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickistr_totext(const char *source, isc_buffer_t *target);
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickimem_tobuffer(isc_buffer_t *target, void *base, unsigned int length);
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickistatic const char hex[] = "0123456789ABCDEF";
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickiisc_hex_totext(isc_region_t *source, int wordlength,
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki const char *wordbreak, isc_buffer_t *target)
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki unsigned int loops = 0;
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki * State of a hex decoding process in progress.
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickitypedef struct {
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki int length; /*%< Desired length of binary data or -1 */
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki isc_buffer_t *target; /*%< Buffer for resulting binary data */
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki int digits; /*%< Number of buffered hex digits */
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickistatic inline void
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickihex_decode_init(hex_decode_ctx_t *ctx, int length, isc_buffer_t *target)
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickihex_decode_char(hex_decode_ctx_t *ctx, int c) {
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki unsigned char num;
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickiisc_hex_tobuffer(isc_lex_t *lexer, isc_buffer_t *target, int length) {
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki unsigned int i;
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki RETERR(isc_lex_getmastertoken(lexer, &token,
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickiisc_hex_decodestring(const char *cstr, isc_buffer_t *target) {
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki if (c == '\0')
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki if (c == ' ' || c == '\t' || c == '\n' || c== '\r')
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickistr_totext(const char *source, isc_buffer_t *target) {
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki unsigned int l;
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecicki isc_buffer_availableregion(target, ®ion);
19d80ce5844e00a021643759adcbe27c11b485a0Witold Krecickimem_tobuffer(isc_buffer_t *target, void *base, unsigned int length) {