You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
tdesdk/kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.cpp

328 lines
7.3 KiB

#include <stdio.h>
#include <time.h>
#include <errno.h>
#include <gdbm.h>
#include <string.h>
void removechar (char *s, int c)
{
int i, l;
l = strlen (s);
if ((c >= l) || (c < 0))
return;
for (i = c; i < l; i++)
s[i] = s[i + 1];
}
void removeallc (char *s, char c)
{
char *pos;
while ((pos = strchr (s, c)) != 0)
removechar (s, (long int) pos - (long int) s);
}
void normalizestr (char *s)
{
char *pos;
while ((pos = strstr (s, "#~")) != 0) {
removechar (s, (long int) pos - (long int) s);
removechar (s, (long int) pos - (long int) s);
}
while (strchr (s, ' ') == s)
removechar (s, 0);
}
void freadline(char *buff,FILE *f)
{
char c;
while ((fread(&c,1,1,f)==1) && (c!='\n'))
{
*buff=c;
buff++;
}
*buff=0;
}
int makePoDb(const char* sourceName,const char* outputName)
{
static bool open = false;
int m=0,n=0,h=0;
GDBM_FILE db;
datum key,value;
char *s,a[20000],b[2000],k[2000],v[2000];
int i,*np,nmax=0,co=-1,oldref[2000];
long int tim;
FILE *mlf;
bool nextIsFuzzy;
bool isAMsgId=true;
/* char keystring[1000],valuestring[1000]; */
/*Read headers, refnum end other info */
db = gdbm_open((char *)outputName,1024,GDBM_READER,0666,0);
mlf = fopen(sourceName,"r");
if(strrchr(sourceName,'/')!=0)
sourceName=strrchr(sourceName,'/')+1;
if(!(db==0))
{
printf("ciao\n");
key.dptr=a;
strcpy(a,"__@REFNUM__");
key.dsize=strlen(a)+1;
value = gdbm_fetch(db,key);
np=(int*)value.dptr;
nmax=*np;
for(i=0;i<nmax;i++) {
sprintf(a,"__@%d__",i);
key.dsize=strlen(a)+1;
value = gdbm_fetch(db,key);
if(strcmp(value.dptr,sourceName)==0)
oldref[++co]=i;
// printf("File %s in Date %s\nRef # %d, oldref[%d]=%d\n",value.dptr,value.dptr+1+strlen(value.dptr),i,co,oldref[co]);
}
gdbm_close(db);
}
db = gdbm_open((char *)outputName,1024,GDBM_WRCREAT,0666,0);
if(db==0) return 0;
nmax++;
//sourceName=strrchr(sourceName,'/')+1;
if(open) return 0;
open=true;
key.dptr=a;
strcpy(a,"__@REFNUM__");
key.dsize=strlen(a)+1;
value.dptr=(char *)&nmax;
value.dsize=4;
gdbm_store(db,key,value,GDBM_REPLACE);
sprintf(a,"__@%d__",nmax-1);
key.dsize=strlen(a)+1;
strcpy(v,sourceName);
value.dptr=v;
time(&tim);
// ctime(&tim);
// fprintf(stderr,"%s %s\n",v,ctime(&tim));
strcpy(v+strlen(v)+1,ctime(&tim));
value.dsize=strlen(v)+2+strlen(v+strlen(v)+1);
gdbm_store(db,key,value,GDBM_REPLACE);
while(!feof(mlf))
{
freadline(a,mlf);
normalizestr(a);
// printf("#%s#\n",a);
// while (st.find("#~")==0)
// st = st.right(st.length()-2);
// while (st.find(" ")==0)
// st = st.right(st.length()-1);
if(isAMsgId) nextIsFuzzy=false;
if(strstr(a,"#,")==a)
if(strstr(a,"fuzzy")!=0) nextIsFuzzy=true;
isAMsgId=(strstr(a,"msgid"));
if(isAMsgId && !nextIsFuzzy)
{
*b='\0';
clearerr(mlf);
while(!feof(mlf) && !(strstr(a,"msgstr")==a))
{
strcat(b,strchr(a,'"')+1);
*strrchr(b,'\"')= '\0'; //"
freadline(a,mlf);
normalizestr(a);
if(b+strlen(b)==strstr(b,"\\n")+2)
{
b[strlen(b)-2]='\n';
b[strlen(b)-1]='\0';
}
}
// fprintf(stderr,"MSGID#%s#\n",b);
//}
if(b[0]!='\0') {
key.dptr=k;
strcpy(k,b);
key.dsize=strlen(key.dptr)+1;
int lines=0;
*b='\0';
while(!feof(mlf) && !(strstr(a,"msgid")==a) && !(strchr(a,'"')==0))
{
lines++;
strcat(b,strchr(a,'"')+1);
*strrchr(b,'\"')= '\0'; //"
freadline(a,mlf);
normalizestr(a);
if(b+strlen(b)==strstr(b,"\\n")+2)
{
b[strlen(b)-2]='\n';
b[strlen(b)-1]='\0';
}
}
value.dptr=v;
int *t;
int *nr,*re; //,*md; //Number of references,ref
t=(int *)value.dptr;
*t=1;
strcpy(value.dptr+4,b);
nr=(int *)(value.dptr+4+strlen(value.dptr+4)+1);
*nr=1;
nr++;
*nr=nmax-1;
value.dsize=strlen(value.dptr+4)+1+4+8;
// fprintf(stderr,"MSGSTR#%s#nref=%d\n",value.dptr+4,
// *(int*)(value.dptr+4+strlen(value.dptr+4)+1 ));
if(b[0]!='\0') {
if(gdbm_store(db,key,value,GDBM_INSERT))
{
// fprintf(stderr,"*** Key exists ***\n");
gdbm_sync(db);
gdbm_close(db);
db = gdbm_open((char *)outputName,1024,GDBM_READER,0,0);
datum oldvalue;
oldvalue= gdbm_fetch(db,key);
gdbm_sync(db);
gdbm_close(db);
db = gdbm_open((char *)outputName,1024,GDBM_WRCREAT,0,0);
t=(int *)oldvalue.dptr;
int i,r,j; //counters
int v=*t; //Number of strings
int *nr,*re,*md; //Number of references,ref
bool exist=false,here,modif=false;
char *os=oldvalue.dptr+4;
// fprintf(stderr,"**Searching string #%s#\n",b);
for(i=0;i<v;i++)
{
exist=false; //REMOVE THIS LINE!!!
here=false;
// fprintf(stderr,"**STRING %d #%s# len=%d %s\n",i,os,strlen(os),b);
if(strcmp(os,b)==0) {
exist=true;
here=true;
// fprintf(stderr,"That's good\n");
}
os+=strlen(os)+1; //End of string
nr=(int *)os;
os+=(*nr+1)*4;
re=nr;
modif=false;
// fprintf(stderr,"refernces %d\n",*nr);
for(j=0;j<*nr;j++)
{
re++;
if(here)
{
// printf("reference #%d\n",*re);
for(r=0;r<=co;r++)
{
// fprintf(stderr,"%d==%d ?-->",oldref[co],*re);
if(oldref[r]==*re)
{
modif=true;
// fprintf(stderr,"Yes\n");
*re=(nmax-1);
} //else fprintf(stderr,"No\n");
}
// fprintf(stderr,"qui\n");
if(!modif)
md=nr;
// fprintf(stderr,"modif %s\n",modif ? "true":"false");
}
}
}
if(!exist)
{
int oldlen=(long int)os-(long int)oldvalue.dptr-4;
memcpy(a+4,oldvalue.dptr+4,oldlen);
// fprintf(stderr,"***!exist Old len is %d+4 1st str is %s\n",oldlen,a+4);
v++;
t=(int *)a;
*t=v;
// fprintf(stderr,"b=%s",b);
strcpy(a+4+oldlen,b);
re=(int *)(a+4+oldlen+strlen(b)+1);
*re=1;
re++;
*re=nmax-1;
//fprintf(stderr,"a+4=%s a+4+oldlen=%s",a+4,a+4+oldlen);
value.dptr=a;
value.dsize=oldlen+strlen(b)+1+4+8;
gdbm_store(db,key,value,GDBM_REPLACE);
n++;
} else
{
if(!modif)
{
// fprintf(stderr,"grossa crisi %d\n",*md);
// fprintf(stderr,"Old num of ref \n");
int oldlen1=(long int)(md)-(long int)(oldvalue.dptr)-4;
int oldlen2=(long int)(os)-(long int)(md)-4; //-4 because nr
memcpy(a+4,oldvalue.dptr+4,oldlen1);
memcpy(a+4+oldlen1+8,oldvalue.dptr+4+oldlen1+4,oldlen2);
re=(int *)(a+4+oldlen1);
*re=(*md )+1;
// *re++;
re++;
*re=nmax-1;
t=(int *)a;
*t=v;
value.dptr=a;
value.dsize=oldlen1+oldlen2+4+8;
gdbm_store(db,key,value,GDBM_REPLACE);
n++;
}
else //if (modif)
{
value.dptr=oldvalue.dptr;
value.dsize=oldvalue.dsize;
gdbm_store(db,key,value,GDBM_REPLACE);
}
}
h++;
} else {
m++;
}
}
}
}
}
fclose(mlf);
gdbm_close(db);
open=false;
printf("new Key in database %d\n old key found %d\n value added %d\n",m,h,n);
return m+n;
}
main(int argc,char **argv)
{
int i;
for(i=1;i<argc;i++)
printf("File %s:\nEntry added to dbase: %d\n",argv[i],makePoDb(argv[i],"messages2.db"));
}