summaryrefslogtreecommitdiff
path: root/app/tools/addcrlf.c
diff options
context:
space:
mode:
Diffstat (limited to 'app/tools/addcrlf.c')
-rw-r--r--app/tools/addcrlf.c242
1 files changed, 242 insertions, 0 deletions
diff --git a/app/tools/addcrlf.c b/app/tools/addcrlf.c
new file mode 100644
index 0000000..d36310e
--- /dev/null
+++ b/app/tools/addcrlf.c
@@ -0,0 +1,242 @@
+/**
+ * \file addcrlf.c Convert text between DOS, UNIX and MAC
+ *
+ * $Header: /home/dmarkle/xtrkcad-fork-cvs/xtrkcad/app/tools/addcrlf.c,v 1.7 2007-02-13 19:46:25 m_fischer Exp $
+ *
+ * This is heavily based on flip by Craig Stuart Sapp <craig@ccrma.stanford.edu>
+ * Web Address: http://www-ccrma.stanford.edu/~craig/utility/flip/flip.cpp
+ */
+
+/* XTrkCad - Model Railroad CAD
+ * Copyright (C) Marin Fischer 2006
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+ */
+
+#include <stdlib.h>
+#include <stdio.h>
+
+void exitUsage( char *cmd );
+void translateToDos( char *infile, char *outfile );
+void translateToUnix(char* infilename, char *outfilename);
+void determineType(char* filename);
+
+int
+main( int argc, char ** argv)
+{
+ char option;
+
+ if( argc < 2 )
+ exitUsage(argv[0]);
+
+ if( argv[1][0] != '-' &&argv[1][0] != '/' )
+ exitUsage(argv[0]);
+
+ option = argv[1][1];
+
+ if (!(option == 'u' || option == 'd' || option == 't' || option =='h' )) {
+ exitUsage(argv[0]);
+ }
+
+ if( !((option == 't' && argc == 3)||(option !='t' && argc==4)||( option =='h' ))) {
+ exitUsage(argv[0]);
+ }
+ switch( option )
+ {
+ case 'd':
+ translateToDos(argv[2], argv[3]);
+ break;
+ case 'u':
+ translateToUnix(argv[2], argv[3]);
+ break;
+ case 'm':
+/* translateToMacintosh(argv[i+2]); */
+ break;
+ case 'h':
+ exitUsage(argv[0]);
+ break;
+ default:
+ determineType(argv[2]);
+ break;
+ }
+ return 0;
+}
+
+
+
+void
+translateToDos(char* infilename, char *outfilename)
+{
+ FILE *in, *out;
+ char ch, lastch;
+ int peekch;
+
+ in = fopen( infilename, "rb" );
+ if (!in) {
+ printf( "Error: cannot find file: %s\n", infilename );
+ return;
+ }
+
+ out = fopen( outfilename, "wb" );
+ if (!out) {
+ printf( "Error: cannot open file: %s\n", outfilename );
+ return;
+ }
+
+ ch = getc( in );
+ lastch = ch;
+
+ while( !feof( in ))
+ {
+ if (ch == 0x0a && lastch != 0x0d) {
+ // convert newline from Unix to MS-DOS
+ putc( (char)0x0d, out );
+ putc( ch, out );
+ lastch = ch;
+ } else {
+ if (ch == 0x0d) { // convert newline from Mac to MS-DOS
+ peekch = getc( in ); // lookahead for following character
+ ungetc( peekch, in );
+
+ if (peekch != 0x0a) {
+ putc( ch, out );
+ putc( (char)0x0a, out );
+ lastch = 0x0a;
+ } else {
+ lastch = 0x0d;
+ // Bug fix here reported by Shelley Adams: running -d
+ // twice in a row was generating Unix style newlines
+ // without the following statement:
+ putc( 0x0d, out );
+ }
+
+ } else {
+ putc( ch, out );
+ lastch = ch;
+ }
+ }
+ ch = getc( in );
+ }
+
+ fclose( in );
+ fclose( out );
+}
+
+void
+translateToUnix(char* infilename, char *outfilename)
+{
+ FILE *in, *out;
+ char ch, lastch;
+
+ in = fopen( infilename, "rb" );
+ if (!in) {
+ printf( "Error: cannot find file: %s\n", infilename );
+ return;
+ }
+
+ out = fopen( outfilename, "wb" );
+ if (!out) {
+ printf( "Error: cannot open file: %s\n", outfilename );
+ return;
+ }
+
+ ch = getc( in );
+ lastch = ch;
+
+ while( !feof( in ))
+ {
+ if (ch == 0x0d) {
+ putc( (char)0x0a, out );
+ } else {
+ if (ch == 0x0a) {
+ if (lastch == 0x0d) {
+ // do nothing: already converted MSDOS newline to Unix form
+ } else {
+ putc( (char)0x0a, out );
+ }
+ } else {
+ putc( ch, out );
+ }
+ }
+ lastch = ch;
+ ch = getc( in );
+ }
+
+ fclose( in );
+ fclose( out );
+}
+
+void
+determineType(char* filename)
+{
+ FILE *in;
+ int ch;
+ int crcount = 0;
+ int lfcount = 0;
+
+ in = fopen( filename, "rb" );
+ if (!in) {
+ printf( "Error: cannot find file: %s\n", filename );
+ return;
+ }
+
+ ch = getc( in );
+ if( ch == EOF ) {
+ printf( "Error: file could not be read: %s\n", filename );
+ return;
+ }
+
+ while( !feof( in ))
+ {
+ if (ch == 0x0d) {
+ crcount ++;
+ } else {
+ if (ch == 0x0a) {
+ lfcount++;
+ }
+ }
+ ch = getc( in );
+ }
+
+ fclose( in );
+
+ if ((lfcount == crcount) && (crcount != 0)) {
+ printf("%s : DOS\n", filename );
+ } else if ((lfcount > 0) && (crcount == 0)) {
+ printf("%s : UNIX\n", filename );
+ } else if ((lfcount == 0) && (crcount > 0)) {
+ printf("%s : MAC\n", filename );
+ } else if ((lfcount > 0) && (crcount > 0)) {
+ printf("%s : MIXED\n", filename );
+ } else {
+ printf("%s : UNKNOWN\n", filename );
+ }
+}
+
+void
+exitUsage( char* commandName )
+{
+ printf( "\nUsage: %s [-h] | [-t infile] | [[-u|-d|-m] infile outfile]\n"
+ " Converts an ASCII file between Unix, MS-DOS/Windows, or Macintosh newline formats\n\n"
+ " Options: \n"
+ " -u = convert file to Unix newline format (newline)\n"
+ " -d = convert file to MS-DOS/Windows newline format (linefeed + newline)\n"
+ " -m = convert file to Macintosh newline format (linefeed)\n"
+ " -t = display current file type, no file modifications\n"
+ " -h = show this help\n",
+ commandName );
+
+ exit(1);
+}