return p;
}
+static inline void
+write_char (char *str, grub_size_t *count, grub_size_t max_len, unsigned char ch)
+{
+ if (*count < max_len)
+ str[*count] = ch;
+
+ (*count)++;
+}
+
+static inline void
+write_str (char *str, grub_size_t *count, grub_size_t max_len, const char *s)
+{
+ while (*s)
+ write_char (str, count, max_len, *s++);
+}
+
+static inline void
+write_fill (char *str, grub_size_t *count, grub_size_t max_len, const char ch, int count_fill)
+{
+ int i;
+ for (i = 0; i < count_fill; i++)
+ write_char (str, count, max_len, ch);
+}
+
+
static int
grub_vsnprintf_real (char *str, grub_size_t max_len, const char *fmt0, va_list args_in)
{
grub_size_t count = 0;
grub_size_t count_args = 0;
const char *fmt;
- auto void write_char (unsigned char ch);
- auto void write_str (const char *s);
- auto void write_fill (const char ch, int count_fill);
-
- void write_char (unsigned char ch)
- {
- if (count < max_len)
- *str++ = ch;
-
- count++;
- }
-
- void write_str (const char *s)
- {
- while (*s)
- write_char (*s++);
- }
-
- void write_fill (const char ch, int count_fill)
- {
- int i;
- for (i = 0; i < count_fill; i++)
- write_char (ch);
- }
fmt = fmt0;
while ((c = *fmt++) != 0)
if (c != '%')
{
- write_char (c);
+ write_char (str, &count, max_len,c);
continue;
}
if (c == '%')
{
- write_char (c);
+ write_char (str, &count, max_len,c);
continue;
}
switch (c)
{
case 'p':
- write_str ("0x");
+ write_str (str, &count, max_len, "0x");
c = 'x';
longlongfmt |= (sizeof (void *) == sizeof (long long));
/* Fall through. */
else
grub_lltoa (tmp, c, args[curn].i);
if (! rightfill && grub_strlen (tmp) < format1)
- write_fill (zerofill, format1 - grub_strlen (tmp));
- write_str (tmp);
+ write_fill (str, &count, max_len, zerofill, format1 - grub_strlen (tmp));
+ write_str (str, &count, max_len, tmp);
if (rightfill && grub_strlen (tmp) < format1)
- write_fill (zerofill, format1 - grub_strlen (tmp));
+ write_fill (str, &count, max_len, zerofill, format1 - grub_strlen (tmp));
break;
case 'c':
- write_char (args[curn].i & 0xff);
+ write_char (str, &count, max_len,args[curn].i & 0xff);
break;
case 'C':
mask = 0;
}
- write_char (mask | (code >> shift));
+ write_char (str, &count, max_len,mask | (code >> shift));
for (shift -= 6; shift >= 0; shift -= 6)
- write_char (0x80 | (0x3f & (code >> shift)));
+ write_char (str, &count, max_len,0x80 | (0x3f & (code >> shift)));
}
break;
len++;
if (!rightfill && len < format1)
- write_fill (zerofill, format1 - len);
+ write_fill (str, &count, max_len, zerofill, format1 - len);
grub_size_t i;
for (i = 0; i < len; i++)
- write_char (*p++);
+ write_char (str, &count, max_len,*p++);
if (rightfill && len < format1)
- write_fill (zerofill, format1 - len);
+ write_fill (str, &count, max_len, zerofill, format1 - len);
}
break;
default:
- write_char (c);
+ write_char (str, &count, max_len,c);
break;
}
}
- *str = '\0';
+ if (count < max_len)
+ str[count] = '\0';
+ else
+ str[max_len] = '\0';
return count;
}