diff options
Diffstat (limited to 'kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C')
-rw-r--r-- | kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C | 327 |
1 files changed, 327 insertions, 0 deletions
diff --git a/kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C b/kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C new file mode 100644 index 00000000..a83d947b --- /dev/null +++ b/kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C @@ -0,0 +1,327 @@ +#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")); + +} |