00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036 #include <stdlib.h>
00037 #include <limits.h>
00038 #include <ctype.h>
00039 #include "xData.h"
00040
00041 #if defined __cplusplus
00042 namespace GIDI {
00043 using namespace GIDI;
00044 #endif
00045
00046
00047
00048 static int toData( statusMessageReporting *smr, xDataType *xDT, xData_attributionList *attributes, const char *text );
00049 static char *toString( statusMessageReporting *smr, xDataType *xDT );
00050 static int release( statusMessageReporting *smr, xDataType *xDT );
00051
00052
00053
00054 int xData_init_2d_xShared_yHistogram( statusMessageReporting *smr, xData_element *element ) {
00055
00056 xDataType *xDT = &(element->xDataTypeInfo);
00057
00058 xDT->status = xData_xDataType_Ok;
00059 xDT->typeString = xData_twod_xShared_yHistogram_ID;
00060 xDT->element = element;
00061 xDT->toData = toData;
00062 xDT->toString = toString;
00063 xDT->release = release;
00064 xDT->data = NULL;
00065 return( xData_xDataTypeConvertAttributes( smr, element ) );
00066 }
00067
00068
00069
00070 int xData_is_2d_xShared_yHistogram( statusMessageReporting *smr, xDataType *xDT, int setMsg ) {
00071
00072 return( xData_is_xDataType( smr, xDT, xData_twod_xShared_yHistogram_ID, setMsg ) );
00073 }
00074
00075
00076
00077 int xData_isElement_2d_xShared_yHistogram( statusMessageReporting *smr, xData_element *element, int setMsg ) {
00078
00079 return( xData_is_2d_xShared_yHistogram( smr, &(element->xDataTypeInfo), setMsg ) );
00080 }
00081
00082
00083
00084
00085 double *xData_2d_xShared_yHistogram_copyData( statusMessageReporting *, xData_element *element, xData_Int *n ) {
00086
00087 xDataType *xDT = &(element->xDataTypeInfo);
00088 xData_Int i;
00089 double *p, *values, *d = (double *) xDT->data;
00090
00091 *n = xDT->end - xDT->start;
00092 if( xDT->length == 0 ) return( NULL );
00093 if( *n == 0 ) return( NULL );
00094
00095 if(( values = (double*) xData_malloc2( NULL, *n * sizeof( double ), 0, "values" ) )) {
00096 p = values;
00097 for( i = 0; i < *n; i++, p++, d++ ) *p = *d;
00098 }
00099 return( values );
00100 }
00101
00102
00103
00104 int xData_2d_xShared_yHistogram_free_copyData( statusMessageReporting *smr, void *data ) {
00105
00106 xData_free( smr, data );
00107 return( 0 );
00108 }
00109
00110
00111
00112
00113 static int toData( statusMessageReporting *smr, xDataType *xDT, xData_attributionList *, const char *text ) {
00114
00115 xData_Int i, n = xDT->end - xDT->start, status = 0;
00116 char *e;
00117 const char *s;
00118 double *p;
00119 void *smrUser = xData_get_smrUserInterfaceFromElement( xDT->element );
00120
00121 if( xDT->status != xData_xDataType_Ok ) return( xData_setMessageError_ReturnInt( 1, smr, smrUser, __FILE__, __LINE__, 1, "bad xDataType instance" ) );
00122 release( smr, xDT );
00123 if( ( xDT->data = xData_malloc2( smr, n * sizeof( double ), 0, "data" ) ) == NULL ) return( 1 );
00124 for( i = 0, s = text, p = (double *) xDT->data; i < n; i++, p++, s = e ) {
00125 if( xData_stringTo_double( smr, smrUser, s, p, " \n", &e ) ) { status = 1; break; }
00126 }
00127 if( status == 0 ) {
00128 while( isspace( *e ) ) e++;
00129 if( *e != 0 ) {
00130 smr_setMessageError( smr, smrUser, __FILE__, __LINE__, 1, "text contains extra data = %s", e );
00131 status = 1;
00132 }
00133 }
00134 if( status != 0 ) release( smr, xDT );
00135 return( status );
00136 }
00137
00138
00139
00140
00141 static char *toString( statusMessageReporting *, xDataType *xDT ) {
00142
00143 xData_Int i, n = xDT->length, recordSize = 16 + 1;
00144 char *str, *p, fmt[32] = " %15.7e\n";
00145
00146 double *d = (double*) xDT->data;
00147
00148 if( n < 0 ) n = 0;
00149 if( ( str = (char *) malloc( recordSize * ( n + 1 ) ) ) == NULL ) return( NULL );
00150 for( i = 0, p = str; i < n; i++, p += recordSize, d++ ) sprintf( p, fmt, d ); *p = 0;
00151 return( str );
00152 }
00153
00154
00155
00156 static int release( statusMessageReporting *smr, xDataType *xDT ) {
00157
00158 if( xDT->data != NULL ) xDT->data = xData_free( smr, xDT->data );
00159 return( xDT->status = xData_xDataType_Ok );
00160 }
00161
00162
00163
00164 double *xData_2d_xShared_yHistogram_toFilledXYs( xDataType *xDT, xData_Int nXs, double *Xs ) {
00165
00166
00167
00168 xData_Int i;
00169
00170 double *p, *values, *d = (double*) xDT->data;
00171
00172 if( xDT->length == 0 ) return( NULL );
00173 if( ( xDT->length + 1 ) != nXs ) return( NULL );
00174
00175 if( ( values = (double*) xData_malloc2( NULL, 4 * xDT->length * sizeof( double ), 0, "values" ) ) == NULL ) return( NULL );
00176 p = values;
00177 for( i = 0; i < xDT->length; i++ ) {
00178 *(p++) = Xs[i];
00179 *(p++) = 0.;
00180 *(p++) = Xs[i+1];
00181 *(p++) = 0.;
00182 }
00183 p = &(values[4 * xDT->start + 1]);
00184 for( i = xDT->start; i < xDT->end; i++, d++, p += 2 ) {
00185 *p = *d;
00186 p += 2;
00187 *p = *d;
00188 }
00189 return( values );
00190 }
00191
00192 #if defined __cplusplus
00193 }
00194 #endif