static int getint __P((void));
static int getlong __P((long *));
static int getulong __P((unsigned long *));
-static double getdouble __P((void));
+static int getdouble __P((double *));
static int asciicode __P((void));
static WORD_LIST *garglist;
static int retval;
-extern char *backslash_quote ();
+extern char *sh_backslash_quote ();
int
printf_builtin (list)
char *p, *xp;
p = getstr ();
- xp = backslash_quote (p);
+ xp = sh_backslash_quote (p);
if (xp)
{
/* Use printstr to get fieldwidth and precision right. */
{
double p;
- p = getdouble ();
+ if (getdouble (&p))
+ PRETURN (EXECUTION_FAILURE);
PF(start, p);
break;
}
case 'b': *cp = '\b'; break;
- case 'e': *cp = '\033'; break; /* ESC -- non-ANSI */
+ case 'e':
+ case 'E': *cp = '\033'; break; /* ESC -- non-ANSI */
case 'f': *cp = '\f'; break;
case 'v': *cp = '\v'; break;
/* %b octal constants are `\0' followed by one, two, or three
- octal digits... */
+ octal digits... */
case '0':
for (temp = 3, evalue = 0; isoctal (*p) && temp--; p++)
evalue = (evalue * 8) + OCTVALUE (*p);
if (ret > INT_MAX)
{
- builtin_error ("%s: %s", garglist->word->word, strerror(ERANGE));
- return (0);
+ builtin_error ("warning: %s: %s", garglist->word->word, strerror(ERANGE));
+ ret = INT_MAX;
+ }
+ else if (ret < INT_MIN)
+ {
+ builtin_error ("warning: %s: %s", garglist->word->word, strerror(ERANGE));
+ ret = INT_MIN;
}
return ((int)ret);
return (1);
}
else if (errno == ERANGE)
- {
- builtin_error ("%s: %s", garglist->word->word, strerror(ERANGE));
- return (1);
- }
+ builtin_error ("warning: %s: %s", garglist->word->word, strerror(ERANGE));
*lp = ret;
garglist = garglist->next;
return (1);
}
else if (errno == ERANGE)
- {
- builtin_error ("%s: %s", garglist->word->word, strerror(ERANGE));
- return (1);
- }
+ builtin_error ("warning: %s: %s", garglist->word->word, strerror(ERANGE));
*ulp = ret;
garglist = garglist->next;
return (0);
}
-static double
-getdouble ()
+static int
+getdouble (dp)
+ double *dp;
{
double ret;
+ char *ep;
if (garglist == 0)
- return ((double)0);
+ {
+ *dp = (double)0;
+ return (0);
+ }
if (garglist->word->word[0] == '\'' || garglist->word->word[0] == '"')
- return ((double)asciicode ());
+ {
+ *dp = (double)asciicode ();
+ return (0);
+ }
- /* This should use strtod if it is available. */
- ret = atof (garglist->word->word);
+ errno = 0;
+ ret = strtod (garglist->word->word, &ep);
+ if (*ep)
+ {
+ builtin_error ("%s: invalid number", garglist->word->word);
+ return (1);
+ }
+ else if (errno == ERANGE)
+ builtin_error ("warning: %s: %s", garglist->word->word, strerror(ERANGE));
+
+ *dp = ret;
garglist = garglist->next;
- return (ret);
+ return (0);
}
/* NO check is needed for garglist here. */