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

« back to all changes in this revision

Viewing changes to tests/simulate/string/strsep.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: strsep.c,v 1.1.2.1 2008/03/20 21:42:39 joerg_wunsch Exp $       */
 
2
 
 
3
#include <stdlib.h>
 
4
#include <string.h>
 
5
#include <stdio.h>
 
6
#include "progmem.h"
 
7
 
 
8
#ifndef __AVR__
 
9
# define PRINTFLN(line, fmt, ...)       \
 
10
    printf("\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
 
11
# define EXIT(code)     exit ((code) < 255 ? (code) : 255)
 
12
# define memcmp_P       memcmp
 
13
#else
 
14
# if defined(__AVR_ATmega128__)
 
15
  /* ATmega128 has enough RAM for sprintf(), print to 0x2000 in XRAM. */
 
16
#  define PRINTFLN(line, fmt, ...)      \
 
17
    sprintf ((char *)0x2000, "\nLine %d: " fmt "\n", line, ##__VA_ARGS__)
 
18
# else
 
19
   /* small AVR */
 
20
#  define PRINTFLN(args...)
 
21
# endif
 
22
# define EXIT   exit
 
23
#endif
 
24
 
 
25
void Check (int line, const char *s1, const char *s2, int clr, int pnt)
 
26
{
 
27
    char t1[300];
 
28
    char t2[100];
 
29
    char *sp;
 
30
    char *rp;
 
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
    sp = t1;
 
37
    rp = strsep (&sp, t2);
 
38
 
 
39
    if (rp != t1) {
 
40
        PRINTFLN (line, "false return value");
 
41
        EXIT (5000 + line);
 
42
    }
 
43
    if (clr < 0) {
 
44
        if (strcmp_P (t1, s1)) {
 
45
            PRINTFLN (line, "string is changed");
 
46
            EXIT (line);
 
47
        }
 
48
    } else {
 
49
        if (strlen (t1) != (size_t)clr) {
 
50
            PRINTFLN (line, "strlen: expect= %d  result= %d",
 
51
                         clr, strlen (t1));
 
52
            EXIT (1000 + line);
 
53
        }
 
54
        if (memcmp_P (t1, s1, clr)
 
55
            || t1[clr]
 
56
            || strcmp_P (t1 + clr + 1, s1 + clr + 1))
 
57
        {
 
58
            PRINTFLN (line, "string mismatch");
 
59
            EXIT (2000 + line);
 
60
        }
 
61
    }
 
62
    if (pnt < 0) {
 
63
        if (sp) {
 
64
            PRINTFLN (line, "sp is not a NULL");
 
65
            EXIT (3000 + line);
 
66
        }
 
67
    } else {
 
68
        if (sp != t1 + pnt) {
 
69
            PRINTFLN (line, "sp: expect= %d  result= %d",
 
70
                         pnt, sp - t1);
 
71
            EXIT (4000 + line);
 
72
        }
 
73
    }
 
74
}
 
75
 
 
76
/* Args:
 
77
     s - string to parse
 
78
     delim - delimeter list
 
79
     clr   - if (clr >= 0) s[cln] must be cleared
 
80
     pnt   - if (pnt >= 0) s[pnt] must be pointed, else NULL
 
81
 */
 
82
#define CHECK(s, delim, clr, pnt)       do {            \
 
83
    Check (__LINE__, PSTR(s), PSTR(delim), clr, pnt);   \
 
84
} while (0)
 
85
 
 
86
int main ()
 
87
{
 
88
    char *p;
 
89
    
 
90
    /* NULL at first call       */
 
91
    p = 0;
 
92
    if (strsep (&p, "") || p) exit (__LINE__);
 
93
    if (strsep (&p, "abc") || p) exit (__LINE__);
 
94
 
 
95
    /* Empty string     */
 
96
    CHECK ("", "", -1, -1);
 
97
    CHECK ("", "abc", -1, -1);
 
98
    
 
99
    /* Empty delimeter list     */
 
100
    CHECK ("a", "", -1, -1);
 
101
    CHECK ("12345678", "", -1, -1);
 
102
    
 
103
    /* No delimeter symbols are founded */
 
104
    CHECK ("\tabc", " ", -1, -1);
 
105
    CHECK ("THE QUICK BROWN FOX", "thequickbrownfox", -1, -1);
 
106
    
 
107
    /* delim is 1 byte long     */
 
108
    CHECK (".", ".", 0, 1);
 
109
    CHECK ("abc", "a", 0, 1);
 
110
    CHECK ("abc", "b", 1, 2);
 
111
    CHECK ("abc", "c", 2, 3);
 
112
 
 
113
    /* delim is 2 bytes long    */
 
114
    CHECK ("0", "01", 0, 1);
 
115
    CHECK ("1", "01", 0, 1);
 
116
    CHECK ("A.", "AB", 0, 1);
 
117
    CHECK ("B.", "AB", 0, 1);
 
118
    CHECK ("CAD", "AB", 1, 2);
 
119
    CHECK ("CDB", "AB", 2, 3);
 
120
    
 
121
    /* delim length > 2 bytes   */
 
122
    CHECK ("the quick", "0123456789 ", 3, 4);
 
123
 
 
124
    /* Very long string */
 
125
    CHECK ("................................................................"
 
126
           "................................................................"
 
127
           "................................................................"
 
128
           "...............................................................*",
 
129
           "*", 255, 256);
 
130
    CHECK ("................................................................"
 
131
           "................................................................"
 
132
           "................................................................"
 
133
           "................................................................"
 
134
           "*", "*", 256, 257);
 
135
 
 
136
    /* Non ASCII bytes  */
 
137
    CHECK ("\001\002\377", "\001", 0, 1);
 
138
    CHECK ("\001\002\377", "\377", 2, 3);
 
139
}