X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=base%2Fsystem%2Fmsiexec%2Fmsiexec.c;h=f2155622def54875446e0bbe344bc5e8a37f8b97;hp=44f1f28862eabf2a547d7058827bbbf701d0ed7f;hb=0c6498fa67f32d83ccf5505f2dc9ac6e5c1c2541;hpb=84ccccabe02620185e5773583543aa29344f100a diff --git a/base/system/msiexec/msiexec.c b/base/system/msiexec/msiexec.c index 44f1f28862e..f2155622def 100644 --- a/base/system/msiexec/msiexec.c +++ b/base/system/msiexec/msiexec.c @@ -212,14 +212,6 @@ static DWORD msi_atou(LPCWSTR str) return ret; } -static LPWSTR msi_strdup(LPCWSTR str) -{ - DWORD len = lstrlenW(str)+1; - LPWSTR ret = HeapAlloc(GetProcessHeap(), 0, sizeof(WCHAR)*len); - lstrcpyW(ret, str); - return ret; -} - /* str1 is the same as str2, ignoring case */ static BOOL msi_strequal(LPCWSTR str1, LPCSTR str2) { @@ -409,90 +401,103 @@ static INT DoEmbedding( LPWSTR key ) enum chomp_state { - cs_whitespace, - cs_token, - cs_quote + CS_WHITESPACE, + CS_TOKEN, + CS_QUOTE }; -static int chomp( WCHAR *str ) +static int chomp( const WCHAR *in, WCHAR *out ) { - enum chomp_state state = cs_token; - WCHAR *p, *out; - int count = 1; - BOOL ignore; - - for( p = str, out = str; *p; p++ ) - { - ignore = TRUE; - switch( state ) - { - case cs_whitespace: - switch( *p ) - { - case ' ': - break; - case '"': - state = cs_quote; - count++; - break; - default: - count++; - ignore = FALSE; - state = cs_token; - } - break; - - case cs_token: - switch( *p ) - { - case '"': - state = cs_quote; - break; - case ' ': - state = cs_whitespace; - *out++ = 0; - break; - default: - ignore = FALSE; - } - break; - - case cs_quote: - switch( *p ) - { - case '"': - state = cs_token; - break; - default: - ignore = FALSE; - } - break; - } - if( !ignore ) - *out++ = *p; - } - - *out = 0; + enum chomp_state state = CS_TOKEN; + const WCHAR *p; + int count = 1; + BOOL ignore; - return count; + for (p = in; *p; p++) + { + ignore = TRUE; + switch (state) + { + case CS_WHITESPACE: + switch (*p) + { + case ' ': + break; + case '"': + state = CS_QUOTE; + count++; + break; + default: + count++; + ignore = FALSE; + state = CS_TOKEN; + } + break; + + case CS_TOKEN: + switch (*p) + { + case '"': + state = CS_QUOTE; + break; + case ' ': + state = CS_WHITESPACE; + if (out) *out++ = 0; + break; + default: + if (p > in && p[-1] == '"') + { + if (out) *out++ = 0; + count++; + } + ignore = FALSE; + } + break; + + case CS_QUOTE: + switch (*p) + { + case '"': + state = CS_TOKEN; + break; + default: + ignore = FALSE; + } + break; + } + if (!ignore && out) *out++ = *p; + } + if (out) *out = 0; + return count; } static void process_args( WCHAR *cmdline, int *pargc, WCHAR ***pargv ) { - WCHAR **argv, *p = msi_strdup(cmdline); - int i, n; + WCHAR **argv, *p; + int i, count; - n = chomp( p ); - argv = HeapAlloc(GetProcessHeap(), 0, sizeof (WCHAR*)*(n+1)); - for( i=0; i