From: Peter Johnson Date: Sun, 7 Oct 2001 23:02:43 +0000 (-0000) Subject: Add BitVector_from_Oct() and tests for it. X-Git-Tag: v0.1.0~262 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2e04b1830a55b8298079fe0041e9be78417b81db;p=yasm Add BitVector_from_Oct() and tests for it. svn path=/trunk/yasm/; revision=268 --- diff --git a/libyasm/bitvect.c b/libyasm/bitvect.c index 75346639..34b3a94c 100644 --- a/libyasm/bitvect.c +++ b/libyasm/bitvect.c @@ -1378,6 +1378,47 @@ ErrCode BitVector_from_Hex(wordptr addr, charptr string) else return(ErrCode_Pars); } +ErrCode BitVector_from_Oct(wordptr addr, charptr string) +{ + N_word size = size_(addr); + N_word mask = mask_(addr); + boolean ok = TRUE; + N_word length; + N_word value; + N_word value_fill = 0; + N_word count; + Z_word count_fill = 0; + int digit; + + if (size > 0) + { + length = strlen((char *) string); + string += length; + while (size-- > 0) + { + value = value_fill; + for ( count = count_fill; (ok and (length > 0) and (count < BITS)); count += 3 ) + { + digit = (int) *(--string); length--; + if ((ok = (isdigit(digit) && digit != '8' && digit != '9')) != 0) + { + digit -= (int) '0'; + value |= (((N_word) digit) << count); + } + } + count_fill = (Z_word)count-(Z_word)BITS; + if (count_fill > 0) + value_fill = (((N_word) digit) >> (3-count_fill)); + else + value_fill = 0; + *addr++ = value; + } + *(--addr) &= mask; + } + if (ok) return(ErrCode_Ok); + else return(ErrCode_Pars); +} + charptr BitVector_to_Bin(wordptr addr) { N_word size = size_(addr); diff --git a/libyasm/bitvect.h b/libyasm/bitvect.h index 7fbc2ce5..1cd3195d 100644 --- a/libyasm/bitvect.h +++ b/libyasm/bitvect.h @@ -180,6 +180,8 @@ Z_int BitVector_Compare (wordptr X, wordptr Y); /* X <,=,> Y ? */ charptr BitVector_to_Hex (wordptr addr); ErrCode BitVector_from_Hex(wordptr addr, charptr string); +ErrCode BitVector_from_Oct(wordptr addr, charptr string); + charptr BitVector_to_Bin (wordptr addr); ErrCode BitVector_from_Bin(wordptr addr, charptr string); diff --git a/libyasm/tests/Makefile.am b/libyasm/tests/Makefile.am index 169cae5c..51edfab3 100644 --- a/libyasm/tests/Makefile.am +++ b/libyasm/tests/Makefile.am @@ -4,10 +4,12 @@ CFLAGS = @ANSI_CFLAGS@ if CHECK TESTS = \ + bitvect_test \ bytecode_test \ floatnum_test noinst_PROGRAMS = \ + bitvect_test \ bytecode_test \ floatnum_test else @@ -15,6 +17,9 @@ TESTS = noinst_PROGRAMS = endif +bitvect_test_SOURCES = \ + bitvect_test.c + bytecode_test_SOURCES = \ bytecode_test.c diff --git a/libyasm/tests/bitvect_test.c b/libyasm/tests/bitvect_test.c new file mode 100644 index 00000000..963baee7 --- /dev/null +++ b/libyasm/tests/bitvect_test.c @@ -0,0 +1,168 @@ +/* $IdPath$ + * + * Copyright (C) 2001 Peter Johnson + * + * This file is part of YASM. + * + * YASM is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * YASM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef STDC_HEADERS +# include +# include +#endif + +#include + +#include "check.h" + +#include "bitvect.h" + +START_TEST(test_boot) +{ + fail_unless(BitVector_Boot() == ErrCode_Ok, "failed to Boot()"); +} +END_TEST + +typedef struct Val_s { + const char *ascii; + unsigned char result[10]; /* 80 bit result, little endian */ +} Val; + +Val oct_small_vals[] = { + { "0", + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, + { "1", + {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, + { "77", + {0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, +}; + +Val oct_large_vals[] = { + { "7654321076543210", + {0x88, 0xC6, 0xFA, 0x88, 0xC6, 0xFA, 0x00, 0x00, 0x00, 0x00} + }, + { "12634727612534126530214", + {0x8C, 0xB0, 0x5A, 0xE1, 0xAA, 0xF8, 0x3A, 0x67, 0x05, 0x00} + }, + { "61076543210", + {0x88, 0xC6, 0xFA, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00} + }, +}; + +wordptr testval; + +static void +num_family_setup(void) +{ + BitVector_Boot(); + testval = BitVector_Create(80, FALSE); +} + +static void +num_family_teardown(void) +{ + BitVector_Destroy(testval); +} + +static char result_msg[1024]; + +static int +num_check(Val *val) +{ + unsigned char ascii[64], *result; + unsigned int len; + int i; + int ret = 0; + + strcpy((char *)ascii, val->ascii); + strcpy(result_msg, "parser failure"); + if(BitVector_from_Oct(testval, ascii) != ErrCode_Ok) + return 1; + + result = BitVector_Block_Read(testval, &len); + + for (i=0; i<10; i++) + if (result[i] != val->result[i]) + ret = 1; + + if (ret) { + strcpy(result_msg, val->ascii); + for (i=0; i<10; i++) + sprintf((char *)ascii+3*i, "%02x ", result[i]); + strcat(result_msg, ": "); + strcat(result_msg, (char *)ascii); + } + free(result); + + return ret; +} + +START_TEST(test_oct_small_num) +{ + Val *vals = oct_small_vals; + int i, num = sizeof(oct_small_vals)/sizeof(Val); + + for (i=0; i 0) + { + length = strlen((char *) string); + string += length; + while (size-- > 0) + { + value = value_fill; + for ( count = count_fill; (ok and (length > 0) and (count < BITS)); count += 3 ) + { + digit = (int) *(--string); length--; + if ((ok = (isdigit(digit) && digit != '8' && digit != '9')) != 0) + { + digit -= (int) '0'; + value |= (((N_word) digit) << count); + } + } + count_fill = (Z_word)count-(Z_word)BITS; + if (count_fill > 0) + value_fill = (((N_word) digit) >> (3-count_fill)); + else + value_fill = 0; + *addr++ = value; + } + *(--addr) &= mask; + } + if (ok) return(ErrCode_Ok); + else return(ErrCode_Pars); +} + charptr BitVector_to_Bin(wordptr addr) { N_word size = size_(addr); diff --git a/src/bitvect.h b/src/bitvect.h index 7fbc2ce5..1cd3195d 100644 --- a/src/bitvect.h +++ b/src/bitvect.h @@ -180,6 +180,8 @@ Z_int BitVector_Compare (wordptr X, wordptr Y); /* X <,=,> Y ? */ charptr BitVector_to_Hex (wordptr addr); ErrCode BitVector_from_Hex(wordptr addr, charptr string); +ErrCode BitVector_from_Oct(wordptr addr, charptr string); + charptr BitVector_to_Bin (wordptr addr); ErrCode BitVector_from_Bin(wordptr addr, charptr string); diff --git a/src/tests/Makefile.am b/src/tests/Makefile.am index 169cae5c..51edfab3 100644 --- a/src/tests/Makefile.am +++ b/src/tests/Makefile.am @@ -4,10 +4,12 @@ CFLAGS = @ANSI_CFLAGS@ if CHECK TESTS = \ + bitvect_test \ bytecode_test \ floatnum_test noinst_PROGRAMS = \ + bitvect_test \ bytecode_test \ floatnum_test else @@ -15,6 +17,9 @@ TESTS = noinst_PROGRAMS = endif +bitvect_test_SOURCES = \ + bitvect_test.c + bytecode_test_SOURCES = \ bytecode_test.c diff --git a/src/tests/bitvect_test.c b/src/tests/bitvect_test.c new file mode 100644 index 00000000..963baee7 --- /dev/null +++ b/src/tests/bitvect_test.c @@ -0,0 +1,168 @@ +/* $IdPath$ + * + * Copyright (C) 2001 Peter Johnson + * + * This file is part of YASM. + * + * YASM is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * YASM is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + */ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#ifdef STDC_HEADERS +# include +# include +#endif + +#include + +#include "check.h" + +#include "bitvect.h" + +START_TEST(test_boot) +{ + fail_unless(BitVector_Boot() == ErrCode_Ok, "failed to Boot()"); +} +END_TEST + +typedef struct Val_s { + const char *ascii; + unsigned char result[10]; /* 80 bit result, little endian */ +} Val; + +Val oct_small_vals[] = { + { "0", + {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, + { "1", + {0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, + { "77", + {0x3F, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00} + }, +}; + +Val oct_large_vals[] = { + { "7654321076543210", + {0x88, 0xC6, 0xFA, 0x88, 0xC6, 0xFA, 0x00, 0x00, 0x00, 0x00} + }, + { "12634727612534126530214", + {0x8C, 0xB0, 0x5A, 0xE1, 0xAA, 0xF8, 0x3A, 0x67, 0x05, 0x00} + }, + { "61076543210", + {0x88, 0xC6, 0xFA, 0x88, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00} + }, +}; + +wordptr testval; + +static void +num_family_setup(void) +{ + BitVector_Boot(); + testval = BitVector_Create(80, FALSE); +} + +static void +num_family_teardown(void) +{ + BitVector_Destroy(testval); +} + +static char result_msg[1024]; + +static int +num_check(Val *val) +{ + unsigned char ascii[64], *result; + unsigned int len; + int i; + int ret = 0; + + strcpy((char *)ascii, val->ascii); + strcpy(result_msg, "parser failure"); + if(BitVector_from_Oct(testval, ascii) != ErrCode_Ok) + return 1; + + result = BitVector_Block_Read(testval, &len); + + for (i=0; i<10; i++) + if (result[i] != val->result[i]) + ret = 1; + + if (ret) { + strcpy(result_msg, val->ascii); + for (i=0; i<10; i++) + sprintf((char *)ascii+3*i, "%02x ", result[i]); + strcat(result_msg, ": "); + strcat(result_msg, (char *)ascii); + } + free(result); + + return ret; +} + +START_TEST(test_oct_small_num) +{ + Val *vals = oct_small_vals; + int i, num = sizeof(oct_small_vals)/sizeof(Val); + + for (i=0; i