00001 #include <citrus/config.H>
00002
00003 #include <stdexcept>
00004 #include <list>
00005
00006
00007 #include <glib.h>
00008
00009 #include <citrus/UnitInfo.H>
00010 #include <citrus/Quantity.H>
00011 #include <citrus/UnitExpr.H>
00012 #include <citrus/Unit.H>
00013 #include <citrus/DimensionGroup.H>
00014 #include <citrus/Prefix.H>
00015
00016 extern "C" {
00017
00032 int citrus_initialize( const char* configFile )
00033 {
00034 return (int) Unit::initialize( configFile ) ;
00035 }
00036
00051 void* citrus_quantity_from_string( const char* src )
00052 {
00053 Quantity* q ;
00054 try {
00055 q = new Quantity( src ) ;
00056 } catch ( runtime_error* ) {
00057 return 0 ;
00058 }
00059 return (void*) q ;
00060 }
00061
00076 int citrus_convert_quantities( void* from, void* to, double* result )
00077 {
00078 assert( from != 0 ) ;
00079 assert( to != 0 ) ;
00080
00081 Quantity* qFrom = (Quantity*)from ;
00082 Quantity* qTo = (Quantity*)to ;
00083 int code = convert( qTo, qFrom ) ;
00084 if ( (code == 0) && result )
00085 *result = qTo->val() ;
00086 return code ;
00087 }
00088
00103 int citrus_convert_string( const char* from, const char* to, double* result )
00104 {
00105 try {
00106 Quantity qFrom( from ) ;
00107 Quantity qTo( to ) ;
00108 int code = convert( &qTo, &qFrom ) ;
00109 if ( code == 0 )
00110 *result = qTo.val() ;
00111
00112 return code ;
00113 } catch ( runtime_error* ) {
00114 return 2 ;
00115 }
00116 }
00117
00132 int citrus_convert( double value, const char* from, const char* to,
00133 double* result )
00134 {
00135 try {
00136 Quantity qFrom( from ) ;
00137 Quantity qTo( to ) ;
00138 qFrom.val( value ) ;
00139 int code = convert( &qTo, &qFrom ) ;
00140 if ( code == 0 )
00141 *result = qTo.val() ;
00142
00143 return code ;
00144 } catch ( runtime_error* ) {
00145 return 2 ;
00146 }
00147 }
00148
00164 int citrus_convert_array( double* value, int len,
00165 const char* from, const char* to,
00166 double* result )
00167 {
00168 try {
00169 Quantity qFrom( from ) ;
00170 Quantity qTo( to ) ;
00171 int code,err=0 ;
00172 for (int i=0; i<len; i++) {
00173 qFrom.val( value[i] ) ;
00174 code = convert( &qTo, &qFrom ) ;
00175 if ( code == 0 )
00176 result[i] = qTo.val() ;
00177 else
00178 err = 1 ;
00179 }
00180 return err ;
00181 } catch ( runtime_error* ) {
00182 return 2 ;
00183 }
00184 }
00185
00199 const void* citrus_dimension_group_get_next( const void* pDgrp )
00200 {
00201 if ( pDgrp == 0 )
00202 return DimensionGroup::first() ;
00203
00204 DimensionGroup* dgrp = (DimensionGroup*) pDgrp ;
00205 return dgrp->next() ;
00206 }
00207
00218 const gchar* citrus_dimension_group_get_name( const void* pDgrp )
00219 {
00220 if ( pDgrp == 0 )
00221 return 0 ;
00222
00223 DimensionGroup* dgrp = (DimensionGroup*) pDgrp ;
00224 return (const gchar*) dgrp->name() ;
00225 }
00226
00227 list<Unit*>::const_iterator unit_iter = 0 ;
00228
00229 list<Unit*>::const_iterator* citrus_dimension_group_get_next_unit( const void* pDgrp, list<Unit*>::const_iterator* pUnit )
00230 {
00231 if ( pDgrp == 0 )
00232 return 0 ;
00233
00234
00235
00236 DimensionGroup* dgrp = (DimensionGroup*) pDgrp ;
00237 if ( pUnit == 0 ) {
00238 unit_iter = dgrp->unitBegin() ;
00239 if ( unit_iter == dgrp->unitEnd() )
00240 return 0 ;
00241 return &unit_iter ;
00242 }
00243
00244 unit_iter++ ;
00245 if ( unit_iter == dgrp->unitEnd() )
00246 return 0 ;
00247 return &unit_iter ;
00248 }
00249
00262 double citrus_unit_get_scale( list<Unit*>::const_iterator* pUnit )
00263 {
00264 if ( pUnit == 0 )
00265 return 0 ;
00266
00267 return (*(*pUnit))->scale() ;
00268 }
00269
00283 gboolean citrus_unit_has_offset( list<Unit*>::const_iterator* pUnit )
00284 {
00285 if ( pUnit == 0 )
00286 return 0 ;
00287
00288 return gboolean( (*(*pUnit))->offsetPolicy() == true ) ;
00289 }
00290
00304 double citrus_unit_get_offset( list<Unit*>::const_iterator* pUnit )
00305 {
00306 if ( pUnit == 0 )
00307 return 0 ;
00308
00309 return (*(*pUnit))->offsetValue() ;
00310 }
00311
00322 const gchar* citrus_unit_get_name( list<Unit*>::const_iterator* pUnit )
00323 {
00324 if ( pUnit == 0 )
00325 return 0 ;
00326
00327 return (const gchar*) (*(*pUnit))->name() ;
00328 }
00329
00342 const gchar* citrus_unit_get_abbr( list<Unit*>::const_iterator* pUnit )
00343 {
00344 if ( pUnit == 0 )
00345 return 0 ;
00346
00347 return (const gchar*) (*(*pUnit))->abbr() ;
00348 }
00349
00363 xmlNodePtr citrus_quantity_export_mathml( const void* quantity )
00364 {
00365 const Quantity* qty = (const Quantity*) quantity ;
00366
00367 return qty->mathML() ;
00368 }
00369
00380 gint citrus_unit_get_plural_policy( list<Unit*>::const_iterator* pUnit )
00381 {
00382 if ( pUnit == 0 )
00383 return 0 ;
00384
00385 return (*(*pUnit))->pluralPolicy() ;
00386 }
00387
00397 gchar* citrus_unit_get_plural_form( list<Unit*>::const_iterator* pUnit )
00398 {
00399 if ( pUnit == 0 )
00400 return 0 ;
00401
00402 gchar* plural = (*(*pUnit))->pluralForm() ;
00403 if ( plural )
00404 return g_strdup( plural ) ;
00405
00406 int policy = (*(*pUnit))->pluralPolicy() ;
00407 plural = g_strdup_printf( "%s%s", (*(*pUnit))->name(),
00408 policy == CITRUS_PLURAL_NONE ? "" : "s" ) ;
00409 return plural ;
00410 }
00411
00412 }