damaris-backends/tools/add_endline.cpp
2014-06-26 11:10:51 +00:00

63 lines
1.8 KiB
C++

/*
Achim Gaedke, TU Darmstadt, September 2004
add_endline filename
this tool appends an appropriate endline sequence, if file does not end with a \n or \r
the added sequence is determined by the first line end sequence (\n, \r, \n\r or \r\n)
if no line break is found, \n will be used
*/
#include <cstdio>
int main(int argc, char** argv) {
/* get filename and open file for reading */
if (argc!=2) {
fprintf(stderr,"%s filename\n adds endline/carrige return to c code if necessary\n",argv[0]);
return 1;
}
FILE* inspect_file=fopen(argv[1],"r+");
if (inspect_file==NULL) {
fprintf(stderr, "%s: could not open file %s",argv[0],argv[1]);
return 1;
}
/* determine, if file ends without newline/carrige return */
fseek(inspect_file, -2, SEEK_END);
char lineend[3];
size_t charread=fread(lineend, 1, 2, inspect_file);
// nothing inside? fileend?
if (charread==0) return 0;
// is this a file with line end?
if (lineend[charread-1]=='\n' || lineend[charread-1]=='\r') {
fclose(inspect_file);
return 0;
}
/* if not, determine cr/nl file type */
fseek(inspect_file, 0, SEEK_SET);
while (1==(charread=fread(lineend,1,1,inspect_file)) && lineend[0]!='\r' && lineend[0]!='\n') {}
if (charread!=1) {
// could not find a newline, just using \n
lineend[0]='\n';
lineend[1]='\0';
}
else {
charread=fread(lineend+1,1,1,inspect_file);
if (charread!=1 || lineend[0]==lineend[1] || (lineend[1]!='\n' && lineend[1]!='\r'))
lineend[1]='\0';
else
lineend[2]='\0';
}
fclose(inspect_file);
/* fix file by appending cr/nl */
inspect_file=fopen(argv[1],"a+");
if (inspect_file==NULL) {
fprintf(stderr,"%s could not open file %s for appending newlines\n",argv[0],argv[1]);
}
fprintf(inspect_file,lineend);
fclose(inspect_file);
return 0;
}