diff --git a/lib/calib.c b/lib/calib.c index c6cce94..1d107ed 100644 --- a/lib/calib.c +++ b/lib/calib.c @@ -28,7 +28,7 @@ #include #include -static int check_cal_file( comedi_t *dev, const struct calibration_file_contents *parsed_file ) +static int check_cal_file( comedi_t *dev, struct calibration_file_contents *parsed_file ) { if( strcmp( comedi_get_driver_name( dev ), parsed_file->driver_name ) ) { @@ -45,7 +45,7 @@ static int check_cal_file( comedi_t *dev, const struct calibration_file_contents return 0; } -static inline int valid_channel( const struct calibration_file_contents *parsed_file, +static inline int valid_channel( struct calibration_file_contents *parsed_file, unsigned int cal_index, unsigned int channel ) { int num_channels, i; @@ -61,7 +61,7 @@ static inline int valid_channel( const struct calibration_file_contents *parsed_ return 0; } -static inline int valid_range( const struct calibration_file_contents *parsed_file, +static inline int valid_range( struct calibration_file_contents *parsed_file, unsigned int cal_index, unsigned int range ) { int num_ranges, i; @@ -77,7 +77,7 @@ static inline int valid_range( const struct calibration_file_contents *parsed_fi return 0; } -static inline int valid_aref( const struct calibration_file_contents *parsed_file, +static inline int valid_aref( struct calibration_file_contents *parsed_file, unsigned int cal_index, unsigned int aref ) { int num_arefs, i; @@ -93,7 +93,7 @@ static inline int valid_aref( const struct calibration_file_contents *parsed_fil return 0; } -static int find_calibration( const struct calibration_file_contents *parsed_file, +static int find_calibration( struct calibration_file_contents *parsed_file, unsigned int subdev, unsigned int channel, unsigned int range, unsigned int aref ) { int num_cals, i; @@ -113,7 +113,7 @@ static int find_calibration( const struct calibration_file_contents *parsed_file return i; } -static int set_calibration( comedi_t *dev, const struct calibration_file_contents *parsed_file, +static int set_calibration( comedi_t *dev, struct calibration_file_contents *parsed_file, unsigned int cal_index ) { int i, retval, num_caldacs; @@ -143,7 +143,7 @@ int comedi_apply_calibration( comedi_t *dev, unsigned int subdev, unsigned int c int retval; int cal_index; FILE *cal_file; - const struct calibration_file_contents *parsed_file; + struct calibration_file_contents *parsed_file; if( cal_file_path ) { @@ -172,21 +172,21 @@ int comedi_apply_calibration( comedi_t *dev, unsigned int subdev, unsigned int c retval = check_cal_file( dev, parsed_file ); if( retval < 0 ) { - cleanup_calibration_parse(); + cleanup_calibration_parse( parsed_file ); return retval; } cal_index = find_calibration( parsed_file, subdev, channel, range, aref ); if( cal_index < 0 ) { - cleanup_calibration_parse(); + cleanup_calibration_parse( parsed_file ); return cal_index; } retval = set_calibration( dev, parsed_file, cal_index ); if( retval < 0 ); { - cleanup_calibration_parse(); + cleanup_calibration_parse( parsed_file ); return retval; } diff --git a/lib/calib_yacc.y b/lib/calib_yacc.y index 687b68b..cd4e299 100644 --- a/lib/calib_yacc.y +++ b/lib/calib_yacc.y @@ -28,7 +28,7 @@ #define YYERROR_VERBOSE -struct calibration_file_contents file_contents; +struct calibration_file_contents *parsed_file; static struct caldac_setting caldac; static int cal_index; FILE *calib_yyin; @@ -157,33 +157,44 @@ static int add_caldac( struct calibration_file_contents *file_contents, return 0; } -static void init_calib_parse( void ) +static struct calibration_file_contents* alloc_calib_parse( void ) { - memset( &file_contents, 0, sizeof( file_contents ) ); - cal_index = 0; + struct calibration_file_contents *file_contents; + file_contents = malloc( sizeof( *file_contents ) ); + if( file_contents == NULL ) return file_contents; + memset( file_contents, 0, sizeof( *file_contents ) ); + return file_contents; } -extern void cleanup_calibration_parse( void ) +extern void cleanup_calibration_parse( struct calibration_file_contents *file_contents ) { - if( file_contents.driver_name ) + if( file_contents->driver_name ) { - free( file_contents.driver_name ); - file_contents.driver_name = NULL; + free( file_contents->driver_name ); + file_contents->driver_name = NULL; } - if( file_contents.board_name ) + if( file_contents->board_name ) { - free( file_contents.board_name ); - file_contents.board_name = NULL; + free( file_contents->board_name ); + file_contents->board_name = NULL; } - free_calibrations( &file_contents ); + free_calibrations( file_contents ); + free( file_contents ); + file_contents = NULL; } -extern const struct calibration_file_contents* parse_calibration_file( FILE *file ) +extern struct calibration_file_contents* parse_calibration_file( FILE *file ) { calib_yyin = file; - init_calib_parse(); - if( calib_yyparse() ) return NULL; - return &file_contents; + parsed_file = alloc_calib_parse(); + if( parsed_file == NULL ) return parsed_file; + cal_index = 0; + if( calib_yyparse() ) + { + cleanup_calibration_parse( parsed_file ); + return NULL; + } + return parsed_file; } %} @@ -218,13 +229,13 @@ extern const struct calibration_file_contents* parse_calibration_file( FILE *fil hash_element: T_DRIVER_NAME T_ASSIGN T_STRING { - if( file_contents.driver_name != NULL ) YYABORT; - file_contents.driver_name = strdup( $3 ); + if( parsed_file->driver_name != NULL ) YYABORT; + parsed_file->driver_name = strdup( $3 ); } | T_BOARD_NAME T_ASSIGN T_STRING { - if( file_contents.board_name != NULL ) YYABORT; - file_contents.board_name = strdup( $3 ); + if( parsed_file->board_name != NULL ) YYABORT; + parsed_file->board_name = strdup( $3 ); } | T_CALIBRATIONS T_ASSIGN '[' calibrations_array ']' ; @@ -242,7 +253,7 @@ extern const struct calibration_file_contents* parse_calibration_file( FILE *fil calibration_setting_element: T_SUBDEVICE T_ASSIGN T_NUMBER { struct calibration_setting *setting; - setting = current_setting( &file_contents ); + setting = current_setting( parsed_file ); if( setting == NULL ) YYABORT; setting->subdevice = $3; } @@ -257,7 +268,7 @@ extern const struct calibration_file_contents* parse_calibration_file( FILE *fil | channel ',' channels_array ; - channel: T_NUMBER { add_channel( &file_contents, $1 ); } + channel: T_NUMBER { add_channel( parsed_file, $1 ); } ; ranges_array: /* empty */ @@ -265,7 +276,7 @@ extern const struct calibration_file_contents* parse_calibration_file( FILE *fil | range ',' ranges_array ; - range: T_NUMBER { add_range( &file_contents, $1 ); } + range: T_NUMBER { add_range( parsed_file, $1 ); } ; arefs_array: /* empty */ @@ -273,7 +284,7 @@ extern const struct calibration_file_contents* parse_calibration_file( FILE *fil | aref ',' arefs_array ; - aref: T_NUMBER { add_aref( &file_contents, $1 ); } + aref: T_NUMBER { add_aref( parsed_file, $1 ); } ; caldacs_array: /* empty */ @@ -281,7 +292,7 @@ extern const struct calibration_file_contents* parse_calibration_file( FILE *fil | '{' caldac '}' ',' caldacs_array ; - caldac: /* empty */ { add_caldac( &file_contents, caldac ); } + caldac: /* empty */ { add_caldac( parsed_file, caldac ); } | caldac_element | caldac_element ',' caldac ; diff --git a/lib/libinternal.h b/lib/libinternal.h index ea212ca..f290bc9 100644 --- a/lib/libinternal.h +++ b/lib/libinternal.h @@ -186,8 +186,8 @@ struct calibration_file_contents int calib_yylex( void ); void calib_yyerror( char *s ); int calib_yyparse( void ); -const struct calibration_file_contents* parse_calibration_file( FILE *file ); -void cleanup_calibration_parse( void ); +struct calibration_file_contents* parse_calibration_file( FILE *file ); +void cleanup_calibration_parse( struct calibration_file_contents *parsed_file ); #endif