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文の下の行のフラグを抽出すればよいですね。
つづく
コメント