代码改变世界

Linux命令学习总结:dos2unix - unix2dos

2015-12-26 13:31  潇湘隐者  阅读(91075)  评论(1编辑  收藏  举报

命令简介:

dos2unix是将Windows格式文件转换为Unix、Linux格式的实用命令。Windows格式文件的换行符为\r\n ,而Unix&Linux文件的换行符为\n. dos2unix命令其实就是将文件中的\r\n 转换为\n。

而unix2dos则是和dos2unix互为孪生的一个命令,它是将Linux&Unix格式文件转换为Windows格式文件的命令。

 

命令语法

 

dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...]

unix2dos [options] [-c convmode] [-o file ...] [-n infile outfile ...]

 

命令参数:

此命令参数是Red Hat Enterprise Linux Server release 5.7下dos2unix命令参数,不同版本Linux的dos2nnix命令参数有可能不同。

参数

长参数

描叙

-h

 

显示命令dos2unix联机帮助信息。

-k

 

保持文件时间戳不变

-q

 

静默模式,不输出转换结果信息等

-V

 

显示命令版本信息

-c

 

转换模式

-o

 

在源文件转换,默认参数

-n

 

保留原本的旧档,将转换后的内容输出到新档案.默认都会直接在原来的文件上修改,

 

使用示例:

1: 查看dos2unix命令的帮助信息

[root@DB-Server myscript]# man dos2unix
 
[root@DB-Server myscript]# dos2unix -h
dos2unix Copyright (c) 1994-1995 Benjamin Lin
         Copyright (c) 1998      Bernd Johannes Wuebben (Version 3.0)
         Copyright (c) 1998      Christian Wurll (Version 3.1)
Usage: dos2unix [-hkqV] [-c convmode] [-o file ...] [-n infile outfile ...]
 -h --help        give this help
 -k --keepdate    keep output file date
 -q --quiet       quiet mode, suppress all warnings
                  always on in stdin->stdout mode
 -V --version     display version number
 -c --convmode    conversion mode
 convmode         ASCII, 7bit, ISO, Mac, default to ASCII
 -l --newline     add additional newline in all but Mac convmode
 -o --oldfile     write to old file
 file ...         files to convert in old file mode
 -n --newfile     write to new file
 infile           original file in new file mode
 outfile          output file in new file mode

 

2: dos2unix filename 将Windows格式文本转换为Unix&Linux格式文件

   1: [root@DB-Server myscript]# cat -v test.sh 
   2: . /home/oracle/.bash_profile^M
   3: echo ' '^M
   4: date^M
   5: echo ' '^M
   6: ^M
   7: sqlplus test/test @/home/oracle/scripts/test.sql^M
   8: ^M
   9: echo ' '^M
  10: date^M
  11: echo ' '^M
  12: [root@DB-Server myscript]# dos2unix test.sh 
  13: dos2unix: converting file test.sh to UNIX format ...
  14: [root@DB-Server myscript]# cat -v test.sh 
  15: . /home/oracle/.bash_profile
  16: echo ' '
  17: date
  18: echo ' '
  19:  
  20: sqlplus test/test @/home/oracle/scripts/test.sql
  21:  
  22: echo ' '
  23: date
  24: echo ' '

 

3: dos2unix 可以一次转换多个文件

   1: dos2unix filename1 filename2 filename3

 

4: 默认情况下会在源文件上进行转换,如果需要保留源文件,那么可以使用参数-n dos2unix -n oldfilename newfilename

   1: [root@DB-Server myscript]# dos2unix -n dosfile linuxfile
   2: dos2unix: converting file dosfile to file linuxfile in UNIX format ...
   3: [root@DB-Server myscript]# cat -v dosfile 
   4: it is a windows dos file^M
   5: you should convert to unix&linux format^M
   6: [root@DB-Server myscript]# cat -v linuxfile 
   7: it is a windows dos file
   8: you should convert to unix&linux format
   9: [root@DB-Server myscript]# 

clip_image001

 

5:保持文件时间戳不变

   1: [root@DB-Server myscript]# ls -lrt dosfile 
   2: -rw-r--r-- 1 root root 67 Dec 26 11:46 dosfile
   3: [root@DB-Server myscript]# dos2unix dosfile 
   4: dos2unix: converting file dosfile to UNIX format ...
   5: [root@DB-Server myscript]# ls -lrt dosfile 
   6: -rw-r--r-- 1 root root 65 Dec 26 11:58 dosfile
   7: [root@DB-Server myscript]# dos2unix -k dosfile 
   8: dos2unix: converting file dosfile to UNIX format ...
   9: [root@DB-Server myscript]# ls -lrt dosfile 
  10: -rw-r--r-- 1 root root 65 Dec 26 11:58 dosfile

