1/* $OpenBSD: patterns-tester.c,v 1.1 2015/06/23 18:03:09 semarie Exp $ */ 2/* 3 * Copyright (c) 2015 Sebastien Marie <semarie@openbsd.org> 4 * 5 * Permission to use, copy, modify, and distribute this software for any 6 * purpose with or without fee is hereby granted, provided that the above 7 * copyright notice and this permission notice appear in all copies. 8 * 9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 16 */ 17 18#include <stdio.h> 19#include <stdlib.h> 20#include <err.h> 21#include <string.h> 22 23#include "patterns.h" 24 25extern char * malloc_options; 26 27static void read_string(char *, size_t); 28static void read_string_stop(void); 29 30static void 31read_string(char *buf, size_t len) 32{ 33 size_t i; 34 35 /* init */ 36 bzero(buf, len); 37 38 /* read */ 39 if (fgets(buf, len, stdin) == NULL) 40 err(1, "fgets"); 41 42 /* strip '\n' */ 43 i = strnlen(buf, len); 44 if (i != 0) 45 buf[i-1] = '\0'; 46} 47 48static void 49read_string_stop() 50{ 51 if (getchar() != EOF) 52 errx(1, "read_string_stop: too many input"); 53} 54 55int 56main(int argc, char *argv[]) 57{ 58 char string[1024]; 59 char pattern[1024]; 60 struct str_match m; 61 const char *errstr = NULL; 62 int ret; 63 size_t i; 64 65 /* configure malloc */ 66 malloc_options = "S"; 67 68 /* read testcase */ 69 if (argc != 3) { 70 /* from stdin (useful for afl) */ 71 read_string(string, sizeof(string)); 72 read_string(pattern, sizeof(pattern)); 73 read_string_stop(); 74 } else { 75 /* from arguments */ 76 strlcpy(string, argv[1], sizeof(string)); 77 strlcpy(pattern, argv[2], sizeof(pattern)); 78 } 79 80 /* print testcase */ 81 printf("string='%s'\n", string); 82 printf("pattern='%s'\n", pattern); 83 84 /* test it ! */ 85 ret = str_match(string, pattern, &m, &errstr); 86 if (errstr != NULL) 87 errx(1, "str_match: %s", errstr); 88 89 /* print result */ 90 printf("ret=%d num=%d\n", ret, m.sm_nmatch); 91 for (i=0; i<m.sm_nmatch; i++) { 92 printf("%ld: %s\n", i, m.sm_match[i]); 93 } 94 95 str_match_free(&m); 96 97 return (EXIT_SUCCESS); 98} 99