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(&regex, "[[:upper:]]\\([[:upper:]]\\)", 0);
47   assert(!rv);
48 
49   test_matched(&regex, "abc");
50   test_matched(&regex, "ABC");
51 
52   test_print_matches(&regex, "ABC");
53 
54   regfree(&regex);
55 
56   rv = regcomp(&regex, "[[:upp:]]", 0);
57   assert(rv);
58 
59   char errbuf[1024];
60   regerror(rv, &regex, 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