#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;
}