ftp.nice.ch/pub/next/developer/objc/appkit/ContourPlot.1.4.NIHS.bs.tar.gz#/ContourPlot/matalloc.c

This is matalloc.c in view mode; [Download] [Up]

/* Multi-dimensional array dynamic allocation routines
 * From Num. Receipes by Press et al., Geoff Ghose version for NOVA3
 * 90-11-19, Izumi Ohzawa
 * 	Modified for RCA3d (reverse correlation analysis) for NeXT
 * 92-02-21, Izumi Ohzawa
 *	For RCPhase
*/

/* #include <malloc.h>	*/	/* MSDOS */
#include <stdlib.h>
#include <stdio.h>

#include "matalloc.h" 

/* ###### 1-d int */

int *ivector(nl,nh)
int nl,nh;
{
	int *v;
	v=(int *)malloc((unsigned)(nh-nl+1)*sizeof(int));
	if(!v) fprintf(stderr, "allocation failure in ivector()\n");
	return(v-nl);
}


void free_ivector(v,nl,nh)
int *v;
int nl,nh;
{
	free((void *)(v+nl));
}


/* ###### 1-d float */

float *fvector(nl,nh)
int nl,nh;
{
	float *v;
	v=(float *)malloc((unsigned)(nh-nl+1)*sizeof(float));
	if(!v) fprintf(stderr, "allocation failure in fvector()\n");
	return(v-nl);
}


void free_fvector(v,nl,nh)
float *v;
int nl,nh;
{
	free((void *)(v+nl));
}


/* ###### 1-d unsigned long */

unsigned long *ulvector(nl,nh)
int nl,nh;
{
	unsigned long *v;
	v=(unsigned long *)malloc((unsigned)(nh-nl+1)*sizeof(unsigned long));
	if(!v) fprintf(stderr, "allocation failure in ulvector()\n");
	return(v-nl);
}


void free_ulvector(v,nl,nh)
unsigned long *v;
int nl,nh;
{
	free((void *)(v+nl));
}

/* ##### 2-d float */
 
float **fmatrix(nrl,nrh,ncl,nch)
int nrl,nrh,ncl,nch;
{
   int i=2,j;
   int error=0;
   float **m;
	m=(float **) malloc((unsigned) (nrh-nrl+1)*sizeof(float *));
	if (!m) fprintf(stderr, "allocation failure 1 in fmatrix()\n");
	else{
	   m -= nrl;
	   i=nrl;
	   do{
		m[i]=(float *) malloc((unsigned) (nch-ncl+1)*sizeof(float));
		if (!m[i]) {
			fprintf(stderr, "allocation failure 2 in fmatrix()\n");
			error=1;
		}else
			m[i] -= ncl;
		i++;
           }while( (i<=nrh) && (!error));
	}
	if(error){
		fprintf(stderr, "Freeing allocated submatrices...\n");
		for(j=i-2;j>=nrl;j--)	       /* free those allocated */
			free((void *)(m[j]+ncl));
		free((void *)(m+nrl));
		m=NULL;
 	}
	return m;
}


void free_fmatrix(m,nrl,nrh,ncl,nch)
float **m;
int nrl,nrh,ncl,nch;
{
	int i;
	for(i=nrh;i>=nrl;i--)free((void *)(m[i]+ncl));
	free((void *) (m+nrl));

}



/* ##### 2-d int */
 
int **imatrix(nrl,nrh,ncl,nch)
int nrl,nrh,ncl,nch;
{
   int i=2,j;
   int error=0;
   int **m;
	m=(int **) malloc((unsigned) (nrh-nrl+1)*sizeof(int *));
	if (!m) fprintf(stderr, "allocation failure 1 in imatrix()\n");
	else{
	   m -= nrl;
	   i=nrl;
	   do{
		m[i]=(int *) malloc((unsigned) (nch-ncl+1)*sizeof(int));
		if (!m[i]) {
			fprintf(stderr, "allocation failure 2 in imatrix()\n");
			error=1;
		}else
			m[i] -= ncl;
		i++;
           }while( (i<=nrh) && (!error));
	}
	if(error){
		fprintf(stderr, "Freeing allocated submatrices...\n");
		for(j=i-2;j>=nrl;j--)	       /* free those allocated */
			free((void *)(m[j]+ncl));
		free((void *)(m+nrl));
		m=NULL;
 	}
	return m;
}


void free_imatrix(m,nrl,nrh,ncl,nch)
int **m;
int nrl,nrh,ncl,nch;
{
	int i;
	for(i=nrh;i>=nrl;i--)free((void *)(m[i]+ncl));
	free((void *) (m+nrl));

}


/* ##### 2-d short int */

