00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
#include <volume_io/internal_volume_io.h>
00016
#include <bicpl/prog_utils.h>
00017
#include <bicpl/objects.h>
00018
00019
#ifndef lint
00020
static char rcsid[] =
"$Header: /software/source//libraries/bicpl/Prog_utils/globals.c,v 1.15 2000/02/06 15:30:47 stever Exp $";
00021
#endif
00022
00023
static Status input_global_variable(
int,
global_struct [],
00024 FILE *, BOOLEAN * );
00025
static STRING extract_string( STRING );
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039
00040
00041
00042
00043 public Status
input_globals_file(
00044
int n_globals_lookup,
00045
global_struct globals_lookup[],
00046 STRING filename )
00047 {
00048 Status status;
00049 BOOLEAN eof;
00050 FILE *file;
00051
00052 status = open_file( filename, READ_FILE, ASCII_FORMAT, &file );
00053
00054
if( status == OK )
00055 {
00056 eof =
FALSE;
00057
00058
while( !eof )
00059 status = input_global_variable( n_globals_lookup,
00060 globals_lookup, file, &eof );
00061 }
00062
00063
if( status == OK )
00064 status = close_file( file );
00065
00066
return( status );
00067 }
00068
00069
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080
00081
00082
00083
00084
private Status input_global_variable(
00085
int n_globals_lookup,
00086
global_struct globals_lookup[],
00087 FILE *file,
00088 BOOLEAN *eof )
00089 {
00090 Status set_status, status;
00091 STRING variable_name;
00092 STRING value;
00093
00094 *eof =
FALSE;
00095
00096 value = NULL;
00097
00098 status = input_string( file, &variable_name, (
char)
'=' );
00099
00100
if( status == OK )
00101 {
00102 status = input_string( file, &value, (
char)
';' );
00103
00104
if( status == OK )
00105 set_status =
set_global_variable( n_globals_lookup, globals_lookup,
00106 variable_name, value );
00107
else
00108 *eof =
TRUE;
00109 }
00110
else
00111 {
00112 status = OK;
00113 set_status = OK;
00114 *eof =
TRUE;
00115 }
00116
00117
if( set_status != OK || status != OK )
00118 {
00119 print_error(
"Error inputting global.\n" );
00120 print_error(
"Variable name is %s\n", variable_name );
00121 }
00122
00123 delete_string( variable_name );
00124 delete_string( value );
00125
00126
return( status );
00127 }
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 private Status
lookup_global(
00146
int n_globals,
00147
global_struct global_lookup[],
00148 STRING variable_name,
00149
void **ptr,
00150 Variable_types *type,
00151 Smallest_int **set_flag )
00152 {
00153 Status status;
00154 STRING stripped;
00155
char *global_name;
00156
int i, s, len;
00157
00158 status = ERROR;
00159
00160 stripped = strip_outer_blanks( variable_name );
00161
00162 for_less( i, 0, n_globals )
00163 {
00164 global_name = global_lookup[i].
variable_name;
00165 len = string_length( global_name );
00166 s = 0;
00167
00168
while( s < len && global_name[s] ==
' ' )
00169 ++s;
00170
00171
if( equal_strings( &global_name[s], stripped ) )
00172 {
00173 *ptr = global_lookup[i].ptr_to_global;
00174 *type = global_lookup[i].type;
00175
if( set_flag != NULL )
00176 *set_flag = &global_lookup[i].set_flag;
00177 status = OK;
00178
break;
00179 }
00180 }
00181
00182 delete_string( stripped );
00183
00184
return( status );
00185 }
00186
00187
00188
00189
00190
00191
00192
00193
00194
00195
00196
00197
00198
00199
00200
00201
00202
00203 public Status
get_global_variable(
00204
int n_globals_lookup,
00205
global_struct globals_lookup[],
00206 STRING variable_name,
00207 STRING *value )
00208 {
00209 Status status;
00210
void *ptr;
00211 Surfprop *surfprop;
00212
Variable_types type;
00213
char buffer[EXTREMELY_LARGE_STRING_SIZE];
00214 STRING *string_ptr;
00215 STRING tmp_str;
00216
00217 status =
lookup_global( n_globals_lookup, globals_lookup, variable_name,
00218 &ptr, &type, NULL );
00219
00220
if( status == OK )
00221 {
00222
switch( type )
00223 {
00224
case BOOLEAN_type:
00225
if( * ((BOOLEAN *) ptr) )
00226 (
void) strcpy( buffer,
"True" );
00227
else
00228 (
void) strcpy( buffer,
"False" );
00229
break;
00230
00231
case int_type:
00232 (
void) sprintf( buffer,
"%d", * (
int *) ptr );
00233
break;
00234
00235
case Real_type:
00236 (
void) sprintf( buffer,
"%g", * (Real *) ptr );
00237
break;
00238
00239
case STRING_type:
00240 string_ptr = (STRING *) ptr;
00241 (
void) strcpy( buffer, *string_ptr );
00242
break;
00243
00244
case Point_type:
00245 (
void) sprintf( buffer,
"%g %g %g",
00246 Point_x(* (Point *) ptr),
00247 Point_y(* (Point *) ptr),
00248 Point_z(* (Point *) ptr) );
00249
break;
00250
00251
case Vector_type:
00252 (
void) sprintf( buffer,
"%g %g %g",
00253 Vector_x(* (Vector *) ptr),
00254 Vector_y(* (Vector *) ptr),
00255 Vector_z(* (Vector *) ptr) );
00256
break;
00257
00258
case Colour_type:
00259 tmp_str =
convert_colour_to_string( * (Colour *) ptr );
00260 (
void) strcpy( buffer, tmp_str );
00261 delete_string( tmp_str );
00262
break;
00263
00264
case Surfprop_type:
00265 surfprop = (Surfprop *) ptr;
00266 (
void) sprintf( buffer,
"%g %g %g %g %g",
00267 Surfprop_a(*surfprop),
00268 Surfprop_d(*surfprop),
00269 Surfprop_s(*surfprop),
00270 Surfprop_se(*surfprop),
00271 Surfprop_t(*surfprop) );
00272
break;
00273
00274
default:
00275 handle_internal_error(
"get_global_variable\n" );
00276 buffer[0] = END_OF_STRING;
00277
break;
00278 }
00279 }
00280
00281 *value = create_string( buffer );
00282
00283
return( status );
00284 }
00285
00286
00287
00288
00289
00290
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300
00301
00302
00303 public Status
set_global_variable(
00304
int n_globals_lookup,
00305
global_struct globals_lookup[],
00306 STRING variable_name,
00307 STRING value_to_set )
00308 {
00309 Status status;
00310 STRING value, *string_ptr;
00311
void *ptr;
00312
Variable_types type;
00313
int tmp_int;
00314 Real tmp_real;
00315 Point tmp_point;
00316 Vector tmp_vector;
00317 Colour tmp_colour;
00318 Surfprop tmp_surfprop;
00319 Smallest_int *set_flag;
00320
00321 value = strip_outer_blanks( value_to_set );
00322
00323 status =
lookup_global( n_globals_lookup, globals_lookup, variable_name,
00324 &ptr, &type, &set_flag );
00325
00326
if( status == OK )
00327 {
00328
switch( type )
00329 {
00330
case BOOLEAN_type:
00331
if( (value[0] ==
't' || value[0] ==
'T') )
00332 {
00333 * (BOOLEAN *) ptr =
TRUE;
00334 }
00335
else if( (value[0] ==
'f' || value[0] ==
'F') )
00336 {
00337 * (BOOLEAN *) ptr =
FALSE;
00338 }
00339
else
00340 {
00341 status = ERROR;
00342 }
00343
break;
00344
00345
case int_type:
00346
if( sscanf( value,
"%d", &tmp_int ) == 1 )
00347 * (
int *) ptr = tmp_int;
00348
else
00349 status = ERROR;
00350
break;
00351
00352
case Real_type:
00353
if( real_is_double() )
00354 {
00355 tmp_real = 0.0;
00356
if( sscanf( value,
"%lf", (
double *) &tmp_real ) == 1 )
00357 * (Real *) ptr = tmp_real;
00358
else
00359 status = ERROR;
00360 }
00361
else
00362 {
00363
if( sscanf( value,
"%f", (
float *) &tmp_real ) == 1 )
00364 * (Real *) ptr = tmp_real;
00365
else
00366 status = ERROR;
00367 }
00368
break;
00369
00370
case STRING_type:
00371 string_ptr = (STRING *) ptr;
00372
if( *set_flag )
00373 delete_string( *string_ptr );
00374 *string_ptr = extract_string( value );
00375 *set_flag =
TRUE;
00376
break;
00377
00378
case Point_type:
00379
if( sscanf( value,
"%f %f %f", &Point_x(tmp_point),
00380 &Point_y(tmp_point), &Point_z(tmp_point) ) == 3 )
00381 * (Point *) ptr = tmp_point;
00382
else
00383 status = ERROR;
00384
break;
00385
00386
case Vector_type:
00387
if( sscanf( value,
"%f %f %f", &Vector_x(tmp_vector),
00388 &Vector_y(tmp_vector), &Vector_z(tmp_vector) ) == 3 )
00389 * (Vector *) ptr = tmp_vector;
00390
else
00391 status = ERROR;
00392
break;
00393
00394
case Colour_type:
00395 tmp_colour =
convert_string_to_colour( value );
00396
00397
if( status == OK )
00398 {
00399 * (Colour *) ptr = tmp_colour;
00400 }
00401
break;
00402
00403
case Surfprop_type:
00404
if( sscanf( value,
"%f %f %f %f %f",
00405 &Surfprop_a(tmp_surfprop),
00406 &Surfprop_d(tmp_surfprop),
00407 &Surfprop_s(tmp_surfprop),
00408 &Surfprop_se(tmp_surfprop),
00409 &Surfprop_t(tmp_surfprop) ) == 5 )
00410 {
00411 * (Surfprop *) ptr = tmp_surfprop;
00412 }
00413
else
00414 status = ERROR;
00415
break;
00416
00417
default:
00418 handle_internal_error(
"set_global_variable\n" );
00419
break;
00420 }
00421 }
00422
00423 delete_string( value );
00424
00425
return( status );
00426 }
00427
00428
00429
00430
00431
00432
00433
00434
00435
00436
00437
00438
00439
00440
00441
00442
00443
00444
00445
00446
00447
00448
00449 public Status
set_or_get_global_variable(
00450
int n_globals_lookup,
00451
global_struct globals_lookup[],
00452 STRING input_str,
00453 STRING *variable_name,
00454 STRING *value_string )
00455 {
00456 Status status;
00457 STRING tmp_var_name, value_to_set;
00458
int equal_index;
00459
00460 status = OK;
00461
00462 tmp_var_name = create_string( input_str );
00463
00464 equal_index = find_character( tmp_var_name, (
char)
'=' );
00465
00466
if( equal_index >= 0 )
00467 {
00468 value_to_set = create_string( &tmp_var_name[equal_index+1] );
00469 tmp_var_name[equal_index] = END_OF_STRING;
00470 status =
set_global_variable( n_globals_lookup, globals_lookup,
00471 tmp_var_name, value_to_set );
00472 delete_string( value_to_set );
00473 }
00474
00475 *variable_name = strip_outer_blanks( tmp_var_name );
00476
00477
if( status == OK )
00478 {
00479 status =
get_global_variable( n_globals_lookup, globals_lookup,
00480 *variable_name, value_string );
00481 }
00482
00483 delete_string( tmp_var_name );
00484
00485
return( status );
00486 }
00487
00488
00489
00490
00491
00492
00493
00494
00495
00496
00497
00498
00499
00500
00501
00502
private STRING extract_string(
00503 STRING str )
00504 {
00505
int len_str, start, end, i;
00506 STRING extracted;
00507
00508 start = 0;
00509
00510 len_str = string_length( str );
00511
00512
while( start < len_str && (str[start] ==
' ' || str[start] ==
'\t') )
00513 {
00514 ++start;
00515 }
00516
00517 end = len_str - 1;
00518
00519
while( end >= 0 && (str[end] ==
' ' || str[end] ==
'\t') )
00520 {
00521 --end;
00522 }
00523
00524
if( start <= end && str[start] ==
'"' && str[end] ==
'"' )
00525 {
00526 ++start;
00527 --end;
00528 }
00529
00530 extracted = create_string( NULL );
00531
00532
if( start <= end )
00533 {
00534 for_inclusive( i, start, end )
00535 concat_char_to_string( &extracted, str[i] );
00536 }
00537
00538 return( extracted );
00539 }
00540
00541
00542
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555 public
void delete_global_variables(
00556
int n_globals_lookup,
00557
global_struct globals_lookup[] )
00558 {
00559
int i;
00560 STRING *ptr;
00561
00562 for_less( i, 0, n_globals_lookup )
00563 {
00564
if( globals_lookup[i].type ==
STRING_type &&
00565 globals_lookup[i].set_flag )
00566 {
00567 ptr = (STRING *) globals_lookup[i].ptr_to_global;
00568 delete_string( *ptr );
00569 }
00570 }
00571 }