]> granicus.if.org Git - yasm/commitdiff
Add BitVector_from_Oct() and tests for it.
authorPeter Johnson <peter@tortall.net>
Sun, 7 Oct 2001 23:02:43 +0000 (23:02 -0000)
committerPeter Johnson <peter@tortall.net>
Sun, 7 Oct 2001 23:02:43 +0000 (23:02 -0000)
svn path=/trunk/yasm/; revision=268

libyasm/bitvect.c
libyasm/bitvect.h
libyasm/tests/Makefile.am
libyasm/tests/bitvect_test.c [new file with mode: 0644]
src/bitvect.c
src/bitvect.h
src/tests/Makefile.am
src/tests/bitvect_test.c [new file with mode: 0644]

index 7534663975d50ef6839eb0ebde4d69b5fdf9fa82..34b3a94c4e45789e376732c821394bad0a13c855 100644 (file)
@@ -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);
index 7fbc2ce566206cb4b3516a82b04659710e7ca2da..1cd3195dc3941e735338bdb1961b887e4e48f43e 100644 (file)
@@ -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);
 
index 169cae5cec26ed48bb3db827032ca0476fb5bc3c..51edfab3a472575a8cb2533e16da43802aba440c 100644 (file)
@@ -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 (file)
index 0000000..963baee
--- /dev/null
@@ -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 <stdlib.h>
+# include <string.h>
+#endif
+
+#include <stdio.h>
+
+#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<num; i++)
+       fail_unless(num_check(&vals[i]) == 0, result_msg);
+}
+END_TEST
+
+START_TEST(test_oct_large_num)
+{
+    Val *vals = oct_large_vals;
+    int i, num = sizeof(oct_large_vals)/sizeof(Val);
+
+    for (i=0; i<num; i++)
+       fail_unless(num_check(&vals[i]) == 0, result_msg);
+}
+END_TEST
+
+static Suite *
+bitvect_suite(void)
+{
+    Suite *s = suite_create("BitVector");
+    TCase *tc_boot = tcase_create("Boot");
+    TCase *tc_from_oct = tcase_create("from_Oct");
+
+    suite_add_tcase(s, tc_boot);
+    tcase_add_test(tc_boot, test_boot);
+
+    suite_add_tcase(s, tc_from_oct);
+    tcase_add_test(tc_from_oct, test_oct_small_num);
+    tcase_add_test(tc_from_oct, test_oct_large_num);
+    tcase_set_fixture(tc_from_oct, num_family_setup, num_family_teardown);
+
+    return s;
+}
+
+int
+main(void)
+{
+    int nf;
+    Suite *s = bitvect_suite();
+    SRunner *sr = srunner_create(s);
+    srunner_run_all(sr, CRNORMAL);
+    nf = srunner_ntests_failed(sr);
+    srunner_free(sr);
+    suite_free(s);
+    return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}
index 7534663975d50ef6839eb0ebde4d69b5fdf9fa82..34b3a94c4e45789e376732c821394bad0a13c855 100644 (file)
@@ -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);
index 7fbc2ce566206cb4b3516a82b04659710e7ca2da..1cd3195dc3941e735338bdb1961b887e4e48f43e 100644 (file)
@@ -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);
 
index 169cae5cec26ed48bb3db827032ca0476fb5bc3c..51edfab3a472575a8cb2533e16da43802aba440c 100644 (file)
@@ -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 (file)
index 0000000..963baee
--- /dev/null
@@ -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 <stdlib.h>
+# include <string.h>
+#endif
+
+#include <stdio.h>
+
+#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<num; i++)
+       fail_unless(num_check(&vals[i]) == 0, result_msg);
+}
+END_TEST
+
+START_TEST(test_oct_large_num)
+{
+    Val *vals = oct_large_vals;
+    int i, num = sizeof(oct_large_vals)/sizeof(Val);
+
+    for (i=0; i<num; i++)
+       fail_unless(num_check(&vals[i]) == 0, result_msg);
+}
+END_TEST
+
+static Suite *
+bitvect_suite(void)
+{
+    Suite *s = suite_create("BitVector");
+    TCase *tc_boot = tcase_create("Boot");
+    TCase *tc_from_oct = tcase_create("from_Oct");
+
+    suite_add_tcase(s, tc_boot);
+    tcase_add_test(tc_boot, test_boot);
+
+    suite_add_tcase(s, tc_from_oct);
+    tcase_add_test(tc_from_oct, test_oct_small_num);
+    tcase_add_test(tc_from_oct, test_oct_large_num);
+    tcase_set_fixture(tc_from_oct, num_family_setup, num_family_teardown);
+
+    return s;
+}
+
+int
+main(void)
+{
+    int nf;
+    Suite *s = bitvect_suite();
+    SRunner *sr = srunner_create(s);
+    srunner_run_all(sr, CRNORMAL);
+    nf = srunner_ntests_failed(sr);
+    srunner_free(sr);
+    suite_free(s);
+    return (nf == 0) ? EXIT_SUCCESS : EXIT_FAILURE;
+}