diff options
author | josh.macdonald <jmacd@users.noreply.github.com> | 2006-12-16 08:38:32 +0000 |
---|---|---|
committer | josh.macdonald <jmacd@users.noreply.github.com> | 2006-12-16 08:38:32 +0000 |
commit | cfa42a075b9af0c213c0b27707b3ab8b2a45acac (patch) | |
tree | fdbdf6358316d82c6de15b5760c0a42264ba51b4 /xdelta3/xdelta3-main.h | |
parent | 45bc1408336abd3b7bb0e2ee6fdcb44bca759bbf (diff) |
Diffstat (limited to 'xdelta3/xdelta3-main.h')
-rwxr-xr-x | xdelta3/xdelta3-main.h | 90 |
1 files changed, 77 insertions, 13 deletions
diff --git a/xdelta3/xdelta3-main.h b/xdelta3/xdelta3-main.h index e89fc92..1eb6516 100755 --- a/xdelta3/xdelta3-main.h +++ b/xdelta3/xdelta3-main.h | |||
@@ -55,6 +55,9 @@ | |||
55 | #ifndef XD3_STDIO | 55 | #ifndef XD3_STDIO |
56 | #define XD3_STDIO 0 | 56 | #define XD3_STDIO 0 |
57 | #endif | 57 | #endif |
58 | #ifndef XD3_WIN32 | ||
59 | #define XD3_WIN32 0 | ||
60 | #endif | ||
58 | 61 | ||
59 | /* XPRINTX (used by main) prefixes an "xdelta3: " to the output. */ | 62 | /* XPRINTX (used by main) prefixes an "xdelta3: " to the output. */ |
60 | #define XPR fprintf | 63 | #define XPR fprintf |
@@ -64,7 +67,7 @@ | |||
64 | #define UT vcout, | 67 | #define UT vcout, |
65 | 68 | ||
66 | /* If none are set, default to posix. */ | 69 | /* If none are set, default to posix. */ |
67 | #if (XD3_POSIX + XD3_STDIO) == 0 | 70 | #if (XD3_POSIX + XD3_STDIO + XD3_WIN32) == 0 |
68 | #undef XD3_POSIX | 71 | #undef XD3_POSIX |
69 | #define XD3_POSIX 1 | 72 | #define XD3_POSIX 1 |
70 | #endif | 73 | #endif |
@@ -106,11 +109,11 @@ | |||
106 | # define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff) | 109 | # define WEXITSTATUS(stat) (((*((int *) &(stat))) >> 8) & 0xff) |
107 | #endif | 110 | #endif |
108 | #ifndef S_ISREG | 111 | #ifndef S_ISREG |
109 | # ifdef S_IFREG | 112 | //# ifdef S_IFREG |
110 | # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) | 113 | //# define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) |
111 | # else | 114 | //# else |
112 | # define S_ISREG(m) 1 | 115 | # define S_ISREG(m) 1 |
113 | # endif | 116 | //# endif |
114 | #endif /* !S_ISREG */ | 117 | #endif /* !S_ISREG */ |
115 | #endif | 118 | #endif |
116 | 119 | ||
@@ -181,6 +184,8 @@ struct _main_file | |||
181 | FILE *file; | 184 | FILE *file; |
182 | #elif XD3_POSIX | 185 | #elif XD3_POSIX |
183 | int file; | 186 | int file; |
187 | #elif XD3_WIN32 | ||
188 | HANDLE file; | ||
184 | #endif | 189 | #endif |
185 | 190 | ||
186 | int mode; /* XO_READ and XO_WRITE */ | 191 | int mode; /* XO_READ and XO_WRITE */ |
@@ -340,8 +345,10 @@ main_config (void) | |||
340 | P(RINT "XD3_ENCODER=%d\n", XD3_ENCODER); | 345 | P(RINT "XD3_ENCODER=%d\n", XD3_ENCODER); |
341 | P(RINT "XD3_HARDMAXWINSIZE=%d\n", XD3_HARDMAXWINSIZE); | 346 | P(RINT "XD3_HARDMAXWINSIZE=%d\n", XD3_HARDMAXWINSIZE); |
342 | P(RINT "XD3_NODECOMPRESSSIZE=%d\n", XD3_NODECOMPRESSSIZE); | 347 | P(RINT "XD3_NODECOMPRESSSIZE=%d\n", XD3_NODECOMPRESSSIZE); |
343 | P(RINT "XD3_POSIX=%d\n", XD3_POSIX); | ||
344 | P(RINT "XD3_USE_LARGEFILE64=%d\n", XD3_USE_LARGEFILE64); | 348 | P(RINT "XD3_USE_LARGEFILE64=%d\n", XD3_USE_LARGEFILE64); |
349 | P(RINT "XD3_POSIX=%d\n", XD3_POSIX); | ||
350 | P(RINT "XD3_STDIO=%d\n", XD3_STDIO); | ||
351 | P(RINT "XD3_WIN32=%d\n", XD3_WIN32); | ||
345 | 352 | ||
346 | return EXIT_SUCCESS; | 353 | return EXIT_SUCCESS; |
347 | } | 354 | } |
@@ -554,6 +561,12 @@ main_atou (const char* arg, usize_t *xo, usize_t low, char which) | |||
554 | #define XSTDOUT_XF(f) { (f)->file = STDOUT_FILENO; (f)->filename = "/dev/stdout"; } | 561 | #define XSTDOUT_XF(f) { (f)->file = STDOUT_FILENO; (f)->filename = "/dev/stdout"; } |
555 | #define XSTDERR_XF(f) { (f)->file = STDERR_FILENO; (f)->filename = "/dev/stderr"; } | 562 | #define XSTDERR_XF(f) { (f)->file = STDERR_FILENO; (f)->filename = "/dev/stderr"; } |
556 | #define XSTDIN_XF(f) { (f)->file = STDIN_FILENO; (f)->filename = "/dev/stdin"; } | 563 | #define XSTDIN_XF(f) { (f)->file = STDIN_FILENO; (f)->filename = "/dev/stdin"; } |
564 | |||
565 | #elif XD3_WIN32 | ||
566 | #define XFNO(f) 0 | ||
567 | #define XSTDOUT_XF(f) { (f)->file = 0; (f)->filename = "/dev/stdout"; } | ||
568 | #define XSTDERR_XF(f) { (f)->file = 0; (f)->filename = "/dev/stderr"; } | ||
569 | #define XSTDIN_XF(f) { (f)->file = 0; (f)->filename = "/dev/stdin"; } | ||
557 | #endif | 570 | #endif |
558 | 571 | ||
559 | static void | 572 | static void |
@@ -564,6 +577,9 @@ main_file_init (main_file *xfile) | |||
564 | #if XD3_POSIX | 577 | #if XD3_POSIX |
565 | xfile->file = -1; | 578 | xfile->file = -1; |
566 | #endif | 579 | #endif |
580 | #if XD3_WIN32 | ||
581 | xfile->file = INVALID_HANDLE_VALUE; | ||
582 | #endif | ||
567 | } | 583 | } |
568 | 584 | ||
569 | static void | 585 | static void |
@@ -582,6 +598,9 @@ main_file_isopen (main_file *xfile) | |||
582 | 598 | ||
583 | #elif XD3_POSIX | 599 | #elif XD3_POSIX |
584 | return xfile->file != -1; | 600 | return xfile->file != -1; |
601 | |||
602 | #elif XD3_WIN32 | ||
603 | return xfile->file != INVALID_HANDLE_VALUE; | ||
585 | #endif | 604 | #endif |
586 | } | 605 | } |
587 | 606 | ||
@@ -602,6 +621,10 @@ main_file_close (main_file *xfile) | |||
602 | #elif XD3_POSIX | 621 | #elif XD3_POSIX |
603 | ret = close (xfile->file); | 622 | ret = close (xfile->file); |
604 | xfile->file = -1; | 623 | xfile->file = -1; |
624 | |||
625 | #elif XD3_WIN32 | ||
626 | ret = CloseHandle(xfile->file); | ||
627 | xfile->file = INVALID_HANDLE_VALUE; | ||
605 | #endif | 628 | #endif |
606 | 629 | ||
607 | if (ret != 0) { XF_ERROR ("close", xfile->filename, ret = get_errno ()); } | 630 | if (ret != 0) { XF_ERROR ("close", xfile->filename, ret = get_errno ()); } |
@@ -632,6 +655,16 @@ main_file_open (main_file *xfile, const char* name, int mode) | |||
632 | xfile->file = ret; | 655 | xfile->file = ret; |
633 | ret = 0; | 656 | ret = 0; |
634 | } | 657 | } |
658 | |||
659 | #elif XD3_WIN32 | ||
660 | xfile->file = CreateFile(name, | ||
661 | (mode == XO_READ) ? GENERIC_READ : GENERIC_WRITE, | ||
662 | 0, | ||
663 | NULL, | ||
664 | (option_force ? CREATE_ALWAYS : CREATE_NEW), | ||
665 | FILE_ATTRIBUTE_NORMAL, | ||
666 | NULL); | ||
667 | ret = (xfile->file != INVALID_HANDLE_VALUE); | ||
635 | #endif | 668 | #endif |
636 | if (ret) { XF_ERROR ("open", name, ret); } | 669 | if (ret) { XF_ERROR ("open", name, ret); } |
637 | else { xfile->realname = name; xfile->nread = 0; } | 670 | else { xfile->realname = name; xfile->nread = 0; } |
@@ -641,11 +674,14 @@ main_file_open (main_file *xfile, const char* name, int mode) | |||
641 | static int | 674 | static int |
642 | main_file_stat (main_file *xfile, xoff_t *size, int err_ifnoseek) | 675 | main_file_stat (main_file *xfile, xoff_t *size, int err_ifnoseek) |
643 | { | 676 | { |
644 | int ret; | 677 | int ret = 0; |
678 | #if XD3_WIN32 | ||
679 | if (!GetFileSizeEx(xfile->file, size)) { | ||
680 | ret = 1; | ||
681 | } | ||
682 | // TODO: check err_ifnoseek | ||
683 | #else | ||
645 | struct stat sbuf; | 684 | struct stat sbuf; |
646 | |||
647 | XD3_ASSERT (main_file_isopen (xfile)); | ||
648 | |||
649 | if (fstat (XFNO (xfile), & sbuf) < 0) | 685 | if (fstat (XFNO (xfile), & sbuf) < 0) |
650 | { | 686 | { |
651 | ret = get_errno (); | 687 | ret = get_errno (); |
@@ -658,9 +694,9 @@ main_file_stat (main_file *xfile, xoff_t *size, int err_ifnoseek) | |||
658 | if (err_ifnoseek) { XPR(NT "source file must be seekable: %s\n", xfile->filename); } | 694 | if (err_ifnoseek) { XPR(NT "source file must be seekable: %s\n", xfile->filename); } |
659 | return ESPIPE; | 695 | return ESPIPE; |
660 | } | 696 | } |
661 | |||
662 | (*size) = sbuf.st_size; | 697 | (*size) = sbuf.st_size; |
663 | return 0; | 698 | #endif |
699 | return ret; | ||
664 | } | 700 | } |
665 | 701 | ||
666 | static int | 702 | static int |
@@ -733,6 +769,13 @@ main_file_read (main_file *ifile, | |||
733 | 769 | ||
734 | #elif XD3_POSIX | 770 | #elif XD3_POSIX |
735 | ret = xd3_posix_io (ifile->file, buf, size, (xd3_posix_func*) &read, nread); | 771 | ret = xd3_posix_io (ifile->file, buf, size, (xd3_posix_func*) &read, nread); |
772 | |||
773 | #elif XD3_WIN32 | ||
774 | DWORD nread2; | ||
775 | if (!ReadFile (ifile->file, buf, size, &nread2, NULL)) { | ||
776 | ret = 1; | ||
777 | } | ||
778 | *nread = (usize_t)nread2; | ||
736 | #endif | 779 | #endif |
737 | 780 | ||
738 | if (ret) | 781 | if (ret) |
@@ -762,6 +805,12 @@ main_file_write (main_file *ofile, uint8_t *buf, usize_t size, const char *msg) | |||
762 | 805 | ||
763 | #elif XD3_POSIX | 806 | #elif XD3_POSIX |
764 | ret = xd3_posix_io (ofile->file, buf, size, (xd3_posix_func*) &write, NULL); | 807 | ret = xd3_posix_io (ofile->file, buf, size, (xd3_posix_func*) &write, NULL); |
808 | |||
809 | #elif XD3_WIN32 | ||
810 | DWORD nwrite; | ||
811 | if (!WriteFile(ofile->file, &buf, size, &nwrite, NULL)) { | ||
812 | ret = 1; | ||
813 | } | ||
765 | #endif | 814 | #endif |
766 | 815 | ||
767 | if (ret) | 816 | if (ret) |
@@ -784,8 +833,23 @@ main_file_seek (main_file *xfile, xoff_t pos) | |||
784 | 833 | ||
785 | #if XD3_STDIO | 834 | #if XD3_STDIO |
786 | if (fseek (xfile->file, pos, SEEK_SET) != 0) { ret = get_errno (); } | 835 | if (fseek (xfile->file, pos, SEEK_SET) != 0) { ret = get_errno (); } |
787 | #else | 836 | |
837 | #elif XD3_POSIX | ||
788 | if (lseek (xfile->file, pos, SEEK_SET) != pos) { ret = get_errno (); } | 838 | if (lseek (xfile->file, pos, SEEK_SET) != pos) { ret = get_errno (); } |
839 | |||
840 | #elif XD3_WIN32 | ||
841 | DWORD sfp; | ||
842 | DWORD low = (DWORD)(pos & 0xffffffff); | ||
843 | DWORD high = (DWORD)(pos >> 32); | ||
844 | // TODO: What's the proper shift for WIN64? | ||
845 | sfp = SetFilePointer(xfile->file, low, &high, FILE_BEGIN); | ||
846 | if (sfp == (DWORD)-1 && | ||
847 | GetLastError() != NO_ERROR) { | ||
848 | // This example is from MSDN, note that the | ||
849 | // (error = GetLastError()) part of this code is used | ||
850 | // only for the case where &high is passed. | ||
851 | ret = 1; | ||
852 | } | ||
789 | #endif | 853 | #endif |
790 | 854 | ||
791 | if (ret) | 855 | if (ret) |