Category Archives: 4.パターンマッチ・検索・置換

grepを読む(その6)

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文の下の行のフラグを抽出すればよいですね。

つづく