Parse a string supposed to be a double.
534{
535 char *p;
536 int st;
537 enum states
538 {
539 INIT = 0,
540 NEED_DIG = 1,
541 DIG = 2,
542 NEED_DIG_DEC = 3,
543 DIG_DEC = 4,
544 EXP = 5,
545 NEED_DIG_EXP = 6,
546 DIG_EXP = 7,
547 END = 8
548 };
549
550
551
552
553
554
555
556
557 if (space_before) while (isspace(*d)) d++;
558 for (st = INIT, p = d ; *p ; p++)
559 {
560
561 if (isdigit(*p))
562 {
563 if (st == INIT || st == NEED_DIG) st = DIG;
564 else if (st == NEED_DIG_DEC) st = DIG_DEC;
565 else if (st == NEED_DIG_EXP || st == EXP) st = DIG_EXP;
566 else if (st == DIG || st == DIG_DEC || st == DIG_EXP);
568 }
569 else if (*p == '.')
570 {
571 if (st == DIG) st = NEED_DIG_DEC;
573 }
574 else if (*p == '-' || *p == '+')
575 {
576 if (st == INIT) st = NEED_DIG;
577 else if (st == EXP) st = NEED_DIG_EXP;
579 }
580 else if (*p == 'e' || *p == 'E')
581 {
582 if (st == DIG || st == DIG_DEC) st = EXP;
584 }
585 else if (isspace(*p))
586 {
587 if (!space_after)
gml_lwpgerror(
"invalid GML representation", 11);
588 if (st == DIG || st == DIG_DEC || st == DIG_EXP)st = END;
589 else if (st == NEED_DIG_DEC) st = END;
590 else if (st == END);
592 }
594 }
595
596 if (st != DIG && st != NEED_DIG_DEC && st != DIG_DEC && st != DIG_EXP && st != END)
598
599 return atof(d);
600}
static void gml_lwpgerror(char *msg, __attribute__((__unused__)) int error_code)