[ create a new paste ] login | about

Link: http://codepad.org/9VH9AxnZ    [ raw code | fork ]

C, pasted on Jan 23:
#include <stdio.h>

/* 文字列の構成要素かどうか */
int isstring(int c)
{
    if (('a' <= c && c <= 'z') ||
        ('A' <= c && c <= 'Z') ||
        ('0' <= c && c <= '9') ||
        c == '_')
    {
        return 1;
    }
    return 0;
}

int main(int argc, char *argv[])
{
    int c;         /* 文字 */
    int prevc = 0; /* 一つ前の文字 */
    int quote = 0; /* クオーテーションで囲まれた部分である */
    FILE *fp;

    if (argc < 2) {
        return 0;
    }

    fp = fopen(argv[1], "r");
    if (fp == NULL) {
        fprintf(stderr, "\"%s\" file open error.\n", argv[1]);
        return -1;
    }

    c = fgetc(fp);
    while (c != EOF) {
        if (quote && c != quote) {
            /* "や'で囲まれた部分はそのまま出力 */
            putchar(c);
        } else {
            switch(c) {
            case ' ':
            case '\t':
                /* 余分なスペース・タブをスルー */
                while (c == ' ' || c == '\t') {
                    c = fgetc(fp);
                }
                /* 文字列の間にある場合だけスペースを一個だけ出力 */
                if (isstring(prevc) && isstring(c)) {
                    putchar(' ');
                }
                /* 一文字先に読み込んでしまったので戻しておく */
                ungetc(c, fp);
                c = ' ';
                break;
            case '\n':
                /* 空行でなければ改行 */
                if (prevc != '\n') {
                    putchar(c);
                }
                break;
            case '"':
            case '\'':
                if (c == quote) {
                    /* クオーテーションの終了 */
                    if (prevc != '\\') {
                        /* クオーテーションの前は\でない */
                        quote = 0;
                    }
                } else {
                    /* クオーテーションの開始 */
                    quote = c;
                }
                putchar(c);
                break;
            default:
                putchar((char)c);
                break;
            }
        }
        prevc = c;
        c = fgetc(fp);
    }

    fclose(fp);

    return 0;
}


Create a new paste based on this one


Comments: