riel 755e19b
* Fix http://bugzilla.redhat.com/57508 (make dos2unix not modify Mac
riel 755e19b
  files unless in mac2unix mode)
riel 755e19b
* Make mac2unix mode not create duplicate Unix line delimiters when
riel 755e19b
  run on a DOS file. (mschwendt@users.sf.net)
riel 755e19b
riel 755e19b
diff -Nur dos2unix-3.1-orig/dos2unix.c dos2unix-3.1/dos2unix.c
riel 755e19b
--- dos2unix-3.1-orig/dos2unix.c	1998-11-19 13:19:25.000000000 +0100
riel 755e19b
+++ dos2unix-3.1/dos2unix.c	2004-09-26 20:57:41.606587616 +0200
riel 755e19b
@@ -153,6 +153,24 @@
riel 755e19b
 }
riel 755e19b
 
riel 755e19b
 
c230060
+void StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar)
riel 755e19b
+{
riel 755e19b
+  int TempNextChar;
riel 755e19b
+  /* Don't modify Mac files when in dos2unix mode. */
riel 755e19b
+  if ( (TempNextChar = getc(ipInF)) != EOF) {
riel 755e19b
+    ungetc( TempNextChar, ipInF );  /* put back peek char */
riel 755e19b
+    if ( TempNextChar != '\x0a' ) {
riel 755e19b
+      putc( CurChar, ipOutF );  /* Mac line, put back CR */
riel 755e19b
+    }
riel 755e19b
+  }
riel 755e19b
+  else if ( CurChar == '\x0d' ) {  /* EOF: last Mac line delimiter (CR)? */
riel 755e19b
+    putc( CurChar, ipOutF );
riel 755e19b
+  }
riel 755e19b
+  if (ipFlag->NewLine) {  /* add additional LF? */
riel 755e19b
+    putc('\n', ipOutF);
riel 755e19b
+  }
riel 755e19b
+}
riel 755e19b
+
riel 755e19b
 /* converts stream ipInF to UNIX format text and write to stream ipOutF
riel 755e19b
  * RetVal: 0  if success
riel 755e19b
  *         -1  otherwise
riel 755e19b
@@ -161,6 +179,7 @@
riel 755e19b
 {
riel 755e19b
     int RetVal = 0;
riel 755e19b
     int TempChar;
riel 755e19b
+    int TempNextChar;
riel 755e19b
     
riel 755e19b
     if ( macmode )
riel 755e19b
       ipFlag->ConvMode = 3;
riel 755e19b
@@ -177,9 +196,7 @@
riel 755e19b
 		break;
riel 755e19b
 	      } 
riel 755e19b
 	    } else {
riel 755e19b
-	      if (ipFlag->NewLine) {
riel 755e19b
-		putc('\n', ipOutF);
riel 755e19b
-	      }
riel 755e19b
+	      StripDelimiter( ipInF, ipOutF, ipFlag, TempChar );
riel 755e19b
 	    }
riel 755e19b
 	  }
riel 755e19b
 	  break;
riel 755e19b
@@ -193,9 +210,7 @@
riel 755e19b
 		break;
riel 755e19b
 	      }
riel 755e19b
 	    } else {
riel 755e19b
-	      if (ipFlag->NewLine) {
riel 755e19b
-		putc('\n', ipOutF);
riel 755e19b
-	      }
riel 755e19b
+	      StripDelimiter( ipInF, ipOutF, ipFlag, TempChar );
riel 755e19b
 	    }
riel 755e19b
 	  }
riel 755e19b
 	  break;
riel 755e19b
@@ -209,9 +224,7 @@
riel 755e19b
 		break;
riel 755e19b
 	      }
riel 755e19b
 	    } else {
riel 755e19b
-	      if (ipFlag->NewLine) {
riel 755e19b
-		putc('\n', ipOutF);
riel 755e19b
-	      }
riel 755e19b
+	      StripDelimiter( ipInF, ipOutF, ipFlag, TempChar );
riel 755e19b
 	    }
riel 755e19b
 	  }
riel 755e19b
 	  break;
riel 755e19b
@@ -227,6 +240,13 @@
riel 755e19b
 		}
riel 755e19b
 	      }
riel 755e19b
 	    else{
riel 755e19b
+	      if ( (TempNextChar = getc(ipInF)) != EOF) {
riel 755e19b
+		ungetc( TempNextChar, ipInF );  /* put back peek char */
riel 755e19b
+		/* Don't touch this delimiter if it's a CR,LF pair. */
riel 755e19b
+		if ( TempNextChar == '\x0a' ) {
riel 755e19b
+		  continue;
riel 755e19b
+		}
riel 755e19b
+	      }
riel 755e19b
 	      if (putc('\x0a', ipOutF) == EOF)
riel 755e19b
 		{
riel 755e19b
 		  RetVal = -1;