命令简介:
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 ([email protected])
74:
75: * == 1.1 == 1994.12.20 == Benjamin Lin ([email protected])
76:
77: * Cleaned up for Borland C/C++ 4.02
78:
79: * == 1.2 == 1995.03.16 == Benjamin Lin ([email protected])
80:
81: * Modified to more conform to UNIX style.
82:
83: * == 2.0 == 1995.03.19 == Benjamin Lin ([email protected])
84:
85: * Rewritten from scratch.
86:
87: * == 2.1 == 1995.03.29 == Benjamin Lin ([email protected])
88:
89: * Conversion to SunOS charset implemented.
90:
91: * == 2.2 == 1995.03.30 == Benjamin Lin ([email protected])
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, [email protected]
102:
103: * Wed Feb 4 19:12:58 EST 1998
104:
105: *
106:
107: * Added extra newline if ^M occurs
108:
109: * Christian Wurll, [email protected]
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:
技术链接