forked from Bananymous/banan-os
				
			
		
			
				
	
	
		
			51 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.1 KiB
		
	
	
	
		
			C++
		
	
	
	
| #pragma once
 | |
| 
 | |
| #include <BAN/Function.h>
 | |
| #include <BAN/HashMap.h>
 | |
| #include <BAN/Iteration.h>
 | |
| #include <BAN/NoCopyMove.h>
 | |
| #include <BAN/String.h>
 | |
| 
 | |
| #include <stdio.h>
 | |
| 
 | |
| class Execute;
 | |
| 
 | |
| class Builtin
 | |
| {
 | |
| 	BAN_NON_COPYABLE(Builtin);
 | |
| 	BAN_NON_MOVABLE(Builtin);
 | |
| public:
 | |
| 	struct BuiltinCommand
 | |
| 	{
 | |
| 		using function_t = int (*)(Execute&, BAN::Span<const BAN::String>, FILE* fin, FILE* fout);
 | |
| 
 | |
| 		function_t function { nullptr };
 | |
| 		bool immediate { false };
 | |
| 
 | |
| 		BuiltinCommand(function_t function, bool immediate)
 | |
| 			: function(function)
 | |
| 			, immediate(immediate)
 | |
| 		{ }
 | |
| 
 | |
| 		BAN::ErrorOr<int> execute(Execute&, BAN::Span<const BAN::String> arguments, int fd_in, int fd_out) const;
 | |
| 	};
 | |
| 
 | |
| public:
 | |
| 	Builtin() = default;
 | |
| 	static Builtin& get()
 | |
| 	{
 | |
| 		static Builtin s_instance;
 | |
| 		return s_instance;
 | |
| 	}
 | |
| 
 | |
| 	void initialize();
 | |
| 
 | |
| 	void for_each_builtin(BAN::Function<BAN::Iteration(BAN::StringView, const BuiltinCommand&)>) const;
 | |
| 
 | |
| 	// return nullptr if not found
 | |
| 	const BuiltinCommand* find_builtin(const BAN::String& name) const;
 | |
| 
 | |
| private:
 | |
| 	BAN::HashMap<BAN::String, BuiltinCommand> m_builtin_commands;
 | |
| };
 |