Parsing of calibration file with soft calibration information works now.
authorFrank Mori Hess <fmhess@speakeasy.net>
Tue, 22 Aug 2006 20:13:44 +0000 (20:13 +0000)
committerFrank Mori Hess <fmhess@speakeasy.net>
Tue, 22 Aug 2006 20:13:44 +0000 (20:13 +0000)
lib/calib_yacc.y
lib/libinternal.h

index 1417f68747f45b5d3860fa056cbfe5cbc5288b10..24399861200b38f1231a5e6d3fe5b85eed44ff6d 100644 (file)
@@ -108,7 +108,11 @@ static int add_calibration_setting( comedi_calibration_t *file_contents )
 
        temp = realloc( file_contents->settings,
                ( file_contents->num_settings + 1 ) * sizeof( comedi_calibration_setting_t ) );
-       if( temp == NULL ) return -1;
+       if( temp == NULL )
+       {
+               fprintf(stderr, "%s: realloc failed to allocate memory.\n", __FUNCTION__);
+               return -1;
+       }
        file_contents->settings = temp;
        memset( &file_contents->settings[ file_contents->num_settings ],
                0, sizeof( comedi_calibration_setting_t ) );
@@ -138,7 +142,11 @@ static int add_channel( calib_yyparse_private_t *priv, int channel )
        if( setting == NULL ) return -1;
 
        temp = realloc( setting->channels, ( setting->num_channels + 1 ) * sizeof( int ) );
-       if( temp == NULL ) return -1;
+       if( temp == NULL )
+       {
+               fprintf(stderr, "%s: realloc failed to allocate memory.\n", __FUNCTION__);
+               return -1;
+       }
        setting->channels = temp;
        setting->channels[ setting->num_channels++ ] = channel;
        return 0;
@@ -153,7 +161,11 @@ static int add_range( calib_yyparse_private_t *priv, int range )
        if( setting == NULL ) return -1;
 
        temp = realloc( setting->ranges, ( setting->num_ranges + 1 ) * sizeof( int ) );
-       if( temp == NULL ) return -1;
+       if( temp == NULL )
+       {
+               fprintf(stderr, "%s: realloc failed to allocate memory.\n", __FUNCTION__);
+               return -1;
+       }
        setting->ranges = temp;
        setting->ranges[ setting->num_ranges++ ] = range;
        return 0;
