1-22 fold.c

汚い! 汚いよこれ!
clear_buffer()はせめてマクロにしたかった…

/*
 * P42 演習1-22
 *   長い入力行を、入力のn文字目までにある最後の非ブランク文字の後で、
 *   "折りたたむ"プログラムを書け。プログラムは、行が非常に長くても、また
 *   指定桁までにブランクもタブもない場合についても、
 *   ちゃんと動作するようにせよ。
 *
 *       2007/06/23 arikui
 */

#include <stdio.h>

#define FOLD_WIDTH  50
#define TAB_STOP    4


void clear_buffer(char *buffer, int *buff_ptr_ptr){
    buffer[0] = '\0';
    *buff_ptr_ptr = 0;
}



int main(void){
    int n = FOLD_WIDTH, tab = TAB_STOP, col = 0;
    char buff[FOLD_WIDTH + 1] = {'\0'};
    int buff_ptr = 0;
    int c;
    
    while((c = getchar()) != EOF){
        if (c == ' ' || c == '\t'){
            if (col < n){
                col += ((c == '\t') ? tab - col % tab : 1);
                
                /* pool at buff */
                buff[buff_ptr++] = c;
                buff[buff_ptr] = '\0';
            }else{
                putchar('\n');
                clear_buffer(buff, &buff_ptr);
            }
        }else{
            if (col < n){
                printf("%s", buff); /* flush buffer */
                clear_buffer(buff, &buff_ptr);
                
                if (c == '\n') col = 0;
                    else ++col;
                putchar(c);
            }else{
                putchar('\n');
                col = 0;
                
                putchar(c);
                clear_buffer(buff, &buff_ptr);
            }
        }
    }
    
    return 0;
}