C言語入門(47) 実際にプログラムを読んで理解を深めよう tail編(2)

Posted: 2013年07月04日

前回はtailコマンドのエントリーポイントについて書きました。
今回は、エントリーポイントから呼ばれるobsolete関数を解説します。

tail.c obsolete関数

プログラムプログラム:

static void
obsolete(char *argv[])
{
    char *ap, *p, *t;
    size_t len;
    char *start;

    while ((ap = *++argv)) {
        /* Return if "--" or not an option of any form. */
        if (ap[0] != '-') {
            if (ap[0] != '+')
                return;
        } else if (ap[1] == '-')
            return;

        switch(*++ap) {
        // Old-style option 省略 以降解説

        /*
         * Options w/ arguments, skip the argument and continue
         * with the next option.
         */
        case 'b':
        case 'c':
        case 'n':
            if (!ap[1])
                ++argv;
            /* FALLTHROUGH */
        /* Options w/o arguments, continue with the next option. */
        case 'F':
        case 'f':
        case 'r':
            continue;

        /* Illegal option, return and let getopt handle it. */
        default:
            return;
        }
    }
}

解説解説:

-bなどの引数をチェックしています。

先頭では「–」「-+」の無効な値が設定されていないか確認

switch文内では、

  • 昔のスタイルを今のスタイルに変換する処理
  • 現在のスタイルのチェック
     (ここでは、無視するのみ)

この関数では、引数が正しいかのチェック、昔のスタイルの変換を行なっています。
引数がどのような意味を成すかは、前回解説したの処理内で行われます。

プログラムプログラム:

        /* Old-style option. */
        case '0': case '1': case '2': case '3': case '4':
        case '5': case '6': case '7': case '8': case '9':

            /* Malloc space for dash, new option and argument. */
            len = strlen(*argv);
            if ((start = p = malloc(len + 3)) == NULL)
                err(1, "malloc");
            *p++ = '-';

            /*
             * Go to the end of the option argument.  Save off any
             * trailing options (-3lf) and translate any trailing
             * output style characters.
             */
            t = *argv + len - 1;
            if (*t == 'F' || *t == 'f' || *t == 'r') {
                *p++ = *t;
                *t-- = '\0';
            }
            switch(*t) {
            case 'b':
                *p++ = 'b';
                *t = '\0';
                break;
            case 'c':
                *p++ = 'c';
                *t = '\0';
                break;
            case 'l':
                *t = '\0';
                /* FALLTHROUGH */
            case '0': case '1': case '2': case '3': case '4':
            case '5': case '6': case '7': case '8': case '9':
                *p++ = 'n';
                break;
            default:
                errx(1, "illegal option -- %s", *argv);
            }
            *p++ = *argv[0];
            (void)strcpy(p, ap);
            *argv = start;
            continue;

昔のスタイル「-3lf」を今のスタイル「-nf」に変換します。

switch文の中にswitch文があると
わかりづらいですね・・・

カテゴリー: プログラム, 入門 | タグ: , , | コメント無し »

コメント