@@ -184,7 +196,11 @@ static int add_caldac( calib_yyparse_private_t *priv,
 
        temp = realloc( setting->caldacs, ( setting->num_caldacs + 1 ) *
                sizeof( comedi_caldac_t ) );
-       if( temp == NULL ) return -1;
+       if( temp == NULL )
+       {
+               fprintf(stderr, "%s: realloc failed to allocate memory.\n", __FUNCTION__);
+               return -1;
+       }
        setting->caldacs = temp;
        setting->caldacs[ setting->num_caldacs++ ] = caldac;
        return 0;
@@ -195,8 +211,16 @@ static int add_polynomial(calib_yyparse_private_t *priv)
        comedi_calibration_setting_t *setting;
 
        setting = current_setting( priv );
-       if( setting == NULL ) return -1;
-       if(priv->num_coefficients < 1) return -1;
+       if( setting == NULL )
+       {
+               fprintf(stderr, "%s: current_setting returned NULL\n", __FUNCTION__);
+               return -1;
+       }
+       if(priv->num_coefficients < 1)
+       {
+               fprintf(stderr, "%s: polynomial has no coefficients.\n", __FUNCTION__);
+               return -1;
+       }
        if(priv->polynomial_direction == POLYNOMIAL_TO_PHYS)
        {
                if(setting->soft_calibration.to_phys) return -1;
@@ -211,6 +235,19 @@ static int add_polynomial(calib_yyparse_private_t *priv)
        return 0;
 }
 
+static int add_polynomial_coefficient(calib_yyparse_private_t *priv, double coefficient)
+{
+       if(priv->num_coefficients >= COMEDI_MAX_NUM_POLYNOMIAL_COEFFICIENTS)
+       {
+               fprintf(stderr, "too many coefficients for polynomial,\n");
+               fprintf(stderr, "num_coefficients=%i, max is %i .\n", priv->num_coefficients, COMEDI_MAX_NUM_POLYNOMIAL_COEFFICIENTS);
+               return -1;
+       }
+       priv->polynomial.order = priv->num_coefficients;
+       priv->polynomial.coefficients[priv->num_coefficients++] = coefficient;
+       return 0;
+}
+
 static comedi_calibration_t* alloc_calib_parse( void )
 {
        comedi_calibration_t *file_contents;
@@ -245,10 +282,9 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
        FILE *file;
 
        if( cal_file_path == NULL ) return NULL;
-
+       memset(&priv, 0, sizeof(calib_yyparse_private_t));
        priv.parsed_file = alloc_calib_parse();
        if( priv.parsed_file == NULL ) return NULL;
-       priv.cal_index = 0;
 
        file = fopen( cal_file_path, "r" );
        if( file == NULL )
@@ -293,7 +329,8 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
        input: '{' hash '}'
                | error
                        {
-                               fprintf(stderr, "input error on line %i\n", @1.first_line );
+                               fprintf(stderr, "input error on line %i\n", calib_yyget_lineno(priv(parse_arg)->yyscanner));
+//                             fprintf(stderr, "input error on line %i\n", @1.first_line );
                                YYABORT;
                        }
                ;
@@ -352,7 +389,7 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
                | channel ',' channels_array
                ;
 
-       channel: T_NUMBER { add_channel( parse_arg, $1 ); }
+       channel: T_NUMBER { if(add_channel( parse_arg, $1 ) < 0) YYERROR; }
                ;
 
        ranges_array: /* empty */
@@ -360,7 +397,7 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
                | range ',' ranges_array
                ;
 
-       range: T_NUMBER { add_range( parse_arg, $1 ); }
+       range: T_NUMBER { if(add_range( parse_arg, $1 ) < 0) YYERROR; }
                ;
 
        arefs_array: /* empty */
@@ -368,7 +405,7 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
                | aref ',' arefs_array
                ;
 
-       aref: T_NUMBER { add_aref( parse_arg, $1 ); }
+       aref: T_NUMBER { if(add_aref( parse_arg, $1 ) < 0) YYERROR; }
                ;
 
        caldacs_array: /* empty */
@@ -376,8 +413,8 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
                | '{' caldac '}' ',' caldacs_array
                ;
 
-       caldac: /* empty */ { add_caldac( parse_arg, priv(parse_arg)->caldac ); }
-               | caldac_element { add_caldac( parse_arg, priv(parse_arg)->caldac ); }
+       caldac: /* empty */ { if(add_caldac( parse_arg, priv(parse_arg)->caldac ) < 0) YYERROR; }
+               | caldac_element { if(add_caldac( parse_arg, priv(parse_arg)->caldac ) < 0) YYERROR; }
                | caldac_element ',' caldac
                ;
 
@@ -386,12 +423,20 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
                | T_VALUE T_ASSIGN T_NUMBER { priv(parse_arg)->caldac.value = $3; }
                ;
 
-       polynomial: /* empty */ { add_polynomial(parse_arg);}
-               | polynomial_element { add_polynomial(parse_arg);}
+       polynomial: /* empty */
+               {
+                       if(add_polynomial(parse_arg) < 0) YYERROR;
+                       priv(parse_arg)->num_coefficients = 0;
+               }
+               | polynomial_element
+               {
+                       if(add_polynomial(parse_arg) < 0) YYERROR;
+                       priv(parse_arg)->num_coefficients = 0;
+               }
                | polynomial_element ',' polynomial
                ;
 
-       polynomial_element: T_COEFFICIENTS T_ASSIGN '[' coefficient_array ']' {priv(parse_arg)->num_coefficients = 0;}
+       polynomial_element: T_COEFFICIENTS T_ASSIGN '[' coefficient_array ']'
                | T_EXPANSION_ORIGIN T_ASSIGN expansion_origin
                ;
 
@@ -402,18 +447,19 @@ extern comedi_calibration_t* _comedi_parse_calibration_file( const char *cal_fil
 
        coefficient: T_FLOAT
                {
-                       if(priv(parse_arg)->num_coefficients >= COMEDI_MAX_NUM_POLYNOMIAL_COEFFICIENTS)
-                       {
-                               fprintf(stderr, "too many coefficients for polynomial on line %i ,\n", @1.first_line );
-                               fprintf(stderr, "max is %i .\n", COMEDI_MAX_NUM_POLYNOMIAL_COEFFICIENTS);
-                               YYABORT;
-                       }
-                       priv(parse_arg)->polynomial.order = priv(parse_arg)->num_coefficients;
-                       priv(parse_arg)->polynomial.coefficients[priv(parse_arg)->num_coefficients++] = $1;
+                       if(add_polynomial_coefficient(parse_arg, $1) < 0) YYERROR;
+               }
+               | T_NUMBER
+               {
+                       if(add_polynomial_coefficient(parse_arg, $1) < 0) YYERROR;
                }
                ;
 
        expansion_origin: T_FLOAT
+               {
+                       priv(parse_arg)->polynomial.expansion_origin = $1;
+               }
+               | T_NUMBER
                {
                        priv(parse_arg)->polynomial.expansion_origin = $1;
                }
index dc209c9edd6eb53404e7ab63fb6883331c3aa7c0..27228163f82148b5c119be4d483d9729b57f71f7 100644 (file)
@@ -152,7 +152,7 @@ enum{
 /* used by range.c, was in comedilib.h but apparently deprecated so I put it here - fmhess */
 int comedi_get_rangetype(comedi_t *it,unsigned int subdevice,unsigned int chan);
 
-#define YY_DECL int calib_yylex(YYSTYPE *calib_lvalp, YYLTYPE *calib_llocp, yyscan_t yyscanner)
+#define YY_DECL int calib_yylex(YYSTYPE *calib_lvalp, yyscan_t yyscanner)
 void calib_yyerror(char *s);
 int calib_yyparse(void *parse_arg);