Roy Shea : expand: Extended expand program to accept /r argument.
Alexandre Julliard
julliard at winehq.org
Thu Aug 21 10:02:58 CDT 2008
Module: wine
Branch: master
Commit: 44941a55fa97b40b4c9ffa8e414e3a8a26efc65b
URL: http://source.winehq.org/git/wine.git/?a=commit;h=44941a55fa97b40b4c9ffa8e414e3a8a26efc65b
Author: Roy Shea <royshea at gmail.com>
Date: Thu Aug 21 01:18:00 2008 -0700
expand: Extended expand program to accept /r argument.
---
programs/expand/expand.c | 83 ++++++++++++++++++++++++++++++++++++++++++----
1 files changed, 76 insertions(+), 7 deletions(-)
diff --git a/programs/expand/expand.c b/programs/expand/expand.c
index 6022fe2..a8736b1 100644
--- a/programs/expand/expand.c
+++ b/programs/expand/expand.c
@@ -26,6 +26,30 @@
#include <lzexpand.h>
#include <setupapi.h>
+static UINT CALLBACK set_outfile( PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2 )
+{
+ FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)param1;
+ char buffer[MAX_PATH];
+ char* basename;
+
+ switch (notification)
+ {
+ case SPFILENOTIFY_FILEINCABINET:
+ {
+ LPSTR outfile = context;
+ if (outfile[0] != 0)
+ {
+ SetLastError( ERROR_NOT_SUPPORTED );
+ return FILEOP_ABORT;
+ }
+ GetFullPathNameA( info->NameInCabinet, sizeof(buffer), buffer, &basename );
+ strcpy( outfile, basename );
+ return FILEOP_SKIP;
+ }
+ default: return NO_ERROR;
+ }
+}
+
static UINT CALLBACK extract_callback( PVOID context, UINT notification, UINT_PTR param1, UINT_PTR param2 )
{
FILE_IN_CABINET_INFO_A *info = (FILE_IN_CABINET_INFO_A *)param1;
@@ -43,29 +67,74 @@ static UINT CALLBACK extract_callback( PVOID context, UINT notification, UINT_PT
}
}
+static BOOL option_equal(LPCSTR str1, LPCSTR str2)
+{
+ if (str1[0] != '/' && str1[0] != '-')
+ return FALSE;
+ return !lstrcmpA( str1 + 1, str2 );
+}
+
int main(int argc, char *argv[])
{
int ret = 0;
char infile[MAX_PATH], outfile[MAX_PATH], actual_name[MAX_PATH];
+ char outfile_basename[MAX_PATH], *basename_index;
UINT comp;
if (argc < 3)
{
- fprintf( stderr, "Usage: %s infile outfile\n", argv[0] );
+ fprintf( stderr, "Usage:\n" );
+ fprintf( stderr, "\t%s infile outfile\n", argv[0] );
+ fprintf( stderr, "\t%s /r infile \n", argv[0] );
return 1;
}
- GetFullPathNameA( argv[1], sizeof(infile), infile, NULL );
- GetFullPathNameA( argv[2], sizeof(outfile), outfile, NULL );
+ if (argc == 3 && (option_equal(argv[1], "R") || option_equal(argv[1], "r")))
+ GetFullPathNameA( argv[2], sizeof(infile), infile, NULL );
+ else
+ GetFullPathNameA( argv[1], sizeof(infile), infile, NULL );
- if (!lstrcmpiA( infile, outfile ))
+ if (!SetupGetFileCompressionInfoExA( infile, actual_name, sizeof(actual_name), NULL, NULL, NULL, &comp ))
{
- fprintf( stderr, "%s: can't expand file to itself\n", argv[0] );
+ fprintf( stderr, "%s: can't open input file %s\n", argv[0], infile );
return 1;
}
- if (!SetupGetFileCompressionInfoExA( infile, actual_name, sizeof(actual_name), NULL, NULL, NULL, &comp ))
+
+ if (argc == 3 && (option_equal(argv[1], "R") || option_equal(argv[1], "r")))
{
- fprintf( stderr, "%s: can't open input file %s\n", argv[0], infile );
+ switch (comp)
+ {
+ case FILE_COMPRESSION_MSZIP:
+ {
+ outfile_basename[0] = 0;
+ if (!SetupIterateCabinetA( infile, 0, set_outfile, (PVOID)outfile_basename ))
+ {
+ fprintf( stderr, "%s: can't determine original name\n", argv[0] );
+ return 1;
+ }
+ GetFullPathNameA( infile, sizeof(outfile), outfile, &basename_index );
+ *basename_index = 0;
+ strcat( outfile, outfile_basename );
+ break;
+ }
+ case FILE_COMPRESSION_WINLZA:
+ {
+ GetExpandedNameA( infile, outfile_basename );
+ break;
+ }
+ default:
+ {
+ fprintf( stderr, "%s: can't determine original\n", argv[0] );
+ return 1;
+ }
+ }
+ }
+ else
+ GetFullPathNameA( argv[2], sizeof(outfile), outfile, NULL );
+
+ if (!lstrcmpiA( infile, outfile ))
+ {
+ fprintf( stderr, "%s: can't expand file to itself\n", argv[0] );
return 1;
}
More information about the wine-cvs
mailing list