# HG changeset patch # User paulo@twcdns.fastsearch.net # Date 1270536338 25200 # Node ID 99770a6b967d9dde77c0cb70b8597444f4220c4d # Parent fe4b316b43860c30f27b4f653e81902f4f0321fc rcg.c: use getopt.h and read in regex from arguments; use enum for exit codes diff -r fe4b316b4386 -r 99770a6b967d rcg.c --- a/rcg.c Mon Apr 05 22:37:37 2010 -0700 +++ b/rcg.c Mon Apr 05 23:45:38 2010 -0700 @@ -5,11 +5,22 @@ #define __USE_GNU #include +#include + +#define _GNU_SOURCE +#include + const size_t BUFSIZE = 5000; const char *CLR_START = "-CLR_START-"; const char *CLR_END = "-CLR_END-"; +typedef enum _exit_code { + EXIT_OK, + EXIT_REALLOC_ERROR, + EXIT_ARGS_ERROR, +} Exit_code; + int re_error(int errcode, const regex_t *re) { char *err_string = calloc(BUFSIZE, sizeof(char)); @@ -19,19 +30,49 @@ return errcode; } -int realloc_error() +Exit_code realloc_error() { fprintf(stderr, "realloc() failure \n"); - return 1; + return EXIT_REALLOC_ERROR; +} + +Exit_code args_error() +{ + fprintf(stderr, "Invalid or nonexistent argument. \n"); + return EXIT_ARGS_ERROR; +} + +// returns regular expression argument +char *parseArgs(int argc, char **argv) +{ + static struct option long_options[] = + { + { 0, 0, 0, 0 }, + }; + + int c; + int l; + while ((c = getopt_long(argc, argv, "", long_options, &l)) >= 0) + { + } + + if (optind >= argc) + exit(args_error()); + + return argv[optind]; } int main(int argc, char **argv) { + char *re_expression = parseArgs(argc, argv); + + fprintf(stderr, "re_expression = %s \n", re_expression); //d/ 20100405 PBA + char *buf = calloc(BUFSIZE, sizeof(char)); int re_err; regex_t *re = calloc(1, sizeof(regex_t)); - re_err = regcomp(re, "Hello", REG_EXTENDED); + re_err = regcomp(re, re_expression, REG_EXTENDED); if (re_err != 0) exit(re_error(re_err, re)); @@ -40,7 +81,6 @@ size_t CLR_START_len = strlen(CLR_START); size_t CLR_END_len = strlen(CLR_END); - while (fgets(buf, BUFSIZE, stdin)) { int so = -1; @@ -51,7 +91,7 @@ unsigned int out_pos = 0; unsigned int buf_pos = 0; - while (re_err != REG_NOMATCH) + for (re_err = 0; re_err != REG_NOMATCH;) { re_err = regexec(re, &buf[buf_pos], 1, rem, 0); @@ -92,5 +132,5 @@ free(out); } - return 0; + return EXIT_OK; }