On 3/19/07, Magnus Holmgren <[EMAIL PROTECTED]> wrote:
[EMAIL PROTECTED] wrote:
> Log Message:
> Add support for the .precision format in the sprintf()-like functions
> to allow limiting the maximum length of a string.
<...>
> case 's':
> str = va_arg (ap, char*);
> + if(precision > 0)
> + str[precision] = '\0';
Should it really modify the input string like that? What if it is in
flash? (Might not be a problem as currently used, but...)
Magnus
Good point. Would this be a better way to do it:
Index: firmware/common/sprintf.c
===================================================================
--- firmware/common/sprintf.c (revision 12842)
+++ firmware/common/sprintf.c (working copy)
@@ -27,6 +27,7 @@
#include <stdarg.h>
#include <string.h>
#include <stdbool.h>
+#include <limits.h>
#include "file.h" /* for write(), used in fprintf() */
#include "sprintf.h" /* to allow the simulator magic */
@@ -75,6 +76,8 @@
precision = 10*precision + ch - '0';
ch = *fmt++;
}
+ } else {
+ precision = INT_MAX;
}
str = tmpbuf + sizeof tmpbuf - 1;
@@ -86,8 +89,6 @@
case 's':
str = va_arg (ap, char*);
- if(precision > 0)
- str[precision] = '\0';
break;
case 'd':
@@ -160,7 +161,7 @@
while (width-- > 0 && ok)
ok=push(userp, pad);
}
- while (*str != '\0' && ok)
+ while (*str != '\0' && ok && precision--)
ok=push(userp, *str++);
}
else