diff options
| author | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
|---|---|---|
| committer | Xavier ASUS <xavi92psx@gmail.com> | 2019-10-18 00:31:54 +0200 |
| commit | 268a53de823a6750d6256ee1fb1e7707b4b45740 (patch) | |
| tree | 42c1799a9a82b2f7d9790ee9fe181d72a7274751 /support/regression/tests/bug-2684.c | |
| download | sdcc-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-2684.c')
| -rw-r--r-- | support/regression/tests/bug-2684.c | 269 |
1 files changed, 269 insertions, 0 deletions
diff --git a/support/regression/tests/bug-2684.c b/support/regression/tests/bug-2684.c new file mode 100644 index 0000000..c1ce6d7 --- /dev/null +++ b/support/regression/tests/bug-2684.c @@ -0,0 +1,269 @@ +/* bug-2684.c + A bug in the interface between SDCC and tdlib. + */ + +#include <testfwk.h> + +#pragma disable_warning 85 +#pragma disable_warning 196 + +/* printf.c + * Dale Schumacher 399 Beacon Ave. + * (alias: Dalnefre') St. Paul, MN 55104 + * dal@syntel.UUCP United States of America + * + * Altered to use stdarg, made the core function vfprintf. + * Hooked into the stdio package using 'inside information' + * Altered sizeof() assumptions, now assumes all integers except chars + * will be either + * sizeof(xxx) == sizeof(long) or sizeof(xxx) == sizeof(short) + * + * -RDB + */ + +#include <stdarg.h> +#include <string.h> + +typedef unsigned char uchar; +typedef signed long fpos_t; +/* when you add or change fields here, be sure to change the initialization + * in stdio_init and fopen */ +struct __stdio_file { + uchar *bufpos; /* the next byte to write to or read from */ + uchar *bufread; /* the end of data returned by last read() */ + uchar *bufwrite; /* highest address writable by macro */ + uchar *bufstart; /* the start of the buffer */ + uchar *bufend; /* the end of the buffer; ie the byte after + the last malloc()ed byte */ + int fd; /* the file descriptor associated with the stream */ + int mode; + char unbuf[8]; /* The buffer for 'unbuffered' streams */ + struct __stdio_file * next; +}; + +typedef struct __stdio_file FILE; + +int fputc(int c, FILE *stream) +{ + return (0); +} + +int fflush(FILE *stream) +{ + return (0); +} + +#define _IOLBF 0x01 +#define _IONBF 0x02 +#define __MODE_BUF 0x03 + +extern char *__ltostr(long __value, int __radix) +{ + return (""); +} + +extern char *__ultostr(unsigned long value, int __radix) +{ + return (""); +} + +/* + * Output the given field in the manner specified by the arguments. Return + * the number of characters output. + */ +static int prtfld(FILE * op, size_t maxlen, size_t ct, unsigned char *buf, int ljustf, char sign, + char pad, int width, int preci, int buffer_mode) +{ + return 0; +} + +#if !(defined (__SDCC_mcs51) && defined (__SDCC_MODEL_SMALL)) && !defined (__SDCC_pdk14) && !defined (__SDCC_pdk15) +int _vfnprintf(FILE * op, size_t maxlen, const char *fmt, va_list ap) +{ + register int i, ljustf, lval, preci, dpoint, width, radix, cnt = 0; + char pad, sign, hash; + register char *ptmp, *add; + unsigned long val; + char tmp[64]; + int buffer_mode; + + /* This speeds things up a bit for unbuffered */ + buffer_mode = (op->mode & __MODE_BUF); + op->mode &= (~__MODE_BUF); + while (*fmt) { + if (*fmt == '%') { + if (buffer_mode == _IONBF) + fflush(op); + ljustf = 0; /* left justify flag */ + sign = '\0'; /* sign char & status */ + pad = ' '; /* justification padding char */ + width = -1; /* min field width */ + dpoint = 0; /* found decimal point */ + preci = -1; /* max data width */ + radix = 10; /* number base */ + ptmp = tmp; /* pointer to area to print */ + hash = 0; + lval = (sizeof(int) == sizeof(long)); /* long value flaged */ + fmtnxt:for (i = 0, ++fmt;; + ++fmt) { + if (*fmt < '0' || *fmt > '9') + break; + i *= 10; + i += (*fmt - '0'); + if (dpoint) + preci = i; + else if (!i && (pad == ' ')) { + pad = '0'; + goto fmtnxt; + } else + width = i; + } + switch (*fmt) { + case '\0': /* early EOS */ + --fmt; + goto charout; + + case '-': /* left justification */ + ljustf = 1; + goto fmtnxt; + + case ' ': + case '+': /* leading sign flag */ + sign = *fmt; + goto fmtnxt; + + case '#': + hash = 1; + goto fmtnxt; + + case '*': /* parameter width value */ + i = va_arg(ap, int); + if (dpoint) + preci = i; + else if ((width = i) < 0) { + ljustf = 1; + width = -i; + } + goto fmtnxt; + + case '.': /* secondary width field */ + dpoint = 1; + goto fmtnxt; + + case 'l': /* long data */ + lval = 1; + goto fmtnxt; + + case 'h': /* short data */ + lval = 0; + goto fmtnxt; + + case 'd': /* Signed decimal */ + case 'i': + ptmp = __ltostr((long) ((lval) ? + va_arg(ap, long) : + va_arg(ap, int)), 10); + goto printit; + + case 'b': /* Unsigned binary */ + radix = 2; + goto usproc; + + case 'o': /* Unsigned octal */ + radix = 8; + goto usproc; + + case 'p': /* Pointer */ + lval = (sizeof(char *) == sizeof(long)); + pad = '0'; + width = 5; + preci = 8; + /* fall thru */ + + case 'X': /* Unsigned hexadecimal 'ABC' */ + radix = 16; + goto usproc; + + case 'x': /* Unsigned hexadecimal 'abc' */ + radix = -16; + /* fall thru */ + + case 'u': /* Unsigned decimal */ + usproc: + val = lval ? va_arg(ap, unsigned long) : + va_arg(ap, unsigned int); + ptmp = __ultostr(val, radix < 0 ? -radix : radix); + add = ""; + if (hash) { + if (radix == 2) + add = "0b"; + else if (radix == 8) { + if (val != 0) + add = "0"; + } else if (radix == 16) + add = "0x"; + else if (radix == -16) + add = "0X"; + if (*add) { + pad = '\0'; + strcpy(tmp, add); + ptmp = strcat(tmp, ptmp); + } + } + goto printit; + + case '!': /* inline Character */ + if ((i = fmt[1]) != 0) + ++fmt; + goto Chr; + + case 'c': /* Character */ + i = va_arg(ap, int); + Chr:ptmp[0] = + i; + ptmp[1] = '\0'; + if (hash) { + pad = *ptmp; + goto chrpad; + } + goto nopad; + + case 's': /* String */ + ptmp = va_arg(ap, char *); + nopad:pad = + ' '; + chrpad:sign = + '\0'; + printit:cnt += + prtfld(op, maxlen, cnt, (unsigned char *) ptmp, + ljustf, sign, pad, width, preci, + buffer_mode); + break; + + default: /* unknown character */ + goto charout; + } + } else { + charout: + /* normal char out */ + if (cnt < maxlen) + fputc(*fmt, op); + ++cnt; + if (*fmt == '\n' && buffer_mode == _IOLBF) + fflush(op); + } + ++fmt; + } + op->mode |= buffer_mode; + if (buffer_mode == _IONBF) + fflush(op); + if (buffer_mode == _IOLBF) + op->bufwrite = op->bufstart; + return (cnt); +} +#endif + +void testBug(void) +{ +} + |
