int main(int argc, char *argv[]) { wchar_t pattern[1024]; int i; setlocale(LC_CTYPE, ""); if (argc < 2) { fputs("no pattern\n", stderr); exit(1); } if (mbstowcs(pattern, argv[1], 1024) == (size_t)(-1)) { fprintf(stderr, "mbstowcs failed #1\n"); exit(1); } if (argc == 2) { do_grep(pattern, stdin); } else { for (i = 2; i < argc; i++) { FILE *f; f = fopen(argv[i], "r"); if (!f) { perror(argv[i]); exit(1); } do_grep(pattern, f); fclose(f); } } exit(0); }
int main(int argc, char *argv[]) { regex_t pat; int err; int i; if (argc < 2) { fputs("no pattern\n", stderr); exit(1); } err = regcomp(&pat, argv[1], REG_EXTENDED | REG_NOSUB | REG_NEWLINE); if (err != 0) { char buf[1024]; regerror(err, &pat, buf, sizeof buf); puts(buf); exit(1); } if (argc == 2) { do_grep(&pat, stdin); } else { for (i = 2; i < argc; i++) { FILE *f = fopen(argv[i], "r"); if (!f) die(argv[i]); do_grep(&pat, f); fclose(f); } } regfree(&pat); exit(0); }
int main(int argc, char *argv[]) { int opt; int ignore_case = 0; int matched = 0; while ((opt = getopt_long(argc, argv, "iv", longopts, NULL)) != -1) { switch (opt) { case 'i': ignore_case = REG_ICASE; break; case 'v': matched = REG_NOMATCH; break; } } regex_t pat; int err; int i; if (argc < 2) { fputs("no pattern\n", stderr); exit(1); } int regex_flg = REG_EXTENDED | REG_NOSUB | REG_NEWLINE | ignore_case; err = regcomp(&pat, argv[optind], regex_flg); if (err != 0) { char buf[1024]; regerror(err, &pat, buf, sizeof buf); puts(buf); exit(1); } if (optind == argc) { do_grep(&pat, stdin, matched); } else { for (i = optind + 1; i < argc; i++) { FILE *f; f = fopen(argv[i], "r"); if (!f) { perror(argv[i]); exit(1); } do_grep(&pat, f, matched); fclose(f); } } regfree(&pat); exit(0); }
int main(int argc, char *argv[]) { regex_t pat; int err; int opt; int re_mode; while ((opt = getopt(argc, argv, "iv")) != -1) { switch (opt) { case 'i': opt_ignorecase = 1; break; case 'v': opt_invert = 1; break; case '?': fprintf(stderr, "Usage: %s [-iv] [PATTERN] \n", argv[0]); exit(1); } } /* * 配列の添字 0 の位置(アドレス)を変更している。 * [a,b,c] += 1 => [b,c,null] * これにより argc, argv の両変数からオプションの情報を * 取り除ける。 */ argv += optind; argc -= optind; if (argc < 1) { fputs("no pattern\n", stderr); exit(1); } re_mode = REG_EXTENDED | REG_NOSUB | REG_NEWLINE; if (opt_ignorecase) { re_mode |= REG_ICASE; } err = regcomp(&pat, argv[0], re_mode); if (err != 0) { char buf[1024]; regerror(err, &pat, buf, sizeof buf); puts(buf); exit(1); } if (argc == 1) { do_grep(&pat, stdin); } else { int i; for (i = 1; i < argc; i++) { FILE *f; f = fopen(argv[i], "r"); if (!f) { perror(argv[i]); exit(1); } do_grep(&pat, f); fclose(f); } } regfree(&pat); exit(0); }
int main(int argc, char **argv) { char *pattern = NULL; int status = 0; regex_t *preg = malloc(sizeof(regex_t)); int regcomp_flags = REG_BASIC; int regex_errcode = 0; gargs.is_invert = 0; gargs.show_filename = 0; gargs.show_line_number = 0; static const char *optstr = "Ee:Hhinv"; int opt = 0; while ((opt = getopt(argc, argv, optstr)) != -1) { switch(opt) { case 'e': pattern = read_pattern(optarg); break; case 'E': regcomp_flags |= REG_EXTENDED; break; case 'H': gargs.show_filename = 1; break; case 'h': display_usage(EXIT_SUCCESS, NULL, EXIT_SUCCESS); break; case 'i': regcomp_flags |= REG_ICASE; break; case 'n': gargs.show_line_number = 1; break; case 'v': gargs.is_invert = 1; break; default: // shouldn't reach here break; } } if ( !pattern ) { // no -e option if (argc - optind < 1) { display_usage(EXIT_TROUBLE, "Please provide pattern.", -1); } else { pattern = read_pattern(argv[optind++]); } } if ( (regex_errcode = regcomp(preg, pattern, regcomp_flags)) != 0 ) { regfree(preg); display_usage(EXIT_TROUBLE, "Pattern invalid.", regex_errcode); } free(pattern); #ifdef DEBUG printf("optind:%d, argc:%d\n\n", optind, argc); #endif if (argc == optind) { // use stdin status = do_grep(preg, "-"); regfree(preg); exit(status); } if (argc - optind > 1) gargs.show_filename = 1; while (optind < argc) { char *filename = argv[optind++]; if (isdir(filename)) fprintf(stderr, "[WARNING] %s is a directory.\n", filename); //display_usage(EXIT_TROUBLE, "Please provide a file instead of directory", -1); status = do_grep(preg, filename); } regfree(preg); exit(status); }