00001
00002
00003
00004
00005 #include <map>
00006 #include <iostream>
00007 #include <fstream>
00008 #include <sstream>
00009
00010 using namespace std;
00011
00012 void outNumberToScancode(ostream &target, int set, int number, const string &str) {
00013 static int objcnt=0;
00014 objcnt++;
00015
00016 target << "static const int object"<<objcnt<<"[] = { ";
00017
00018 istringstream is(str);
00019
00020 int cnt=0;
00021 do {
00022 char val[5];
00023 char dummy;
00024
00025 is.get(val, 5, ',');
00026 if (is.fail()) break;
00027 target << "0x00" << val;
00028 is >> dummy;
00029 if (is.fail()) break;
00030 target << ",";
00031 cnt++;
00032
00033
00034
00035 } while (!is.eof());
00036
00037
00038 target << ",0xffff";
00039
00040
00041
00042
00043
00044 target << "};" << endl;
00045
00046 target << "keynumberToScancode" << set << "[" << number << "]= object"<<objcnt<<";"<< endl;
00047
00048 }
00049
00050 void generateKeytrans(
00051 std::string directory
00052 )
00053 {
00054 string xName( directory + string("/xcode_to_keynumber.dat") );
00055 string kName( directory + string("/keynumber_to_scancode.dat") );
00056 string tName( directory + string("/keytrans.h") );
00057
00058 ifstream xToNumber( xName.c_str() );
00059 ifstream keynumberToScancode( kName.c_str() );
00060 ofstream target( tName.c_str() );
00061
00062 target
00063 << "//" << endl
00064 << "// This file is automatically generated. DO NOT EDIT!" << endl
00065 << "// See kbdgentables.cpp for details." << endl
00066 << "//" << endl
00067 << endl;
00068
00069 do {
00070 int xcode;
00071 int number;
00072 xToNumber >> xcode >> number;
00073 if (xToNumber.fail()) break;
00074 target << "xToNumber[" << xcode << "]="<< number<< ";" << endl;
00075 }
00076 while (!xToNumber.eof());
00077
00078 do {
00079 int number;
00080 string mode1;
00081 string mode2;
00082 string mode3;
00083
00084 keynumberToScancode >> number >> mode1>>mode2>>mode3;
00085 if (keynumberToScancode.fail()) break;
00086
00087
00088
00089
00090
00091 outNumberToScancode(target, 1, number, mode1);
00092 outNumberToScancode(target, 2, number, mode2);
00093 outNumberToScancode(target, 3, number, mode3);
00094
00095 } while (!keynumberToScancode.eof());
00096 }
00097
00098 int main(
00099 int argc,
00100 char **argv
00101 )
00102 {
00103 if ( argc != 2 ) {
00104 cerr << "Incorrect usage; takes a directory argument" << endl;
00105 return -1;
00106 }
00107
00108 generateKeytrans( string(argv[1] ) );
00109
00110 }
00111