https://opensource.apple.com/source/xnu/xnu-201/osfmk/kern/printf.c.auto.html
Hello! While analyzing Apple's printf code, I have a question!
case 's':
{
register char *p;
register char *p2;
if (prec == -1)
prec = 0x7fffffff; /* MAXINT */
p = va_arg(*argp, char *);
if (p == (char *)0)
p = "";
if (length > 0 && !ladjust) {
n = 0;
p2 = p;
for (; *p != '\0' && n < prec; p++)
n++;
p = p2;
while (n < length) {
(*putc)(' ');
n++;
}
}
n = 0;
while (*p != '\0') {
if (++n > prec || (length > 0 && n > length))
break;
(*putc)(*p++);
}
if (n < length && ladjust) {
while (n < length) {
(*putc)(' ');
n++;
}
}
break;
}
As follows, Apple cuts out the word for '% 2s' and prints it.
For example, "hello" is printed as "he"!
However, the actual printf output will return the entire string if it does not exceed the length of the string.
For example, "hello" is printed as "hello"!
Which part of the Apple code am I missing?
This is the code for% 3s.
In my code:
void printf_str(va_list listp, t_list *_flags)
{
char *src;
char *src_cpy;
long n;
if (_flags->prec == -1)
_flags->prec = 0x7fffffff;
src = va_arg(listp, char *);
if(src == (char *)0)
src = "";
if (_flags->length > 0 && !_flags->ladjust)
{
n = 0;
src_cpy = src;
while (*src != '\0' && n < _flags->prec)
{
n++;
src++;
}
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
src = src_cpy;
while (n < _flags->length)
{
putchar_fd(1, ' ');
n++;
}
}
n = 0;
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
while (*src != '\0')
{
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
if (++n > _flags->prec || (_flags->length > 0 && n > _flags->length))
break;
putchar_fd(1, *(src++));
}
printf("%ld, %d, %d\n", n, _flags->prec, _flags->length);
if (n < _flags->length && _flags->ladjust)
{
while (n < _flags->length)
{
putchar_fd(1, ' ');
n++;
}
}
}
length: 3 prec: -1 ladjust: 0 *fmt: s
Result:
5, 2147483647, 3
0, 2147483647, 3
0, 2147483647, 3
h1, 2147483647, 3
e2, 2147483647, 3
l3, 2147483647, 3
4, 2147483647, 3
The actual output part will be this part.
while (*p != '\0') {
if (++n > prec || (length > 0 && n > length))
break;
(*putc)(*p++);
}
To summarize my question again, it's Apple's code, but printf's behavior on mac prints out hello entirely. So when I re-implement, what guidelines should I follow?