Main Page | Modules | Data Structures | File List | Data Fields | Globals | Related Pages

globals.c

Go to the documentation of this file.
00001 /* ---------------------------------------------------------------------------- 00002 @COPYRIGHT : 00003 Copyright 1993,1994,1995 David MacDonald, 00004 McConnell Brain Imaging Centre, 00005 Montreal Neurological Institute, McGill University. 00006 Permission to use, copy, modify, and distribute this 00007 software and its documentation for any purpose and without 00008 fee is hereby granted, provided that the above copyright 00009 notice appear in all copies. The author and McGill University 00010 make no representations about the suitability of this 00011 software for any purpose. It is provided "as is" without 00012 express or implied warranty. 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 /* ----------------------------- MNI Header ----------------------------------- 00028 @NAME : input_globals_file 00029 @INPUT : n_globals_lookup 00030 globals_lookup 00031 filename 00032 @OUTPUT : 00033 @RETURNS : OK or ERROR 00034 @DESCRIPTION: Reads the global variable values from filename, using the 00035 globals lookup to find the relevant globals. 00036 @METHOD : 00037 @GLOBALS : 00038 @CALLS : 00039 @CREATED : 1993 David MacDonald 00040 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00070 @NAME : input_global_variable 00071 @INPUT : n_globals_lookup 00072 globals_lookup 00073 file 00074 @OUTPUT : eof - TRUE if end of file 00075 @RETURNS : 00076 @DESCRIPTION: Inputs a global variable value from the file. 00077 @METHOD : 00078 @GLOBALS : 00079 @CALLS : 00080 @CREATED : 1993 David MacDonald 00081 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00130 @NAME : lookup_global 00131 @INPUT : n_globals 00132 global_lookup 00133 variable_name 00134 @OUTPUT : ptr - pointer to global variable 00135 type 00136 @RETURNS : OK or ERROR 00137 @DESCRIPTION: Given a name string, looks up the corresponding global variable. 00138 @METHOD : 00139 @GLOBALS : 00140 @CALLS : 00141 @CREATED : 1993 David MacDonald 00142 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00188 @NAME : get_global_variable 00189 @INPUT : n_globals_lookup 00190 globals_lookup 00191 variable_name 00192 @OUTPUT : value 00193 @RETURNS : 00194 @DESCRIPTION: Looks up the given variable name and places its value in string 00195 form in the 'value' parameter. 00196 @METHOD : 00197 @GLOBALS : 00198 @CALLS : 00199 @CREATED : 1993 David MacDonald 00200 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00287 @NAME : set_global_variable 00288 @INPUT : n_globals_lookup 00289 globals_lookup 00290 variable_name 00291 value_to_set 00292 @OUTPUT : 00293 @RETURNS : 00294 @DESCRIPTION: Looks up the given variable name, converts the value_to_set 00295 string to the correct type, and sets the global variable. 00296 @METHOD : 00297 @GLOBALS : 00298 @CALLS : 00299 @CREATED : 1993 David MacDonald 00300 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00429 @NAME : set_or_get_global_variable 00430 @INPUT : n_globals_lookup 00431 globals_lookup 00432 input_str 00433 @OUTPUT : variable_name 00434 value_string 00435 @RETURNS : 00436 @DESCRIPTION: input_str is of the form "variable_name" or 00437 "variable_name = value". In both cases the variable name and 00438 value of the variable are passed back. In the second case, 00439 the variable is first assigned the value. This routine is 00440 usually used by programs to allow the user to type in input 00441 strings to query or modify the values of global variables. 00442 @METHOD : 00443 @GLOBALS : 00444 @CALLS : 00445 @CREATED : 1993 David MacDonald 00446 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00489 @NAME : extract_string 00490 @INPUT : str 00491 @OUTPUT : extracted 00492 @RETURNS : 00493 @DESCRIPTION: Extracts a string from str. Skips leading and trailing 00494 white space. String can be a quoted string or not. 00495 @METHOD : 00496 @GLOBALS : 00497 @CALLS : 00498 @CREATED : 1993 David MacDonald 00499 @MODIFIED : 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 /* ----------------------------- MNI Header ----------------------------------- 00542 @NAME : delete_global_variables 00543 @INPUT : n_globals_lookup 00544 globals_lookup 00545 @OUTPUT : 00546 @RETURNS : 00547 @DESCRIPTION: 00548 @METHOD : 00549 @GLOBALS : 00550 @CALLS : 00551 @CREATED : Sep. 1, 1995 David MacDonald 00552 @MODIFIED : 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 }

Generated on Wed Jul 28 09:10:57 2004 for BICPL by doxygen 1.3.7