~ubuntu-branches/ubuntu/raring/avr-libc/raring-proposed

« back to all changes in this revision

Viewing changes to tests/simulate/scanf/sscanf-x1.c

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2008-08-10 09:59:16 UTC
  • mfrom: (1.1.7 upstream) (4.1.1 lenny)
  • Revision ID: james.westby@ubuntu.com-20080810095916-wwyigh3vt0e9s7ud
Tags: 1:1.6.2.cvs20080610-2
Added build-depends on texlive-extra-utils (closes: #493454)

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/* Test of scanf(): 'x' conversion directive.
 
2
   $Id: sscanf-x1.c,v 1.2.2.3 2008/03/20 21:42:35 joerg_wunsch Exp $    */
 
3
 
 
4
#include <stdio.h>
 
5
#include <stdlib.h>
 
6
#include <string.h>
 
7
#include "progmem.h"
 
8
 
 
9
#ifdef  __AVR__
 
10
# define ASSERT(expr)                   \
 
11
    do {                                \
 
12
        if (!(expr)) exit(__LINE__);    \
 
13
    } while (0)
 
14
# define EXIT(v)        exit (v)
 
15
# if defined(__AVR_ATmega128__)
 
16
  /* ATmega128 has enough RAM for sprintf(), print to 0x2000 in XRAM. */
 
17
#  define PRINTF(f...)  sprintf((char *)0x2000, f)
 
18
# else
 
19
  /* small AVR */
 
20
#  define PRINTF(f...)
 
21
# endif
 
22
#else
 
23
# include <assert.h>
 
24
# define ASSERT(expr)   assert (expr)
 
25
# define EXIT(v)        exit ((v) < 256 ? (v) : 255)
 
26
# define PRINTF(f...)   printf (f)
 
27
# define sscanf_P       sscanf
 
28
# define memcmp_P       memcmp
 
29
#endif
 
30
 
 
31
/* Next variables are useful to debug the AVR.  */
 
32
int vrslt = 1;
 
33
struct {
 
34
    unsigned int i[10];
 
35
    char s[10];
 
36
} v = { {1}, {1} };
 
37
 
 
38
void Check (int line, int expval, int rslt)
 
39
{
 
40
    vrslt = rslt;
 
41
    if (rslt != expval) {
 
42
        PRINTF ("\nLine %d:  expect= %d, rslt= %d\n", line, expval, rslt);
 
43
        EXIT (line);
 
44
    }
 
45
}
 
46
 
 
47
/* The sscanf() is called 4 times: SRAM and FLASH format, 2 values
 
48
   to fill before run.  */
 
49
#define CHECK(expval, ass_expr, str, fmt, ...)                          \
 
50
    do {                                                                \
 
51
        PROGMEM static char fmt_p[] = fmt;                              \
 
52
        char str_s[220];                                                \
 
53
        char fmt_s[40];                                                 \
 
54
        char FILL;                                                      \
 
55
        int i;                                                          \
 
56
        int (* volatile vp)(const char *, const char *, ...);           \
 
57
                                                                        \
 
58
        ASSERT (sizeof(str_s) >= sizeof(str));                          \
 
59
        ASSERT (sizeof(fmt_s) >= sizeof(fmt_p));                        \
 
60
        strcpy_P (str_s, PSTR(str));                                    \
 
61
        strcpy_P (fmt_s, fmt_p);                                        \
 
62
                                                                        \
 
63
        for (FILL = 0; FILL < 4; FILL++) {                              \
 
64
            memset (&v, FILL, sizeof(v));                               \
 
65
            vp = (FILL & 1) ? sscanf_P : sscanf;                        \
 
66
            i = vp (str_s, (FILL & 1) ? fmt_p : fmt_s, ##__VA_ARGS__);  \
 
67
            Check (__LINE__, expval, i);                                \
 
68
            ASSERT (ass_expr);                                          \
 
69
        }                                                               \
 
70
    } while (0)
 
71
 
 
72
#define PVEC(args...)   ({ static int __x[] PROGMEM = {args}; __x; })
 
73
 
 
74
int main ()
 
75
{
 
76
    /* Empty input.     */
 
77
    CHECK (-1, (*(char *)v.i == FILL), "", "%x", v.i);
 
78
    CHECK (-1, (*(char *)v.i == FILL), "", " %x", v.i);
 
79
    CHECK (-1, (*(char *)v.i == FILL), " ", " %x", v.i);
 
80
    CHECK (-1, (*(char *)v.i == FILL), " ", "  %x", v.i);
 
81
    CHECK (-1, (*(char *)v.i == FILL), "\t\n\v\f\r", " %x", v.i);
 
82
 
 
83
    /* Normal conversion.       */
 
84
    CHECK (1, (v.i[0] == 0), "0", "%x", v.i);
 
85
#if 0
 
86
    CHECK (1, (v.i[0] == 0), "+0", "%x", v.i);
 
87
    CHECK (1, (v.i[0] == 0), "-0", "%x", v.i);
 
88
    CHECK (1, (v.i[0] == 1), "1", "%x", v.i);
 
89
    CHECK (1, (v.i[0] == 0x1234), "1234", "%x", v.i);
 
90
    CHECK (1, (v.i[0] == 0x5678), "5678", "%x", v.i);
 
91
    CHECK (1, (v.i[0] == 0x9ABC), "9ABC", "%x", v.i);
 
92
    CHECK (1, (v.i[0] == 0xDEF0), "DEF0", "%x", v.i);
 
93
    CHECK (1, (v.i[0] == 0xFFFF), "FFFF", "%x", v.i);
 
94
    CHECK (1, (v.i[0] == (unsigned)(-1)), "-1", "%x", v.i);
 
95
    CHECK (1, (v.i[0] == 1), "-FFFFFFFF", "%x", v.i);
 
96
#else
 
97
    CHECK (
 
98
        10,
 
99
        !memcmp_P (
 
100
            v.i,
 
101
            PVEC (0, 0, 1, 0x1234, 0x5678, 0x9ABC, 0xDEF0, 0xFFFF, -1, 1),
 
102
            10 * sizeof(int)),
 
103
        "+0 -0 1 1234 5678 9ABC DEF0 FFFF -1 -FFFFFFFF",
 
104
        "%x %x %x %x %x %x %x %x %x %x",
 
105
        v.i + 0, v.i + 1,
 
106
        v.i + 2, v.i + 3,
 
107
        v.i + 4, v.i + 5,
 
108
        v.i + 6, v.i + 7,
 
109
        v.i + 8, v.i + 9);
 
110
#endif
 
111
 
 
112
    /* Low/upper characters.    */
 
113
    CHECK (
 
114
        8,
 
115
        !memcmp_P (
 
116
            v.i,
 
117
            PVEC(0xABCD, 0xEF, 0xABCD, 0xEF, 0xABCD, 0xEF, 0xABCD, 0xEF),
 
118
            8 * sizeof(int)),
 
119
        "abcd ef abcd ef ABCD EF AbCd eF",
 
120
        "%x %x %X %X %X %X %x %X",
 
121
        v.i + 0, v.i + 1,
 
122
        v.i + 2, v.i + 3,
 
123
        v.i + 4, v.i + 5,
 
124
        v.i + 6, v.i + 7);
 
125
 
 
126
    /* '%p' conversion. */
 
127
    CHECK (
 
128
        3,
 
129
        !memcmp_P (v.i, PVEC(0xABCD, -0x12EF, 0x10), 3 * sizeof(int)),
 
130
        "ABCD -12EF 0x10",
 
131
        "%p%p%p", v.i, v.i + 1, v.i + 2);
 
132
 
 
133
    /* Leading spaces.  */
 
134
    CHECK (1, (v.i[0] == 0x12), " 12", "%x", v.i);
 
135
    CHECK (1, (v.i[0] == 0x123), "\t\n\v\f\r123", "%x", v.i);
 
136
 
 
137
    /* Leading '0'.     */
 
138
    CHECK (1, (v.i[0] == 04567), "04567", "%o", v.i);
 
139
    CHECK (1, (v.i[0] == 07654), "00000000007654", "%o", v.i);
 
140
 
 
141
    /* Hex prefix.      */
 
142
    CHECK (
 
143
        6, !memcmp_P (v.i, PVEC(1,2,3,4,0xA987,-0x100), 6 * sizeof(int)),
 
144
        "0x1 0X2 0x3 0X4 0xA987 -0x100",
 
145
        "%x%x%X%X%x%x",
 
146
        v.i + 0, v.i + 1,
 
147
        v.i + 2, v.i + 3,
 
148
        v.i + 4, v.i + 5);
 
149
 
 
150
    return 0;
 
151
}