grep読みの続きです。
オプションとフラグを関係を読むのが面倒なので、grepを使って整理します。
オプションはcase文でフラグ設定されるので、case文を検索。
takk@deb9:~/tmp/grep-3.1/src$ grep -n case grep.c
460: {"ignore-case", no_argument, NULL, 'i'},
490:bool match_icase;
758: case LONGINT_OK:
759: case LONGINT_OVERFLOW:
1616: case FTS_D:
1625: case FTS_DC:
1631: case FTS_DNR:
1632: case FTS_ERR:
1633: case FTS_NS:
1637: case FTS_DEFAULT:
1638: case FTS_NSOK:
1661: case FTS_F:
1662: case FTS_SLNONE:
1665: case FTS_SL:
1666: case FTS_W:
1929: -i, --ignore-case ignore case distinctions\n\
2026: Exit in case of conflicts or if M is not available. */
2240: case folded counterparts and toupper translates none of its bytes. */
2243:fgrep_icase_charlen (char const *pat, size_t patlen, mbstate_t *mbs)
2251: if (MB_LEN_MAX < wn || case_folded_counterparts (wc, folded))
2265: single-byte characters or characters not subject to case folding,
2269:fgrep_icase_available (char const *pat, size_t patlen)
2275: int n = fgrep_icase_charlen (pat + i, patlen - i, &mbs);
2301: case (size_t) -2:
2308: case (size_t) -1:
2312: case 1:
2315: case '$': case '*': case '.': case '[': case '\\': case '^':
2349: case '$': case '*': case '.': case '[': case '^':
2352: case '(': case '+': case '?': case '{': case '|':
2357: case '\\':
2361: case '\n':
2362: case 'B': case 'S': case 'W': case'\'': case '<':
2363: case 'b': case 's': case 'w': case '`': case '>':
2364: case '1': case '2': case '3': case '4':
2365: case '5': case '6': case '7': case '8': case '9':
2368: case '(': case '+': case '?': case '{': case '|':
2381: if (match_icase)
2383: int ni = fgrep_icase_charlen (q, len, &mb_state);
2465: case 'A':
2469: case 'B':
2473: case 'C':
2479: case 'D':
省略
2732: case EXCLUDE_DIRECTORY_OPTION:
2743: case GROUP_SEPARATOR_OPTION:
2747: case LINE_BUFFERED_OPTION:
2751: case LABEL_OPTION:
2755: case 0:
2867: || (match_icase && !fgrep_icase_available (keys, keycc)))))
takk@deb9:~/tmp/grep-3.1/src$
多すぎですね。
‘.’のパターンで絞ります。
takk@deb9:~/tmp/grep-3.1/src$ grep -n "case.*'.'" grep.c
460: {"ignore-case", no_argument, NULL, 'i'},
2315: case '$': case '*': case '.': case '[': case '\\': case '^':
2349: case '$': case '*': case '.': case '[': case '^':
2352: case '(': case '+': case '?': case '{': case '|':
2362: case 'B': case 'S': case 'W': case'\'': case '<':
2363: case 'b': case 's': case 'w': case '`': case '>':
2364: case '1': case '2': case '3': case '4':
2365: case '5': case '6': case '7': case '8': case '9':
2368: case '(': case '+': case '?': case '{': case '|':
2465: case 'A':
2469: case 'B':
2473: case 'C':
2479: case 'D':
2488: case 'E':
2492: case 'F':
2496: case 'P':
2500: case 'G':
2504: case 'X': /* undocumented on purpose */
2508: case 'H':
2513: case 'I':
2517: case 'T':
2521: case 'U':
2526: case 'u':
2531: case 'V':
省略
2646: case 'R':
2649: case 'r':
2654: case 's':
2658: case 'v':
2662: case 'w':
2667: case 'x':
2671: case 'Z':
2675: case 'z':
takk@deb9:~/tmp/grep-3.1/src$
さらにcaseが複数出現する行は除外します。
takk@deb9:~/tmp/grep-3.1/src$ grep "case.*'.'" grep.c | grep -v 'case.*case'
{"ignore-case", no_argument, NULL, 'i'},
case 'A':
case 'B':
case 'C':
case 'D':
case 'E':
case 'F':
case 'P':
case 'G':
case 'X': /* undocumented on purpose */
case 'H':
case 'I':
case 'T':
case 'U':
case 'u':
case 'V':
case 'a':
case 'b':
case 'c':
case 'd':
case 'e':
case 'f':
case 'h':
case 'i':
case 'y': /* For old-timers . . . */
case 'L':
case 'l':
case 'm':
case 'n':
case 'o':
case 'q':
case 'R':
case 'r':
case 's':
case 'v':
case 'w':
case 'x':
case 'Z':
case 'z':
takk@deb9:~/tmp/grep-3.1/src$
これらのcase文の下の行のフラグを抽出すればよいですね。
つづく


コメント