Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

258 lines
7.6 KiB

#include "headers.hxx"
#include "..\CSVDSReader.hpp"
#include "..\constants.hpp"
#include "..\global.hpp"
HINSTANCE hResourceModuleHandle = 0;
const wchar_t* HELPFILE_NAME = 0; // no context help available
const wchar_t* RUNTIME_NAME = L"W2KStrs";
DWORD DEFAULT_LOGGING_OPTIONS =
Log::OUTPUT_TO_FILE
| Log::OUTPUT_FUNCCALLS
| Log::OUTPUT_LOGS
| Log::OUTPUT_ERRORS
| Log::OUTPUT_HEADER;
Popup popup(L"W2KStrs", false);
// Keep all printable characters and escape the others.
// Escaping means representing the character as &xxxx
// where the x is an hexadecimal digit
// This routine also replaces & for &&
// The unescape function is in ..\global.cpp
String escape(const wchar_t *str)
{
LOG_FUNCTION(escape);
String dest;
wchar_t strNum[5];
while(*str!=0)
{
if(*str=='&')
{
dest+=L"&&";
}
else
{
if (
(*str >= L'a' && *str <= L'z') ||
(*str >= L'A' && *str <= L'Z') ||
(*str >= L'0' && *str <= L'9') ||
wcschr(L" !@#$%^*()-_=+[{]}\"';:.>,</?\\|",*str)!=NULL
)
{
dest+=*str;
}
else
{
// I know that a w_char as a string will have
// exactly 4 hexadecimal digits, so this is one of
// the very rare wsprintfs that can be considered safe :)
wsprintf(strNum,L"&%04x",*str);
dest+=String(strNum);
}
}
str++;
}
return dest;
}
int WINAPI
WinMain(
HINSTANCE /*hInstance*/,
HINSTANCE /*hPrevInstance */ ,
LPSTR /*lpszCmdLine, */,
int /*nCmdShow */)
{
LOG_FUNCTION(WinMain);
int argv;
LPWSTR *argc=CommandLineToArgvW(GetCommandLine(),&argv);
if(argv!=3)
{
MessageBox(NULL,L"Usage: W2KStrs dcpromo2k.csv out.txt",L"Error",MB_OK);
return 0;
}
HRESULT hr=S_OK;
HANDLE file=INVALID_HANDLE_VALUE;
const wchar_t *W2KFile =argc[1];
const wchar_t *outFile =argc[2];
do
{
CSVDSReader csvIntlW2K;
hr=csvIntlW2K.read(W2KFile,LOCALEIDS);
BREAK_ON_FAILED_HRESULT(hr);
hr=FS::CreateFile( outFile,
file,
GENERIC_WRITE);
if FAILED(hr)
{
MessageBox(NULL,L"Problems during generation",L"Error",MB_OK);
LOG_HRESULT(hr);
return hr;
}
for(long l=0;LOCALEIDS[l]!=0;l++)
{
for( long i = 0;
*(CHANGE_LIST[i].object)!=0;
i++)
{
wchar_t *object = CHANGE_LIST[i].object;
for( long c = 0;
*(CHANGE_LIST[i].changes[c].property)!=0;
c++)
{
enum TYPE_OF_CHANGE type;
type = CHANGE_LIST[i].changes[c].type;
if(
type == REPLACE_W2K_SINGLE_VALUE ||
type == REPLACE_W2K_MULTIPLE_VALUE
)
{
wchar_t *property = CHANGE_LIST[i].changes[c].property;
wchar_t *value = CHANGE_LIST[i].changes[c].value;
long locale = LOCALEIDS[l];
String W2KValue;
// The goal of if and else is getting the W2KValue
if(type==REPLACE_W2K_SINGLE_VALUE)
{
StringList valuesW2K;
hr=csvIntlW2K.getCsvValues(locale,object,property,valuesW2K);
BREAK_ON_FAILED_HRESULT(hr);
if(valuesW2K.size()==0)
{
error=L"No values";
hr=E_FAIL;
break;
}
if (valuesW2K.size()!=1)
{
error=L"Size should be 1";
hr=E_FAIL;
break;
}
W2KValue=*valuesW2K.begin();
}
else
{
// type == REPLACE_W2K_MULTIPLE_VALUE
String sW2KXP(value+2); // +2 for index and comma
StringList lW2KXP;
size_t cnt=sW2KXP.tokenize(back_inserter(lW2KXP),L";");
if(cnt!=2)
{
error=L"There should be two strings (W2K and XP)";
hr=E_FAIL;
break;
}
hr=csvIntlW2K.getCsvValue(
locale,
object,
property,
lW2KXP.begin()->c_str(),
W2KValue
);
BREAK_ON_FAILED_HRESULT(hr);
if(W2KValue.size()==0)
{
error=L"Did not find value(s)",L"Error";
hr=E_FAIL;
break;
}
size_t pos=W2KValue.find(L',');
if(pos==String::npos)
{
error=L"MultipleValue without comma",L"Error";
hr=E_FAIL;
break;
}
}
// by now the W2KValue is loaded
// The test sequence
// This test sequence is usefull when you already have
// replaceW2KStrs from a previous run and you want to
// test that the strings have been correctly
// retrieved, encoded and decoded
//pair<long,long> tmpIndxLoc;
//tmpIndxLoc.first=index;
//tmpIndxLoc.second=locale;
//String tmpValue=replaceW2KStrs[tmpIndxLoc];
//if (tmpValue!=W2KValue)
//{
//hr=E_FAIL;
//break;
//}
long index = *value;
hr=FS::WriteLine(file,
String::format(L"tmpIndxLoc.first=%1!d!;",index));
BREAK_ON_FAILED_HRESULT(hr);
hr=FS::WriteLine(file,
String::format(L"tmpIndxLoc.second=0x%1!3x!;",locale));
BREAK_ON_FAILED_HRESULT(hr);
hr=FS::Write
(
file,
String::format
(
L"replaceW2KStrs[tmpIndxLoc]=L\"%1\";\r\n",
escape( W2KValue.c_str() ).c_str()
)
);
BREAK_ON_FAILED_HRESULT(hr);
} // if(changes[c].change== is REPLACE multiple or single
} // for c (for each change in the entry)
BREAK_ON_FAILED_HRESULT(hr);
}// for i (for each entry in the change list)
BREAK_ON_FAILED_HRESULT(hr);
}// for l (for each locale)
BREAK_ON_FAILED_HRESULT(hr);
} while(0);
CloseHandle(file);
if (FAILED(hr))
{
MessageBox(NULL,L"Problems during generation",L"Error",MB_OK);
}
else
{
MessageBox(NULL,L"Generation Successfull",L"Success",MB_OK);
}
LOG_HRESULT(hr);
return 1;
}