6:静默模式格式化文件

   1: [root@DB-Server myscript]# unix2dos -q dosfile 
   2:  
   3: [root@DB-Server myscript]# 

dos2unix的下载地址为http://sourceforge.net/projects/dos2unix/ ,可以从上面下载最新版本的dos2unix、unix2dos等命令工具以及相关文档,dos2unix的源码如下所示

   1: /*
   2: 
   3: *  Name: dos2unix
   4: 
   5: *  Documentation:
   6: 
   7: *    Remove cr ('\x0d') characters from a file.
   8: 
   9: *
  10: 
  11: *  The dos2unix package is distributed under FreeBSD style license.
  12: 
  13: *  See also http://www.freebsd.org/copyright/freebsd-license.html
  14: 
  15: *  --------
  16: 
  17: *
  18: 
  19: *  Copyright (C) 2009-2015 Erwin Waterlander
  20: 
  21: *  Copyright (C) 1998 Christian Wurll
  22: 
  23: *  Copyright (C) 1998 Bernd Johannes Wuebben
  24: 
  25: *  Copyright (C) 1994-1995 Benjamin Lin.
  26: 
  27: *  All rights reserved.
  28: 
  29: *
  30: 
  31: *  Redistribution and use in source and binary forms, with or without
  32: 
  33: *  modification, are permitted provided that the following conditions
  34: 
  35: *  are met:
  36: 
  37: *  1. Redistributions of source code must retain the above copyright
  38: 
  39: *     notice, this list of conditions and the following disclaimer.
  40: 
  41: *  2. Redistributions in binary form must reproduce the above copyright
  42: 
  43: *     notice in the documentation and/or other materials provided with
  44: 
  45: *     the distribution.
  46: 
  47: *
  48: 
  49: *  THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
  50: 
  51: *  EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  52: 
  53: *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
  54: 
  55: *  PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR BE LIABLE
  56: 
  57: *  FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
  58: 
  59: *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
  60: 
  61: *  OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
  62: 
  63: *  BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
  64: 
  65: *  WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
  66: 
  67: *  OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
  68: 
  69: *  IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  70: 
  71: *
  72: 
  73: *  == 1.0 == 1989.10.04 == John Birchfield (jb@koko.csustan.edu)
  74: 
  75: *  == 1.1 == 1994.12.20 == Benjamin Lin (blin@socs.uts.edu.au)
  76: 
  77: *     Cleaned up for Borland C/C++ 4.02
  78: 
  79: *  == 1.2 == 1995.03.16 == Benjamin Lin (blin@socs.uts.edu.au)
  80: 
  81: *     Modified to more conform to UNIX style.
  82: 
  83: *  == 2.0 == 1995.03.19 == Benjamin Lin (blin@socs.uts.edu.au)
  84: 
  85: *     Rewritten from scratch.
  86: 
  87: *  == 2.1 == 1995.03.29 == Benjamin Lin (blin@socs.uts.edu.au)
  88: 
  89: *     Conversion to SunOS charset implemented.
  90: 
  91: *  == 2.2 == 1995.03.30 == Benjamin Lin (blin@socs.uts.edu.au)
  92: 
  93: *     Fixed a bug in 2.1 where in new-file mode, if outfile already exists
  94: 
  95: *     conversion can not be completed properly.
  96: 
  97: *
  98: 
  99: * Added Mac text file translation, i.e. \r to \n conversion
 100: 
 101: * Bernd Johannes Wuebben, wuebben@kde.org
 102: 
 103: * Wed Feb  4 19:12:58 EST 1998
 104: 
 105: *
 106: 
 107: * Added extra newline if ^M occurs
 108: 
 109: * Christian Wurll, wurll@ira.uka.de
 110: 
 111: * Thu Nov 19 1998
 112: 
 113: *
 114: 
 115: *  See ChangeLog.txt for complete version history.
 116: 
 117: *
 118: 
 119: */
 120:  
 121:  
 122:  
 123: /* #define DEBUG 1 */
 124:  
 125: #define __DOS2UNIX_C
 126:  
 127:  
 128: #include "common.h"
 129:  
 130: #include "dos2unix.h"
 131:  
 132: # if (defined(_WIN32) && !defined(__CYGWIN__))
 133:  
 134: #include <windows.h>
 135:  
 136: #endif
 137:  
 138: #ifdef D2U_UNICODE
 139:  
 140: #if !defined(__MSDOS__) && !defined(_WIN32) && !defined(__OS2__)  /* Unix, Cygwin */
 141:  
 142: # include <langinfo.h>
 143:  
 144: #endif
 145:  
 146: #endif
 147:  
 148:  
 149: void PrintLicense(void)
 150:  
 151: {
 152:  
 153: printf("%s", _("\
 154:  
 155: Copyright (C) 2009-2015 Erwin Waterlander\n\
 156:  
 157: Copyright (C) 1998      Christian Wurll (Version 3.1)\n\
 158:  
 159: Copyright (C) 1998      Bernd Johannes Wuebben (Version 3.0)\n\
 160:  
 161: Copyright (C) 1994-1995 Benjamin Lin\n\
 162:  
 163: All rights reserved.\n\n"));
 164:  
 165: PrintBSDLicense();
 166:  
 167: }
 168:  
 169:  
 170: #ifdef D2U_UNICODE
 171:  
 172: wint_t StripDelimiterW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, wint_t CurChar, unsigned int *converted, const char *progname)
 173:  
 174: {
 175:  
 176: wint_t TempNextChar;
 177:  
 178: /* CurChar is always CR (x0d) */
 179:  
 180: /* In normal dos2unix mode put nothing (skip CR). */
 181:  
 182: /* Don't modify Mac files when in dos2unix mode. */
 183:  
 184: if ( (TempNextChar = d2u_getwc(ipInF, ipFlag->bomtype)) != WEOF) {
 185:  
 186: if (d2u_ungetwc( TempNextChar, ipInF, ipFlag->bomtype) == WEOF) {  /* put back peek char */
 187:  
 188: d2u_getc_error(ipFlag,progname);
 189:  
 190: return WEOF;
 191:  
 192: }
 193:  
 194: if ( TempNextChar != 0x0a ) {
 195:  
 196: if (d2u_putwc(CurChar, ipOutF, ipFlag, progname) == WEOF) {  /* Mac line, put CR */
 197:  
 198: d2u_putwc_error(ipFlag,progname);
 199:  
 200: return WEOF;
 201:  
 202: }
 203:  
 204: } else {
 205:  
 206: (*converted)++;
 207:  
 208: if (ipFlag->NewLine) {  /* add additional LF? */
 209:  
 210: if (d2u_putwc(0x0a, ipOutF, ipFlag, progname) == WEOF) {
 211:  
 212: d2u_putwc_error(ipFlag,progname);
 213:  
 214: return WEOF;
 215:  
 216: }
 217:  
 218: }
 219:  
 220: }
 221:  
 222: } else {
 223:  
 224: if (ferror(ipInF)) {
 225:  
 226: d2u_getc_error(ipFlag,progname);
 227:  
 228: return WEOF;
 229:  
 230: }
 231:  
 232: if ( CurChar == 0x0d ) {  /* EOF: last Mac line delimiter (CR)? */
 233:  
 234: if (d2u_putwc(CurChar, ipOutF, ipFlag, progname) == WEOF) {
 235:  
 236: d2u_putwc_error(ipFlag,progname);
 237:  
 238: return WEOF;
 239:  
 240: }
 241:  
 242: }
 243:  
 244: }
 245:  
 246: return CurChar;
 247:  
 248: }
 249:  
 250: #endif
 251:  
 252:  
 253: /* CUR        NEXT
 254: 
 255: 0xd(CR)    0xa(LF)  => put LF if option -l was used
 256: 
 257: 0xd(CR)  ! 0xa(LF)  => put CR
 258: 
 259: 0xd(CR)    EOF      => put CR
 260: 
 261: */
 262:  
 263: int StripDelimiter(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, int CurChar, unsigned int *converted, const char *progname)
 264:  
 265: {
 266:  
 267: int TempNextChar;
 268:  
 269: /* CurChar is always CR (x0d) */
 270:  
 271: /* In normal dos2unix mode put nothing (skip CR). */
 272:  
 273: /* Don't modify Mac files when in dos2unix mode. */
 274:  
 275: if ( (TempNextChar = fgetc(ipInF)) != EOF) {
 276:  
 277: if (ungetc( TempNextChar, ipInF ) == EOF) { /* put back peek char */
 278:  
 279: d2u_getc_error(ipFlag,progname);
 280:  
 281: return EOF;
 282:  
 283: }
 284:  
 285: if ( TempNextChar != '\x0a' ) {
 286:  
 287: if (fputc( CurChar, ipOutF ) == EOF) { /* Mac line, put CR */
 288:  
 289: d2u_putc_error(ipFlag,progname);
 290:  
 291: return EOF;
 292:  
 293: }
 294:  
 295: } else {
 296:  
 297: (*converted)++;
 298:  
 299: if (ipFlag->NewLine) {  /* add additional LF? */
 300:  
 301: if (fputc('\x0a', ipOutF) == EOF) {
 302:  
 303: d2u_putc_error(ipFlag,progname);
 304:  
 305: return EOF;
 306:  
 307: }
 308:  
 309: }
 310:  
 311: }
 312:  
 313: } else {
 314:  
 315: if (ferror(ipInF)) {
 316:  
 317: d2u_getc_error(ipFlag,progname);
 318:  
 319: return EOF;
 320:  
 321: }
 322:  
 323: if ( CurChar == '\x0d' ) {  /* EOF: last Mac line delimiter (CR)? */
 324:  
 325: if (fputc( CurChar, ipOutF ) == EOF) {
 326:  
 327: d2u_putc_error(ipFlag,progname);
 328:  
 329: return EOF;
 330:  
 331: }
 332:  
 333: }
 334:  
 335: }
 336:  
 337: return CurChar;
 338:  
 339: }
 340:  
 341:  
 342: /* converts stream ipInF to UNIX format text and write to stream ipOutF
 343: 
 344: * RetVal: 0  if success
 345: 
 346: *         -1  otherwise
 347: 
 348: */
 349:  
 350: #ifdef D2U_UNICODE
 351:  
 352: int ConvertDosToUnixW(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, const char *progname)
 353:  
 354: {
 355:  
 356: int RetVal = 0;
 357:  
 358: wint_t TempChar;
 359:  
 360: wint_t TempNextChar;
 361:  
 362: unsigned int line_nr = 1;
 363:  
 364: unsigned int converted = 0;
 365:  
 366:  
 367: ipFlag->status = 0;
 368:  
 369:  
 370: /* CR-LF -> LF */
 371:  
 372: /* LF    -> LF, in case the input file is a Unix text file */
 373:  
 374: /* CR    -> CR, in dos2unix mode (don't modify Mac file) */
 375:  
 376: /* CR    -> LF, in Mac mode */
 377:  
 378: /* \x0a = Newline/Line Feed (LF) */
 379:  
 380: /* \x0d = Carriage Return (CR) */
 381:  
 382:  
 383: switch (ipFlag->FromToMode)
 384:  
 385: {
 386:  
 387: case FROMTO_DOS2UNIX: /* dos2unix */
 388:  
 389: while ((TempChar = d2u_getwc(ipInF, ipFlag->bomtype)) != WEOF) {  /* get character */
 390:  
 391: if ((ipFlag->Force == 0) &&
 392:  
 393: (TempChar < 32) &&
 394:  
 395: (TempChar != 0x0a) &&  /* Not an LF */
 396:  
 397: (TempChar != 0x0d) &&  /* Not a CR */
 398:  
 399: (TempChar != 0x09) &&  /* Not a TAB */
 400:  
 401: (TempChar != 0x0c)) {  /* Not a form feed */
 402:  
 403: RetVal = -1;
 404:  
 405: ipFlag->status |= BINARY_FILE ;
 406:  
 407: if (ipFlag->verbose) {
 408:  
 409: if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
 410:  
 411: d2u_fprintf(stderr, "%s: ", progname);
 412:  
 413: d2u_fprintf(stderr, _("Binary symbol 0x00%02X found at line %u\n"),TempChar, line_nr);
 414:  
 415: }
 416:  
 417: break;
 418:  
 419: }
 420:  
 421: if (TempChar != 0x0d) {
 422:  
 423: if (TempChar == 0x0a) /* Count all DOS and Unix line breaks */
 424:  
 425: ++line_nr;
 426:  
 427: if (d2u_putwc(TempChar, ipOutF, ipFlag, progname) == WEOF) {
 428:  
 429: RetVal = -1;
 430:  
 431: d2u_putwc_error(ipFlag,progname);
 432:  
 433: break;
 434:  
 435: }
 436:  
 437: } else {
 438:  
 439: if (StripDelimiterW( ipInF, ipOutF, ipFlag, TempChar, &converted, progname) == WEOF) {
 440:  
 441: RetVal = -1;
 442:  
 443: break;
 444:  
 445: }
 446:  
 447: }
 448:  
 449: }
 450:  
 451: if ((TempChar == WEOF) && ferror(ipInF)) {
 452:  
 453: RetVal = -1;
 454:  
 455: d2u_getc_error(ipFlag,progname);
 456:  
 457: }
 458:  
 459: break;
 460:  
 461: case FROMTO_MAC2UNIX: /* mac2unix */
 462:  
 463: while ((TempChar = d2u_getwc(ipInF, ipFlag->bomtype)) != WEOF) {
 464:  
 465: if ((ipFlag->Force == 0) &&
 466:  
 467: (TempChar < 32) &&
 468:  
 469: (TempChar != 0x0a) &&  /* Not an LF */
 470:  
 471: (TempChar != 0x0d) &&  /* Not a CR */
 472:  
 473: (TempChar != 0x09) &&  /* Not a TAB */
 474:  
 475: (TempChar != 0x0c)) {  /* Not a form feed */
 476:  
 477: RetVal = -1;
 478:  
 479: ipFlag->status |= BINARY_FILE ;
 480:  
 481: if (ipFlag->verbose) {
 482:  
 483: if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
 484:  
 485: d2u_fprintf(stderr, "%s: ", progname);
 486:  
 487: d2u_fprintf(stderr, _("Binary symbol 0x00%02X found at line %u\n"), TempChar, line_nr);
 488:  
 489: }
 490:  
 491: break;
 492:  
 493: }
 494:  
 495: if ((TempChar != 0x0d)) {
 496:  
 497: if (TempChar == 0x0a) /* Count all DOS and Unix line breaks */
 498:  
 499: ++line_nr;
 500:  
 501: if(d2u_putwc(TempChar, ipOutF, ipFlag, progname) == WEOF) {
 502:  
 503: RetVal = -1;
 504:  
 505: d2u_putwc_error(ipFlag,progname);
 506:  
 507: break;
 508:  
 509: }
 510:  
 511: }
 512:  
 513: else{
 514:  
 515: /* TempChar is a CR */
 516:  
 517: if ( (TempNextChar = d2u_getwc(ipInF, ipFlag->bomtype)) != WEOF) {
 518:  
 519: if (d2u_ungetwc( TempNextChar, ipInF, ipFlag->bomtype) == WEOF) {  /* put back peek char */
 520:  
 521: d2u_getc_error(ipFlag,progname);
 522:  
 523: RetVal = -1;
 524:  
 525: break;
 526:  
 527: }
 528:  
 529: /* Don't touch this delimiter if it's a CR,LF pair. */
 530:  
 531: if ( TempNextChar == 0x0a ) {
 532:  
 533: if (d2u_putwc(0x0d, ipOutF, ipFlag, progname) == WEOF) { /* put CR, part of DOS CR-LF */
 534:  
 535: d2u_putwc_error(ipFlag,progname);
 536:  
 537: RetVal = -1;
 538:  
 539: break;
 540:  
 541: }
 542:  
 543: continue;
 544:  
 545: }
 546:  
 547: }
 548:  
 549: if (d2u_putwc(0x0a, ipOutF, ipFlag, progname) == WEOF) { /* MAC line end (CR). Put LF */
 550:  
 551: RetVal = -1;
 552:  
 553: d2u_putwc_error(ipFlag,progname);
 554:  
 555: break;
 556:  
 557: }
 558:  
 559: converted++;
 560:  
 561: line_nr++; /* Count all Mac line breaks */
 562:  
 563: if (ipFlag->NewLine) {  /* add additional LF? */
 564:  
 565: if (d2u_putwc(0x0a, ipOutF, ipFlag, progname) == WEOF) {
 566:  
 567: RetVal = -1;
 568:  
 569: d2u_putwc_error(ipFlag,progname);
 570:  
 571: break;
 572:  
 573: }
 574:  
 575: }
 576:  
 577: }
 578:  
 579: }
 580:  
 581: if ((TempChar == WEOF) && ferror(ipInF)) {
 582:  
 583: RetVal = -1;
 584:  
 585: d2u_getc_error(ipFlag,progname);
 586:  
 587: }
 588:  
 589: break;
 590:  
 591: default: /* unknown FromToMode */
 592:  
 593: ;
 594:  
 595: #if DEBUG
 596:  
 597: d2u_fprintf(stderr, "%s: ", progname);
 598:  
 599: d2u_fprintf(stderr, _("program error, invalid conversion mode %d\n"),ipFlag->FromToMode);
 600:  
 601: exit(1);
 602:  
 603: #endif
 604:  
 605: }
 606:  
 607: if (ipFlag->status & UNICODE_CONVERSION_ERROR)
 608:  
 609: ipFlag->line_nr = line_nr;
 610:  
 611: if ((RetVal == 0) && (ipFlag->verbose > 1)) {
 612:  
 613: d2u_fprintf(stderr, "%s: ", progname);
 614:  
 615: d2u_fprintf(stderr, _("Converted %u out of %u line breaks.\n"), converted, line_nr -1);
 616:  
 617: }
 618:  
 619: return RetVal;
 620:  
 621: }
 622:  
 623: #endif
 624:  
 625:  
 626: /* converts stream ipInF to UNIX format text and write to stream ipOutF
 627: 
 628: * RetVal: 0  if success
 629: 
 630: *         -1  otherwise
 631: 
 632: */
 633:  
 634: int ConvertDosToUnix(FILE* ipInF, FILE* ipOutF, CFlag *ipFlag, const char *progname)
 635:  
 636: {
 637:  
 638: int RetVal = 0;
 639:  
 640: int TempChar;
 641:  
 642: int TempNextChar;
 643:  
 644: int *ConvTable;
 645:  
 646: unsigned int line_nr = 1;
 647:  
 648: unsigned int converted = 0;
 649:  
 650:  
 651: ipFlag->status = 0;
 652:  
 653:  
 654: switch (ipFlag->ConvMode) {
 655:  
 656: case CONVMODE_ASCII: /* ascii */
 657:  
 658: case CONVMODE_UTF16LE: /* Assume UTF-16LE, bomtype = FILE_UTF8 or GB18030 */
 659:  
 660: case CONVMODE_UTF16BE: /* Assume UTF-16BE, bomtype = FILE_UTF8 or GB18030 */
 661:  
 662: ConvTable = D2UAsciiTable;
 663:  
 664: break;
 665:  
 666: case CONVMODE_7BIT: /* 7bit */
 667:  
 668: ConvTable = D2U7BitTable;
 669:  
 670: break;
 671:  
 672: case CONVMODE_437: /* iso */
 673:  
 674: ConvTable = D2UIso437Table;
 675:  
 676: break;
 677:  
 678: case CONVMODE_850: /* iso */
 679:  
 680: ConvTable = D2UIso850Table;
 681:  
 682: break;
 683:  
 684: case CONVMODE_860: /* iso */
 685:  
 686: ConvTable = D2UIso860Table;
 687:  
 688: break;
 689:  
 690: case CONVMODE_863: /* iso */
 691:  
 692: ConvTable = D2UIso863Table;
 693:  
 694: break;
 695:  
 696: case CONVMODE_865: /* iso */
 697:  
 698: ConvTable = D2UIso865Table;
 699:  
 700: break;
 701:  
 702: case CONVMODE_1252: /* iso */
 703:  
 704: ConvTable = D2UIso1252Table;
 705:  
 706: break;
 707:  
 708: default: /* unknown convmode */
 709:  
 710: ipFlag->status |= WRONG_CODEPAGE ;
 711:  
 712: return(-1);
 713:  
 714: }
 715:  
 716: /* Turn off ISO and 7-bit conversion for Unicode text files */
 717:  
 718: if (ipFlag->bomtype > 0)
 719:  
 720: ConvTable = D2UAsciiTable;
 721:  
 722:  
 723: if ((ipFlag->ConvMode > CONVMODE_7BIT) && (ipFlag->verbose)) { /* not ascii or 7bit */
 724:  
 725: d2u_fprintf(stderr, "%s: ", progname);
 726:  
 727: d2u_fprintf(stderr, _("using code page %d.\n"), ipFlag->ConvMode);
 728:  
 729: }
 730:  
 731:  
 732: /* CR-LF -> LF */
 733:  
 734: /* LF    -> LF, in case the input file is a Unix text file */
 735:  
 736: /* CR    -> CR, in dos2unix mode (don't modify Mac file) */
 737:  
 738: /* CR    -> LF, in Mac mode */
 739:  
 740: /* \x0a = Newline/Line Feed (LF) */
 741:  
 742: /* \x0d = Carriage Return (CR) */
 743:  
 744:  
 745: switch (ipFlag->FromToMode) {
 746:  
 747: case FROMTO_DOS2UNIX: /* dos2unix */
 748:  
 749: while ((TempChar = fgetc(ipInF)) != EOF) {  /* get character */
 750:  
 751: if ((ipFlag->Force == 0) &&
 752:  
 753: (TempChar < 32) &&
 754:  
 755: (TempChar != '\x0a') &&  /* Not an LF */
 756:  
 757: (TempChar != '\x0d') &&  /* Not a CR */
 758:  
 759: (TempChar != '\x09') &&  /* Not a TAB */
 760:  
 761: (TempChar != '\x0c')) {  /* Not a form feed */
 762:  
 763: RetVal = -1;
 764:  
 765: ipFlag->status |= BINARY_FILE ;
 766:  
 767: if (ipFlag->verbose) {
 768:  
 769: if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
 770:  
 771: d2u_fprintf(stderr, "%s: ", progname);
 772:  
 773: d2u_fprintf(stderr, _("Binary symbol 0x%02X found at line %u\n"),TempChar, line_nr);
 774:  
 775: }
 776:  
 777: break;
 778:  
 779: }
 780:  
 781: if (TempChar != '\x0d') {
 782:  
 783: if (TempChar == '\x0a') /* Count all DOS and Unix line breaks */
 784:  
 785: ++line_nr;
 786:  
 787: if (fputc(ConvTable[TempChar], ipOutF) == EOF) {
 788:  
 789: RetVal = -1;
 790:  
 791: d2u_putc_error(ipFlag,progname);
 792:  
 793: break;
 794:  
 795: }
 796:  
 797: } else {
 798:  
 799: if (StripDelimiter( ipInF, ipOutF, ipFlag, TempChar, &converted, progname) == EOF) {
 800:  
 801: RetVal = -1;
 802:  
 803: break;
 804:  
 805: }
 806:  
 807: }
 808:  
 809: }
 810:  
 811: if ((TempChar == EOF) && ferror(ipInF)) {
 812:  
 813: RetVal = -1;
 814:  
 815: d2u_getc_error(ipFlag,progname);
 816:  
 817: }
 818:  
 819: break;
 820:  
 821: case FROMTO_MAC2UNIX: /* mac2unix */
 822:  
 823: while ((TempChar = fgetc(ipInF)) != EOF) {
 824:  
 825: if ((ipFlag->Force == 0) &&
 826:  
 827: (TempChar < 32) &&
 828:  
 829: (TempChar != '\x0a') &&  /* Not an LF */
 830:  
 831: (TempChar != '\x0d') &&  /* Not a CR */
 832:  
 833: (TempChar != '\x09') &&  /* Not a TAB */
 834:  
 835: (TempChar != '\x0c')) {  /* Not a form feed */
 836:  
 837: RetVal = -1;
 838:  
 839: ipFlag->status |= BINARY_FILE ;
 840:  
 841: if (ipFlag->verbose) {
 842:  
 843: if ((ipFlag->stdio_mode) && (!ipFlag->error)) ipFlag->error = 1;
 844:  
 845: d2u_fprintf(stderr, "%s: ", progname);
 846:  
 847: d2u_fprintf(stderr, _("Binary symbol 0x%02X found at line %u\n"),TempChar, line_nr);
 848:  
 849: }
 850:  
 851: break;
 852:  
 853: }
 854:  
 855: if ((TempChar != '\x0d')) {
 856:  
 857: if (TempChar == '\x0a') /* Count all DOS and Unix line breaks */
 858:  
 859: ++line_nr;
 860:  
 861: if(fputc(ConvTable[TempChar], ipOutF) == EOF) {
 862:  
 863: RetVal = -1;
 864:  
 865: d2u_putc_error(ipFlag,progname);
 866:  
 867: break;
 868:  
 869: }
 870:  
 871: }
 872:  
 873: else{
 874:  
 875: /* TempChar is a CR */
 876:  
 877: if ( (TempNextChar = fgetc(ipInF)) != EOF) {
 878:  
 879: if (ungetc( TempNextChar, ipInF ) == EOF) {  /* put back peek char */
 880:  
 881: d2u_getc_error(ipFlag,progname);
 882:  
 883: RetVal = -1;
 884:  
 885: break;
 886:  
 887: }
 888:  
 889: /* Don't touch this delimiter if it's a CR,LF pair. */
 890:  
 891: if ( TempNextChar == '\x0a' ) {
 892:  
 893: if (fputc('\x0d', ipOutF) == EOF) { /* put CR, part of DOS CR-LF */
 894:  
 895: RetVal = -1;
 896:  
 897: d2u_putc_error(ipFlag,progname);
 898:  
 899: break;
 900:  
 901: }
 902:  
 903: continue;
 904:  
 905: }
 906:  
 907: }
 908:  
 909: if (fputc('\x0a', ipOutF) == EOF) { /* MAC line end (CR). Put LF */
 910:  
 911: RetVal = -1;
 912:  
 913: d2u_putc_error(ipFlag,progname);
 914:  
 915: break;
 916:  
 917: }
 918:  
 919: converted++;
 920:  
 921: line_nr++; /* Count all Mac line breaks */
 922:  
 923: if (ipFlag->NewLine) {  /* add additional LF? */
 924:  
 925: if (fputc('\x0a', ipOutF) == EOF) {
 926:  
 927: RetVal = -1;
 928:  
 929: d2u_putc_error(ipFlag,progname);
 930:  
 931: break;
 932:  
 933: }
 934:  
 935: }
 936:  
 937: }
 938:  
 939: }
 940:  
 941: if ((TempChar == EOF) && ferror(ipInF)) {
 942:  
 943: RetVal = -1;
 944:  
 945: d2u_getc_error(ipFlag,progname);
 946:  
 947: }
 948:  
 949: break;
 950:  
 951: default: /* unknown FromToMode */
 952:  
 953: ;
 954:  
 955: #if DEBUG
 956:  
 957: d2u_fprintf(stderr, "%s: ", progname);
 958:  
 959: d2u_fprintf(stderr, _("program error, invalid conversion mode %d\n"),ipFlag->FromToMode);
 960:  
 961: exit(1);
 962:  
 963: #endif
 964:  
 965: }
 966:  
 967: if ((RetVal == 0) && (ipFlag->verbose > 1)) {
 968:  
 969: d2u_fprintf(stderr, "%s: ", progname);
 970:  
 971: d2u_fprintf(stderr, _("Converted %u out of %u line breaks.\n"),converted, line_nr -1);
 972:  
 973: }
 974:  
 975: return RetVal;
 976:  
 977: }
 978:  
 979:  
 980:  
 981: int main (int argc, char *argv[])
 982:  
 983: {
 984:  
 985: /* variable declarations */
 986:  
 987: char progname[9];
 988:  
 989: CFlag *pFlag;
 990:  
 991: char *ptr;
 992:  
 993: char localedir[1024];
 994:  
 995: # ifdef __MINGW64__
 996:  
 997: int _dowildcard = -1; /* enable wildcard expansion for Win64 */
 998:  
 999: # endif
1000:  
1001: int  argc_new;
1002:  
1003: char **argv_new;
1004:  
1005:  
1006: progname[8] = '\0';
1007:  
1008: strcpy(progname,"dos2unix");
1009:  
1010:  
1011: #ifdef ENABLE_NLS
1012:  
1013: ptr = getenv("DOS2UNIX_LOCALEDIR");
1014:  
1015: if (ptr == NULL)
1016:  
1017: strcpy(localedir,LOCALEDIR);
1018:  
1019: else {
1020:  
1021: if (strlen(ptr) < sizeof(localedir))
1022:  
1023: strcpy(localedir,ptr);
1024:  
1025: else {
1026:  
1027: d2u_fprintf(stderr,"%s: ",progname);
1028:  
1029: d2u_ansi_fprintf(stderr, "%s", _("error: Value of environment variable DOS2UNIX_LOCALEDIR is too long.\n"));
1030:  
1031: strcpy(localedir,LOCALEDIR);
1032:  
1033: }
1034:  
1035: }
1036:  
1037: #endif
1038:  
1039:  
1040: #if defined(ENABLE_NLS) || (defined(D2U_UNICODE) && !defined(__MSDOS__) && !defined(_WIN32) && !defined(__OS2__))
1041:  
1042: /* setlocale() is also needed for nl_langinfo() */
1043:  
1044: setlocale (LC_ALL, "");
1045:  
1046: #endif
1047:  
1048:  
1049: #ifdef ENABLE_NLS
1050:  
1051: bindtextdomain (PACKAGE, localedir);
1052:  
1053: textdomain (PACKAGE);
1054:  
1055: #endif
1056:  
1057:  
1058:  
1059: /* variable initialisations */
1060:  
1061: pFlag = (CFlag*)malloc(sizeof(CFlag));
1062:  
1063: if (pFlag == NULL) {
1064:  
1065: d2u_fprintf(stderr, "dos2unix:");
1066:  
1067: d2u_ansi_fprintf(stderr, " %s\n", strerror(errno));
1068:  
1069: return errno;
1070:  
1071: }
1072:  
1073: pFlag->FromToMode = FROMTO_DOS2UNIX;  /* default dos2unix */
1074:  
1075: pFlag->keep_bom = 0;
1076:  
1077:  
1078: if ( ((ptr=strrchr(argv[0],'/')) == NULL) && ((ptr=strrchr(argv[0],'\\')) == NULL) )
1079:  
1080: ptr = argv[0];
1081:  
1082: else
1083:  
1084: ptr++;
1085:  
1086:  
1087: if ((strcmpi("mac2unix", ptr) == 0) || (strcmpi("mac2unix.exe", ptr) == 0)) {
1088:  
1089: pFlag->FromToMode = FROMTO_MAC2UNIX;
1090:  
1091: strcpy(progname,"mac2unix");
1092:  
1093: }
1094:  
1095:  
1096: #ifdef D2U_UNIFILE
1097:  
1098: /* Get arguments in wide Unicode format in the Windows Command Prompt */
1099:  
1100: wchar_t **wargv;
1101:  
1102: char ***argv_glob;
1103:  
1104:  
1105: /* This does not support wildcard expansion (globbing) */
1106:  
1107: wargv = CommandLineToArgvW(GetCommandLineW(), &argc);
1108:  
1109:  
1110: argv_glob = (char ***)malloc(sizeof(char***));
1111:  
1112: if (argv_glob == NULL) {
1113:  
1114: d2u_fprintf(stderr, "%s:", progname);
1115:  
1116: d2u_ansi_fprintf(stderr, " %s\n", strerror(errno));
1117:  
1118: return errno;
1119:  
1120: }
1121:  
1122: /* Glob the arguments and convert them to UTF-8 */
1123:  
1124: argc_new = glob_warg(argc, wargv, argv_glob, pFlag, progname);
1125:  
1126: argv_new = *argv_glob;
1127:  
1128: #else  
1129:  
1130: argc_new = argc;
1131:  
1132: argv_new = argv;
1133:  
1134: #endif
1135:  
1136:  
1137: #ifdef D2U_UNICODE
1138:  
1139: return parse_options(argc_new, argv_new, pFlag, localedir, progname, PrintLicense, ConvertDosToUnix, ConvertDosToUnixW);
1140:  
1141: #else
1142:  
1143: return parse_options(argc_new, argv_new, pFlag, localedir, progname, PrintLicense, ConvertDosToUnix);
1144:  
1145: #endif
1146:  
1147: }
1148: