Add %m to userspace printf
%m as a format specifier is a nonstandard glibc extension, but I like it so I'm implementing it. What it does is print the value of strerror(errno), without consuming any arguments to printf().
This commit is contained in:
parent
4b74c14f1b
commit
49c7900407
@ -15,7 +15,7 @@ int main()
|
|||||||
printf("Allocating 4 MB of memory... %p\n", allocated);
|
printf("Allocating 4 MB of memory... %p\n", allocated);
|
||||||
sleep(1);
|
sleep(1);
|
||||||
} while ((allocated = malloc(CHUNK)));
|
} while ((allocated = malloc(CHUNK)));
|
||||||
perror("malloc");
|
printf("Memory allocation failed: %m\n");
|
||||||
printf("Press any key to restart.\n");
|
printf("Press any key to restart.\n");
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
@ -1,3 +1,4 @@
|
|||||||
|
#include <errno.h>
|
||||||
#include <luna.h>
|
#include <luna.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <stddef.h>
|
#include <stddef.h>
|
||||||
@ -251,6 +252,21 @@ static int internal_printf(const char* format, PutString put_string_callback, ss
|
|||||||
if (buffer_insert_index == 1024) flush_buffer();
|
if (buffer_insert_index == 1024) flush_buffer();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
case 'm': {
|
||||||
|
const char* str = strerror(errno);
|
||||||
|
while (strlen(str) > 1024)
|
||||||
|
{
|
||||||
|
flush_buffer();
|
||||||
|
memcpy(buffer, str, 1024);
|
||||||
|
str += 1024;
|
||||||
|
buffer_insert_index = 1024;
|
||||||
|
}
|
||||||
|
if (buffer_insert_index + strlen(str) > 1024) flush_buffer();
|
||||||
|
memcpy(buffer + buffer_insert_index, str, strlen(str));
|
||||||
|
buffer_insert_index += strlen(str);
|
||||||
|
if (buffer_insert_index == 1024) flush_buffer();
|
||||||
|
break;
|
||||||
|
}
|
||||||
case 's': {
|
case 's': {
|
||||||
const char* str = va_arg(ap, const char*);
|
const char* str = va_arg(ap, const char*);
|
||||||
while (strlen(str) > 1024)
|
while (strlen(str) > 1024)
|
||||||
|
Loading…
Reference in New Issue
Block a user