Compare commits

...

2 Commits

Author SHA1 Message Date
Bananymous 04f49a6819 LibC: Implement {,v}dprintf 2024-11-27 21:33:10 +02:00
Bananymous d465ea2a67 LibC: Fix headers :) 2024-11-27 21:32:10 +02:00
3 changed files with 46 additions and 2 deletions

View File

@ -24,7 +24,7 @@ struct ifreq
struct sockaddr ifru_netmask;
struct sockaddr ifru_gwaddr;
struct sockaddr ifru_hwaddr;
unsigned char __min_storage[sizeof(sockaddr) + 6];
unsigned char __min_storage[sizeof(struct sockaddr) + 6];
} ifr_ifru;
};

View File

@ -5,7 +5,7 @@
__BEGIN_DECLS
#define __need_size_t 1
#define __need_size_t
#include <stddef.h>
#define TTY_CMD_SET 0x01

View File

@ -102,6 +102,15 @@ char* ctermid(char* buffer)
return target;
}
int dprintf(int fildes, const char* __restrict format, ...)
{
va_list arguments;
va_start(arguments, format);
int ret = vdprintf(fildes, format, arguments);
va_end(arguments);
return ret;
}
int fclose(FILE* file)
{
ScopeLock _(file);
@ -811,6 +820,41 @@ int ungetc(int c, FILE* stream)
return ungetc_unlocked(c, stream);
}
int vdprintf(int fildes, const char* __restrict format, va_list arguments)
{
struct print_info
{
int fildes;
size_t offset;
char buffer[512];
};
print_info info {
.fildes = fildes,
.offset = 0,
.buffer = {},
};
const int ret = printf_impl(format, arguments,
[](int c, void* _info) -> int
{
auto* info = static_cast<print_info*>(_info);
info->buffer[info->offset++] = c;
if (info->offset >= sizeof(info->buffer))
{
write(info->fildes, info->buffer, info->offset);
info->offset = 0;
}
return 0;
}, static_cast<void*>(&info)
);
if (info.offset)
write(info.fildes, info.buffer, info.offset);
return ret;
}
int vfprintf(FILE* file, const char* format, va_list arguments)
{
ScopeLock _(file);