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

« back to all changes in this revision

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