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_xy( statusMessageReporting *smr, xData_element *element ) {
00055
00056 xDataType *xDT = &(element->xDataTypeInfo);
00057
00058 xDT->status = xData_xDataType_Ok;
00059 xDT->typeString = xData_twod_xy_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_xy( statusMessageReporting *smr, xDataType *xDT, int setMsg ) {
00071
00072 return( xData_is_xDataType( smr, xDT, xData_twod_xy_ID, setMsg ) );
00073 }
00074
00075
00076
00077 int xData_isElement_2d_xy( statusMessageReporting *smr, xData_element *element, int setMsg ) {
00078
00079 return( xData_is_2d_xy( smr, &(element->xDataTypeInfo), setMsg ) );
00080 }
00081
00082
00083
00084 double *xData_2d_xy_allocateCopyData( statusMessageReporting *smr, xData_element *element, xData_Int *length ) {
00085
00086 xData_Int i;
00087 xDataType *xDT = &(element->xDataTypeInfo);
00088 double *data;
00089
00090 if( !xData_isElement_2d_xy( smr, element, 1 ) ) return( NULL );
00091 *length = xDT->length;
00092
00093 if( ( data = (double*)xData_malloc2( smr, 2 * xDT->length * sizeof( double ), 0, "data" ) ) ) {
00094 for( i = 0; i < 2 * xDT->length; i++ ) data[i] = ((double *) xDT->data)[i];
00095 }
00096 return( data );
00097 }
00098
00099
00100
00101 int xData_2d_xy_free_copyData( statusMessageReporting *smr, void *data ) {
00102
00103 xData_free( smr, data );
00104 return( 0 );
00105 }
00106
00107
00108
00109
00110 static int toData( statusMessageReporting *smr, xDataType *xDT, xData_attributionList *, const char *text ) {
00111
00112 xData_Int i, status = 0;
00113 char *e;
00114 const char *s;
00115 double *p;
00116 void *smrUser = xData_get_smrUserInterfaceFromElement( xDT->element );
00117
00118 if( xDT->status != xData_xDataType_Ok ) return( xData_setMessageError_ReturnInt( 1, smr, smrUser, __FILE__, __LINE__,
00119 1, "bad xDataType instance" ) );
00120 release( smr, xDT );
00121 if( ( xDT->data = xData_malloc2( smr, 2 * xDT->length * sizeof( double ), 0, "data" ) ) == NULL ) return( 1 );
00122 for( i = 0, s = text, p = (double *) xDT->data; i < 2 * xDT->length; i++, p++, s = e ) {
00123 if( xData_stringTo_double( smr, smrUser, s, p, " \n", &e ) ) { status = 1; break; }
00124 }
00125 if( status == 0 ) {
00126 while( isspace( *e ) ) e++;
00127 if( *e != 0 ) {
00128 smr_setMessageError( smr, smrUser, __FILE__, __LINE__, 1, "text contains extra data = %s", e );
00129 status = 1;
00130 }
00131 }
00132 if( status != 0 ) release( smr, xDT );
00133 return( status );
00134 }
00135
00136
00137
00138
00139 static char *toString( statusMessageReporting *, xDataType *xDT ) {
00140
00141 xData_Int i, n = xDT->length;
00142 char *str, *p;
00143 double *data = (double *) xDT->data;
00144
00145 if( n < 0 ) n = 0;
00146 if( ( str = (char *) malloc( 2 * ( n + 1 ) * 17 ) ) == NULL ) return( NULL );
00147 for( i = 0, p = str; i < n; i++, p += 2 * 16 + 1, data += 2 ) {
00148 sprintf( p, " %15.7e %15.7e\n", *data, data[1] );
00149 }
00150 *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 #if defined __cplusplus
00163 }
00164 #endif