This is mm.merge.c in view mode; [Download] [Up]
#include "mm.head.h" #include <signal.h> #define P2 (*(Params+2)) #define P4 (*(Params+4)) char mfn[16]; char *merge(){ float *PVars, *PParams; int i, PVerbose, nmfiles; FILE *mfile[1024]; static char *mrgfn = "/tmp/mrgXXXXXX"; char *mkmrgfn(), *mktemp(); char comfld[1024], cmd[1024]; static char clean[1024]; /* * Squirrel away p and v states. */ PParams = (float *) calloc(Nparams+1,sizeof(float)); for(i = 0; i <= Nparams; i++) *(PParams+i) = *(Params+i); PVars = (float *) calloc(Nvars+1,sizeof(float)); for(i = 0; i <= Nvars; i++) *(PVars+i) = *(Vars+i); /* * Temporarily turn off verbosity, if on. */ PVerbose = Verbose; Verbose = 0; PInfile = Infile; /* * Read score statements until "endmerge" encountered (EOF = error). * Actually execute var statements affecting v's since p2 and p4 might * depend on v's; evaluate p2 on all "gen", "not" (p4 as well on this * one), "pri", and "var" statements; treat "ins", "mer", "set", "sec", * and "ter" statements as errors within a merge; ignore "com" * statements. Write all statements onto file until "sec" encountered; * repeat as needed with new temp files for each section. */ Merging = 1; strcpy(mfn, mrgfn); strcpy(mfn, mktemp(mfn)); nmfiles = 0; catch(); /* Catch all signals to allow for mrg file cleanup */ mfile[nmfiles] = fopen(mkmrgfn(mfn,nmfiles), "w"); nmfiles++; while( bc = field(fld,SIGS,SBRK) ){ strcpy(comfld, fld); if(bc == EOF){ Error++; PROUT("EOF encountered during merge",bc);exit(-1); } if(S3("var",fld)){variable(); continue;} if(S3("gen",fld) || S3("pri",fld) ){ fputs(fld, mfile[nmfiles-1]); /* Write out command */ field(fld,SIGS,SBRK); /* Read p2 */ P2 = getp2(fld); /* Evaluate p2 */ sprintf(fld," %f",P2); /* Convert value for printing */ sqz0s(fld); /* Squeeze trailing fractional zeros */ strcat(fld, " "); fputs(fld, mfile[nmfiles-1]); /* Write out p2 */ field(fld,"",";"); /* Read to end of statement */ fputs(fld, mfile[nmfiles-1]); /* Write it out */ fputs(";\n", mfile[nmfiles-1]); /* Write EOL */ continue; } if(S3("not",fld) || S3("pla",fld)){ fputs(fld, mfile[nmfiles-1]); /* Write out command */ field(fld,SIGS,SBRK); /* Read p2 */ P2 = getp2(fld); /* Evaluate p2 */ sprintf(fld," %f",P2); /* Convert value for printing */ sqz0s(fld); /* Squeeze trailing fractional zeros */ strcat(fld, " "); fputs(fld, mfile[nmfiles-1]); /* Write out p2 */ field(fld,"",SBRK); /* Read ins */ fputs(fld, mfile[nmfiles-1]); /* Write out ins */ bc = field(fld,SIGS,SBRK); /* Read p4 */ P4 = getp4(fld); /* Evaluate p4 */ sprintf(fld," %f",P4); /* Convert value for printing */ sqz0s(fld); /* Squeeze trailing fractional zeros */ strcat(fld, " "); fputs(fld, mfile[nmfiles-1]); /* Write out p4 */ if(bc != ';'){ field(cmd,"",";"); /* Read to end of statement */ fputs(cmd, mfile[nmfiles-1]); /* Write it out */ } fputs(";\n", mfile[nmfiles-1]); /* Write EOL */ continue; } if(!strncmp("endsec",fld,strlen(fld))){ fclose(mfile[nmfiles-1]); mfile[nmfiles] = fopen(mkmrgfn(mfn,nmfiles), "w"); nmfiles++; if(bc != ';'){ Error++; PROUT("Illegal endsec statement\n",fld); SEMIC; } for(i = 0; i <= Nparams; i++) *(Params+i) = 0; continue; } if(!strncmp("endmerge",fld,strlen(fld))) break; if(S3("com",fld)){SEMIC; continue;} if(!strncmp(" ",fld,strlen(fld))){continue;} /* * Errors */ if( S3("ins",fld) || S3("mer",fld) || S3("set",fld) || S3("sec",fld) || S3("ter",fld) ){ Error++; PROUT("\nMERGE: Command '%s' illegal inside merge\n",fld); SEMIC; continue; } CMD(fld);UNREC;NL;SEMIC; } fclose(mfile[nmfiles-1]); /* * Sort and merge the section files. */ strcpy(cmd, "sort -n +1 "); for(i = 0; i < nmfiles; i++){ strcat(cmd, mkmrgfn(mfn,i)); strcat(cmd, " "); } strcat(cmd, " > "); strcat(cmd, mkmrgfn(mfn,nmfiles+1)); system(cmd); for(i = 0; i < nmfiles; i++){ strcpy(cmd, "rm "); strcat(cmd, mkmrgfn(mfn,i)); system(cmd); } strcpy(clean, "rm "); strcat(clean, mkmrgfn(mfn,nmfiles+1)); /* * Set mergeflag and Infile to point at mergefile. */ Infile = fopen(mkmrgfn(mfn,nmfiles+1), "r"); Mergeflag = 1; Merging = 0; /* * Restore verbosity, p and v states. */ for(i = 0; i <= Nparams; i++) *(Params+i) = *(PParams+i); free(PParams); for(i = 0; i <= Nvars; i++) *(Vars+i) = *(PVars+i); free(PVars); Verbose = PVerbose; /* * Return to cmusic, which then reads mergefile until EOF, then returns to * reading normal input file. */ return(clean); } char *mkmrgfn(fn, n) char fn[]; int n; { static char tfn[16]; static char c_index[] = {'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'}; strcpy(tfn, fn); if(n < 52) tfn[14] = c_index[n]; /*assure 52 unique file names - sfl */ else { fprintf(stderr, "Too many merge files! - exiting\n"); exit(1); } tfn[15] = '\0'; return(tfn); } /* Squeeze out trailing fractional zeroes from float number strings */ sqz0s(s) char s[];{ if(!index(s,'.'))return; while(s[strlen(s)-1] == '0')s[strlen(s)-1] = '\0'; if(s[strlen(s)-1] == '.')s[strlen(s)-1] = '\0'; } cleanmrg(){ char cmd[1024]; strcpy(cmd, "rm "); strcat(cmd, mfn); strcat(cmd, " "); cmd[strlen(cmd)-1] = '*'; system(cmd); exit(0); } catch(){ int i, cleanmrg(); for(i = 1; i <= 15; i++)signal(i,cleanmrg); }
These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.