summaryrefslogtreecommitdiff
path: root/xdelta3/xdelta3-main.h
diff options
context:
space:
mode:
authorjosh.macdonald <jmacd@users.noreply.github.com>2006-12-16 08:38:32 +0000
committerjosh.macdonald <jmacd@users.noreply.github.com>2006-12-16 08:38:32 +0000
commitcfa42a075b9af0c213c0b27707b3ab8b2a45acac (patch)
treefdbdf6358316d82c6de15b5760c0a42264ba51b4 /xdelta3/xdelta3-main.h
parent45bc1408336abd3b7bb0e2ee6fdcb44bca759bbf (diff)
Diffstat (limited to 'xdelta3/xdelta3-main.h')
-rwxr-xr-xxdelta3/xdelta3-main.h90
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
559static void 572static 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
569static void 585static 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)
641static int 674static int
642main_file_stat (main_file *xfile, xoff_t *size, int err_ifnoseek) 675main_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
666static int 702static 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)