Number Parser::createNumber(string number, char first){ Number result; //This is probably lazy/ bad, but it basically makes sure that theres no junk before the actual operation. if (first != 's' && number.find("rt:") > 0){ string base (number.find(':')+1, -1); string radicand (0, number.find('r')-1); result = Radical(createNumber(base, base.front()), createNumber(radicand, radicand.front())); } else if (first=='p' && number.at(1) =='i' && number.length() == 2){ //create pi result = Constant("pi"); } else if (first=='e' && number.length() == 1){ //create e result = Constant("e"); } else if (first == 's' && number.find("sqrt:") > 0){ //create a square root string base (number.find(':')+1, -1); result = Radical(createNumber(base, base.front()), Integer(2)); } else if (first == 'l' && number.find("log_") > 0){ //create a log string base (number.find('_')+1, number.find(':')); string arg (number.find(':')+1, -1); result = Log(createNumber(base, base.front()), createNumber(arg, arg.front())); } //all numbers are created here else if (isdigit(first) && number.find_last_not_of("0123456789./") != -1){ //find a '/' to create a fraction if(number.find_first_of('/') > 0){ //check to make sure there is only one '/' in the fraction if (number.find_first_of('/') != number.find_last_of('/')) { //temporary error handling throw "Only one / per fracton"; } //create a rational string numerator (0, number.find('/')-1); string denom ( number.find('/') + 1, -1); result = Rational(createNumber(numerator, numerator.front()), createNumber(denom, denom.front())); } if(number.find_first_of('.') > 0){ if (number.find_first_of('.') != number.find_last_of('.')){ throw "Only one . per decimal"; } //create a rational from a decimal result = Rational(number)); } //finally, create an integer result = Integer(stoi(number)); } return result; }
void Rad::load() { if (loaded) return; KStandardDirs *dirs = KGlobal::dirs(); QString radkfile = dirs->findResource("data", "kiten/radkfile"); if (radkfile.isNull()) { KMessageBox::error(0, i18n("Kanji radical information file not installed, so radical searching cannot be used.")); return; } QFile f(radkfile); if (!f.open(IO_ReadOnly)) { KMessageBox::error(0, i18n("Kanji radical information could not be loaded, so radical searching cannot be used.")); } QTextStream t(&f); t.setCodec(QTextCodec::codecForName("eucJP")); Radical cur; while (!t.eof()) { QString s = t.readLine(); QChar first = s.at(0); if (first == '#') // comment! { // nothing } else if (first == '$') // header { // save previous one if( !cur.kanji().isNull() ) list.append(cur); //first entry is trim(last 4 chars).. <rad><space><strokes> unsigned int strokes = s.right(2).toUInt(); QString radical = QString(s.at(2)); cur = Radical(radical, strokes); } else // continuation { cur.addKanji(s); } } // we gotta append the last one!! // this nagged jasonkb for a bit wondering why fue wasn't showing up ;) list.append(cur); f.close(); loaded = true; }