summaryrefslogtreecommitdiff
path: root/support/regression/tests/bug3475656.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/bug3475656.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/bug3475656.c')
-rw-r--r--support/regression/tests/bug3475656.c73
1 files changed, 73 insertions, 0 deletions
diff --git a/support/regression/tests/bug3475656.c b/support/regression/tests/bug3475656.c
new file mode 100644
index 0000000..23ee19a
--- /dev/null
+++ b/support/regression/tests/bug3475656.c
@@ -0,0 +1,73 @@
+/*
+ bug3475656.c
+
+ Digits in output were reversed (e.g. 192 was written as "291").
+*/
+
+#include <testfwk.h>
+
+#ifdef __SDCC
+#pragma disable_warning 85
+#endif
+
+#define UCHAR unsigned char
+#define USHORT unsigned short
+#define PCHAR unsigned char *
+
+UCHAR mod_16x8(USHORT s16, UCHAR i8)
+{
+ return(s16 % i8);
+}
+
+USHORT div_16x8(USHORT s16, UCHAR i8)
+{
+ return(s16 / i8);
+}
+
+#if 1
+void itoa(USHORT sVal, PCHAR pBuf, UCHAR iRadix)
+{
+ PCHAR p; // pointer to traverse string
+ PCHAR pFirstDigit; // pointer to first digit
+ UCHAR iTmp; // temp UCHAR
+
+ p = pBuf;
+ pFirstDigit = p; // save pointer to first digit
+
+ do
+ {
+ iTmp = mod_16x8(sVal, iRadix);
+ sVal = div_16x8(sVal, iRadix);
+
+ // convert to ascii and store
+ *p++ = (iTmp > 9) ? iTmp - 10 + 'A' : iTmp + '0'; // a letter or a digit
+ } while (sVal > 0);
+
+ // We now have the digit of the number in the buffer, but in reverse order. Thus we reverse them now.
+
+ *p-- = '\0'; // terminate string; p points to last digit
+
+ do
+ {
+ iTmp = *p;
+ *p = *pFirstDigit;
+ *pFirstDigit = iTmp; // swap *p and *pFirstDigit
+ --p;
+ ++pFirstDigit; // advance to next two digits
+ } while (pFirstDigit < p); // repeat until halfway
+}
+#endif
+
+void testBug(void)
+{
+ unsigned char c[8];
+ unsigned short i;
+
+ i = 192;
+#if 1
+ itoa(i, c, 10);
+ ASSERT(c[0] == '1');
+ ASSERT(c[1] == '9');
+ ASSERT(c[2] == '2');
+#endif
+}