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.