summaryrefslogtreecommitdiffstats
path: root/kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C
diff options
context:
space:
mode:
Diffstat (limited to 'kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C')
-rw-r--r--kbabel/kbabeldict/modules/dbsearchengine/makemsgdb.C327
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"));
+
+}