#include <fstream.h>#include <stdio.h>#include <string.h>#include <stdlib.h>#include <unistd.h>#define MAXN 5000using namespace std;main(int argc, char **argv){ char *forms[MAXN];//массив названий форм char *strs[MAXN];//массив названий слов int idform[MAXN];//индекс в forms int other_forms;//номер скоторого формы в forms[] попадают под 'other' char str[250];//буфер для слова char form[250];//буфер для формы int stri=0;//текущий символ в слове int formi=0;//текущий символ в форме int count_str=0;//кол-во слов int count_form=0;//кол-во форм//очистка массивов for(int i=0;i<MAXN;i++){ forms[i]=NULL; strs[i]=NULL; idform[i]=0; other_forms=0; str[i]=0; form[i]=0; } int cntF=0,cntW=0,flagEndForms=-1,last=0; unsigned char c=0,c1=0,c2=0,c3=0; while(read(0,&c,1)){ if(flagEndForms>=0){//получение конечных форм if((c>='0' && c<='9') || (c>='a' && c<='z') || (c>='A' && c<='Z') || c=='_'){ form[formi]=c; form[formi+1]=0; formi++; }else{ if(formi>5 && last==strlen(form)){ forms[count_form]=strdup(form); count_form++; } formi=0; last=c;//Последний не буквенный символ, если мы нашли то, что искали, то он равен длине } continue; } if(cntF>0){//чтение формы form[formi]=c; formi++; cntF--; if(cntF==0){//конец формы form[formi]=0; forms[count_form]=strdup(form); idform[count_str-1]=count_form; count_form++; } } if(cntW>0){//чтение слова cntW--; if(c && c!=38){ str[stri]=c; stri++; } if(cntW==0){//конец слова str[stri]=0; strs[count_str]=strdup(str); idform[count_str]=-1; count_str++; } } if(cntF==-1){cntF=c;formi=0;} if(cntW==-1){cntW=c;stri=0;} if((c3==7)&&(c2==0)&&(c1==0)&&(c==0))cntF=-1; //далее форма if((c3==3)&&(c2==0)&&(c1==0)&&(c==0))cntW=-1; //далее слово if((c3==151)&&(c2==0)&&(c1==0)&&(c==0) || (c3==1)&&(c2==0xF7)&&(c1==0)&&(c==0 || c==1) || (c3==151)&&(c2==0)&&(c1==1)&&(c==0)) { flagEndForms=count_form; form[0]=0; formi=0; } c3=c2; c2=c1; c1=c;//сдвиг }// printfor(int i=0;i<count_form;i++) if(i>=flagEndForms) printf("= %s\n",forms[i]); else printf(" %s\n",forms[i]);for(int i=0;i<count_str;i++) printf("s [%d]\t%s\n",idform[i],strs[i]); ofstream f("tmp.ts", ios::app); f << "<!DOCTYPE TS><TS>" << endl; for(int i=0;i<count_str;i++){ f << "<context>" << endl; if(idform[i] != -1) f << "\t<name>" << forms[idform[i]] << "</name>" << endl; else{printf("flagEndForms [%d]\n",flagEndForms); f << "\t<name>" << forms[flagEndForms] << "</name>" << endl; if( flagEndForms<count_form-1 ) flagEndForms++; } f << "\t<message>" << endl; f << "\t\t<source>" << strs[i] << "</source>" << endl; f << "\t\t<translation type=\"unfinished\">" << "</translation>" << endl; f << "\t</message>" << endl; f << "</context>" << endl; } f << "</TS>" << endl; f.close();//очистка массивов for(int i=0;i<MAXN;i++){ free(forms[i]); free(strs[i]); }}
#!/bin/shrm -f rmzerosg++-3.3 rmzeros.cppmv a.out rmzerosdir=qmrm -r $dir"_ts"/*rm -r $dir"_qm"/*rm -r $dir"_log"/*mkdir $dir"_ts"mkdir $dir"_qm"mkdir $dir"_log"list=`ls -1 $dir ; echo /`while [ "$list" != "/" ] ; do fname=${list%%*} list=${list#*} echo $fname mkdir $dir"_ts"/$fname cat $dir/$fname | ./rmzeros >> $dir"_log"/$fname.log cp tmp.ts $dir"_ts"/$fname/$fname.ts /usr/lib/qt3/bin/lrelease $dir"_ts"/$fname/$fname".ts" -qm $dir"_qm"/$fname rm tmp.ts echo "#!/bin/bash" > $dir"_ts"/$fname/zzz echo "" >> $dir"_ts"/$fname/zzz echo "/usr/lib/qt3/bin/linguist "$fname.ts >> $dir"_ts"/$fname/zzz echo "/usr/lib/qt3/bin/lrelease "$fname.ts" -qm "$fname >> $dir"_ts"/$fname/zzz chmod 777 $dir"_ts"/$fname/zzzdonerm -f rmzeros