LibC: Implement {,v}dprintf
This commit is contained in:
		
							parent
							
								
									d465ea2a67
								
							
						
					
					
						commit
						04f49a6819
					
				| 
						 | 
				
			
			@ -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);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue