Mike McCormack : msi: Clean trailing and leading spaces from path segments.
Module: wine Branch: refs/heads/master Commit: b9d135a37b235ac4fedc6bd1924aa7351d655b72 URL: http://source.winehq.org/git/?p=wine.git;a=commit;h=b9d135a37b235ac4fedc6bd1... Author: Mike McCormack <mike(a)codeweavers.com> Date: Fri Jan 6 12:19:22 2006 +0100 msi: Clean trailing and leading spaces from path segments. --- dlls/msi/helpers.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 files changed, 41 insertions(+), 0 deletions(-) diff --git a/dlls/msi/helpers.c b/dlls/msi/helpers.c index 2b2ba06..ffdf3be 100644 --- a/dlls/msi/helpers.c +++ b/dlls/msi/helpers.c @@ -228,6 +228,45 @@ static LPWSTR get_source_root( MSIPACKAG return path; } +/* + * clean_spaces_from_path() + * + * removes spaces from the beginning and end of path segments + * removes multiple \\ characters + */ +static void clean_spaces_from_path( LPWSTR p ) +{ + LPWSTR q = p; + int n, len = 0; + + while (1) + { + /* copy until the end of the string or a space */ + while (*p != ' ' && (*q = *p)) + { + p++, len++; + /* reduce many backslashes to one */ + if (*p != '\\' || *q != '\\') + q++; + } + + /* quit at the end of the string */ + if (!*p) + break; + + /* count the number of spaces */ + n = 0; + while (p[n] == ' ') + n++; + + /* if it's leading or trailing space, skip it */ + if ( len == 0 || p[-1] == '\\' || p[n] == '\\' ) + p += n; + else /* copy n spaces */ + while (n && (*q++ = *p++)) n--; + } +} + LPWSTR resolve_folder(MSIPACKAGE *package, LPCWSTR name, BOOL source, BOOL set_prop, MSIFOLDER **folder) { @@ -255,6 +294,7 @@ LPWSTR resolve_folder(MSIPACKAGE *packag /* correct misbuilt target dir */ path = build_directory_name(2, check_path, NULL); + clean_spaces_from_path( path ); if (strcmpiW(path,check_path)!=0) MSI_SetPropertyW(package,cszTargetDir,path); msi_free(check_path); @@ -307,6 +347,7 @@ LPWSTR resolve_folder(MSIPACKAGE *packag TRACE(" TargetDefault = %s\n", debugstr_w(f->TargetDefault)); path = build_directory_name( 3, p, f->TargetDefault, NULL ); + clean_spaces_from_path( path ); f->ResolvedTarget = strdupW( path ); TRACE("target -> %s\n", debugstr_w(path)); if (set_prop)
participants (1)
-
Alexandre Julliard