summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug-2452.c
diff options
context:
space:
mode:
authorXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
committerXavier ASUS <xavi92psx@gmail.com>2019-10-18 00:31:54 +0200
commit268a53de823a6750d6256ee1fb1e7707b4b45740 (patch)
tree42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/bug-2452.c
downloadsdcc-gas-268a53de823a6750d6256ee1fb1e7707b4b45740.tar.gz
sdcc-3.9.0 fork implementing GNU assembler syntax
This fork aims to provide better support for stm8-binutils
Diffstat (limited to 'support/regression/tests/bug-2452.c')
-rw-r--r--support/regression/tests/bug-2452.c91
1 files changed, 91 insertions, 0 deletions
diff --git a/support/regression/tests/bug-2452.c b/support/regression/tests/bug-2452.c
new file mode 100644
index 0000000..4d86793
--- /dev/null
+++ b/support/regression/tests/bug-2452.c
@@ -0,0 +1,91 @@
+/*
+ bug-2452.c
+*/
+
+#include <stdbool.h>
+#include <testfwk.h>
+
+typedef struct
+{
+ unsigned char byte[5];
+} value_t;
+
+static void
+output_digit (unsigned char n)
+{
+ ASSERT(n == 9);
+}
+
+static void
+calculate_digit (value_t *value)
+{
+ value->byte[4] = 9;
+}
+
+int
+xprint_format (const char *format)
+{
+ value_t value;
+ bool lsd;
+ int i;
+
+ unsigned char length;
+
+ while( *format++ )
+ {
+ unsigned char store[6];
+ unsigned char *pstore = &store[5];
+
+ format++;
+
+
+ lsd = 1;
+ i = 1;
+ do {
+ value.byte[4] = 0;
+
+ calculate_digit(&value);
+
+ if (!lsd)
+ {
+ *pstore = (value.byte[4] << 4) | (value.byte[4] >> 4) | *pstore;
+ pstore--;
+ }
+ else
+ {
+ *pstore = value.byte[4];
+ }
+
+ lsd = !lsd;
+ } while( i-- );
+
+ length = 2;
+
+ ASSERT(lsd);
+
+ while( length-- )
+ {
+ lsd = !lsd;
+ if (!lsd)
+ {
+ pstore++;
+ value.byte[4] = *pstore >> 4;
+ }
+ else
+ {
+ value.byte[4] = *pstore & 0x0F;
+ }
+
+ output_digit( value.byte[4]);
+ }
+ }
+
+ return 0;
+}
+
+void
+test_xprintf (void)
+{
+ xprint_format ("%d");
+}
+