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

« back to all changes in this revision

Viewing changes to tests/simulate/string/strcasestr.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
/* $Id: strcasestr.c,v 1.1.2.1 2008/03/20 21:42:39 joerg_wunsch Exp $   */
 
2
 
 
3
#ifndef __AVR__
 
4
# define _GNU_SOURCE            /* to include strcasestr()      */
 
5
# define PRINTFLN(line, fmt, ...)       \
 
6
    printf("\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
 
7
# define EXIT(code)     exit ((code) < 255 ? (code) : 255)
 
8
#else
 
9
# if defined(__AVR_ATmega128__)
 
10
  /* ATmega128 has enough RAM for sprintf(), print to 0x2000 in XRAM. */
 
11
#  define PRINTFLN(line, fmt, ...)      \
 
12
    sprintf ((char *)0x2000, "\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
 
13
# else
 
14
   /* small AVR */
 
15
#  define PRINTFLN(args...)
 
16
# endif
 
17
# define EXIT   exit
 
18
#endif
 
19
 
 
20
#include <ctype.h>
 
21
#include <stdlib.h>
 
22
#include <string.h>
 
23
#include <stdio.h>
 
24
#include "progmem.h"
 
25
 
 
26
void Check (int line, const char *s1, const char *s2, int expect)
 
27
{
 
28
    char t1[300];
 
29
    char t2[100];
 
30
    char *p;
 
31
 
 
32
    if ((strlen_P(s1) > sizeof(t1) - 1) || (strlen_P(s2) > sizeof(t2) - 1))
 
33
        exit (1);
 
34
    strcpy_P (t1, s1);
 
35
    strcpy_P (t2, s2);
 
36
    p = strcasestr (t1, t2);
 
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 (strcmp_P (t1, s1) || strcmp_P (t2, s2)) {
 
50
        PRINTFLN (line, "string(s) is changed");
 
51
        EXIT (2000 + line);
 
52
    }
 
53
}
 
54
 
 
55
#define CHECK(s1, s2, expect)   do {                    \
 
56
    Check (__LINE__, PSTR(s1), PSTR(s2), expect);       \
 
57
} while (0)
 
58
 
 
59
int main ()
 
60
{
 
61
    int c1, c2;
 
62
    char s1[4];
 
63
    char s2[4];
 
64
 
 
65
    /* Empty 'needle'.  */
 
66
    CHECK ("", "", 0);
 
67
    CHECK ("12345", "", 0);
 
68
 
 
69
    /* bug #19135       */
 
70
    CHECK ("ababac", "abac", 2);
 
71
 
 
72
    /* 'needle' of 1 byte long  */
 
73
    CHECK ("", "a", -1);
 
74
    CHECK ("b", "a", -1);
 
75
    CHECK ("a", "a", 0);
 
76
    CHECK ("abcbef", "a", 0);
 
77
    CHECK (".a", "a", 1);
 
78
    CHECK (".a.", "a", 1);
 
79
    CHECK ("ABCDEFGH", "H", 7);
 
80
    
 
81
    /* 'needle' of 2 bytes long */
 
82
    CHECK ("", "12", -1);
 
83
    CHECK ("13", "12", -1);
 
84
    CHECK ("32", "12", -1);
 
85
    CHECK ("12", "12", 0);
 
86
    CHECK ("123", "12", 0);
 
87
    CHECK ("012", "12", 1);
 
88
    CHECK ("01200", "12", 1);
 
89
    
 
90
    /* partially mathing        */
 
91
    CHECK ("a_ab_abc_abcd_abcde", "abcdef", -1);
 
92
    CHECK ("a_ab_abc_abcd_abcde_abcdef", "abcdef", 20);
 
93
    CHECK ("aababcabcdabcde", "abcdef", -1);
 
94
    CHECK ("aababcabcdabcdeabcdef", "abcdef", 15);
 
95
    
 
96
    /* repeated chars   */
 
97
    CHECK ("abaabaaabaaaab", "aaaaab", -1);
 
98
    CHECK ("abaabaaabaaaabaaaaab", "aaaaab", 14);
 
99
    
 
100
    /* A first match is returned.       */
 
101
    CHECK ("_foo_foo", "foo", 1);
 
102
    
 
103
    /* Case is ignored. */
 
104
    CHECK ("A", "a", 0);
 
105
    CHECK ("qwertyuiopasdfghjklzxcvbnm",
 
106
           "QWERTYUIOPASDFGHJKLZXCVBNM",
 
107
           0);
 
108
    CHECK (" QWERTYUIOPASDFGHJKLZXCVBNM",
 
109
           "qwertyuiopasdfghjklzxcvbnm",
 
110
           1);
 
111
    CHECK ("  The Quick Brown Fox ", "thE quicK browN foX", 2);
 
112
 
 
113
    /* Case is ignored for alphas only. */
 
114
    CHECK ("", "\040", -1);
 
115
    CHECK ("\100", "\140", -1);         /* first        */
 
116
    CHECK ("\140", "\100", -1);
 
117
    CHECK ("\133", "\173", -1);
 
118
    CHECK ("\173", "\133", -1);
 
119
    CHECK (".\100", ".\140", -1);       /* second       */
 
120
    CHECK (".\140", ".\100", -1);
 
121
    CHECK (".\133", ".\173", -1);
 
122
    CHECK (".\173", ".\133", -1);
 
123
    CHECK ("\100\140", "\140", 1);      /* second match */
 
124
    
 
125
    /* Very long s1     */
 
126
    CHECK ("................................................................"
 
127
           "................................................................"
 
128
           "................................................................"
 
129
           "...............................................................A",
 
130
           "a", 255);
 
131
    CHECK ("................................................................"
 
132
           "................................................................"
 
133
           "................................................................"
 
134
           "................................................................"
 
135
           "a", "A", 256);
 
136
    CHECK ("................................................................"
 
137
           "................................................................"
 
138
           "................................................................"
 
139
           "................................................................"
 
140
           ".a", "A", 257);
 
141
    CHECK ("................................................................"
 
142
           "................................................................"
 
143
           "................................................................"
 
144
           "................................................................"
 
145
           ".a", "..A", 255);
 
146
 
 
147
    /* Let us check a set of possible combinations of 2 symbols.        */
 
148
    for (c1 = 1; c1 < 256; c1++) {
 
149
        for (c2 = 1; c2 < 256; c2++) {
 
150
            if (c1 == c2
 
151
                || (isalpha(c1) && isalpha(c2) && ((c1 ^ c2) == ('A' ^ 'a'))))
 
152
            {
 
153
 
 
154
                /* first char: ("c","c")        */
 
155
                s1[0] = c1;  s1[1] = 0;
 
156
                s2[0] = c2;  s2[1] = 0;
 
157
                if (strcasestr (s1, s2) != s1)
 
158
                    EXIT (__LINE__);
 
159
 
 
160
                /* second char: (".c", ".c")    */
 
161
                s1[0] = '.';  s1[1] = c1;  s1[2] = 0;
 
162
                s2[0] = '.';  s2[1] = c2;  s2[2] = 0;
 
163
                if (strcasestr (s1, s2) != s1)
 
164
                    EXIT (__LINE__);
 
165
 
 
166
                /* substring is shifted: ("..c", ".c")  */
 
167
                s1[0] = '.';  s1[1] = '.';  s1[2] = c1;  s1[3] = 0;
 
168
                s2[0] = '.';  s2[1] = c2;  s2[2] = 0;
 
169
                if (strcasestr (s1, s2) != s1 + (c2 != '.'))
 
170
                    EXIT (__LINE__);
 
171
 
 
172
            } else {
 
173
 
 
174
                /* first char: ("c","c")        */
 
175
                s1[0] = c1;  s1[1] = 0;
 
176
                s2[0] = c2;  s2[1] = 0;
 
177
                if (strcasestr (s1, s2) != 0)
 
178
#ifdef  DEBUG
 
179
                    EXIT (c1 | c2<<8);
 
180
#else
 
181
                    EXIT (__LINE__);
 
182
#endif
 
183
 
 
184
                /* second char: (".c", ".c")    */
 
185
                s1[0] = '.';  s1[1] = c1;  s1[2] = 0;
 
186
                s2[0] = '.';  s2[1] = c2;  s2[2] = 0;
 
187
                if (strcasestr (s1, s2) != 0)
 
188
                    EXIT (__LINE__);
 
189
            }
 
190
        }
 
191
    }
 
192
 
 
193
    return 0;
 
194
}