> - it is difficult for me (and no one did/do it),

Try this.  It allows "um", "mm", "mil", or "in" as suffixes after
floating point numbers (no space between), anywhere an integer is
otherwise allowed.  Example:

        Line[1.5mm 0 1.5mm 0.5 in 1mil 2mil "clearline"]

Index: parse_l.l
===================================================================
RCS file: /cvsroot/pcb/pcb/src/parse_l.l,v
retrieving revision 1.23
diff -p -U3 -r1.23 parse_l.l
--- parse_l.l   7 Jan 2008 03:44:18 -0000       1.23
+++ parse_l.l   10 Jun 2008 23:23:52 -0000
@@ -76,6 +76,8 @@ DataTypePtr           yyData;
 ElementTypePtr         yyElement;
 FontTypePtr            yyFont;
 
+static int parse_number (double);
+
 /* ---------------------------------------------------------------------------
  * an external prototypes
  */
@@ -90,7 +92,11 @@ static       int             Parse(char *, char *, char *
 
 HEX                            0x[0-9a-fA-F]+
 DECIMAL                        -?[1-9][0-9]*|0
-FLOATING                -?[0-9]*"."[0-9]*
+FLOATING                [+-]?[0-9]*("."[0-9]*)?
+FLOATINGMM              {FLOATING}[mM][mM]
+FLOATINGUM              {FLOATING}[uU][mM]
+FLOATINGIN              {FLOATING}[iI][nN]
+FLOATINGMIL             {FLOATING}[mM][iI][lL]
 CARDINAL               [1-9][0-9]*|0
 STRINGCHAR             ([^"\n\r\\]|\\.)
 
@@ -133,10 +139,12 @@ Attribute { return(T_ATTRIBUTE); }
                                                yylval.number = (unsigned) 
*(yytext+1);
                                                return(CHAR_CONST);
                                        }
-{DECIMAL}              {
-                                               sscanf((char *) yytext, "%i", 
&yylval.number);
-                                               return(NUMBER);
-                                       }
+{FLOATINGMM}           {       return parse_number(3937.0079); }
+{FLOATINGUM}           {       return parse_number(3.9370079); }
+{FLOATINGIN}           {       return parse_number(100000.0); }
+{FLOATINGMIL}          {       return parse_number(100.0); }
+{DECIMAL}              {       return parse_number(1.0); }
+
 {HEX}                  {
                                                sscanf((char *) yytext, "%x", 
&yylval.number);
                                                return(NUMBER);
@@ -346,3 +354,11 @@ int ParseFont(FontTypePtr Ptr, char *Fil
        return r;
 }
 
+static int
+parse_number (double scale)
+{
+  double val;
+  sscanf ((char *) yytext, "%lf", &val);
+  yylval.number = (int)(val * scale + 0.49);
+  return NUMBER;
+}


_______________________________________________
geda-user mailing list
[email protected]
http://www.seul.org/cgi-bin/mailman/listinfo/geda-user

Reply via email to