ArrayFactories.c

Go to the documentation of this file.
00001 /*----------------------------------------------------------------------- 
00002 
00003 File Name: ArrayFactories.c
00004 
00005 <lalVerbatim file="ArrayFactoriesCV">
00006 Revision: $Id: ArrayFactories.m4,v 1.5 2003/09/29 00:33:24 dwchin Exp $
00007 </lalVerbatim>
00008 
00009 -------------------------------------------------------------------------*/
00010 
00011 /* <lalLaTeX>
00012 
00013 \subsection{Module \texttt{ArrayFactories.c}}
00014 \label{ss:ArrayFactories.c}
00015 
00016 Create/destroy $\langle\mbox{datatype}\rangle$Array objects. 
00017 
00018 \subsubsection*{Prototypes}
00019 \vspace{0.1in}
00020 \input{ArrayFactoriesD}
00021 \idx{LALZCreateArray()}
00022 \idx{LALCCreateArray()}
00023 \idx{LALDCreateArray()}
00024 \idx{LALSCreateArray()}
00025 \idx{LALI2CreateArray()}
00026 \idx{LALI4CreateArray()}
00027 \idx{LALI8CreateArray()}
00028 \idx{LALU2CreateArray()}
00029 \idx{LALU4CreateArray()}
00030 \idx{LALU8CreateArray()}
00031 \idx{LALCreateArray()}
00032 \idx{LALZDestroyArray()}
00033 \idx{LALCDestroyArray()}
00034 \idx{LALDDestroyArray()}
00035 \idx{LALSDestroyArray()}
00036 \idx{LALI2DestroyArray()}
00037 \idx{LALI4DestroyArray()}
00038 \idx{LALI8DestroyArray()}
00039 \idx{LALU2DestroyArray()}
00040 \idx{LALU4DestroyArray()}
00041 \idx{LALU8DestroyArray()}
00042 \idx{LALDestroyArray()}
00043 
00044 \subsubsection*{Description}
00045 
00046 The \texttt{CreateArray} family of functions create a
00047 $\langle\mbox{datatype}\rangle$\texttt{Array} of the appropriate dimensions.
00048 
00049 The \texttt{DestroyArray} family of functions return the storage allocated by
00050 the \texttt{CreateArray} functions to the system.
00051 
00052 \subsubsection*{Algorithm}
00053 
00054 \subsubsection*{Uses}
00055 \begin{verbatim}
00056 LALMalloc()
00057 LALFree()
00058 \end{verbatim}
00059 
00060 \subsubsection*{Notes}
00061 
00062 \vfill{\footnotesize\input{ArrayFactoriesCV}}
00063 
00064 </lalLaTeX> */
00065 
00066 #include <string.h>
00067 #include "LALStdlib.h"
00068 #include "AVFactories.h"
00069 
00070 /* <lalVerbatim file="ArrayFactoriesNRCSID"> */
00071 NRCSID( ARRAYFACTORIESC, "$Id: ArrayFactories.m4,v 1.5 2003/09/29 00:33:24 dwchin Exp $" );
00072 /* </lalVerbatim> */
00073 
00074 
00075 
00076 
00077 
00078 
00079 
00080 
00081 
00082 
00083 
00084 
00085 
00086 
00087 
00088  
00089  
00090  
00091 
00092 COMPLEX16Array * XLALCreateCOMPLEX16ArrayL ( UINT4 ndim, ... )
00093 {
00094   enum { maxdim = 16 };
00095   va_list ap;
00096   COMPLEX16Array *arr;
00097   UINT4 dims[maxdim];
00098   UINT4 dim;
00099 
00100   if ( ! ndim )
00101     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16ArrayL", XLAL_EBADLEN );
00102   if ( ndim > maxdim )
00103     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16ArrayL", XLAL_EINVAL );
00104 
00105   va_start( ap, ndim );
00106   for ( dim = 0; dim < ndim; ++dim )
00107     dims[dim] = va_arg( ap, UINT4 );
00108   va_end( ap );
00109 
00110   arr = XLALCreateCOMPLEX16ArrayV ( ndim, dims );
00111   if ( ! arr )
00112     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16ArrayL", XLAL_EFUNC );
00113   return arr; 
00114 }
00115 
00116 COMPLEX16Array * XLALCreateCOMPLEX16ArrayV ( UINT4 ndim, UINT4 *dims )
00117 {
00118   COMPLEX16Array *arr;
00119   UINT4Vector dimLength;
00120 
00121   if ( ! ndim )
00122     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16ArrayV", XLAL_EBADLEN );
00123   if ( ! dims )
00124     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16ArrayV", XLAL_EFAULT );
00125 
00126   dimLength.length = ndim;
00127   dimLength.data   = dims;
00128 
00129   arr = XLALCreateCOMPLEX16Array ( &dimLength );
00130   if ( ! arr )
00131     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16ArrayV", XLAL_EFUNC );
00132   return arr;
00133 }
00134 
00135 
00136 COMPLEX16Array * XLALCreateCOMPLEX16Array ( UINT4Vector *dimLength )
00137 {
00138   COMPLEX16Array *arr;
00139   UINT4 size = 1;
00140   UINT4 ndim;
00141   UINT4 dim;
00142 
00143   if ( ! dimLength )
00144     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_EFAULT );
00145   if ( ! dimLength->length )
00146     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_EBADLEN );
00147   if ( ! dimLength->data )
00148     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_EINVAL );
00149 
00150   ndim = dimLength->length;
00151   for ( dim = 0; dim < ndim; ++dim )
00152     size *= dimLength->data[dim];
00153 
00154   if ( ! size )
00155     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_EBADLEN );
00156 
00157   /* create array */
00158   arr = LALMalloc( sizeof( *arr ) );
00159   if ( ! arr )
00160     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_ENOMEM );
00161 
00162   /* create array dimensions */
00163   arr->dimLength = XLALCreateUINT4Vector( ndim );
00164   if ( ! arr->dimLength )
00165   {
00166     LALFree( arr );
00167     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_EFUNC );
00168   }
00169 
00170   /* copy dimension lengths */
00171   memcpy( arr->dimLength->data, dimLength->data,
00172       ndim * sizeof( *arr->dimLength->data ) );
00173 
00174   /* allocate data storage */
00175   arr->data = LALMalloc( size * sizeof( *arr->data ) );
00176   if ( ! arr->data )
00177   {
00178     XLALDestroyUINT4Vector( arr->dimLength );
00179     LALFree( arr );
00180     XLAL_ERROR_NULL( "XLALCreateCOMPLEX16Array", XLAL_ENOMEM );
00181   }
00182 
00183   return arr;
00184 }
00185 
00186 
00187 /* <lalVerbatim file="ArrayFactoriesD"> */
00188 void LALZCreateArray ( LALStatus *status, COMPLEX16Array **array, UINT4Vector *dimLength ) 
00189 { /* </lalVerbatim> */
00190   INITSTATUS (status, "LALZCreateArray", ARRAYFACTORIESC);   
00191 
00192   /* make sure arguments are sane */
00193 
00194   ASSERT (array,             status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00195   ASSERT (!*array,           status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00196   ASSERT (dimLength,         status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00197   ASSERT (dimLength->data,   status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00198   ASSERT (dimLength->length, status,
00199           AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00200 
00201   *array = XLALCreateCOMPLEX16Array ( dimLength );
00202   if ( ! *array )
00203   {
00204     int code = xlalErrno & ~XLAL_EFUNC; /* turn off subfunction error bit */
00205     XLALClearErrno();
00206     if ( code & XLAL_EFAULT )
00207     {
00208       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00209     }
00210     if ( code == XLAL_EBADLEN )
00211     {
00212       ABORT (status, AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00213     }
00214     if ( code == XLAL_EINVAL )
00215     {
00216       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00217     }
00218     if ( code == XLAL_ENOMEM )
00219     {
00220       ABORT (status, AVFACTORIESH_EMALLOC, AVFACTORIESH_MSGEMALLOC);
00221     }
00222   }
00223 
00224   RETURN (status);
00225 }
00226 
00227 
00228 
00229 
00230 
00231 
00232 
00233 
00234 
00235 
00236 
00237 
00238 
00239 
00240 
00241 
00242  
00243  
00244  
00245  
00246  
00247 
00248 
00249 COMPLEX16Array * XLALResizeCOMPLEX16ArrayL ( COMPLEX16Array *array, UINT4 ndim, ... )
00250 {
00251   enum { maxdim = 16 };
00252   va_list ap;
00253   UINT4 dims[maxdim];
00254   UINT4 dim;
00255 
00256   if ( ! ndim )
00257   {
00258     XLALDestroyCOMPLEX16Array ( array );
00259     return NULL;
00260   }
00261   if ( ndim > maxdim )
00262     XLAL_ERROR_NULL( "XLALResizeCOMPLEX16ArrayL", XLAL_EINVAL );
00263 
00264   va_start( ap, ndim );
00265   for ( dim = 0; dim < ndim; ++dim )
00266     dims[dim] = va_arg( ap, UINT4 );
00267   va_end( ap );
00268 
00269   return XLALResizeCOMPLEX16ArrayV ( array, ndim, dims );
00270 }
00271 
00272 COMPLEX16Array * XLALResizeCOMPLEX16ArrayV ( COMPLEX16Array *array, UINT4 ndim, UINT4 *dims )
00273 {
00274   UINT4Vector dimLength;
00275 
00276   if ( ! ndim )
00277   {
00278     XLALDestroyCOMPLEX16Array ( array );
00279     return NULL;
00280   }
00281   if ( ! dims )
00282     XLAL_ERROR_NULL( "XLALResizeCOMPLEX16ArrayV", XLAL_EINVAL );
00283 
00284   dimLength.length = ndim;
00285   dimLength.data   = dims;
00286 
00287   return XLALResizeCOMPLEX16Array ( array, &dimLength );
00288 }
00289 
00290 COMPLEX16Array * XLALResizeCOMPLEX16Array ( COMPLEX16Array *array, UINT4Vector *dimLength )
00291 {
00292   UINT4 size = 1;
00293   UINT4 ndim;
00294   UINT4 dim;
00295 
00296   if ( ! array )
00297     return XLALCreateCOMPLEX16Array ( dimLength );
00298   if ( ! dimLength )
00299   {
00300     XLALDestroyCOMPLEX16Array ( array );
00301     return NULL;
00302   }
00303   if ( ! dimLength->length )
00304     XLAL_ERROR_NULL( "XLALResizeCOMPLEX16Array", XLAL_EBADLEN );
00305   if ( ! dimLength->data )
00306     XLAL_ERROR_NULL( "XLALResizeCOMPLEX16Array", XLAL_EINVAL );
00307 
00308   ndim = dimLength->length;
00309   for ( dim = 0; dim < ndim; ++dim )
00310     size *= dimLength->data[dim];
00311 
00312   if ( ! size )
00313     XLAL_ERROR_NULL( "XLALResizeCOMPLEX16Array", XLAL_EBADLEN );
00314   
00315   /* resize array->dimLength vector if needed */
00316   if ( array->dimLength->length != ndim )
00317   {
00318     array->dimLength = XLALResizeUINT4Vector( array->dimLength, ndim );
00319     if ( ! array->dimLength )
00320       XLAL_ERROR_NULL( "XLALResizeCOMPLEX16Array", XLAL_EFUNC );
00321   }
00322 
00323   /* copy dimension lengths */
00324   memcpy( array->dimLength->data, dimLength->data,
00325       ndim * sizeof( *array->dimLength->data ) );
00326 
00327   /* reallocate data storage */
00328   array->data = LALRealloc( array->data, size * sizeof( *array->data ) );
00329   if ( ! array->data )
00330     XLAL_ERROR_NULL( "XLALResizeCOMPLEX16Array", XLAL_ENOMEM );
00331 
00332   return array;
00333 }
00334 
00335 /* <lalVerbatim file="ArrayFactoriesD"> */
00336 void LALZResizeArray ( LALStatus *status, COMPLEX16Array **array, UINT4Vector *dimLength )
00337 {  /* </lalVerbatim> */
00338   COMPLEX16Array *tmparr = NULL;
00339 
00340   INITSTATUS (status, "LALZResizeArray", ARRAYFACTORIESC);
00341 
00342   ASSERT ( array != NULL, status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR );
00343 
00344   if ( ! array )
00345   {
00346     tmparr = XLALCreateCOMPLEX16Array ( dimLength );
00347   }
00348   else if ( ! dimLength )
00349   {
00350     XLALDestroyCOMPLEX16Array ( *array );
00351     *array = NULL;
00352   }
00353   else
00354   {
00355     tmparr = XLALResizeCOMPLEX16Array ( *array, dimLength );
00356   }
00357 
00358   if ( xlalErrno )
00359   {
00360     int code = xlalErrno;
00361     XLALClearErrno();
00362     if ( code == XLAL_EINVAL )
00363     {
00364       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00365     }
00366     if ( code == XLAL_EBADLEN )
00367     {
00368       ABORT (status, AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00369     }
00370     if ( code == XLAL_ENOMEM )
00371     {
00372       ABORT (status, AVFACTORIESH_EMALLOC, AVFACTORIESH_MSGEMALLOC);
00373     }
00374   }
00375 
00376   *array = tmparr;
00377 
00378   RETURN (status);
00379 }
00380 
00381 
00382 
00383 
00384 
00385 
00386 
00387 
00388 
00389 
00390 
00391 
00392 
00393 
00394   
00395 
00396 void XLALDestroyCOMPLEX16Array ( COMPLEX16Array *array )
00397 {
00398   if ( ! array )
00399     XLAL_ERROR_VOID( "XLALDestroyCOMPLEX16Array", XLAL_EFAULT );
00400   if ( ! array->dimLength
00401       || ! array->dimLength->length
00402       || ! array->dimLength->data
00403       || ! array->data )
00404     XLAL_ERROR_VOID( "XLALDestroyCOMPLEX16Array", XLAL_EINVAL );
00405   XLALDestroyUINT4Vector( array->dimLength );
00406   LALFree( array->data );
00407   LALFree( array );
00408   return;
00409 }
00410 
00411 /* <lalVerbatim file="ArrayFactoriesD"> */
00412 void LALZDestroyArray ( LALStatus *status, COMPLEX16Array **array )
00413 { /* </lalVerbatim> */
00414   INITSTATUS (status, "LALZDestroyArray", ARRAYFACTORIESC);     
00415       
00416   ASSERT (array,          status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00417   ASSERT (*array,         status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00418   ASSERT ((*array)->data, status, AVFACTORIESH_EDPTR, AVFACTORIESH_MSGEDPTR);
00419 
00420   /* Free allocated storage */
00421 
00422   XLALDestroyCOMPLEX16Array ( *array );
00423   if ( xlalErrno )
00424   {
00425     int code = xlalErrno;
00426     XLALClearErrno();
00427     if ( code == XLAL_EFAULT )
00428     {
00429       ABORT (status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00430     }
00431     if ( code == XLAL_EINVAL )
00432     {
00433       ABORT (status, AVFACTORIESH_EDPTR, AVFACTORIESH_MSGEDPTR);
00434     }
00435   }
00436   *array = NULL;            /* make sure we don't point to freed struct */
00437 
00438   RETURN (status);
00439 }
00440 
00441 
00442 
00443 
00444 
00445 
00446 
00447 
00448 
00449 
00450 
00451 
00452 
00453 
00454 
00455 
00456  
00457  
00458  
00459 
00460 COMPLEX8Array * XLALCreateCOMPLEX8ArrayL ( UINT4 ndim, ... )
00461 {
00462   enum { maxdim = 16 };
00463   va_list ap;
00464   COMPLEX8Array *arr;
00465   UINT4 dims[maxdim];
00466   UINT4 dim;
00467 
00468   if ( ! ndim )
00469     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8ArrayL", XLAL_EBADLEN );
00470   if ( ndim > maxdim )
00471     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8ArrayL", XLAL_EINVAL );
00472 
00473   va_start( ap, ndim );
00474   for ( dim = 0; dim < ndim; ++dim )
00475     dims[dim] = va_arg( ap, UINT4 );
00476   va_end( ap );
00477 
00478   arr = XLALCreateCOMPLEX8ArrayV ( ndim, dims );
00479   if ( ! arr )
00480     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8ArrayL", XLAL_EFUNC );
00481   return arr; 
00482 }
00483 
00484 COMPLEX8Array * XLALCreateCOMPLEX8ArrayV ( UINT4 ndim, UINT4 *dims )
00485 {
00486   COMPLEX8Array *arr;
00487   UINT4Vector dimLength;
00488 
00489   if ( ! ndim )
00490     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8ArrayV", XLAL_EBADLEN );
00491   if ( ! dims )
00492     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8ArrayV", XLAL_EFAULT );
00493 
00494   dimLength.length = ndim;
00495   dimLength.data   = dims;
00496 
00497   arr = XLALCreateCOMPLEX8Array ( &dimLength );
00498   if ( ! arr )
00499     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8ArrayV", XLAL_EFUNC );
00500   return arr;
00501 }
00502 
00503 
00504 COMPLEX8Array * XLALCreateCOMPLEX8Array ( UINT4Vector *dimLength )
00505 {
00506   COMPLEX8Array *arr;
00507   UINT4 size = 1;
00508   UINT4 ndim;
00509   UINT4 dim;
00510 
00511   if ( ! dimLength )
00512     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_EFAULT );
00513   if ( ! dimLength->length )
00514     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_EBADLEN );
00515   if ( ! dimLength->data )
00516     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_EINVAL );
00517 
00518   ndim = dimLength->length;
00519   for ( dim = 0; dim < ndim; ++dim )
00520     size *= dimLength->data[dim];
00521 
00522   if ( ! size )
00523     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_EBADLEN );
00524 
00525   /* create array */
00526   arr = LALMalloc( sizeof( *arr ) );
00527   if ( ! arr )
00528     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_ENOMEM );
00529 
00530   /* create array dimensions */
00531   arr->dimLength = XLALCreateUINT4Vector( ndim );
00532   if ( ! arr->dimLength )
00533   {
00534     LALFree( arr );
00535     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_EFUNC );
00536   }
00537 
00538   /* copy dimension lengths */
00539   memcpy( arr->dimLength->data, dimLength->data,
00540       ndim * sizeof( *arr->dimLength->data ) );
00541 
00542   /* allocate data storage */
00543   arr->data = LALMalloc( size * sizeof( *arr->data ) );
00544   if ( ! arr->data )
00545   {
00546     XLALDestroyUINT4Vector( arr->dimLength );
00547     LALFree( arr );
00548     XLAL_ERROR_NULL( "XLALCreateCOMPLEX8Array", XLAL_ENOMEM );
00549   }
00550 
00551   return arr;
00552 }
00553 
00554 
00555 /* <lalVerbatim file="ArrayFactoriesD"> */
00556 void LALCCreateArray ( LALStatus *status, COMPLEX8Array **array, UINT4Vector *dimLength ) 
00557 { /* </lalVerbatim> */
00558   INITSTATUS (status, "LALCCreateArray", ARRAYFACTORIESC);   
00559 
00560   /* make sure arguments are sane */
00561 
00562   ASSERT (array,             status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00563   ASSERT (!*array,           status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00564   ASSERT (dimLength,         status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00565   ASSERT (dimLength->data,   status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00566   ASSERT (dimLength->length, status,
00567           AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00568 
00569   *array = XLALCreateCOMPLEX8Array ( dimLength );
00570   if ( ! *array )
00571   {
00572     int code = xlalErrno & ~XLAL_EFUNC; /* turn off subfunction error bit */
00573     XLALClearErrno();
00574     if ( code & XLAL_EFAULT )
00575     {
00576       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00577     }
00578     if ( code == XLAL_EBADLEN )
00579     {
00580       ABORT (status, AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00581     }
00582     if ( code == XLAL_EINVAL )
00583     {
00584       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00585     }
00586     if ( code == XLAL_ENOMEM )
00587     {
00588       ABORT (status, AVFACTORIESH_EMALLOC, AVFACTORIESH_MSGEMALLOC);
00589     }
00590   }
00591 
00592   RETURN (status);
00593 }
00594 
00595 
00596 
00597 
00598 
00599 
00600 
00601 
00602 
00603 
00604 
00605 
00606 
00607 
00608 
00609 
00610  
00611  
00612  
00613  
00614  
00615 
00616 
00617 COMPLEX8Array * XLALResizeCOMPLEX8ArrayL ( COMPLEX8Array *array, UINT4 ndim, ... )
00618 {
00619   enum { maxdim = 16 };
00620   va_list ap;
00621   UINT4 dims[maxdim];
00622   UINT4 dim;
00623 
00624   if ( ! ndim )
00625   {
00626     XLALDestroyCOMPLEX8Array ( array );
00627     return NULL;
00628   }
00629   if ( ndim > maxdim )
00630     XLAL_ERROR_NULL( "XLALResizeCOMPLEX8ArrayL", XLAL_EINVAL );
00631 
00632   va_start( ap, ndim );
00633   for ( dim = 0; dim < ndim; ++dim )
00634     dims[dim] = va_arg( ap, UINT4 );
00635   va_end( ap );
00636 
00637   return XLALResizeCOMPLEX8ArrayV ( array, ndim, dims );
00638 }
00639 
00640 COMPLEX8Array * XLALResizeCOMPLEX8ArrayV ( COMPLEX8Array *array, UINT4 ndim, UINT4 *dims )
00641 {
00642   UINT4Vector dimLength;
00643 
00644   if ( ! ndim )
00645   {
00646     XLALDestroyCOMPLEX8Array ( array );
00647     return NULL;
00648   }
00649   if ( ! dims )
00650     XLAL_ERROR_NULL( "XLALResizeCOMPLEX8ArrayV", XLAL_EINVAL );
00651 
00652   dimLength.length = ndim;
00653   dimLength.data   = dims;
00654 
00655   return XLALResizeCOMPLEX8Array ( array, &dimLength );
00656 }
00657 
00658 COMPLEX8Array * XLALResizeCOMPLEX8Array ( COMPLEX8Array *array, UINT4Vector *dimLength )
00659 {
00660   UINT4 size = 1;
00661   UINT4 ndim;
00662   UINT4 dim;
00663 
00664   if ( ! array )
00665     return XLALCreateCOMPLEX8Array ( dimLength );
00666   if ( ! dimLength )
00667   {
00668     XLALDestroyCOMPLEX8Array ( array );
00669     return NULL;
00670   }
00671   if ( ! dimLength->length )
00672     XLAL_ERROR_NULL( "XLALResizeCOMPLEX8Array", XLAL_EBADLEN );
00673   if ( ! dimLength->data )
00674     XLAL_ERROR_NULL( "XLALResizeCOMPLEX8Array", XLAL_EINVAL );
00675 
00676   ndim = dimLength->length;
00677   for ( dim = 0; dim < ndim; ++dim )
00678     size *= dimLength->data[dim];
00679 
00680   if ( ! size )
00681     XLAL_ERROR_NULL( "XLALResizeCOMPLEX8Array", XLAL_EBADLEN );
00682   
00683   /* resize array->dimLength vector if needed */
00684   if ( array->dimLength->length != ndim )
00685   {
00686     array->dimLength = XLALResizeUINT4Vector( array->dimLength, ndim );
00687     if ( ! array->dimLength )
00688       XLAL_ERROR_NULL( "XLALResizeCOMPLEX8Array", XLAL_EFUNC );
00689   }
00690 
00691   /* copy dimension lengths */
00692   memcpy( array->dimLength->data, dimLength->data,
00693       ndim * sizeof( *array->dimLength->data ) );
00694 
00695   /* reallocate data storage */
00696   array->data = LALRealloc( array->data, size * sizeof( *array->data ) );
00697   if ( ! array->data )
00698     XLAL_ERROR_NULL( "XLALResizeCOMPLEX8Array", XLAL_ENOMEM );
00699 
00700   return array;
00701 }
00702 
00703 /* <lalVerbatim file="ArrayFactoriesD"> */
00704 void LALCResizeArray ( LALStatus *status, COMPLEX8Array **array, UINT4Vector *dimLength )
00705 {  /* </lalVerbatim> */
00706   COMPLEX8Array *tmparr = NULL;
00707 
00708   INITSTATUS (status, "LALCResizeArray", ARRAYFACTORIESC);
00709 
00710   ASSERT ( array != NULL, status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR );
00711 
00712   if ( ! array )
00713   {
00714     tmparr = XLALCreateCOMPLEX8Array ( dimLength );
00715   }
00716   else if ( ! dimLength )
00717   {
00718     XLALDestroyCOMPLEX8Array ( *array );
00719     *array = NULL;
00720   }
00721   else
00722   {
00723     tmparr = XLALResizeCOMPLEX8Array ( *array, dimLength );
00724   }
00725 
00726   if ( xlalErrno )
00727   {
00728     int code = xlalErrno;
00729     XLALClearErrno();
00730     if ( code == XLAL_EINVAL )
00731     {
00732       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00733     }
00734     if ( code == XLAL_EBADLEN )
00735     {
00736       ABORT (status, AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00737     }
00738     if ( code == XLAL_ENOMEM )
00739     {
00740       ABORT (status, AVFACTORIESH_EMALLOC, AVFACTORIESH_MSGEMALLOC);
00741     }
00742   }
00743 
00744   *array = tmparr;
00745 
00746   RETURN (status);
00747 }
00748 
00749 
00750 
00751 
00752 
00753 
00754 
00755 
00756 
00757 
00758 
00759 
00760 
00761 
00762   
00763 
00764 void XLALDestroyCOMPLEX8Array ( COMPLEX8Array *array )
00765 {
00766   if ( ! array )
00767     XLAL_ERROR_VOID( "XLALDestroyCOMPLEX8Array", XLAL_EFAULT );
00768   if ( ! array->dimLength
00769       || ! array->dimLength->length
00770       || ! array->dimLength->data
00771       || ! array->data )
00772     XLAL_ERROR_VOID( "XLALDestroyCOMPLEX8Array", XLAL_EINVAL );
00773   XLALDestroyUINT4Vector( array->dimLength );
00774   LALFree( array->data );
00775   LALFree( array );
00776   return;
00777 }
00778 
00779 /* <lalVerbatim file="ArrayFactoriesD"> */
00780 void LALCDestroyArray ( LALStatus *status, COMPLEX8Array **array )
00781 { /* </lalVerbatim> */
00782   INITSTATUS (status, "LALCDestroyArray", ARRAYFACTORIESC);     
00783       
00784   ASSERT (array,          status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00785   ASSERT (*array,         status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00786   ASSERT ((*array)->data, status, AVFACTORIESH_EDPTR, AVFACTORIESH_MSGEDPTR);
00787 
00788   /* Free allocated storage */
00789 
00790   XLALDestroyCOMPLEX8Array ( *array );
00791   if ( xlalErrno )
00792   {
00793     int code = xlalErrno;
00794     XLALClearErrno();
00795     if ( code == XLAL_EFAULT )
00796     {
00797       ABORT (status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00798     }
00799     if ( code == XLAL_EINVAL )
00800     {
00801       ABORT (status, AVFACTORIESH_EDPTR, AVFACTORIESH_MSGEDPTR);
00802     }
00803   }
00804   *array = NULL;            /* make sure we don't point to freed struct */
00805 
00806   RETURN (status);
00807 }
00808 
00809 
00810 
00811 
00812 
00813 
00814 
00815 
00816 
00817 
00818 
00819 
00820 
00821 
00822 
00823 
00824  
00825  
00826  
00827 
00828 REAL8Array * XLALCreateREAL8ArrayL ( UINT4 ndim, ... )
00829 {
00830   enum { maxdim = 16 };
00831   va_list ap;
00832   REAL8Array *arr;
00833   UINT4 dims[maxdim];
00834   UINT4 dim;
00835 
00836   if ( ! ndim )
00837     XLAL_ERROR_NULL( "XLALCreateREAL8ArrayL", XLAL_EBADLEN );
00838   if ( ndim > maxdim )
00839     XLAL_ERROR_NULL( "XLALCreateREAL8ArrayL", XLAL_EINVAL );
00840 
00841   va_start( ap, ndim );
00842   for ( dim = 0; dim < ndim; ++dim )
00843     dims[dim] = va_arg( ap, UINT4 );
00844   va_end( ap );
00845 
00846   arr = XLALCreateREAL8ArrayV ( ndim, dims );
00847   if ( ! arr )
00848     XLAL_ERROR_NULL( "XLALCreateREAL8ArrayL", XLAL_EFUNC );
00849   return arr; 
00850 }
00851 
00852 REAL8Array * XLALCreateREAL8ArrayV ( UINT4 ndim, UINT4 *dims )
00853 {
00854   REAL8Array *arr;
00855   UINT4Vector dimLength;
00856 
00857   if ( ! ndim )
00858     XLAL_ERROR_NULL( "XLALCreateREAL8ArrayV", XLAL_EBADLEN );
00859   if ( ! dims )
00860     XLAL_ERROR_NULL( "XLALCreateREAL8ArrayV", XLAL_EFAULT );
00861 
00862   dimLength.length = ndim;
00863   dimLength.data   = dims;
00864 
00865   arr = XLALCreateREAL8Array ( &dimLength );
00866   if ( ! arr )
00867     XLAL_ERROR_NULL( "XLALCreateREAL8ArrayV", XLAL_EFUNC );
00868   return arr;
00869 }
00870 
00871 
00872 REAL8Array * XLALCreateREAL8Array ( UINT4Vector *dimLength )
00873 {
00874   REAL8Array *arr;
00875   UINT4 size = 1;
00876   UINT4 ndim;
00877   UINT4 dim;
00878 
00879   if ( ! dimLength )
00880     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_EFAULT );
00881   if ( ! dimLength->length )
00882     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_EBADLEN );
00883   if ( ! dimLength->data )
00884     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_EINVAL );
00885 
00886   ndim = dimLength->length;
00887   for ( dim = 0; dim < ndim; ++dim )
00888     size *= dimLength->data[dim];
00889 
00890   if ( ! size )
00891     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_EBADLEN );
00892 
00893   /* create array */
00894   arr = LALMalloc( sizeof( *arr ) );
00895   if ( ! arr )
00896     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_ENOMEM );
00897 
00898   /* create array dimensions */
00899   arr->dimLength = XLALCreateUINT4Vector( ndim );
00900   if ( ! arr->dimLength )
00901   {
00902     LALFree( arr );
00903     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_EFUNC );
00904   }
00905 
00906   /* copy dimension lengths */
00907   memcpy( arr->dimLength->data, dimLength->data,
00908       ndim * sizeof( *arr->dimLength->data ) );
00909 
00910   /* allocate data storage */
00911   arr->data = LALMalloc( size * sizeof( *arr->data ) );
00912   if ( ! arr->data )
00913   {
00914     XLALDestroyUINT4Vector( arr->dimLength );
00915     LALFree( arr );
00916     XLAL_ERROR_NULL( "XLALCreateREAL8Array", XLAL_ENOMEM );
00917   }
00918 
00919   return arr;
00920 }
00921 
00922 
00923 /* <lalVerbatim file="ArrayFactoriesD"> */
00924 void LALDCreateArray ( LALStatus *status, REAL8Array **array, UINT4Vector *dimLength ) 
00925 { /* </lalVerbatim> */
00926   INITSTATUS (status, "LALDCreateArray", ARRAYFACTORIESC);   
00927 
00928   /* make sure arguments are sane */
00929 
00930   ASSERT (array,             status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00931   ASSERT (!*array,           status, AVFACTORIESH_EUPTR, AVFACTORIESH_MSGEUPTR);
00932   ASSERT (dimLength,         status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00933   ASSERT (dimLength->data,   status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00934   ASSERT (dimLength->length, status,
00935           AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00936 
00937   *array = XLALCreateREAL8Array ( dimLength );
00938   if ( ! *array )
00939   {
00940     int code = xlalErrno & ~XLAL_EFUNC; /* turn off subfunction error bit */
00941     XLALClearErrno();
00942     if ( code & XLAL_EFAULT )
00943     {
00944       ABORT (status, AVFACTORIESH_EVPTR, AVFACTORIESH_MSGEVPTR);
00945     }
00946     if ( code == XLAL_EBADLEN )
00947     {
00948       ABORT (status, AVFACTORIESH_ELENGTH, AVFACTORIESH_MSGELENGTH);
00949     }
00950     if ( code == XLAL_EINVAL )
00951     {
00952       ABORT (