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

« 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: 2008-08-10 09:59:16 UTC
  • mfrom: (1.2.1 upstream) (8 intrepid)
  • mto: (4.1.7 sid)
  • mto: This revision was merged to the branch mainline in revision 9.
  • Revision ID: james.westby@ubuntu.com-20080810095916-7ku06pjsfia3hz16
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(): 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
}