X-Git-Url: https://git.reactos.org/?p=reactos.git;a=blobdiff_plain;f=reactos%2Flib%2Fkernel32%2Fmisc%2Fenv.c;h=60a1addd42e6f54bc72b5ab777b0148112dfa09e;hp=abaac3f0f2c839bb84c2d0f619bae2c4da27427c;hb=1d786dd865c340addc70dad05c2b4e1e21c04b85;hpb=3174c5069a851450824b47b9d4c457220eec20bf diff --git a/reactos/lib/kernel32/misc/env.c b/reactos/lib/kernel32/misc/env.c index abaac3f0f2c..60a1addd42e 100644 --- a/reactos/lib/kernel32/misc/env.c +++ b/reactos/lib/kernel32/misc/env.c @@ -346,3 +346,153 @@ FreeEnvironmentStringsW( return TRUE; } + +int ExpandVariableA( + LPCSTR lpSrc, LPSTR lpDst, DWORD nSize , DWORD *nWritten) +{ + int nVar = 0; + LPSTR lpVar; + LPSTR lpEnd; + + if ( nWritten == NULL ) + return -1; + + if ( *lpSrc != '%' ) { + return -1; + } + + + lpVar = (LPSTR)lpSrc; + lpVar++; + + + lpEnd = strchr( lpVar, '%' ); + if ( lpEnd == NULL ) { + return -1; + } + else + *lpEnd = 0; + + nWritten = GetEnvironmentVariableA(lpVar,lpDst,nSize); + *lpEnd = '%'; + + if ( nWritten == 0 ) + return -1; + + if ( nWritten > nSize ) + return -1; + + return (lpEnd - lpVar) -1; +} + + +DWORD STDCALL ExpandEnvironmentStringsA( + LPCSTR lpSrc, LPSTR lpDst, DWORD nSize +) +{ + DWORD v; + DWORD bw; + + while(*lpSrc != 0 && nSize > 0 ) + { + if ( *lpSrc == '%' ) { + v = ExpandVariableA(lpSrc,lpDst,nSize , &bw); + if ( v == -1 ) { + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + } + else { + lpSrc+=v; + lpDst+=bw; + nSize-=bw; + } + } + else { + + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + + } + + } + +} + +int ExpandVariableW( + LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize , DWORD *nWritten) +{ + LPWSTR lpVar; + LPWSTR lpEnd; + + if ( nWritten == NULL ) + return -1; + + if ( *lpSrc != L'%' ) { + return -1; + } + + + lpVar = (LPWSTR)lpSrc; + lpVar++; + + + lpEnd = wcschr( lpVar, L'%' ); + if ( lpEnd == NULL ) { + return -1; + } + else + *lpEnd = 0; + + nWritten = GetEnvironmentVariableW(lpVar,lpDst,nSize); + *lpEnd = L'%'; + + if ( nWritten == 0 ) + return -1; + + if ( nWritten > nSize ) + return -1; + + return ((lpEnd - lpVar)/2) -1; +} + + +DWORD STDCALL ExpandEnvironmentStringsW( + LPCWSTR lpSrc, LPWSTR lpDst, DWORD nSize +) +{ + DWORD v; + DWORD bw; + + while(*lpSrc != 0 && nSize > 0 ) + { + if ( *lpSrc == L'%' ) { + v = ExpandVariableW(lpSrc,lpDst,nSize , &bw); + if ( v == -1 ) { + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + } + else { + lpSrc+=v; + lpDst+=bw; + nSize-=bw; + } + } + else { + + *lpDst = *lpSrc; + lpDst++; + lpSrc++; + nSize--; + + } + + } + +} +