short int **simatrix(nrl,nrh,ncl,nch)
int nrl,nrh,ncl,nch;
{
   int i=2,j;
   int error=0;
   short int **m;
	m=(short int **) malloc((unsigned) (nrh-nrl+1)*sizeof(short int*));
	if (!m) fprintf(stderr, "allocation failure 1 in simatrix()\n");
	else {
   	  m -= nrl;
	  i=nrl;
	  do{
		m[i]=(short int *) malloc((unsigned) (nch-ncl+1)*sizeof(short int));
		if (!m[i]) {
			fprintf(stderr, "allocation failure 2 in simatrix()\n");
			error=1; /* set entire matrix to FAILED */
		}
		else {
			m[i] -= ncl;
		}
		i++;
	  } while( (i<=nrh) && (!error) ); /* halt if any row fails */
     	}
	if(error){
		fprintf(stderr, "Freeing allocated submatrices...\n");
		for(j=i-2;j>=nrl;j--)	       /* free those allocated */
			free((void *)(m[j]+ncl));
		free((void *)(m+nrl));
		m=NULL;
 	}
	return m;
}


void free_simatrix(m,nrl,nrh,ncl,nch)
short int **m;
int nrl,nrh,ncl,nch;
{
	int i;
	for(i=nrh;i>=nrl;i--)free((void *)(m[i]+ncl));
	free((void *) (m+nrl));

}



/* ##### 3-d short int */

short int ***tdsint(nxl,nxh,nyl,nyh,nzl,nzh)
int nxl,nxh,nyl,nyh,nzl,nzh;
{
   int i,j;
   short int ***d, **simatrix();
   void free_simatrix();

	d=(short int ***)malloc( (unsigned)(nxh-nxl+1)*sizeof(short int **));
	if(!d) fprintf(stderr, "Allocation failure in tdsint().\n");
	else
	{
		d-=nxl;
		i=nxl;
		do{
			d[i]= simatrix(nyl,nyh,nzl,nzh);
			i++;
		}
		while( (i<=nxh) && (d[i-1]) ); /* halt if matrix failed */
		if (!d[i-1]) { /* set td to null if matrix failed */
			fprintf(stderr, "Allocation failure in tdsint()\n");
			fprintf(stderr, "Freeing allocated submatrices...\n");
			for(j=i-2;j>=nxl;j--)	       /* ree those allocated */
				free_simatrix(d[j],nyl,nyh,nzl,nzh);
			free((void *)(d+nxl));
			d=NULL;
		}
 	}
	return d;
}




void free_tdsint(d,nxl,nxh,nyl,nyh,nzl,nzh)
short int ***d;
int nxl,nxh,nyl,nyh,nzl,nzh;
{
   int i,j;
   short int **m,*n;
	for(i=nxh;i>=nxl;i--)
	{
		m=d[i];
		for(j=nyh;j>=nyl;j--)
		{
			n=m[j]+nzl;
			free( (void *)n);
		}
		free( (void *)(m+nyl));
	}
	free( (void *) (d+nxl) );
}

/* ##### 3-d int */

int ***tdint(nxl,nxh,nyl,nyh,nzl,nzh)
int nxl,nxh,nyl,nyh,nzl,nzh;
{
   int i,j;
   int ***d, **imatrix();
   void free_simatrix();

	d=(int ***)malloc( (unsigned)(nxh-nxl+1)*sizeof(int **));
	if(!d) fprintf(stderr, "Allocation failure in tdint().\n");
	else
	{
		d-=nxl;
		i=nxl;
		do{
			d[i]= imatrix(nyl,nyh,nzl,nzh);
			i++;
		}
		while( (i<=nxh) && (d[i-1]) ); /* halt if matrix failed */
		if (!d[i-1]) { /* set td to null if matrix failed */
			fprintf(stderr, "Allocation failure in tdint()\n");
			fprintf(stderr, "Freeing allocated submatrices...\n");
			for(j=i-2;j>=nxl;j--)	       /* ree those allocated */
				free_imatrix(d[j],nyl,nyh,nzl,nzh);
			free((void *)(d+nxl));
			d=NULL;
		}
 	}
	return d;
}




void free_tdint(d,nxl,nxh,nyl,nyh,nzl,nzh)
int ***d;
int nxl,nxh,nyl,nyh,nzl,nzh;
{
   int i,j;
   int **m,*n;
	for(i=nxh;i>=nxl;i--)
	{
		m=d[i];
		for(j=nyh;j>=nyl;j--)
		{
			n=m[j]+nzl;
			free( (void *)n);
		}
		free( (void *)(m+nyl));
	}
	free( (void *) (d+nxl) );
}



These are the contents of the former NiCE NeXT User Group NeXTSTEP/OpenStep software archive, currently hosted by Netfuture.ch.