ここで出されるコードってインデントが入ってなくて見にくいので、
行頭のスペースとタブを「 」に書き換えるコード作ってみた。
どっか変なところある?

#include <stdio.h>
#include <ctype.h>

#define LINESIZE 1024
#define TABSIZE 4
#define SPACESIZE 1

int istabsp(int);

int main(void){

    char line[LINESIZE];
    int line_ptr;

    int tabsize = TABSIZE;
    int spacesize = SPACESIZE;

    while(fgets(line, sizeof(line), stdin) != NULL){
        for(line_ptr = 0; 0 != istabsp(*(line + line_ptr)); ++line_ptr){
            if(*(line + line_ptr) == '\t'){
                while(0 < tabsize--){
                    fprintf(stdout, " ");
                }
            }else if(*(line + line_ptr) == ' '){
                while(0 < spacesize--){
                    fprintf(stdout, " ");
                }
            }
            tabsize = TABSIZE;
            spacesize = SPACESIZE;
        }

        fprintf(stdout, "%s", line + line_ptr);
    }

    return 0;
}

int istabsp(int c){
    if(c == '\t' || c == ' '){
        return 1;
    }else{
        return 0;
    }
}

このレス自身もこのプログラムとおしてみた。