コード例 #1
0
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;
}
コード例 #2
0
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;
}