xref: /llvm-project/compiler-rt/test/sanitizer_common/TestCases/Posix/regex.cpp (revision 975fa725063fe33aba02164a53c4ef66662e68d8)
1 // RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s
2 //
3 // UNSUPPORTED: darwin, target={{.*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   {
46     regex_t regex;
47     int rv = regcomp(&regex, "[[:upper:]]\\([[:upper:]]\\)", 0);
48     assert(!rv);
49 
50     test_matched(&regex, "abc");
51     test_matched(&regex, "ABC");
52 
53     test_print_matches(&regex, "ABC");
54 
55     regfree(&regex);
56   }
57 
58   {
59     regex_t regex;
60     int rv = regcomp(&regex, "[[:upp:]]", 0);
61     assert(rv);
62 
63     char errbuf[1024];
64     regerror(rv, &regex, errbuf, sizeof errbuf);
65     printf("error: %s\n", errbuf);
66 
67     regfree(&regex);
68   }
69 
70   // CHECK: regex
71   // CHECK: abc: not-matched
72   // CHECK: ABC: matched
73   // CHECK: matched[0]='AB'
74   // CHECK: matched[1]='B'
75   // CHECK: error:{{.*}}
76 
77   return 0;
78 }
79