ftp.nice.ch/pub/next/unix/audio/cmusic.bs.N.tar.gz#/src/cmusic/mm.merge.c

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.