1 // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
2 //
3 // UNSUPPORTED: darwin, solaris
4
5 #include <assert.h>
6 #include <regex.h>
7 #include <stdio.h>
8 #include <stdlib.h>
9
10 #ifndef __arraycount
11 #define __arraycount(a) ((sizeof(a) / sizeof(a[0])))
12 #endif
13
test_matched(const regex_t * preg,const char * string)14 void test_matched(const regex_t *preg, const char *string) {
15 int rv = regexec(preg, string, 0, NULL, 0);
16 if (!rv)
17 printf("%s: matched\n", string);
18 else if (rv == REG_NOMATCH)
19 printf("%s: not-matched\n", string);
20 else
21 abort();
22 }
23
test_print_matches(const regex_t * preg,const char * string)24 void test_print_matches(const regex_t *preg, const char *string) {
25 regmatch_t rm[10];
26 int rv = regexec(preg, string, __arraycount(rm), rm, 0);
27 if (!rv) {
28 for (size_t i = 0; i < __arraycount(rm); i++) {
29 // This condition shall be simplified, but verify that the data fields
30 // are accessible.
31 if (rm[i].rm_so == -1 && rm[i].rm_eo == -1)
32 continue;
33 printf("matched[%zu]='%.*s'\n", i, (int)(rm[i].rm_eo - rm[i].rm_so),
34 string + rm[i].rm_so);
35 }
36 } else if (rv == REG_NOMATCH)
37 printf("%s: not-matched\n", string);
38 else
39 abort();
40 }
41
main(void)42 int main(void) {
43 printf("regex\n");
44
45 regex_t regex;
46 int rv = regcomp(®ex, "[[:upper:]]\\([[:upper:]]\\)", 0);
47 assert(!rv);
48
49 test_matched(®ex, "abc");
50 test_matched(®ex, "ABC");
51
52 test_print_matches(®ex, "ABC");
53
54 regfree(®ex);
55
56 rv = regcomp(®ex, "[[:upp:]]", 0);
57 assert(rv);
58
59 char errbuf[1024];
60 regerror(rv, ®ex, errbuf, sizeof errbuf);
61 printf("error: %s\n", errbuf);
62
63 // CHECK: regex
64 // CHECK: abc: not-matched
65 // CHECK: ABC: matched
66 // CHECK: matched[0]='AB'
67 // CHECK: matched[1]='B'
68 // CHECK: error:{{.*}}
69
70 return 0;
71 }
72