/* st04.c CJP Version 2.3 16/10/07 */ #include #include #include"blimp.h" #include"alw1.h" #include"nty.h" #define MAXTWORELS 100000 int tworels[MAXTWORELS][2]; int tr; int addtworel(int* rel, int len); int cleartworel(); int writetworel(FILE *f); int main(int argc, char **argv) { int keepgoing; int i,j,k, len, relh, rels, nth; int inrels; int l1,l2; int *gp, *b, *b2,*rel, *inv; FILE *f1,*f2,*f3,*f4; int good=1; int *pt, *pt2; int *p,*p2; int changed; int lentwo; int restart; int m; NTY n; NTY *nt; int test; nt = &n; gp = (int*) malloc(sizeof(int)*GRPSIZ); if(gp==NULL) good=0; b = (int*) malloc(sizeof(int)*GRPSIZ); if(b==NULL) good=0; b2 = (int*) malloc(sizeof(int)*GRPSIZ); if(b2==NULL) good=0; rel = (int*) malloc(sizeof(int)*GRPSIZ); if(rel==NULL) good=0; inv = (int*) malloc(sizeof(int)*GRPSIZ); if(inv==NULL) good=0; ntycons(nt); if(good==0) { printf("Error allocating memory\n"); return 0; } if(argc!=5) { printf("Usage: st04 \n"); return 0; } f1 = (FILE*) fopen(argv[1],"r"); if(f1==NULL) { printf("Error opening file %s",argv[1]); return 0; } f2 = (FILE*) fopen(argv[2],"w"); if(f2==NULL) { printf("Error opening file %s",argv[2]); return 0; } f3 = (FILE*) fopen(argv[3],"w"); if(f3==NULL) { printf("Error opening file %s",argv[3]); return 0; } f4 = (FILE*) fopen(argv[4],"w"); if(f4==NULL) { printf("Error opening file %s",argv[4]); return 0; } while(1) { changed=0; lentwo=0; tr=0; i = ReadGroup(gp,f1); if(i==-1) break; ExtractBlimp(gp,3,inv); k=inv[1]; for(i=0;i2) { if(ntyinsert(nt,rel,i)==0) changed=1; } else { printf("Relator of length 2 in input file %s. Exiting.\n",argv[1]); return 0; } } // Piss about with the NTY to reduce it restart=1; while(restart) { keepgoing=1; j = ntynexnts(nt,1,-1); if(j==2) // To catch the 1 - 2 list. { keepgoing=0; } while(keepgoing) // Look for AX, AY { i = j; j = ntynexnts(nt,j,-1); if(j==2) { break; } l2 = ntyntlen(nt,j); l1 = ntyntlen(nt,i); p2 = ntyntptr(nt,j); p = ntyntptr(nt,i); if(l2==l1) { good=1; for(k=0;kl1) { good=1; for(k=0;k2) { changed=1; ntydelete(nt,ntyntrel(nt,j)); ntyinsert(nt,b2,l2-l1); restart=1; break; } if(l2-l1==2) { if(tr!=MAXTWORELS) { changed=1; ntydelete(nt,ntyntrel(nt,j)); tworels[tr][0]=b2[0]; tworels[tr][1]=b2[1]; tr++; restart=1; break; } } if(l2-l1==1) { if(tr!=MAXTWORELS) { changed=1; ntydelete(nt,ntyntrel(nt,j)); tworels[tr][0]=b2[0]; tworels[tr][1]=0; tr++; restart=1; break; } } } } } } // Write out file b2[0]=6; len=1; rels=0; pt=b2; pt++; pt++; pt++; // Write out relators from nty, adding each len+1 to len. relh=1; while(1) { relh=ntynexrel(nt,relh); if(relh==2) break; j = ntyntlen(nt,ntyrelnt(nt,relh)); pt2 = ntyntptr(nt,ntyrelnt(nt,relh)); for(k=0;k0) { DeleteBlimp(gp,6); InsertBlimp(gp,b2); WriteGroup(gp,f2); } else if(changed==1) { DeleteBlimp(gp,6); InsertBlimp(gp,b2); WriteGroup(gp,f3); } else { WriteGroup(gp,f4); } } WriteEOF(f2); fclose(f2); WriteEOF(f3); fclose(f3); WriteEOF(f4); fclose(f4); fclose(f1); } /* end of st04.c */