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.