tmapldr.cpp
来自「一个类似windows」· C++ 代码 · 共 774 行 · 第 1/2 页
CPP
774 行
};
// AVS
// load [charmap ...] part to xlat
int TMapLoader::LoadCharMap(string buf) {
char wbuf[128];
char charmapname[128];
charmapname[0] = 0;
// xlat.init(); now it done by KeyTranslator::Load()
while ( buf.length() ) {
wbuf[0]=0;
if (!getline(buf,wbuf,sizeof(wbuf))) break;
if ( wbuf[0]==0 ) break;
if ( strnicmp(wbuf,"[charmap",8)==0 ) {
strcpy(charmapname,wbuf);
continue;
};
char * host = strtok(wbuf, " ");
char * console = strtok(NULL, " ");
int bHost;
int bConsole;
if ( host == NULL || console == NULL ) {
// cerr << charmapname << " -> Bad structure" << endl;
printm(0, FALSE, MSG_KEYBADSTRUCT, charmapname);
return 0;
};
if ( strlen(host) > 1 && host[0] == '\\' )
bHost = getbyte(host+1);
else
bHost = (unsigned char)host[0];
if ( strlen(console) > 1 && console[0] == '\\' )
bConsole = getbyte(console+1);
else
bConsole = (unsigned char)console[0];
if ( bHost <= 0 || bConsole <= 0 ) {
// cerr << charmapname << " -> Bad chars? "
// << host << " -> " << console << endl;
printm(0, FALSE, MSG_KEYBADCHARS, charmapname, host, console);
return 0;
};
// xlat.table[bHost] = bConsole;
Charmap.modmap(bHost, 'B', bConsole);
};
return (Charmap.enabled = 1);
return 1;
};
// AVS
// ignore long comment [comment] ... [end comment]
// recursive!
int getLongComment(istream& is, char* wbuf, size_t sz) {
int bufLen;
while ( is ) {
wbuf[0] = 0;
getline(is, wbuf, sz);
if ( wbuf[0]==0 ) return 1;
bufLen = strlen(wbuf);
if ( wbuf[0] == '[' && wbuf[bufLen-1] == ']' ) {
string temps(wbuf);
if (!normalizeSplitter(temps)) {
// cerr << "Unexpected line '" << temps << "'\n";
printm(0, FALSE, MSG_KEYUNEXPLINE, temps.c_str());
return 0;
};
if ( stricmp(temps.c_str(),"[comment]") == 0 ) {
// do recursive call
if ( !getLongComment(is, wbuf, sz) ) return 0;
continue;
};
if ( stricmp(temps.c_str(),"[end comment]") == 0 ) return 1;
};
};
// we get a warning if we don't put a return here (Paul Brannan 5/25/98)
return 0;
};
// AVS
// completelly rewrited to support new conceptions
int TMapLoader::Load(const char * filename, const char * szActiveEmul) {
char buf[256];
int bufLen;
ifstream inpfile(filename);
KeyTrans.DeleteAllDefs();
Charmap.init();
// it is an array for store [...] ... [end ...] parts from file
stringArray SA(0,0,sizeof(string));
int AllOk = 0;
while ( inpfile ) {
getline(inpfile, buf, 255);
bufLen = strlen(buf);
if ( !bufLen ) continue;
if ( buf[0] == '[' && buf[bufLen-1] == ']' ) {
// is a part splitter [...]
string temps(buf);
if (!normalizeSplitter(temps)) {
printm(0, FALSE, MSG_KEYUNEXPLINE, temps.c_str());
AllOk = 0;
break;
};
// if a comment
if ( stricmp(temps.c_str(),"[comment]") == 0 ) {
#ifdef KEYDEBUG
printit(temps.c_str());
#endif
if ( !getLongComment(inpfile, buf, sizeof(buf)) ) {
printm(0, FALSE, MSG_KEYUNEXPEOF);
break;
};
#ifdef KEYDEBUG
printit("\r \r");
#endif
continue;
};
string back = temps;
// prepare line for make it as [end ...]
// and check it
if ( strnicmp(back.c_str(), "[global]", 8) == 0 ) {} // do nothing
else if ( strnicmp(back.c_str(), "[keymap", 7) == 0 ) {
// DJGPP also uses erase rather than remove (Paul Brannan 6/23/98)
#ifndef __BORLANDC__
back.erase(7);
#else
back.remove(7);
#endif
back += "]";
}
else if ( strnicmp(back.c_str(), "[charmap", 8) == 0 ) {
// Paul Brannan 6/23/98
#ifndef __BORLANDC__
back.erase(8);
#else
back.remove(8);
#endif
back += "]";
}
else if ( strnicmp(back.c_str(), "[config", 7) == 0 ) {
// Paul Brannan 6/23/98
#ifndef __BORLANDC__
back.erase(7);
#else
back.remove(7);
#endif
back += "]";
}
else {
// cerr << "Unexpected token " << back << endl;
printm(0, FALSE, MSG_KEYUNEXPTOK, back.c_str());
break;
};
back.insert(1,"END "); // now it looks like [END ...]
#ifdef KEYDEBUG
printit(temps.c_str());
#endif
int ok = 0;
// fetch it to temps
while ( 1 ) {
getline(inpfile, buf, sizeof(buf));
bufLen = strlen(buf);
if ( !bufLen ) break;
if ( buf[0] == '[' && buf[bufLen-1] == ']' ) {
string t(buf);
if ( !normalizeSplitter(t) ) break;
if ( stricmp(t.c_str(),back.c_str()) == 0 ) {
ok = 1;
break;
};
// AVS 31.12.97 fix [comment] block inside another block
if ( stricmp(t.c_str(),"[comment]") == 0 &&
getLongComment(inpfile, buf, sizeof(buf)) ) continue;
break;
};
temps += "\n";
temps += buf;
};
if ( !ok ) {
// cerr << "Unexpected end of file or token" << endl;
printm(0, FALSE, MSG_KEYUNEXP);
AllOk = 0;
break;
};
#ifdef KEYDEBUG
printit("\r \r");
#endif
AllOk = SA.Add(temps);;
if ( !AllOk ) break;
} else {
// cerr << "Unexpected line '" << buf << "'\n";
printm(0, FALSE, MSG_KEYUNEXPLINE, buf);
AllOk = 0;
break;
};
};
inpfile.close();
if ( !AllOk ) return 0;
// now all file are in SA, comments are stripped
int i = LookForPart(SA, "global", "");
if ( i == INT_MAX ) {
// cerr << "No [GLOBAL] definition!" << endl;
printm(0, FALSE, MSG_KEYNOGLOBAL);
return 0;
};
if ( !LoadGlobal(SA[i]) ) {
return 0;
};
// look for need configuration
i = LookForPart(SA, "config", szActiveEmul);
if ( i == INT_MAX ) {
// cerr << "No [CONFIG " << szActiveEmul << "]\n";
printm(0, FALSE, MSG_KEYNOCONFIG, szActiveEmul);
return 0;
};
// cerr << "use configuration: " << szActiveEmul << endl;
printm(0, FALSE, MSG_KEYUSECONFIG, szActiveEmul);
BOOL hadKeys = FALSE;
string config = SA[i];
// parse it
while ( config.length() ) {
buf[0] = 0;
getline(config,buf,sizeof(buf));
bufLen = strlen(buf);
if ( !bufLen || (buf[0] == '[' && buf[bufLen-1] == ']') ) continue;
if ( strnicmp(buf,"keymap",6) == 0 ) {
string orig(buf);
printit("\t"); printit(buf); printit("\n");
char * mapdef = strtok(buf,":");
char * switchKey = strtok(NULL,"\n");
if ( !KeyTrans.mapArray.IsEmpty() && switchKey == NULL ) {
// cerr << "no switch Key for '" << mapdef
// << "'" << endl;
printm(0, FALSE, MSG_KEYNOSWKEY, mapdef);
break;
};
if ( KeyTrans.mapArray.IsEmpty() ) {
if ( switchKey != NULL ) { // create default keymap
// cerr << "You cannot define switch key for default keymap -> ignored"
// << endl;
printm(0, FALSE, MSG_KEYCANNOTDEF);
};
TKeyDef empty;
KeyTrans.mapArray.Add(KeyMap(string(mapdef)));
KeyTrans.switchMap(empty); // set it as current keymap
KeyTrans.mainKeyMap = KeyTrans.currentKeyMap;
}
else {
string keydef(switchKey);
keydef += " !*!*!*"; // just for check
WORD vk_code;
DWORD control;
switchKey = ParseKeyDef(keydef.c_str(),vk_code,control);
if ( switchKey != NULL ) {
TKeyDef swi(NULL,control,vk_code);
if ( KeyTrans.switchMap(swi) > 0 ) {
// cerr << "Duplicate switching key\n";
printm(0, FALSE, MSG_KEYDUPSWKEY);
break;
};
KeyTrans.mapArray.Add(KeyMap(swi, orig));
KeyTrans.switchMap(swi); // set it as current keymap
}
};
mapdef+=7; // 'keymap '
// now load defined keymaps to current
while ((mapdef != NULL)&&
(mapdef = strtok(mapdef,TOKEN_DELIMITERS)) != NULL ) {
i = LookForPart(SA,"keymap",mapdef);
if ( i == INT_MAX ) {
// cerr << "Unknown KEYMAP " << mapdef << endl;
printm(0, FALSE, MSG_KEYUNKNOWNMAP, mapdef);
} else {
mapdef = strtok(NULL,"\n"); // strtok is used in LoadKeyMap
// so - save pointer!
hadKeys = LoadKeyMap(SA[i]); // load it
};
};
}
else if ( strnicmp(buf,"charmap",7) == 0 ) {
printit("\t"); printit(buf); printit("\n");
char * mapdef = buf + 8;// 'charmap '
int SuccesLoaded = 0;
// now load defined charmaps to current
while ((mapdef != NULL)&&
(mapdef = strtok(mapdef,TOKEN_DELIMITERS)) != NULL ) {
i = LookForPart(SA,"charmap",mapdef);
if ( i == INT_MAX ) {
// cerr << "Unknown KEYMAP " << mapdef << endl;
printm(0, FALSE, MSG_KEYUNKNOWNMAP, mapdef);
} else {
mapdef = strtok(NULL,"\n"); // strtok is used in LoadKeyMap
// so - save pointer!
if (LoadCharMap(SA[i])) // load it
SuccesLoaded++;
};
};
if (!SuccesLoaded) {
// cerr << "No charmaps loaded\n";
printm(0, FALSE, MSG_KEYNOCHARMAPS);
Charmap.init();
};
/* strtok(buf," ");
char* name = strtok(NULL," ");
if ( name == NULL ) {
cerr << "No name for CHARMAP" << endl;
} else {
i = LookForPart(SA,"charmap", name);
if ( i == INT_MAX ) {
cerr << "Unknown CHARMAP " << name << endl;
} else {
LoadCharMap(SA[i]);
};
};
*/
}
else {
// cerr << "unexpected token in " << szActiveEmul << endl;
printm(0, FALSE, MSG_KEYUNEXPTOKIN, szActiveEmul);
}
}
if ( hadKeys) {
TKeyDef empty;
KeyTrans.switchMap(empty); // switch to default
KeyTrans.mainKeyMap = KeyTrans.currentKeyMap; // save it's number
// cerr << "There are " << (KeyTrans.mapArray.GetItemsInContainer()) << " maps\n";
char s[12]; // good enough for a long int (32-bit)
itoa(KeyTrans.mapArray.GetItemsInContainer(), s, 10);
printm(0, FALSE, MSG_KEYNUMMAPS, s);
return 1;
};
return 0;
}
void TMapLoader::Display() {
int max = KeyTrans.mapArray.GetItemsInContainer();
if (max == 0) {
printm(0, FALSE, MSG_KEYNOKEYMAPS);
return;
};
for ( int i = 0; i < max; i++ ) {
char buf[20];
itoa(i,buf,10);
printit("\t");
// Ioannou : we can show the current
if (KeyTrans.currentKeyMap == i)
printit("*");
else
printit(" ");
strcat(buf," ");
printit(buf);
char * msg = new char [KeyTrans.mapArray[i].orig.length()+1];
strcpy(msg,KeyTrans.mapArray[i].orig.c_str());
printit(msg);
delete[] msg;
printit("\n");
};
};
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?