Lingua-StarDict

 view release on metacpan or  search on metacpan

StarDict.xs  view on Meta::CPAN



class StarDict: public LibCore {
  public:
    StarDict(const StringsList & enable_list, 
	     const StringsList & disable_list, 
	     const char *_stardict_data_dir=NULL);
};
StarDict::StarDict(
	     const StringsList & enable_list, 
	     const StringsList & disable_list, 
	     const char *_stardict_data_dir
	     ) : LibCore (enable_list, disable_list, _stardict_data_dir) 
	     {};


// -- END OF C/C++ PART -- //




MODULE = Lingua::StarDict		PACKAGE = Lingua::StarDict		

StarDict *
StarDict::new(...)
    CODE:

        StringsList enable_list;
	StringsList disable_list;

	SV* name = sv_newmortal();
	SV* val = sv_newmortal();;

	/*  Parse input params   */
	if ( 0 == (items - 1) % 2){ // without THIS
	    for( int i = 1; i < items; i = i+2){
		name = ST(i);
		val  = ST(i+1);
		if ( SvOK( name ) && SvOK(val) ){
		    if ( strEQ( SvPV(name, PL_na), "dict" )){
			/* define certain dictionary */
			enable_list.push_back( SvPV(val, PL_na) );
		    }
		}
		
	    }
	}
    

	RETVAL = new StarDict(enable_list, disable_list, NULL);

    OUTPUT:
	RETVAL

void
StarDict::DESTROY()


void
StarDict::dictionaries()
    PPCODE:

        dTARG;

	// result array
	AV* dicts = (AV *)sv_2mortal((SV *)newAV());


        std::vector<BookInfo> dicts_list=THIS->GetBooksInfo();
        for(std::vector<BookInfo>::iterator ptr=dicts_list.begin();
	    ptr!=dicts_list.end(); ++ptr
	){
	    HV* dict;
	    dict = (HV *)sv_2mortal((SV *)newHV());

	    hv_store( dict, 
		"bookname", strlen("bookname"), 
		newSVpv( ptr->bookname.c_str(), strlen(ptr->bookname.c_str()) ),
		0);

	    hv_store( dict, 
		"wordcount", strlen("wordcount"), 
		newSViv( (IV) ptr->wordcount ),
		0);


	    hv_store( dict, 
		"ifofile", strlen("ifofile"), 
		newSVpv( ptr->name_of_ifofile.c_str(), strlen(ptr->name_of_ifofile.c_str()) ),
		0);

	    av_push(dicts, newRV( (SV*) dict) );
		
	}

    
	SV* ref = newRV( (SV*) dicts );
    
	EXTEND(SP, 1);
        PUSHs(sv_2mortal( ref ));


	
void
StarDict::search( str )
    char * str
    PPCODE:


	LibCore::SearchResultsList res;
	bool is_found=false;
	  
	if(str[0]=='/'){
	    is_found=THIS->LookupWithFuzzy(str+1, res);
	}
	else if(bContainRule(str)){
	    is_found=THIS->LookupWithRule(str, res);
	}
	else{
	    if(!(is_found=THIS->SimpleLookup(str, res)))
	      is_found=THIS->LookupWithFuzzy(str, res);
	}


	AV * a_res;
	a_res = (AV *)sv_2mortal((SV *)newAV());

        LibCore::PSearchResult ptr;
	for(ptr=res.begin(); ptr!=res.end(); ++ptr){
	    HV* w = (HV *)sv_2mortal((SV *)newHV());

	    hv_store( w,
		"bookname", strlen("bookname"),
		newSVpv( ptr->bookname.c_str(), strlen(ptr->bookname.c_str()) ),
		0);

	    hv_store( w,
		"definition", strlen("definition"),
		newSVpv( ptr->definition.c_str(), strlen(ptr->definition.c_str()) ),
		0);

	    hv_store( w,
		"explanation", strlen("explanation"),
		newSVpv( ptr->explanation.c_str(), strlen(ptr->explanation.c_str()) ),
		0);

	    av_push(a_res, newRV( (SV*) w ) );
	}



	SV* ref = newRV( (SV*) a_res );
    
	EXTEND(SP, 1);
        PUSHs(sv_2mortal( ref ));







( run in 0.648 second using v1.01-cache-2.11-cpan-5511b514fd6 )