Main Page   Modules   Class Hierarchy   Compound List   File List   Compound Members  

citrus.C

00001 #include <citrus/config.H>
00002 
00003 #include <stdexcept>
00004 #include <list>
00005 
00006 /* #include <citrus/citrus.h> */
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 ; // Parse error
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 ; // Parse error = 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 ; // Parse error = 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 ; // Parse error = 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     // FIXME! Can't depend on iterators being equivalent to const void* !
00235     // I think the newer versions of glibc (RH7) break this.
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 }
Citrus C++ Reference Manual  20010520