00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #include <eh_utils.h>
00022 #include <math.h>
00023 #include <stdlib.h>
00024
00025 void eh_init_glib( void )
00026 {
00027 #if defined( USE_MY_VTABLE )
00028 static GMemVTable my_vtable;
00029
00030 my_vtable.malloc = &eh_malloc_c_style;
00031 my_vtable.realloc = &eh_realloc_c_style;
00032 my_vtable.free = &eh_free_c_style;
00033 my_vtable.calloc = &eh_calloc_c_style;
00034 my_vtable.try_malloc = &eh_malloc_c_style;
00035 my_vtable.try_realloc = &eh_realloc_c_style;
00036
00037 g_mem_set_vtable( &my_vtable );
00038 #else
00039
00040 #endif
00041 }
00042
00043 void
00044 eh_exit( int code )
00045 {
00046 fprintf( stderr , "Exiting program. " );
00047
00048
00049
00050
00051 #ifdef G_PLATFORM_WIN32
00052 fprintf( stderr , "Hit enter to continue..." );
00053
00054 fflush( stdin );
00055 while ( '\n' != getchar() )
00056 {
00057 }
00058 #endif
00059 fprintf( stderr , "\n" );
00060
00061 exit( code );
00062 }
00063
00064 void
00065 eh_exit_on_error( GError* error , const gchar* format , ... )
00066 {
00067 if ( error )
00068 {
00069 gchar* err_s;
00070 va_list ap;
00071 va_start( ap , format );
00072
00073 err_s = g_strdup_vprintf( format , ap );
00074 eh_error( eh_render_error_str( error , err_s ) );
00075 eh_exit( EXIT_FAILURE );
00076
00077 va_end(ap);
00078 eh_free( err_s );
00079 }
00080 }
00081
00082 gchar* brief_copyleft_msg[] =
00083 {
00084 "Copywrite (C) 2006 Eric Hutton." ,
00085 "This is free software; see the source for copying conditions. This is NO" ,
00086 "warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." ,
00087 NULL
00088 };
00089
00090 gint
00091 eh_fprint_version_info( FILE* fp ,
00092 const gchar* prog ,
00093 gint maj ,
00094 gint min ,
00095 gint micro )
00096 {
00097 gint n = 0;
00098
00099 if ( fp )
00100 {
00101 n += fprintf( fp , "%s %d.%d.%d\n" , prog , maj , min , micro );
00102
00103 n += fprintf( fp , "Written by Eric Hutton <eric.hutton@colorado.edu>.\n" );
00104 n += fprintf( fp , "\n" );
00105
00106 n += eh_print_message( fp , brief_copyleft_msg );
00107 }
00108 return n;
00109 }
00110
00120 gboolean
00121 eh_is_in_domain( gssize n_i , gssize n_j , gssize i , gssize j )
00122 {
00123 return i>=0 && j>=0 && i<n_i && j<n_j;
00124 }
00125
00126 double
00127 eh_date_to_years( Eh_date_t* d )
00128 {
00129 eh_require( d );
00130 return d->year
00131 + d->month/12.
00132 + d->day/365.;
00133 }
00134
00147 double sigma( double s , double t , double p )
00148 {
00149 double ans;
00150 double t_2 = pow( t , 2 );
00151 double t_3 = t_2*t;
00152 double t_4 = t_3*t;
00153 double t_5 = t_4*t;
00154 double s_2 = pow( s , 2 );
00155 double s_3 = s_2*s;
00156 double s_1 = sqrt( s_3 );
00157 double p_2 = pow( p , 2 );
00158 double rho, sbmk;
00159
00160 rho = 6.793952e-2*t - 9.095290e-3*t_2 + 1.001685e-4*t_3
00161 - 1.120083e-6*t_4 + 6.536332e-9*t_5
00162 + s * ( 8.24493e-1 - 4.0899e-3*t + 7.6438e-5*t_2
00163 - 8.2467e-7*t_3 + 5.3875e-9*t_4 )
00164 + s_1 * ( - 5.72466e-3 + 1.0227e-4*t - 1.6546e-6*t_2 )
00165 + 4.8314e-4*s_2;
00166
00167 sbmk = 19652.21
00168 + 148.4206*t - 2.327105*t_2 + 1.360477e-2*t_3 - 5.155288e-5*t_4
00169 + p * ( 3.239908 + 1.43713e-3*t + 1.16092e-4*t_2
00170 - 5.77905e-7*t_3)
00171 + p_2 * ( 8.50935e-5 - 6.12293e-6*t + 5.2787e-8*t_2 )
00172 + s * ( 54.6746 - 0.603459*t + 1.09987e-2*t_2 - 6.1670e-5*t_3 )
00173 + s_1 * ( 7.944e-2 + 1.6483e-2*t - 5.3009e-4*t_2 + 1.91075e-4*p )
00174 + p*s * ( 2.2838e-3 - 1.0981e-5*t - 1.6078e-6*t_2 )
00175 + p_2*s * ( -9.9348e-7 + 2.0816e-8*t + 9.1697e-10*t_2 );
00176
00177 ans = 1.e-3*( rho + 999.842594*p/sbmk )/( 1.0-p/sbmk );
00178
00179 return ans*1e3+1000;
00180 }
00181
00182 void
00183 eh_test_function( const char *func_name , Eh_test_func f )
00184 {
00185 gboolean result;
00186
00187 fprintf( stdout , "Testing %s ... " , func_name );
00188 fflush( stdout );
00189
00190 result = (*f)();
00191
00192 fprintf( stdout, "\nDONE.\n" );
00193 if ( result == TRUE )
00194 fprintf( stdout, "ok.\n" );
00195 else
00196 fprintf( stdout , "FAIL.\n" );
00197 fflush( stdout );
00198
00199 return;
00200 }
00201
00202 gboolean
00203 eh_check_to_s( gboolean assert , const gchar* str , gchar*** str_list )
00204 {
00205 if ( !assert && str_list ) eh_strv_append( str_list , g_strconcat( "FAILED: " , str , NULL ) );
00206
00207 return assert;
00208 }
00209
00210 void
00211 eh_set_error_strv( GError** error , GQuark domain , gint code , gchar** err_s )
00212 {
00213 if ( err_s && *err_s )
00214 {
00215 gchar* str = g_strjoinv( "\n" , err_s );
00216
00217 g_set_error( error , domain , code , "%s" , str );
00218
00219 eh_free( str );
00220 }
00221
00222 return;
00223 }
00224
00225 gchar*
00226 eh_render_error_str( GError* error , const gchar* err_str )
00227 {
00228 gchar* new_str = NULL;
00229
00230 if ( error )
00231 {
00232 if ( err_str )
00233 new_str = g_strdup_printf( "Error %d: %s: %s: %s" ,
00234 error->code ,
00235 g_quark_to_string(error->domain) ,
00236 err_str ,
00237 error->message );
00238 else
00239 new_str = g_strdup_printf( "Error %d: %s: %s" ,
00240 error->code ,
00241 g_quark_to_string(error->domain) ,
00242 error->message );
00243 }
00244
00245 return new_str;
00246 }
00247
00248 gchar*
00249 eh_render_command_str( int argc , char* argv[] )
00250 {
00251 gchar* str = NULL;
00252
00253 eh_require( argv!=NULL );
00254
00255 if ( argv )
00256 {
00257 gint i;
00258 gchar** str_array = NULL;
00259
00260 for ( i=0 ; i<argc ; i++ )
00261 eh_strv_append( &str_array , argv[i] );
00262
00263 str = g_strjoinv( " " , str_array );
00264
00265 eh_free( str_array );
00266 }
00267
00268 return str;
00269 }
00270