/************************************************************************ 改行コード変換・統一プログラム copyright 2004, TKEN *************************************************************************/ #include #include #include #include static int newline( char * ); static int newline_internal( char *, char *, int size ); static int newline_p( int, int ); static int output_newline( char *, int * ); int main( int argc, char **argv ) { int i; if ( argc < 2 ) { fprintf( stderr, "Usage:%s filename, ...\n", argv[0] ); exit(1); } for ( i = 1; i < argc; i++ ) { newline( argv[i] ); } return 0; } static int newline( char *filename ) { int ret; int len; #ifdef _WIN32 static struct _stat buf; #else static struct stat buf; #endif static char backup_file[1024]; len = strlen( filename ); if ( len > 512 ) { fprintf( stderr, "Too long filename:%s\n", filename ); exit(1); } strcpy( backup_file, filename ); strcat( backup_file, ".bak" ); #ifdef _WIN32 ret = _stat( backup_file, &buf ); #else ret = stat( backup_file, &buf ); #endif if ( ret == 0 ) { fprintf( stderr, "<%s> exits!\n", backup_file ); fprintf( stderr, "please remove or rename <%s>\n", backup_file ); exit(1); } #ifdef _WIN32 ret = _stat( filename, &buf ); #else ret = stat( filename, &buf ); #endif if ( ret != 0 ) { fprintf( stderr, "<%s> does not exit!\n", filename ); exit(1); } newline_internal( filename, backup_file, buf.st_size ); return 0; } static int newline_internal( char *srcfile, char *backfile, int size ) { char *filebuf; char *outbuf; int i; int j; int ret; int check; FILE *fp1; FILE *fp2; filebuf = (char *)malloc( size ); if ( filebuf == NULL ) { fprintf( stderr, "Cannot alloc!\n" ); exit(1); } outbuf = (char *)malloc( size * 2 ); if ( filebuf == NULL ) { fprintf( stderr, "Cannot alloc!\n" ); exit(1); } fp1 = fopen( srcfile, "rb" ); if ( fp1 == NULL ) { fprintf( stderr, "Cannot open %s\n", srcfile ); exit(1); } ret = fread( filebuf, size, 1, fp1 ); if ( ret != 1 ) { fprintf( stderr, "Cannot read %s\n", srcfile ); exit(1); } fclose( fp1 ); /* binary check */ for ( i = 0; i < size; i++ ) { if ( filebuf[i] == '\0' ) { fprintf( stderr, "<%s> seems to be binary file\n", srcfile ); exit(1); } } fp2= fopen( backfile, "wb" ); if ( fp2 == NULL ) { fprintf( stderr, "Cannot open %s\n", backfile ); exit(1); } ret = fwrite( filebuf, size, 1, fp2 ); if ( ret != 1 ) { fprintf( stderr, "Cannot backup %s\n", backfile ); exit(1); } fclose( fp2 ); i = 0; j = 0; while ( i < size ) { if ( j >= size * 2) { fprintf( stderr, "Panic!\n" ); exit(1); } check = newline_p( filebuf[i], filebuf[i+1] ); if ( check != 0 ) { output_newline( outbuf, &j ); i = i + check; } else { outbuf[j] = filebuf[i], j++; i++; } } fp1 = fopen( srcfile, "wb" ); if ( fp1 == NULL ) { fprintf( stderr, "Cannot open %s\n", srcfile ); exit(1); } ret = fwrite( outbuf, j, 1, fp1 ); if ( ret != 1 ) { fprintf( stderr, "Cannot write %s\n", srcfile ); exit(1); } free( filebuf ); free( outbuf ); fclose( fp1 ); return 1; } static int newline_p( int c1, int c2 ) { if ( c1 == 10 ) { /* unix */ return 1; } if ( ( c1 == 13 ) && ( c2 == 10 ) ) { /* dos */ return 2; } if ( c1 == 13 ) { /* mac */ return 1; } return 0; } static int output_newline( char *buf, int *index ) { #ifdef _WIN32 buf[*index] = 13; (*index)++; buf[*index] = 10; (*index)++; #else buf[*index] = 10; (*index)++; #endif return 1; }