~ubuntu-branches/ubuntu/maverick/avr-libc/maverick

« back to all changes in this revision

Viewing changes to tests/simulate/scanf/scanf-nul.c

  • Committer: Bazaar Package Importer
  • Author(s): Hakan Ardo
  • Date: 2009-10-31 11:52:10 UTC
  • mfrom: (1.2.2 upstream)
  • mto: This revision was merged to the branch mainline in revision 10.
  • Revision ID: james.westby@ubuntu.com-20091031115210-crjd42sn6ezrj52c
* New upstream relese (closes: #544030)
* Added lintian overrides (closes: #553265)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* Test of scanf(): NUL symbol (input file).
2
 
   $Id: scanf-nul.c,v 1.1.2.3 2008/03/20 21:42:32 joerg_wunsch Exp $    */
3
 
 
4
 
#define _GNU_SOURCE
5
 
#include <stdio.h>
6
 
#include <stdlib.h>
7
 
#include <string.h>
8
 
#include "progmem.h"
9
 
 
10
 
#ifdef  __AVR__
11
 
# define ASSERT(expr)                   \
12
 
    do {                                \
13
 
        if (!(expr)) exit(__LINE__);    \
14
 
    } while (0)
15
 
# define EXIT(v)        exit (v)
16
 
# if defined(__AVR_ATmega128__)
17
 
  /* ATmega128 has enough RAM for sprintf(), print to 0x2000 in XRAM. */
18
 
#  define PRINTF(f...)  sprintf((char *)0x2000, f)
19
 
# else
20
 
  /* small AVR */
21
 
#  define PRINTF(f...)
22
 
# endif
23
 
# define ssize_t        int
24
 
#else
25
 
# include <assert.h>
26
 
# define ASSERT(expr)   assert (expr)
27
 
# define EXIT(v)        exit ((v) < 256 ? (v) : 255)
28
 
# define PRINTF(f...)   printf (f)
29
 
# define sscanf_P       sscanf
30
 
# define memcmp_P       memcmp
31
 
# define _FDEV_EOF      (-1)
32
 
#endif
33
 
 
34
 
/* Next variables are useful to debug the AVR.  */
35
 
int vrslt = 1;
36
 
struct {
37
 
    int i;
38
 
    int j;
39
 
    char s[8];
40
 
    char t[8];
41
 
} v = { 1, 1, {1}, {1} };
42
 
 
43
 
const char *getpnt, *getend;
44
 
 
45
 
int ugetc (FILE *fp)
46
 
{
47
 
    (void)fp;
48
 
    if (getpnt == getend)
49
 
        return _FDEV_EOF;
50
 
    return pgm_read_byte (getpnt++);
51
 
}
52
 
 
53
 
ssize_t uread (void *cookie, char *buf, size_t size)
54
 
{
55
 
    size_t n;
56
 
 
57
 
    for (n = 0; n < size; n++) {
58
 
        int i = ugetc (cookie);
59
 
        if (i < 0) break;
60
 
        *buf++ = i;
61
 
    }
62
 
    return n;
63
 
}
64
 
 
65
 
int uclose (void *cookie)
66
 
{
67
 
    (void)cookie;
68
 
    return 0;
69
 
}
70
 
 
71
 
static FILE * uopen (const char *buf, int size)
72
 
{
73
 
    static FILE *fp;
74
 
 
75
 
    if (fp) fclose (fp);
76
 
 
77
 
#ifdef  __AVR__
78
 
    fp = fdevopen (0, ugetc);
79
 
#else
80
 
    {
81
 
        cookie_io_functions_t iofuns;
82
 
        memset (& iofuns, 0, sizeof(iofuns));
83
 
        iofuns.read = uread;
84
 
        iofuns.close = uclose;
85
 
        fp = fopencookie (NULL, "rb", iofuns);
86
 
    }
87
 
#endif
88
 
    ASSERT (fp);
89
 
 
90
 
    getpnt = buf;
91
 
    getend = buf + size;
92
 
    return fp;
93
 
}
94
 
 
95
 
int main ()
96
 
{
97
 
    FILE *fp;
98
 
    int i;
99
 
 
100
 
    /* %c       */
101
 
    memset (&v, ~0, sizeof(v));
102
 
    fp = uopen (PSTR ("A\000B"), 3);
103
 
    vrslt = fscanf (fp, "%c%c%c", v.s, v.s + 1, v.s + 2);
104
 
    ASSERT (vrslt == 3);
105
 
    ASSERT (!memcmp_P (v.s, PSTR("A\000B"), 3));
106
 
 
107
 
    /* '\0' is not a space.     */
108
 
    memset (&v, ~0, sizeof(v));
109
 
    fp = uopen (PSTR ("\t \000"), 3);
110
 
    i = fscanf (fp, " %c", v.s);
111
 
    ASSERT (i == 1);
112
 
    ASSERT (!v.s[0]);
113
 
 
114
 
    /* %d       */
115
 
    memset (&v, ~0, sizeof(v));
116
 
    fp = uopen (PSTR ("123\000456"), 7);
117
 
    i = fscanf (fp, "%d%c%d", & v.i, v.s, & v.j);
118
 
    ASSERT (i == 3);
119
 
    ASSERT (v.i == 123 && !v.s[0] && v.j == 456);
120
 
 
121
 
    /* %s       */
122
 
    memset (&v, ~0, sizeof(v));
123
 
    fp = uopen (PSTR ("A\000BC"), 4);
124
 
    i = fscanf (fp, "%s%s", v.s, v.t);
125
 
    ASSERT (i == 1);
126
 
    ASSERT (!memcmp_P (v.s, PSTR("A\000BC"), 4));
127
 
 
128
 
    return 0;
129
 
}