clean up number scanner in Units

This commit is contained in:
jriegel 2014-08-03 17:24:42 +02:00
parent 1da5543657
commit b32b227733
3 changed files with 381 additions and 356 deletions

View File

@ -239,7 +239,28 @@ Quantity Quantity::Gon (360.0/400.0 ,Unit(0,0,0,0,0,0,0,1)); // g
Quantity QuantResult; Quantity QuantResult;
/* helper function for tuning number strings with groups in a locale agnostic way... */
double num_change(char* yytext,char dez_delim,char grp_delim)
{
double ret_val;
char temp[40];
int i = 0;
for(char* c=yytext;*c!='\0';c++){
// skipp group delimiter
if(*c==grp_delim) continue;
// check for a dez delimiter othere then dot
if(*c==dez_delim && dez_delim !='.')
temp[i++] = '.';
else
temp[i++] = *c;
// check buffor overflow
if (i>39) return 0.0;
}
temp[i] = '\0';
ret_val = atof( temp );
return ret_val;
};
// error func // error func
void Quantity_yyerror(char *errorinfo) void Quantity_yyerror(char *errorinfo)

File diff suppressed because it is too large Load Diff

View File

@ -22,6 +22,9 @@
DIGIT [0-9] DIGIT [0-9]
ID [a-z][a-z0-9]* ID [a-z][a-z0-9]*
EXPO [eE][-+]?[0-9]+
DGRP '\.'[0-9][0-9][0-9]
CGRP '\,'[0-9][0-9][0-9]
%x C_COMMENT %x C_COMMENT
@ -127,10 +130,8 @@ ID [a-z][a-z0-9]*
"rad" yylval = Quantity::Radian; return UNIT; // radian "rad" yylval = Quantity::Radian; return UNIT; // radian
"gon" yylval = Quantity::Gon; return UNIT; // gon "gon" yylval = Quantity::Gon; return UNIT; // gon
{DIGIT}+"."?{DIGIT}*{EXPO}? { yylval = num_change(yytext,'.',',');return NUM; }
{DIGIT}*["."","]{DIGIT}*[eE][-+]?[0-9]+ { for(char* c=yytext;*c!='\0';c++) if(*c==',') *c='.'; yylval = atof( yytext ); return NUM; } {DIGIT}+","?{DIGIT}*{EXPO}? { yylval = num_change(yytext,',','.');return NUM; }
{DIGIT}*["."","]{DIGIT}* { for(char* c=yytext;*c!='\0';c++)if(*c==',')*c='.'; yylval = atof( yytext ); return NUM; }
{DIGIT}+ { yylval = atof( yytext ); return NUM;}
"pi" {yylval = M_PI ; return NUM;} // constant pi "pi" {yylval = M_PI ; return NUM;} // constant pi