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

« back to all changes in this revision

Viewing changes to tests/simulate/pmstring/memmem_P.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
/* $Id: memmem_P.c,v 1.1.2.1 2008/03/20 21:42:30 joerg_wunsch Exp $     */
 
2
 
 
3
#ifndef __AVR__
 
4
# define _GNU_SOURCE            /* to include memmem()  */
 
5
# define PRINTFLN(line, fmt, ...)       \
 
6
    printf("\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
 
7
# define EXIT(code)     exit ((code) < 255 ? (code) : 255)
 
8
# define memcmp_P       memcmp
 
9
# define memmem_P       memmem
 
10
#else
 
11
# if defined(__AVR_ATmega128__)
 
12
  /* ATmega128 has enough RAM for sprintf(), print to 0x2000 in XRAM. */
 
13
#  define PRINTFLN(line, fmt, ...)      \
 
14
    sprintf ((char *)0x2000, "\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
 
15
# else
 
16
   /* small AVR */
 
17
#  define PRINTFLN(args...)
 
18
# endif
 
19
# define EXIT   exit
 
20
#endif
 
21
 
 
22
#include <stdlib.h>
 
23
#include <string.h>
 
24
#include <stdio.h>
 
25
#include "progmem.h"
 
26
 
 
27
void Check (int line,
 
28
            const void *s1, size_t n1, const char *s2, size_t n2, int expect)
 
29
{
 
30
    char t1[300];
 
31
    char *p;
 
32
 
 
33
    if (n1 > sizeof(t1))
 
34
        exit (1);
 
35
    memcpy_P (t1, s1, n1);
 
36
    p = memmem_P (t1, n1, s2, n2);
 
37
 
 
38
    if (expect < 0) {
 
39
        if (p) {
 
40
            PRINTFLN (line, "return nonzero");
 
41
            EXIT (line);
 
42
        }
 
43
    } else {
 
44
        if (p != t1 + expect) {
 
45
            PRINTFLN (line, "expect= %d  result= %d", expect, p - t1);
 
46
            EXIT (1000 + line);
 
47
        }
 
48
    }
 
49
    if (memcmp_P (t1, s1, n1)) {
 
50
        PRINTFLN (line, "string is changed");
 
51
        EXIT (2000 + line);
 
52
    }
 
53
}
 
54
 
 
55
#define CHECK(s1, n1, s2, n2, expect)   do {                    \
 
56
    Check (__LINE__, PSTR(s1), n1, PSTR(s2), n2, expect);       \
 
57
} while (0)
 
58
 
 
59
int main ()
 
60
{
 
61
    /* Empty 'needle'.  */
 
62
    CHECK ("", 0, "", 0, 0);
 
63
    CHECK ("12345", 5, "1", 0, 0);
 
64
 
 
65
    /* 'needle' of 1 byte long  */
 
66
    CHECK ("", 0, "a", 1, -1);
 
67
    CHECK ("b", 1, "a", 1, -1);
 
68
    CHECK ("a", 1, "a", 1, 0);
 
69
    CHECK ("abcbef", 6, "a", 1, 0);
 
70
    CHECK (".a", 2, "a", 1, 1);
 
71
    CHECK (".a.", 3, "a", 1, 1);
 
72
    CHECK ("ABCDEFGH", 8, "H", 1, 7);
 
73
    CHECK ("", 0, "\000", 1, -1);
 
74
    CHECK ("", 1, "\000", 1, 0);
 
75
    CHECK (".", 2, "\000", 1, 1);
 
76
    CHECK ("\000\001", 2, "\001", 1, 1);
 
77
    
 
78
    /* 'needle' of 2 bytes long */
 
79
    CHECK ("", 0, "12", 2, -1);
 
80
    CHECK ("1", 1, "12", 2, -1);
 
81
    CHECK ("13", 2, "12", 2, -1);
 
82
    CHECK ("32", 2, "12", 2, -1);
 
83
    CHECK ("12", 2, "12", 2, 0);
 
84
    CHECK ("123", 3, "12", 2, 0);
 
85
    CHECK ("012", 3, "12", 2, 1);
 
86
    CHECK ("01200", 5, "12", 2, 1);
 
87
    CHECK ("\000", 1, "\000\000", 2, -1);
 
88
    CHECK ("\000\000", 2, "\000\000", 2, 0);
 
89
    
 
90
    /* partially mathing        */
 
91
    CHECK ("a_ab_abc_abcd_abcde", 19, "abcdef", 6, -1);
 
92
    CHECK ("a_ab_abc_abcd_abcde_abcdef", 26, "abcdef", 6, 20);
 
93
    CHECK ("aababcabcdabcde", 15, "abcdef", 6, -1);
 
94
    CHECK ("aababcabcdabcdeabcdef", 21, "abcdef", 6, 15);
 
95
    
 
96
    /* repeated chars   */
 
97
    CHECK ("abaabaaabaaaab", 14, "aaaaab", 6, -1);
 
98
    CHECK ("abaabaaabaaaabaaaaab", 20, "aaaaab", 6, 14);
 
99
    
 
100
    /* A first match is returned.       */
 
101
    CHECK ("_foo_foo", 8, "foo", 3, 1);
 
102
    
 
103
    /* Case is not ignored.     */
 
104
    CHECK ("A", 1, "a", 1, -1);
 
105
    CHECK (".z", 2, ".Z", 2, -1);
 
106
 
 
107
    /* Very long s1     */
 
108
    CHECK ("................................................................"
 
109
           "................................................................"
 
110
           "................................................................"
 
111
           "...............................................................*",
 
112
           256, "*", 1, 255);
 
113
    CHECK ("................................................................"
 
114
           "................................................................"
 
115
           "................................................................"
 
116
           "................................................................"
 
117
           "*", 257, "*", 1, 256);
 
118
    CHECK ("................................................................"
 
119
           "................................................................"
 
120
           "................................................................"
 
121
           "................................................................"
 
122
           ".*.", 258, "*", 1, 257);
 
123
    CHECK ("................................................................"
 
124
           "................................................................"
 
125
           "................................................................"
 
126
           "................................................................"
 
127
           "...*..", 260, ".*", 2, 258);
 
128
 
 
129
    /* Very long s2[]   */
 
130
    CHECK ("..", 2,
 
131
           "................................................................"
 
132
           "................................................................"
 
133
           "................................................................"
 
134
           "...............................................................",
 
135
           255, -1);
 
136
    CHECK ("..", 2,
 
137
           "................................................................"
 
138
           "................................................................"
 
139
           "................................................................"
 
140
           "................................................................",
 
141
           256, -1);
 
142
 
 
143
    /* Both strings are long.   */
 
144
    CHECK ("................................................................"
 
145
           "................................................................"
 
146
           "................................................................"
 
147
           "................................................................"
 
148
           "*", 257,
 
149
           "................................................................"
 
150
           "................................................................"
 
151
           "................................................................"
 
152
           "...............................................................*"
 
153
           , 256, 1);
 
154
    CHECK ("................................................................"
 
155
           "................................................................"
 
156
           "................................................................"
 
157
           "................................................................"
 
158
           "..*.", 260,
 
159
           "................................................................"
 
160
           "................................................................"
 
161
           "................................................................"
 
162
           "................................................................"
 
163
           "*", 257, 2);
 
164
 
 
165
    return 0;
 
166
}