#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")); }