diff options
Diffstat (limited to 'dos2unix.c')
-rw-r--r-- | dos2unix.c | 905 |
1 files changed, 72 insertions, 833 deletions
@@ -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); } |