summaryrefslogtreecommitdiff
path: root/dos2unix.c
diff options
context:
space:
mode:
Diffstat (limited to 'dos2unix.c')
-rw-r--r--dos2unix.c905
1 files changed, 72 insertions, 833 deletions
diff --git a/dos2unix.c b/dos2unix.c
index c02ebba..0515228 100644
--- a/dos2unix.c
+++ b/dos2unix.c
@@ -61,10 +61,10 @@
/* #define DEBUG 1 */
+#define __DOS2UNIX_C
#include "common.h"
#include "dos2unix.h"
-#include "querycp.h"
#ifdef D2U_UNICODE
#if !defined(__MSDOS__) && !defined(_WIN32) && !defined(__OS2__) /* Unix, Cygwin */
# include <langinfo.h>
@@ -83,7 +83,7 @@ All rights reserved.\n\n"));
}
#ifdef D2U_UNICODE
-void StripDelimiterW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, wint_t CurChar)
+void StripDelimiterW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, wint_t CurChar, unsigned int *converted)
{
wint_t TempNextChar;
/* CurChar is always CR (x0d) */
@@ -93,18 +93,20 @@ void StripDelimiterW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, wint_t CurChar)
d2u_ungetwc( TempNextChar, ipInF, ipFlag->bomtype); /* put back peek char */
if ( TempNextChar != 0x0a ) {
d2u_putwc( CurChar, ipOutF, ipFlag); /* Mac line, put back CR */
+ } else {
+ (*converted)++;
+ if (ipFlag->NewLine) { /* add additional LF? */
+ d2u_putwc(0x0a, ipOutF, ipFlag);
+ }
}
}
else if ( CurChar == 0x0d ) { /* EOF: last Mac line delimiter (CR)? */
d2u_putwc( CurChar, ipOutF, ipFlag);
}
- if (ipFlag->NewLine) { /* add additional LF? */
- d2u_putwc(0x0a, ipOutF, ipFlag);
- }
}
#endif
-void StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar)
+void StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar, unsigned int *converted)
{
int TempNextChar;
/* CurChar is always CR (x0d) */
@@ -114,14 +116,16 @@ void StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar)
ungetc( TempNextChar, ipInF ); /* put back peek char */
if ( TempNextChar != '\x0a' ) {
fputc( CurChar, ipOutF ); /* Mac line, put back CR */
+ } else {
+ (*converted)++;
+ if (ipFlag->NewLine) { /* add additional LF? */
+ fputc('\x0a', ipOutF);
+ }
}
}
else if ( CurChar == '\x0d' ) { /* EOF: last Mac line delimiter (CR)? */
fputc( CurChar, ipOutF );
}
- if (ipFlag->NewLine) { /* add additional LF? */
- fputc('\x0a', ipOutF);
- }
}
/* converts stream ipInF to UNIX format text and write to stream ipOutF
@@ -129,12 +133,13 @@ void StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar)
* -1 otherwise
*/
#ifdef D2U_UNICODE
-int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
+int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, const char *progname)
{
int RetVal = 0;
wint_t TempChar;
wint_t TempNextChar;
- int line_nr = 1;
+ unsigned int line_nr = 1;
+ unsigned int converted = 0;
char *errstr;
ipFlag->status = 0;
@@ -158,8 +163,8 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
(TempChar != 0x0c)) { /* Not a form feed */
RetVal = -1;
ipFlag->status |= BINARY_FILE ;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("Binary symbol 0x00%02X found at line %d\n"),TempChar, line_nr);
}
@@ -170,10 +175,9 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
++line_nr;
if (d2u_putwc(TempChar, ipOutF, ipFlag) == WEOF) {
RetVal = -1;
- if (!ipFlag->Quiet)
- {
- if (!(ipFlag->status & UNICODE_CONVERSION_ERROR))
- {
+ if (ipFlag->verbose) {
+ if (!(ipFlag->status & UNICODE_CONVERSION_ERROR)) {
+ ipFlag->error = errno;
errstr = strerror(errno);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("can not write to output file: %s\n"), errstr);
@@ -182,7 +186,7 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
break;
}
} else {
- StripDelimiterW( ipInF, ipOutF, ipFlag, TempChar );
+ StripDelimiterW( ipInF, ipOutF, ipFlag, TempChar, &converted);
}
}
break;
@@ -196,23 +200,21 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
(TempChar != 0x0c)) { /* Not a form feed */
RetVal = -1;
ipFlag->status |= BINARY_FILE ;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("Binary symbol 0x00%02X found at line %d\n"),TempChar, line_nr);
}
break;
}
- if ((TempChar != 0x0d))
- {
+ if ((TempChar != 0x0d)) {
if (TempChar == 0x0a) /* Count all DOS and Unix line breaks */
++line_nr;
- if(d2u_putwc(TempChar, ipOutF, ipFlag) == WEOF){
+ if(d2u_putwc(TempChar, ipOutF, ipFlag) == WEOF) {
RetVal = -1;
- if (!ipFlag->Quiet)
- {
- if (!(ipFlag->status & UNICODE_CONVERSION_ERROR))
- {
+ if (ipFlag->verbose) {
+ if (!(ipFlag->status & UNICODE_CONVERSION_ERROR)) {
+ ipFlag->error = errno;
errstr = strerror(errno);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("can not write to output file: %s\n"), errstr);
@@ -231,13 +233,11 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
continue;
}
}
- if (d2u_putwc(0x0a, ipOutF, ipFlag) == WEOF) /* MAC line end (CR). Put LF */
- {
+ if (d2u_putwc(0x0a, ipOutF, ipFlag) == WEOF) { /* MAC line end (CR). Put LF */
RetVal = -1;
- if (!ipFlag->Quiet)
- {
- if (!(ipFlag->status & UNICODE_CONVERSION_ERROR))
- {
+ if (ipFlag->verbose) {
+ if (!(ipFlag->status & UNICODE_CONVERSION_ERROR)) {
+ ipFlag->error = errno;
errstr = strerror(errno);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("can not write to output file: %s\n"), errstr);
@@ -245,6 +245,7 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
}
break;
}
+ converted++;
line_nr++; /* Count all Mac line breaks */
if (ipFlag->NewLine) { /* add additional LF? */
d2u_putwc(0x0a, ipOutF, ipFlag);
@@ -260,6 +261,10 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
exit(1);
#endif
}
+ if (ipFlag->verbose > 1) {
+ fprintf(stderr, "%s: ", progname);
+ fprintf(stderr, _("Converted %d out of %d line breaks.\n"),converted, line_nr -1);
+ }
return RetVal;
}
#endif
@@ -268,19 +273,19 @@ int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
* RetVal: 0 if success
* -1 otherwise
*/
-int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
+int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, const char *progname)
{
int RetVal = 0;
int TempChar;
int TempNextChar;
int *ConvTable;
- int line_nr = 1;
+ unsigned int line_nr = 1;
+ unsigned int converted = 0;
char *errstr;
ipFlag->status = 0;
- switch (ipFlag->ConvMode)
- {
+ switch (ipFlag->ConvMode) {
case CONVMODE_ASCII: /* ascii */
case CONVMODE_UTF16LE: /* Assume UTF-16LE, bomtype = FILE_UTF8 */
case CONVMODE_UTF16BE: /* Assume UTF-16BE, bomtype = FILE_UTF8 */
@@ -311,8 +316,11 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
ipFlag->status |= WRONG_CODEPAGE ;
return(-1);
}
- if ((ipFlag->ConvMode > 1) && (!ipFlag->Quiet)) /* not ascii or 7bit */
- {
+ /* Turn off ISO and 7-bit conversion for Unicode text files */
+ if (ipFlag->bomtype > 0)
+ ConvTable = D2UAsciiTable;
+
+ if ((ipFlag->ConvMode > CONVMODE_7BIT) && (ipFlag->verbose)) { /* not ascii or 7bit */
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("using code page %d.\n"), ipFlag->ConvMode);
}
@@ -324,8 +332,7 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
/* \x0a = Newline/Line Feed (LF) */
/* \x0d = Carriage Return (CR) */
- switch (ipFlag->FromToMode)
- {
+ switch (ipFlag->FromToMode) {
case FROMTO_DOS2UNIX: /* dos2unix */
while ((TempChar = fgetc(ipInF)) != EOF) { /* get character */
if ((ipFlag->Force == 0) &&
@@ -336,8 +343,8 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
(TempChar != '\x0c')) { /* Not a form feed */
RetVal = -1;
ipFlag->status |= BINARY_FILE ;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("Binary symbol 0x%02X found at line %d\n"),TempChar, line_nr);
}
@@ -348,8 +355,8 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
++line_nr;
if (fputc(ConvTable[TempChar], ipOutF) == EOF) {
RetVal = -1;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ ipFlag->error = errno;
errstr = strerror(errno);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("can not write to output file: %s\n"), errstr);
@@ -357,7 +364,7 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
break;
}
} else {
- StripDelimiter( ipInF, ipOutF, ipFlag, TempChar );
+ StripDelimiter( ipInF, ipOutF, ipFlag, TempChar, &converted);
}
}
break;
@@ -371,21 +378,20 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
(TempChar != '\x0c')) { /* Not a form feed */
RetVal = -1;
ipFlag->status |= BINARY_FILE ;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("Binary symbol 0x%02X found at line %d\n"),TempChar, line_nr);
}
break;
}
- if ((TempChar != '\x0d'))
- {
+ if ((TempChar != '\x0d')) {
if (TempChar == '\x0a') /* Count all DOS and Unix line breaks */
++line_nr;
- if(fputc(ConvTable[TempChar], ipOutF) == EOF){
+ if(fputc(ConvTable[TempChar], ipOutF) == EOF) {
RetVal = -1;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ ipFlag->error = errno;
errstr = strerror(errno);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("can not write to output file: %s\n"), errstr);
@@ -403,17 +409,17 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
continue;
}
}
- if (fputc('\x0a', ipOutF) == EOF) /* MAC line end (CR). Put LF */
- {
+ if (fputc('\x0a', ipOutF) == EOF) { /* MAC line end (CR). Put LF */
RetVal = -1;
- if (!ipFlag->Quiet)
- {
+ if (ipFlag->verbose) {
+ ipFlag->error = errno;
errstr = strerror(errno);
fprintf(stderr, "%s: ", progname);
fprintf(stderr, _("can not write to output file: %s\n"), errstr);
}
break;
}
+ converted++;
line_nr++; /* Count all Mac line breaks */
if (ipFlag->NewLine) { /* add additional LF? */
fputc('\x0a', ipOutF);
@@ -429,413 +435,11 @@ int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, char *progname)
exit(1);
#endif
}
- return RetVal;
-}
-
-/* convert file ipInFN to UNIX format text and write to file ipOutFN
- * RetVal: 0 if success
- * -1 otherwise
- */
-int ConvertDosToUnixNewFile(char *ipInFN, char *ipOutFN, CFlag *ipFlag, char *progname)
-{
- int RetVal = 0;
- FILE *InF = NULL;
- FILE *TempF = NULL;
- char *TempPath;
- char *errstr;
- struct stat StatBuf;
- struct utimbuf UTimeBuf;
-#ifndef NO_CHMOD
- mode_t mask;
-#endif
-#ifdef NO_MKSTEMP
- FILE* fd;
-#else
- int fd;
-#endif
- char *TargetFN = NULL;
- int ResolveSymlinkResult = 0;
-
- ipFlag->status = 0 ;
-
- /* Test if output file is a symbolic link */
- if (symbolic_link(ipOutFN) && !ipFlag->Follow)
- {
- ipFlag->status |= OUTPUTFILE_SYMLINK ;
- /* Not a failure, skipping input file according spec. (keep symbolic link unchanged) */
- return -1;
- }
-
- /* Test if input file is a regular file or symbolic link */
- if (regfile(ipInFN, 1, ipFlag, progname))
- {
- ipFlag->status |= NO_REGFILE ;
- /* Not a failure, skipping non-regular input file according spec. */
- return -1;
- }
-
- /* Test if input file target is a regular file */
- if (symbolic_link(ipInFN) && regfile_target(ipInFN, ipFlag,progname))
- {
- ipFlag->status |= INPUT_TARGET_NO_REGFILE ;
- /* Not a failure, skipping non-regular input file according spec. */
- return -1;
- }
-
- /* Test if output file target is a regular file */
- if (symbolic_link(ipOutFN) && (ipFlag->Follow == SYMLINK_FOLLOW) && regfile_target(ipOutFN, ipFlag,progname))
- {
- ipFlag->status |= OUTPUT_TARGET_NO_REGFILE ;
- /* Failure, input is regular, cannot produce output. */
- if (!ipFlag->error) ipFlag->error = 1;
- return -1;
- }
-
- /* retrieve ipInFN file date stamp */
- if (stat(ipInFN, &StatBuf))
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: %s: %s\n", progname, ipInFN, errstr);
- }
- RetVal = -1;
- }
-
-#ifdef NO_MKSTEMP
- if((fd = MakeTempFileFrom(ipOutFN, &TempPath))==NULL) {
-#else
- if((fd = MakeTempFileFrom (ipOutFN, &TempPath)) < 0) {
-#endif
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
+ if (ipFlag->verbose > 1) {
fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("Failed to open temporary output file: %s\n"), errstr);
- }
- RetVal = -1;
- }
-
-#if DEBUG
- fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("using %s as temporary file\n"), TempPath);
-#endif
-
- /* can open in file? */
- if (!RetVal)
- {
- InF=OpenInFile(ipInFN);
- if (InF == NULL)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: %s: %s\n", progname, ipInFN, errstr);
- RetVal = -1;
- }
- }
-
- /* can open output file? */
- if ((!RetVal) && (InF))
- {
-#ifdef NO_MKSTEMP
- if ((TempF=fd) == NULL)
- {
-#else
- if ((TempF=OpenOutFile(fd)) == NULL)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: %s\n", progname, errstr);
-#endif
- fclose (InF);
- InF = NULL;
- RetVal = -1;
- }
- }
-
- InF = read_bom(InF, &ipFlag->bomtype);
-#ifdef D2U_UNICODE
- if ((ipFlag->bomtype == FILE_MBS) && (ipFlag->ConvMode == CONVMODE_UTF16LE))
- ipFlag->bomtype = FILE_UTF16LE;
- if ((ipFlag->bomtype == FILE_MBS) && (ipFlag->ConvMode == CONVMODE_UTF16BE))
- ipFlag->bomtype = FILE_UTF16BE;
-#endif
-
-#ifdef D2U_UNICODE
-#if !defined(__MSDOS__) && !defined(_WIN32) && !defined(__OS2__) /* Unix, Cygwin */
- if ((ipFlag->bomtype == FILE_UTF16LE) || (ipFlag->bomtype == FILE_UTF16BE))
- {
- if (strcmp(nl_langinfo(CODESET), "UTF-8") != 0)
- {
- /* Don't convert UTF-16 files when the locale encoding is not UTF-8
- * to prevent loss of characters. */
- ipFlag->status |= LOCALE_NOT_UTF8 ;
- if (!ipFlag->error) ipFlag->error = 1;
- RetVal = -1;
- }
- }
-#endif
-#if !defined(_WIN32) && !defined(__CYGWIN__) /* Not Windows or Cygwin */
- if ((ipFlag->bomtype == FILE_UTF16LE) || (ipFlag->bomtype == FILE_UTF16BE))
- {
- if (sizeof(wchar_t) < 4)
- {
- /* A decoded UTF-16 surrogate pair must fit in a wchar_t */
- ipFlag->status |= WCHAR_T_TOO_SMALL ;
- if (!ipFlag->error) ipFlag->error = 1;
- RetVal = -1;
- }
- }
-#endif
-#endif
-
- if ((ipFlag->add_bom) || ((ipFlag->keep_bom) && (ipFlag->bomtype > 0)))
- fprintf(TempF, "%s", "\xEF\xBB\xBF"); /* UTF-8 BOM */
-
- /* Turn off ISO and 7-bit conversion for Unicode text files */
- /* When we assume UTF16, don't change the conversion mode. We need to remember it. */
- if ((ipFlag->bomtype > 0) && (ipFlag->ConvMode != CONVMODE_UTF16LE) && (ipFlag->ConvMode != CONVMODE_UTF16BE))
- ipFlag->ConvMode = CONVMODE_ASCII;
-
- /* conversion sucessful? */
-#ifdef D2U_UNICODE
- if ((ipFlag->bomtype == FILE_UTF16LE) || (ipFlag->bomtype == FILE_UTF16BE))
- {
- if ((!RetVal) && (ConvertDosToUnixW(InF, TempF, ipFlag, progname)))
- RetVal = -1;
- if (ipFlag->status & UNICODE_CONVERSION_ERROR)
- {
- if (!ipFlag->error) ipFlag->error = 1;
- RetVal = -1;
- }
- } else {
- if ((!RetVal) && (ConvertDosToUnix(InF, TempF, ipFlag, progname)))
- RetVal = -1;
- }
-#else
- if ((!RetVal) && (ConvertDosToUnix(InF, TempF, ipFlag, progname)))
- RetVal = -1;
-#endif
-
- /* can close in file? */
- if ((InF) && (fclose(InF) == EOF))
- RetVal = -1;
-
- /* can close output file? */
- if (TempF)
- {
- if (fclose(TempF) == EOF)
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("Failed to write to temporary output file %s: %s\n"), TempPath, errstr);
- }
- RetVal = -1;
- }
- }
-
-#ifdef NO_MKSTEMP
- if(fd!=NULL)
- fclose(fd);
-#else
- if(fd>=0)
- close(fd);
-#endif
-
-#ifndef NO_CHMOD
- if (!RetVal)
- {
- if (ipFlag->NewFile == 0) /* old-file mode */
- {
- RetVal = chmod (TempPath, StatBuf.st_mode); /* set original permissions */
- }
- else
- {
- mask = umask(0); /* get process's umask */
- umask(mask); /* set umask back to original */
- RetVal = chmod(TempPath, StatBuf.st_mode & ~mask); /* set original permissions, minus umask */
- }
-
- if (RetVal)
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("Failed to change the permissions of temporary output file %s: %s\n"), TempPath, errstr);
- }
- }
- }
-#endif
-
-#ifndef NO_CHOWN
- if (!RetVal && (ipFlag->NewFile == 0)) /* old-file mode */
- {
- /* Change owner and group of the temporary output file to the original file's uid and gid. */
- /* Required when a different user (e.g. root) has write permission on the original file. */
- /* Make sure that the original owner can still access the file. */
- if (chown(TempPath, StatBuf.st_uid, StatBuf.st_gid))
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("Failed to change the owner and group of temporary output file %s: %s\n"), TempPath, errstr);
- }
- RetVal = -1;
- }
- }
-#endif
-
- if ((!RetVal) && (ipFlag->KeepDate))
- {
- UTimeBuf.actime = StatBuf.st_atime;
- UTimeBuf.modtime = StatBuf.st_mtime;
- /* can change output file time to in file time? */
- if (utime(TempPath, &UTimeBuf) == -1)
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: %s: %s\n", progname, TempPath, errstr);
- }
- RetVal = -1;
- }
- }
-
- /* any error? cleanup the temp file */
- if (RetVal && (TempPath != NULL))
- {
- if (unlink(TempPath) && (errno != ENOENT))
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: %s: %s\n", progname, TempPath, errstr);
- }
- RetVal = -1;
- }
- }
-
- /* If output file is a symbolic link, optional resolve the link and modify */
- /* the target, instead of removing the link and creating a new regular file */
- TargetFN = ipOutFN;
- if (symbolic_link(ipOutFN) && !RetVal)
- {
- ResolveSymlinkResult = 0; /* indicates that TargetFN need not be freed */
- if (ipFlag->Follow == SYMLINK_FOLLOW)
- {
- ResolveSymlinkResult = ResolveSymbolicLink(ipOutFN, &TargetFN, ipFlag, progname);
- if (ResolveSymlinkResult < 0)
- {
- if (!ipFlag->Quiet)
- {
- fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("problems resolving symbolic link '%s'\n"), ipOutFN);
- fprintf(stderr, _(" output file remains in '%s'\n"), TempPath);
- }
- RetVal = -1;
- }
+ fprintf(stderr, _("Converted %d out of %d line breaks.\n"),converted, line_nr -1);
}
- }
-
- /* can rename temporary file to output file? */
- if (!RetVal)
- {
-#ifdef NEED_REMOVE
- if (unlink(TargetFN) && (errno != ENOENT))
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: %s: %s\n", progname, TargetFN, errstr);
- }
- RetVal = -1;
- }
-#endif
- if (rename(TempPath, TargetFN) == -1)
- {
- if (!ipFlag->Quiet)
- {
- ipFlag->error = errno;
- errstr = strerror(errno);
- fprintf(stderr, "%s: ", progname);
- fprintf(stderr, _("problems renaming '%s' to '%s': %s\n"), TempPath, TargetFN, errstr);
-#ifdef S_ISLNK
- if (ResolveSymlinkResult > 0)
- fprintf(stderr, _(" which is the target of symbolic link '%s'\n"), ipOutFN);
-#endif
- fprintf(stderr, _(" output file remains in '%s'\n"), TempPath);
- }
- RetVal = -1;
- }
-
- if (ResolveSymlinkResult > 0)
- free(TargetFN);
- }
- free(TempPath);
- return RetVal;
-}
-
-/* convert stdin to UNIX format text and write to stdout
- * RetVal: 0 if success
- * -1 otherwise
- */
-int ConvertDosToUnixStdio(CFlag *ipFlag, char *progname)
-{
- ipFlag->NewFile = 1;
- ipFlag->Quiet = 1;
- ipFlag->KeepDate = 0;
- ipFlag->Force = 1;
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-
- /* stdin and stdout are by default text streams. We need
- * to set them to binary mode. Otherwise an LF will
- * automatically be converted to CR-LF on DOS/Windows.
- * Erwin */
-
- /* POSIX 'setmode' was deprecated by MicroSoft since
- * Visual C++ 2005. Use ISO C++ conformant '_setmode' instead. */
-
- _setmode(_fileno(stdout), _O_BINARY);
- _setmode(_fileno(stdin), _O_BINARY);
-#elif defined(__MSDOS__) || defined(__CYGWIN__) || defined(__OS2__)
- setmode(fileno(stdout), O_BINARY);
- setmode(fileno(stdin), O_BINARY);
-#endif
-
- read_bom(stdin, &ipFlag->bomtype);
-#ifdef D2U_UNICODE
- if ((ipFlag->bomtype == FILE_MBS) && (ipFlag->ConvMode == CONVMODE_UTF16LE))
- ipFlag->bomtype = FILE_UTF16LE;
- if ((ipFlag->bomtype == FILE_MBS) && (ipFlag->ConvMode == CONVMODE_UTF16BE))
- ipFlag->bomtype = FILE_UTF16BE;
-#endif
-
- if ((ipFlag->add_bom) || ((ipFlag->keep_bom) && (ipFlag->bomtype > 0)))
- fprintf(stdout, "%s", "\xEF\xBB\xBF"); /* UTF-8 BOM */
-
-#ifdef D2U_UNICODE
- if ((ipFlag->bomtype == FILE_UTF16LE) || (ipFlag->bomtype == FILE_UTF16BE))
- {
- return (ConvertDosToUnixW(stdin, stdout, ipFlag, progname));
- } else {
- return (ConvertDosToUnix(stdin, stdout, ipFlag, progname));
- }
-#else
- return (ConvertDosToUnix(stdin, stdout, ipFlag, progname));
-#endif
+ return RetVal;
}
@@ -843,16 +447,9 @@ int main (int argc, char *argv[])
{
/* variable declarations */
char progname[9];
- int ArgIdx;
- int CanSwitchFileMode;
- int ShouldExit;
- int RetVal = 0;
- int process_options = 1;
CFlag *pFlag;
char *ptr;
-#ifdef ENABLE_NLS
char localedir[1024];
-#endif
# ifdef __MINGW64__
int _dowildcard = -1; /* enable wildcard expansion for Win64 */
# endif
@@ -864,12 +461,10 @@ int main (int argc, char *argv[])
ptr = getenv("DOS2UNIX_LOCALEDIR");
if (ptr == NULL)
strcpy(localedir,LOCALEDIR);
- else
- {
+ else {
if (strlen(ptr) < sizeof(localedir))
strcpy(localedir,ptr);
- else
- {
+ else {
fprintf(stderr,"%s: ",progname);
fprintf(stderr, "%s", _("error: Value of environment variable DOS2UNIX_LOCALEDIR is too long.\n"));
strcpy(localedir,LOCALEDIR);
@@ -889,25 +484,8 @@ int main (int argc, char *argv[])
/* variable initialisations */
- ArgIdx = 0;
- CanSwitchFileMode = 1;
- ShouldExit = 0;
pFlag = (CFlag*)malloc(sizeof(CFlag));
- pFlag->NewFile = 0;
- pFlag->Quiet = 0;
- pFlag->KeepDate = 0;
- pFlag->ConvMode = CONVMODE_ASCII; /* default ascii */
pFlag->FromToMode = FROMTO_DOS2UNIX; /* default dos2unix */
- pFlag->NewLine = 0;
- pFlag->Force = 0;
- pFlag->Follow = SYMLINK_SKIP;
- pFlag->status = 0;
- pFlag->stdio_mode = 1;
- pFlag->error = 0;
-#ifdef D2U_UNICODE
- pFlag->bomtype = FILE_MBS;
-#endif
- pFlag->add_bom = 0;
pFlag->keep_bom = 0;
if ( ((ptr=strrchr(argv[0],'/')) == NULL) && ((ptr=strrchr(argv[0],'\\')) == NULL) )
@@ -915,354 +493,15 @@ int main (int argc, char *argv[])
else
ptr++;
- if ((strcmpi("mac2unix", ptr) == 0) || (strcmpi("mac2unix.exe", ptr) == 0))
- {
+ if ((strcmpi("mac2unix", ptr) == 0) || (strcmpi("mac2unix.exe", ptr) == 0)) {
pFlag->FromToMode = FROMTO_MAC2UNIX;
strcpy(progname,"mac2unix");
}
- while ((++ArgIdx < argc) && (!ShouldExit))
- {
- /* is it an option? */
- if ((argv[ArgIdx][0] == '-') && process_options)
- {
- /* an option */
- if (strcmp(argv[ArgIdx],"--") == 0)
- process_options = 0;
- else if ((strcmp(argv[ArgIdx],"-h") == 0) || (strcmp(argv[ArgIdx],"--help") == 0))
- {
- PrintUsage(progname);
- return(pFlag->error);
- }
- else if ((strcmp(argv[ArgIdx],"-b") == 0) || (strcmp(argv[ArgIdx],"--keep-bom") == 0))
- pFlag->keep_bom = 1;
- else if ((strcmp(argv[ArgIdx],"-k") == 0) || (strcmp(argv[ArgIdx],"--keepdate") == 0))
- pFlag->KeepDate = 1;
- else if ((strcmp(argv[ArgIdx],"-f") == 0) || (strcmp(argv[ArgIdx],"--force") == 0))
- pFlag->Force = 1;
- else if ((strcmp(argv[ArgIdx],"-s") == 0) || (strcmp(argv[ArgIdx],"--safe") == 0))
- pFlag->Force = 0;
- else if ((strcmp(argv[ArgIdx],"-q") == 0) || (strcmp(argv[ArgIdx],"--quiet") == 0))
- pFlag->Quiet = 1;
- else if ((strcmp(argv[ArgIdx],"-l") == 0) || (strcmp(argv[ArgIdx],"--newline") == 0))
- pFlag->NewLine = 1;
- else if ((strcmp(argv[ArgIdx],"-m") == 0) || (strcmp(argv[ArgIdx],"--add-bom") == 0))
- pFlag->add_bom = 1;
- else if ((strcmp(argv[ArgIdx],"-r") == 0) || (strcmp(argv[ArgIdx],"--remove-bom") == 0))
- {
- pFlag->keep_bom = 0;
- pFlag->add_bom = 0;
- }
- else if ((strcmp(argv[ArgIdx],"-S") == 0) || (strcmp(argv[ArgIdx],"--skip-symlink") == 0))
- pFlag->Follow = SYMLINK_SKIP;
- else if ((strcmp(argv[ArgIdx],"-F") == 0) || (strcmp(argv[ArgIdx],"--follow-symlink") == 0))
- pFlag->Follow = SYMLINK_FOLLOW;
- else if ((strcmp(argv[ArgIdx],"-R") == 0) || (strcmp(argv[ArgIdx],"--replace-symlink") == 0))
- pFlag->Follow = SYMLINK_REPLACE;
- else if ((strcmp(argv[ArgIdx],"-V") == 0) || (strcmp(argv[ArgIdx],"--version") == 0))
- {
- PrintVersion(progname);
-#ifdef ENABLE_NLS
- PrintLocaledir(localedir);
-#endif
- return(pFlag->error);
- }
- else if ((strcmp(argv[ArgIdx],"-L") == 0) || (strcmp(argv[ArgIdx],"--license") == 0))
- {
- PrintLicense();
- return(pFlag->error);
- }
- else if (strcmp(argv[ArgIdx],"-ascii") == 0) /* SunOS compatible options */
- pFlag->ConvMode = CONVMODE_ASCII;
- else if (strcmp(argv[ArgIdx],"-7") == 0)
- pFlag->ConvMode = CONVMODE_7BIT;
- else if (strcmp(argv[ArgIdx],"-iso") == 0)
- {
- pFlag->ConvMode = (int)query_con_codepage();
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr,_("active code page: %d\n"), pFlag->ConvMode);
- }
- if (pFlag->ConvMode < 2)
- pFlag->ConvMode = CONVMODE_437;
- }
- else if (strcmp(argv[ArgIdx],"-437") == 0)
- pFlag->ConvMode = CONVMODE_437;
- else if (strcmp(argv[ArgIdx],"-850") == 0)
- pFlag->ConvMode = CONVMODE_850;
- else if (strcmp(argv[ArgIdx],"-860") == 0)
- pFlag->ConvMode = CONVMODE_860;
- else if (strcmp(argv[ArgIdx],"-863") == 0)
- pFlag->ConvMode = CONVMODE_863;
- else if (strcmp(argv[ArgIdx],"-865") == 0)
- pFlag->ConvMode = CONVMODE_865;
- else if (strcmp(argv[ArgIdx],"-1252") == 0)
- pFlag->ConvMode = CONVMODE_1252;
#ifdef D2U_UNICODE
- else if ((strcmp(argv[ArgIdx],"-ul") == 0) || (strcmp(argv[ArgIdx],"--assume-utf16le") == 0))
- pFlag->ConvMode = CONVMODE_UTF16LE;
- else if ((strcmp(argv[ArgIdx],"-ub") == 0) || (strcmp(argv[ArgIdx],"--assume-utf16be") == 0))
- pFlag->ConvMode = CONVMODE_UTF16BE;
+ return parse_options(argc, argv, pFlag, localedir, progname, PrintLicense, ConvertDosToUnix, ConvertDosToUnixW);
+#else
+ return parse_options(argc, argv, pFlag, localedir, progname, PrintLicense, ConvertDosToUnix);
#endif
- else if ((strcmp(argv[ArgIdx],"-c") == 0) || (strcmp(argv[ArgIdx],"--convmode") == 0))
- {
- if (++ArgIdx < argc)
- {
- if (strcmpi(argv[ArgIdx],"ascii") == 0) /* Benjamin Lin's legacy options */
- pFlag->ConvMode = CONVMODE_ASCII;
- else if (strcmpi(argv[ArgIdx], "7bit") == 0)
- pFlag->ConvMode = CONVMODE_7BIT;
- else if (strcmpi(argv[ArgIdx], "iso") == 0)
- {
- pFlag->ConvMode = (int)query_con_codepage();
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr,_("active code page: %d\n"), pFlag->ConvMode);
- }
- if (pFlag->ConvMode < 2)
- pFlag->ConvMode = CONVMODE_437;
- }
- else if (strcmpi(argv[ArgIdx], "mac") == 0)
- pFlag->FromToMode = FROMTO_MAC2UNIX;
- else
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("invalid %s conversion mode specified\n"),argv[ArgIdx]);
- pFlag->error = 1;
- ShouldExit = 1;
- pFlag->stdio_mode = 0;
- }
- }
- else
- {
- ArgIdx--;
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr,_("option '%s' requires an argument\n"),argv[ArgIdx]);
- pFlag->error = 1;
- ShouldExit = 1;
- pFlag->stdio_mode = 0;
- }
- }
-
- else if ((strcmp(argv[ArgIdx],"-o") == 0) || (strcmp(argv[ArgIdx],"--oldfile") == 0))
- {
- /* last convert not paired */
- if (!CanSwitchFileMode)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("target of file %s not specified in new-file mode\n"), argv[ArgIdx-1]);
- pFlag->error = 1;
- ShouldExit = 1;
- pFlag->stdio_mode = 0;
- }
- pFlag->NewFile = 0;
- }
-
- else if ((strcmp(argv[ArgIdx],"-n") == 0) || (strcmp(argv[ArgIdx],"--newfile") == 0))
- {
- /* last convert not paired */
- if (!CanSwitchFileMode)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("target of file %s not specified in new-file mode\n"), argv[ArgIdx-1]);
- pFlag->error = 1;
- ShouldExit = 1;
- pFlag->stdio_mode = 0;
- }
- pFlag->NewFile = 1;
- }
- else { /* wrong option */
- PrintUsage(progname);
- ShouldExit = 1;
- pFlag->error = 1;
- pFlag->stdio_mode = 0;
- }
- }
- else
- {
- pFlag->stdio_mode = 0;
- /* not an option */
- if (pFlag->NewFile)
- {
- if (CanSwitchFileMode)
- CanSwitchFileMode = 0;
- else
- {
- RetVal = ConvertDosToUnixNewFile(argv[ArgIdx-1], argv[ArgIdx], pFlag, progname);
- if (pFlag->status & NO_REGFILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping %s, not a regular file.\n"), argv[ArgIdx-1]);
- }
- } else if (pFlag->status & OUTPUTFILE_SYMLINK)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping %s, output file %s is a symbolic link.\n"), argv[ArgIdx-1], argv[ArgIdx]);
- }
- } else if (pFlag->status & INPUT_TARGET_NO_REGFILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping symbolic link %s, target is not a regular file.\n"), argv[ArgIdx-1]);
- }
- } else if (pFlag->status & OUTPUT_TARGET_NO_REGFILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping %s, target of symbolic link %s is not a regular file.\n"), argv[ArgIdx-1], argv[ArgIdx]);
- }
- } else if (pFlag->status & BINARY_FILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping binary file %s\n"), argv[ArgIdx-1]);
- }
- } else if (pFlag->status & WRONG_CODEPAGE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("code page %d is not supported.\n"), pFlag->ConvMode);
- }
- } else if (pFlag->status & LOCALE_NOT_UTF8)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping UTF-16 file %s, the current locale character encoding is not UTF-8.\n"), argv[ArgIdx-1]);
- }
- } else if (pFlag->status & WCHAR_T_TOO_SMALL)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping UTF-16 file %s, the size of wchar_t is %d bytes.\n"), argv[ArgIdx-1], (int)sizeof(wchar_t));
- }
- } else if (pFlag->status & UNICODE_CONVERSION_ERROR)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping UTF-16 file %s, an UTF-16 conversion error occurred.\n"), argv[ArgIdx-1]);
- }
- } else {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("converting file %s to file %s in Unix format...\n"), argv[ArgIdx-1], argv[ArgIdx]);
- }
- if (RetVal)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("problems converting file %s to file %s\n"), argv[ArgIdx-1], argv[ArgIdx]);
- }
- }
- }
- CanSwitchFileMode = 1;
- }
- }
- else
- {
- RetVal = ConvertDosToUnixNewFile(argv[ArgIdx], argv[ArgIdx], pFlag, progname);
- if (pFlag->status & NO_REGFILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping %s, not a regular file.\n"), argv[ArgIdx]);
- }
- } else if (pFlag->status & OUTPUTFILE_SYMLINK)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping symbolic link %s.\n"), argv[ArgIdx]);
- }
- } else if (pFlag->status & INPUT_TARGET_NO_REGFILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping symbolic link %s, target is not a regular file.\n"), argv[ArgIdx]);
- }
- } else if (pFlag->status & BINARY_FILE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping binary file %s\n"), argv[ArgIdx]);
- }
- } else if (pFlag->status & WRONG_CODEPAGE)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("code page %d is not supported.\n"), pFlag->ConvMode);
- }
- } else if (pFlag->status & LOCALE_NOT_UTF8)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping UTF-16 file %s, the current locale character encoding is not UTF-8.\n"), argv[ArgIdx]);
- }
- } else if (pFlag->status & WCHAR_T_TOO_SMALL)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping UTF-16 file %s, the size of wchar_t is %d bytes.\n"), argv[ArgIdx], (int)sizeof(wchar_t));
- }
- } else if (pFlag->status & UNICODE_CONVERSION_ERROR)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("Skipping UTF-16 file %s, an UTF-16 conversion error occurred.\n"), argv[ArgIdx]);
- }
- } else {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("converting file %s to Unix format...\n"), argv[ArgIdx]);
- }
- if (RetVal)
- {
- if (!pFlag->Quiet)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("problems converting file %s\n"), argv[ArgIdx]);
- }
- }
- }
- }
- }
- }
-
- /* no file argument, use stdin and stdout */
- if (pFlag->stdio_mode)
- {
- exit(ConvertDosToUnixStdio(pFlag, progname));
- }
-
-
- if (!CanSwitchFileMode)
- {
- fprintf(stderr,"%s: ",progname);
- fprintf(stderr, _("target of file %s not specified in new-file mode\n"), argv[ArgIdx-1]);
- pFlag->error = 1;
- }
- return (pFlag->error);
}