brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.7 KiB · 59d9480 Raw
79 lines · cpp
1// RUN: %clangxx -O0 -g %s -o %t && %run %t 2>&1 | FileCheck %s2//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 __arraycount11#define __arraycount(a) ((sizeof(a) / sizeof(a[0])))12#endif13 14void 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  else21    abort();22}23 24void 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 fields30      // 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  else39    abort();40}41 42int 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: regex71  // CHECK: abc: not-matched72  // CHECK: ABC: matched73  // CHECK: matched[0]='AB'74  // CHECK: matched[1]='B'75  // CHECK: error:{{.*}}76 77  return 0;78}79