Merge exec_command and parse_command modifications
This commit is contained in:
		
						commit
						2ce36c258e
					
				
					 12 changed files with 358 additions and 119 deletions
				
			
		
							
								
								
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
										
									
									
										vendored
									
									
								
							|  | @ -37,7 +37,6 @@ | ||||||
| *.i*86 | *.i*86 | ||||||
| *.x86_64 | *.x86_64 | ||||||
| *.hex | *.hex | ||||||
| ./minishell |  | ||||||
| 
 | 
 | ||||||
| # Debug files | # Debug files | ||||||
| *.dSYM/ | *.dSYM/ | ||||||
|  |  | ||||||
							
								
								
									
										21
									
								
								dev/TODO
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								dev/TODO
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  | - working history (rl_* functions?) | ||||||
|  | 	- '<<' with history? | ||||||
|  | - finding commands | ||||||
|  | 	- built-in commands | ||||||
|  | 	- relative/absolute paths | ||||||
|  | - signals | ||||||
|  | 	- ^C, ^D, ^\ | ||||||
|  | - variables | ||||||
|  | 	- normal variables | ||||||
|  | 	- environment variables | ||||||
|  | 	- $? | ||||||
|  | - pipes | ||||||
|  | 	- no calls (like `$ < input_file > output_file`) | ||||||
|  | - builtins: | ||||||
|  | 	- echo		(with option -n) | ||||||
|  | 	- cd [path] | ||||||
|  | 	- pwd		(with no options) | ||||||
|  | 	- export	(with no options) | ||||||
|  | 	- unset		(with no options) | ||||||
|  | 	- env		(with no options or arguments) | ||||||
|  | 	- exit		(with no options) | ||||||
							
								
								
									
										1
									
								
								dev/lolcat.sh
									
										
									
									
									
										Executable file
									
								
							
							
						
						
									
										1
									
								
								dev/lolcat.sh
									
										
									
									
									
										Executable file
									
								
							|  | @ -0,0 +1 @@ | ||||||
|  | COLORTERM= lolcat -p 1 -F 0.3 -S 0 -f header.nocolor > header | ||||||
							
								
								
									
										21
									
								
								header
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								header
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  | [38;5;99m [39m[38;5;63mW[39m[38;5;33me[39m[38;5;39ml[39m[38;5;44mc[39m[38;5;49mo[39m[38;5;48mm[39m[38;5;84me[39m[38;5;83m [39m[38;5;118mt[39m[38;5;154mo[39m[38;5;184m_[39m[38;5;214m_[39m[38;5;208m_[39m[38;5;203m_[39m[38;5;203m_[39m[38;5;198m_[39m[38;5;199m_[39m[38;5;164m_[39m[38;5;129m_[39m[38;5;93m_[39m[38;5;63m_[39m[38;5;63m_[39m[38;5;33m_[39m[38;5;39m_[39m[38;5;44m_[39m[38;5;49m_[39m[38;5;48m_[39m[38;5;83m_[39m[38;5;83m_[39m[38;5;118m_[39m[38;5;154m_[39m[38;5;184m_[39m[38;5;214m_[39m[38;5;208m_[39m[38;5;203m_[39m[38;5;203m_[39m[38;5;198m_[39m[38;5;199m_[39m[38;5;164m_[39m[38;5;129m_[39m[38;5;93m_[39m[38;5;63m_[39m[38;5;63m_[39m[38;5;33m_[39m[38;5;39m[39m | ||||||
|  | [38;5;63m|[39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m [39m[38;5;49m_[39m[38;5;48m_[39m[38;5;84m_[39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m_[39m[38;5;199m_[39m[38;5;164m_[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m|[39m[38;5;48m[39m | ||||||
|  | [38;5;33m|[39m[38;5;39m|[39m[38;5;44m [39m[38;5;49m|[39m[38;5;48m [39m[38;5;84m [39m[38;5;83m [39m[38;5;118m\[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m/[39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m|[39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m|[39m[38;5;48m|[39m[38;5;83m[39m | ||||||
|  | [38;5;39m|[39m[38;5;44m|[39m[38;5;49m [39m[38;5;48m|[39m[38;5;84m [39m[38;5;83m|[39m[38;5;118m\[39m[38;5;154m [39m[38;5;184m\[39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m/[39m[38;5;199m [39m[38;5;164m/[39m[38;5;129m|[39m[38;5;93m [39m[38;5;63m|[39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m_[39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m_[39m[38;5;154m_[39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m_[39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m_[39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m|[39m[38;5;83m|[39m[38;5;83m[39m | ||||||
|  | [38;5;44m|[39m[38;5;49m|[39m[38;5;48m [39m[38;5;84m|[39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m [39m[38;5;184m\[39m[38;5;214m [39m[38;5;208m\[39m[38;5;203m [39m[38;5;203m [39m[38;5;198m/[39m[38;5;199m [39m[38;5;164m/[39m[38;5;129m [39m[38;5;93m|[39m[38;5;63m [39m[38;5;63m|[39m[38;5;33m [39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m_[39m[38;5;48m|[39m[38;5;83m [39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m\[39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m|[39m[38;5;199m [39m[38;5;164m|[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m|[39m[38;5;63m_[39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m|[39m[38;5;83m|[39m[38;5;118m[39m | ||||||
|  | [38;5;49m|[39m[38;5;48m|[39m[38;5;84m [39m[38;5;83m|[39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m [39m[38;5;208m\[39m[38;5;203m [39m[38;5;203m\[39m[38;5;198m/[39m[38;5;199m [39m[38;5;164m/[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m|[39m[38;5;63m [39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m_[39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m\[39m[38;5;203m [39m[38;5;198m [39m[38;5;199m|[39m[38;5;164m [39m[38;5;129m|[39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m_[39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m|[39m[38;5;118m|[39m[38;5;154m[39m | ||||||
|  | [38;5;48m|[39m[38;5;84m|[39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m [39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m\[39m[38;5;198m [39m[38;5;199m [39m[38;5;164m/[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m|[39m[38;5;33m [39m[38;5;39m|[39m[38;5;44m [39m[38;5;49m [39m[38;5;48m|[39m[38;5;83m [39m[38;5;83m|[39m[38;5;118m [39m[38;5;154m [39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m|[39m[38;5;203m\[39m[38;5;203m [39m[38;5;198m\[39m[38;5;199m [39m[38;5;164m|[39m[38;5;129m [39m[38;5;93m|[39m[38;5;63m [39m[38;5;63m [39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m|[39m[38;5;184m[39m | ||||||
|  | [38;5;84m|[39m[38;5;83m|[39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m|[39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m\[39m[38;5;164m/[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m [39m[38;5;48m [39m[38;5;83m|[39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m|[39m[38;5;208m [39m[38;5;203m|[39m[38;5;203m [39m[38;5;198m\[39m[38;5;199m [39m[38;5;164m\[39m[38;5;129m|[39m[38;5;93m [39m[38;5;63m|[39m[38;5;63m [39m[38;5;33m [39m[38;5;39m|[39m[38;5;44m [39m[38;5;49m|[39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m|[39m[38;5;214m[39m | ||||||
|  | [38;5;83m|[39m[38;5;118m|[39m[38;5;154m [39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m|[39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m|[39m[38;5;44m [39m[38;5;49m|[39m[38;5;48m [39m[38;5;83m [39m[38;5;83m|[39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m [39m[38;5;208m|[39m[38;5;203m [39m[38;5;203m|[39m[38;5;198m [39m[38;5;199m [39m[38;5;164m\[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m|[39m[38;5;33m [39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m [39m[38;5;48m|[39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m|[39m[38;5;214m|[39m[38;5;208m[39m | ||||||
|  | [38;5;118m|[39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m|[39m[38;5;208m_[39m[38;5;203m|[39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m_[39m[38;5;48m|[39m[38;5;83m [39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m_[39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m [39m[38;5;203m|[39m[38;5;203m_[39m[38;5;198m|[39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m\[39m[38;5;63m_[39m[38;5;63m_[39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m [39m[38;5;49m|[39m[38;5;48m_[39m[38;5;83m|[39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m|[39m[38;5;208m|[39m[38;5;203m[39m | ||||||
|  | [38;5;154m|[39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m|[39m[38;5;203m|[39m[38;5;203m[39m | ||||||
|  | [38;5;184m|[39m[38;5;214m|[39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m=[39m[38;5;63m=[39m[38;5;63m=[39m[38;5;33m=[39m[38;5;39m=[39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118mB[39m[38;5;154my[39m[38;5;184m:[39m[38;5;214m [39m[38;5;208mM[39m[38;5;203my[39m[38;5;203ml[39m[38;5;198ma[39m[38;5;199mn[39m[38;5;164m [39m[38;5;129mC[39m[38;5;93mO[39m[38;5;63mL[39m[38;5;63mO[39m[38;5;33mN[39m[38;5;39mN[39m[38;5;44mA[39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m|[39m[38;5;203m|[39m[38;5;198m[39m | ||||||
|  | [38;5;214m|[39m[38;5;208m|[39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m/[39m[38;5;63m/[39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208mA[39m[38;5;203mn[39m[38;5;203md[39m[38;5;198m:[39m[38;5;199m [39m[38;5;164mJ[39m[38;5;129mo[39m[38;5;93mr[39m[38;5;63mi[39m[38;5;63ms[39m[38;5;33m [39m[38;5;39mS[39m[38;5;44mC[39m[38;5;49mH[39m[38;5;48mA[39m[38;5;83mF[39m[38;5;83mT[39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m|[39m[38;5;198m|[39m[38;5;199m[39m | ||||||
|  | [38;5;208m|[39m[38;5;203m|[39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m/[39m[38;5;63m/[39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m|[39m[38;5;199m|[39m[38;5;164m[39m | ||||||
|  | [38;5;203m|[39m[38;5;203m|[39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m\[39m[38;5;63m\[39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m|[39m[38;5;164m|[39m[38;5;129m[39m | ||||||
|  | [38;5;203m|[39m[38;5;198m|[39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m=[39m[38;5;39m=[39m[38;5;44m=[39m[38;5;49m=[39m[38;5;48m=[39m[38;5;83m [39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m [39m[38;5;208m|[39m[38;5;203m|[39m[38;5;203m [39m[38;5;198m [39m[38;5;199m=[39m[38;5;164m=[39m[38;5;129m=[39m[38;5;93m=[39m[38;5;63m [39m[38;5;63m|[39m[38;5;33m|[39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m|[39m[38;5;83m|[39m[38;5;118m [39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m|[39m[38;5;129m|[39m[38;5;93m[39m | ||||||
|  | [38;5;198m|[39m[38;5;199m|[39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m\[39m[38;5;83m\[39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m [39m[38;5;203m|[39m[38;5;203m|[39m[38;5;198m [39m[38;5;199m|[39m[38;5;164m|[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m|[39m[38;5;39m|[39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m|[39m[38;5;118m|[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m|[39m[38;5;93m|[39m[38;5;63m[39m | ||||||
|  | [38;5;199m|[39m[38;5;164m|[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m/[39m[38;5;118m/[39m[38;5;154m [39m[38;5;184m|[39m[38;5;214m=[39m[38;5;208m=[39m[38;5;203m=[39m[38;5;203m=[39m[38;5;198m|[39m[38;5;199m [39m[38;5;164m|[39m[38;5;129m=[39m[38;5;93m=[39m[38;5;63m=[39m[38;5;63m [39m[38;5;33m [39m[38;5;39m|[39m[38;5;44m|[39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m|[39m[38;5;154m|[39m[38;5;184m [39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m|[39m[38;5;63m|[39m[38;5;63m[39m | ||||||
|  | [38;5;164m|[39m[38;5;129m|[39m[38;5;93m [39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m [39m[38;5;48m [39m[38;5;83m [39m[38;5;83m/[39m[38;5;118m/[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m|[39m[38;5;208m|[39m[38;5;203m [39m[38;5;203m [39m[38;5;198m|[39m[38;5;199m|[39m[38;5;164m [39m[38;5;129m|[39m[38;5;93m|[39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m|[39m[38;5;49m|[39m[38;5;48m [39m[38;5;83m [39m[38;5;83m [39m[38;5;118m [39m[38;5;154m|[39m[38;5;184m|[39m[38;5;214m [39m[38;5;208m [39m[38;5;203m [39m[38;5;203m [39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m|[39m[38;5;63m|[39m[38;5;33m[39m | ||||||
|  | [38;5;129m|[39m[38;5;93m|[39m[38;5;63m [39m[38;5;63m [39m[38;5;33m [39m[38;5;39m [39m[38;5;44m [39m[38;5;49m=[39m[38;5;48m=[39m[38;5;83m=[39m[38;5;83m=[39m[38;5;118m=[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m [39m[38;5;208m|[39m[38;5;203m|[39m[38;5;203m [39m[38;5;198m [39m[38;5;199m|[39m[38;5;164m|[39m[38;5;129m [39m[38;5;93m [39m[38;5;63m=[39m[38;5;63m=[39m[38;5;33m=[39m[38;5;39m=[39m[38;5;44m [39m[38;5;49m [39m[38;5;48m=[39m[38;5;83m=[39m[38;5;83m=[39m[38;5;118m=[39m[38;5;154m [39m[38;5;184m [39m[38;5;214m=[39m[38;5;208m=[39m[38;5;203m=[39m[38;5;203m=[39m[38;5;198m [39m[38;5;199m [39m[38;5;164m [39m[38;5;129m [39m[38;5;93m [39m[38;5;63m [39m[38;5;63m|[39m[38;5;33m|[39m[38;5;39m[39m | ||||||
|  | [38;5;93m|[39m[38;5;63m|[39m[38;5;63m_[39m[38;5;33m_[39m[38;5;39m_[39m[38;5;44m_[39m[38;5;49m_[39m[38;5;48m_[39m[38;5;83m_[39m[38;5;83m_[39m[38;5;118m_[39m[38;5;154m_[39m[38;5;184m_[39m[38;5;214m_[39m[38;5;208m_[39m[38;5;203m_[39m[38;5;203m_[39m[38;5;198m_[39m[38;5;199m_[39m[38;5;164m_[39m[38;5;129m_[39m[38;5;93m_[39m[38;5;63m_[39m[38;5;63m_[39m[38;5;33m_[39m[38;5;39m_[39m[38;5;44m_[39m[38;5;49m_[39m[38;5;48m_[39m[38;5;83m_[39m[38;5;83m_[39m[38;5;118m_[39m[38;5;154m_[39m[38;5;184m_[39m[38;5;214m_[39m[38;5;208m_[39m[38;5;203m_[39m[38;5;203m_[39m[38;5;198m_[39m[38;5;199m_[39m[38;5;164m_[39m[38;5;129m_[39m[38;5;93m_[39m[38;5;63m_[39m[38;5;63m_[39m[38;5;33m|[39m[38;5;39m|[39m[38;5;44m[39m | ||||||
							
								
								
									
										21
									
								
								header.nocolor
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								header.nocolor
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,21 @@ | ||||||
|  |  Welcome to__________________________________ | ||||||
|  | ||  ___        ___                           || | ||||||
|  | || |   \      /   |                          || | ||||||
|  | || | |\ \    / /| |   _    __     _    _     || | ||||||
|  | || | | \ \  / / | |  |_|  |  \   | |  |_|    || | ||||||
|  | || | |  \ \/ /  | |   _   |   \  | |   _     || | ||||||
|  | || | |   \  /   | |  | |  | |\ \ | |  | |    || | ||||||
|  | || | |    \/    | |  | |  | | \ \| |  | |    || | ||||||
|  | || | |          | |  | |  | |  \   |  | |    || | ||||||
|  | || |_|          |_|  |_|  |_|   \__|  |_|    || | ||||||
|  | ||                                           || | ||||||
|  | ||       =====     By: Mylan COLONNA         || | ||||||
|  | ||      //            And: Joris SCHAFT      || | ||||||
|  | ||     //                                    || | ||||||
|  | ||     \\                                    || | ||||||
|  | ||      =====  ||  ||  ==== ||    ||         || | ||||||
|  | ||          \\ ||  || ||    ||    ||         || | ||||||
|  | ||          // |====| |===  ||    ||         || | ||||||
|  | ||         //  ||  || ||    ||    ||         || | ||||||
|  | ||     =====   ||  ||  ====  ====  ====      || | ||||||
|  | ||___________________________________________|| | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
| /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2024/04/23 14:15:12 by mcolonna          #+#    #+#             */ | /*   Created: 2024/04/23 14:15:12 by mcolonna          #+#    #+#             */ | ||||||
| /*   Updated: 2024/05/16 17:34:49 by mcolonna         ###   ########.fr       */ | /*   Updated: 2024/05/16 18:18:16 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
|  | @ -23,6 +23,7 @@ | ||||||
| # include <fcntl.h> | # include <fcntl.h> | ||||||
| # include <stdlib.h> | # include <stdlib.h> | ||||||
| # include <strings.h> | # include <strings.h> | ||||||
|  | # include <sys/wait.h> | ||||||
| # include "libft.h" | # include "libft.h" | ||||||
| # include "libtf.h" | # include "libtf.h" | ||||||
| 
 | 
 | ||||||
|  | @ -46,7 +47,8 @@ typedef struct s_call | ||||||
| // Represents a command given by the user.
 | // Represents a command given by the user.
 | ||||||
| typedef struct s_command | typedef struct s_command | ||||||
| { | { | ||||||
| 	bool			error; // true if an error occured in interpret_command().
 | 	int				error; // 0 if parse_command() succeded, error status if not
 | ||||||
|  | 	bool			empty; // true if there isn't anything to do
 | ||||||
| 	const t_call	*calls; // all calls to programs (ended by .program == NULL)
 | 	const t_call	*calls; // all calls to programs (ended by .program == NULL)
 | ||||||
| 	int				input_fd; // fd to use with '<' redirection (0 by default)
 | 	int				input_fd; // fd to use with '<' redirection (0 by default)
 | ||||||
| 	int				output_fd; // fd to use with '>' redirection (1 by default)
 | 	int				output_fd; // fd to use with '>' redirection (1 by default)
 | ||||||
|  | @ -71,21 +73,29 @@ int			execute_command(t_memclass mc, t_command command, | ||||||
| ///// ERROR /////
 | ///// ERROR /////
 | ||||||
| 
 | 
 | ||||||
| // Call to show an error.
 | // Call to show an error.
 | ||||||
| // If msg == "errno", use strerror(errno)
 | // If msg == "errno", use perror()
 | ||||||
| void		minishell_error(const char *msg); | void		minishell_error(const char *msg); | ||||||
| 
 | 
 | ||||||
| // Call to write the error and exit the program.
 | // Call perror() and exit the program.
 | ||||||
| void		fatal_error(const char *msg); | void		fatal_error(const char *msg); | ||||||
| 
 | 
 | ||||||
|  | // Call strerror() and exit the program.
 | ||||||
|  | void		fatal_error_msg(const char *msg); | ||||||
|  | 
 | ||||||
| ///// PATH /////
 | ///// PATH /////
 | ||||||
| 
 | 
 | ||||||
| // Get the PATH values.
 | // Get the PATH values.
 | ||||||
| // Return a list of strings ended by NULL.
 | // Return a list of strings ended by NULL.
 | ||||||
| char		**get_path(char *const envp[]); | const char	**get_path(const t_memclass mc, char *const envp[]); | ||||||
| 
 | 
 | ||||||
| // Search the program in PATH.
 | // Search the program in $PATH.
 | ||||||
| // Returns the path of the program to use, or NULL if there is none.
 | // Returns the path of the program to use, or NULL if there is none.
 | ||||||
|  | // If there is several possibilities, it returns the one from the first path
 | ||||||
|  | // given in $PATH.
 | ||||||
| const char	*search_path( | const char	*search_path( | ||||||
| 				const t_memclass mc, const char **path, const char *prog); | 				const t_memclass mc, const char **path, const char *prog); | ||||||
| 
 | 
 | ||||||
|  | ///// MAIN /////
 | ||||||
|  | extern t_memclass	g_mc; | ||||||
|  | 
 | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|  | @ -6,7 +6,7 @@ | ||||||
| /*   By: mcolonna <marvin@42.fr>                    +#+  +:+       +#+        */ | /*   By: mcolonna <marvin@42.fr>                    +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2024/04/23 15:03:23 by mcolonna          #+#    #+#             */ | /*   Created: 2024/04/23 15:03:23 by mcolonna          #+#    #+#             */ | ||||||
| /*   Updated: 2024/04/24 13:19:42 by mcolonna         ###   ########.fr       */ | /*   Updated: 2024/05/01 12:46:34 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
|  | @ -16,8 +16,8 @@ const char	*ask_command(const t_memclass mc) | ||||||
| { | { | ||||||
| 	const char	*r; | 	const char	*r; | ||||||
| 
 | 
 | ||||||
| 	print_str(minishell_error, 1, "( ^.^)> "); | 	print_str(fatal_error, 1, "\e[1m\e[38;5;45m( ^.^)> \e[0m"); | ||||||
| 	r = read_line(minishell_error, mc, 0); | 	r = read_line(fatal_error, mc, 0); | ||||||
| 	if (r) | 	if (r) | ||||||
| 		return (r); | 		return (r); | ||||||
| 	else | 	else | ||||||
|  |  | ||||||
							
								
								
									
										24
									
								
								src/error.c
									
										
									
									
									
								
							
							
						
						
									
										24
									
								
								src/error.c
									
										
									
									
									
								
							|  | @ -6,7 +6,7 @@ | ||||||
| /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2024/04/23 15:51:56 by mcolonna          #+#    #+#             */ | /*   Created: 2024/04/23 15:51:56 by mcolonna          #+#    #+#             */ | ||||||
| /*   Updated: 2024/05/16 17:29:43 by mcolonna         ###   ########.fr       */ | /*   Updated: 2024/05/16 18:19:05 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
|  | @ -15,16 +15,26 @@ | ||||||
| void	minishell_error(const char *msg) | void	minishell_error(const char *msg) | ||||||
| { | { | ||||||
| 	if (str_eq(msg, "errno")) | 	if (str_eq(msg, "errno")) | ||||||
| 		msg = strerror(errno); | 		perror("minishell"); | ||||||
|  | 	else | ||||||
|  | 	{ | ||||||
| 		print_str(err_remember, 2, "minishell: "); | 		print_str(err_remember, 2, "minishell: "); | ||||||
| 	print_str(err_remember, 2, msg); | 		print_line(err_remember, 2, msg); | ||||||
| 		err_get(); | 		err_get(); | ||||||
|  | 	} | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TODO adapt for msg == errno
 |  | ||||||
| void	fatal_error(const char *msg) | void	fatal_error(const char *msg) | ||||||
| { | { | ||||||
| 	print_str(err_remember, 2, "Fatal error: "); | 	(void)msg; | ||||||
| 	print_line(err_remember, 2, msg); | 	minishell_error("errno"); | ||||||
| 	exit(1); | 	mem_freeall(g_mc); | ||||||
|  | 	exit(errno); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | void	fatal_error_msg(const char *msg) | ||||||
|  | { | ||||||
|  | 	minishell_error(msg); | ||||||
|  | 	mem_freeall(g_mc); | ||||||
|  | 	exit(errno); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,22 +6,27 @@ | ||||||
| /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2024/04/24 13:48:00 by jschaft           #+#    #+#             */ | /*   Created: 2024/04/24 13:48:00 by jschaft           #+#    #+#             */ | ||||||
| /*   Updated: 2024/05/16 18:10:48 by mcolonna         ###   ########.fr       */ | /*   Updated: 2024/05/16 18:22:42 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
| #include "include.h" | #include "include.h" | ||||||
| 
 | 
 | ||||||
| // Execute the call with stdin = in and stdout = out.
 | // Execute a program with specific stdin and stdout:
 | ||||||
| // Find the program in $PATH
 | // - inout[0] is stdin
 | ||||||
| static int	execute_call(t_memclass mc, t_call call, int inout[2], | // - inout[0] is stdout
 | ||||||
|  | // If call.program doesn't start with "./" or "/", find the program in $PATH.
 | ||||||
|  | //   (TODO)
 | ||||||
|  | // If the program wasn't to found in $PATH, or the fork didn't work,
 | ||||||
|  | // write the error (TODO) and return the error status.
 | ||||||
|  | static int	execute_call(t_memclass mc, t_call call, const int inout[2], | ||||||
| 				char *const envp[]) | 				char *const envp[]) | ||||||
| { | { | ||||||
| 	char **const	path = get_path(envp); | 	const char	**path = get_path(mc, envp); | ||||||
| 	pid_t		pid; | 	pid_t		pid; | ||||||
| 	const char	*program_path; | 	const char	*program_path; | ||||||
| 
 | 
 | ||||||
| 	program_path = search_path(mc, (const char **)path, call.program); | 	program_path = search_path(mc, path, call.program); | ||||||
| 	if (!program_path) | 	if (!program_path) | ||||||
| 		return (minishell_error(str_join(fatal_error, mc, | 		return (minishell_error(str_join(fatal_error, mc, | ||||||
| 					"command not found: ", str_join(fatal_error, mc, | 					"command not found: ", str_join(fatal_error, mc, | ||||||
|  |  | ||||||
							
								
								
									
										74
									
								
								src/main.c
									
										
									
									
									
								
							
							
						
						
									
										74
									
								
								src/main.c
									
										
									
									
									
								
							|  | @ -6,67 +6,65 @@ | ||||||
| /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2024/04/23 14:33:45 by mcolonna          #+#    #+#             */ | /*   Created: 2024/04/23 14:33:45 by mcolonna          #+#    #+#             */ | ||||||
| /*   Updated: 2024/04/26 14:06:48 by jschaft          ###   ########.fr       */ | /*   Updated: 2024/05/16 18:19:37 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
| #include "include.h" | #include "include.h" | ||||||
| 
 | 
 | ||||||
| // Clean the screen (TODO)
 | t_memclass	g_mc; | ||||||
| static void	execclear(void) | 
 | ||||||
|  | // Close the input and output fds of the command.
 | ||||||
|  | static void	close_fds(const t_command *command) | ||||||
| { | { | ||||||
|  | 	if (command->input_fd != 0) | ||||||
|  | 		if (close(command->input_fd) == -1) | ||||||
|  | 			minishell_error("errno"); | ||||||
|  | 	if (command->output_fd != 1) | ||||||
|  | 		if (close(command->output_fd) == -1) | ||||||
|  | 			minishell_error("errno"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Print hi :D
 | // Execute a command from a string.
 | ||||||
| static void	print_hi(void) | static int	do_command(char *const envp[], const char *str) | ||||||
| { | { | ||||||
| 	printf("Welcome to____________________________________\n"); | 	const t_memclass	mc = mem_subclass(fatal_error, g_mc); | ||||||
| 	printf("||  ___        ___                           ||\n"); | 	t_command			command; | ||||||
| 	printf("|| |   \\      /   |                          ||\n"); | 	int					r; | ||||||
| 	printf("|| | |\\ \\    / /| |  __  __      __  __      ||\n"); | 
 | ||||||
| 	printf("|| | | \\ \\  / / | | |__| ||\\     || |__|     ||\n"); | 	command = parse_command(mc, str); | ||||||
| 	printf("|| | |  \\ \\/ /  | |  __  || \\    ||  __      ||\n"); | 	if (command.error || command.empty) | ||||||
| 	printf("|| | |   \\  /   | |  ||  ||  \\   ||  ||      ||\n"); | 		return (command.error); | ||||||
| 	printf("|| | |    \\/    | |  ||  ||   \\  ||  ||      ||\n"); | 	r = execute_command(mc, command, envp); | ||||||
| 	printf("|| | |          | |  ||  ||    \\ ||  ||      ||\n"); | 	mem_freeall(mc); | ||||||
| 	printf("|| |_|          |_|  ||  ||     \\||  ||      ||\n"); | 	close_fds(&command); | ||||||
| 	printf("||    _____                                  ||\n"); | 	return (r); | ||||||
| 	printf("||   / ___|    By: Mylan COLONNA             ||\n"); | } | ||||||
| 	printf("||   \\ \\         And: Joris SCHAFT           ||\n"); | 
 | ||||||
| 	printf("||    \\ \\                                    ||\n"); | static void	start(char *const envp[]) | ||||||
| 	printf("||     \\ \\   __   __ __    __    __          ||\n"); | { | ||||||
| 	printf("||      \\ \\  ||   || ||=== ||    ||          ||\n"); | 	do_command(envp, "clear"); | ||||||
| 	printf("||       \\ \\ ||   || ||    ||    ||          ||\n"); | 	do_command(envp, "cat ./header"); | ||||||
| 	printf("||       / / ||===|| ||=== ||    ||          ||\n"); | 	do_command(envp, "echo"); | ||||||
| 	printf("||   ___/ /  ||   || ||    ||    ||          ||\n"); |  | ||||||
| 	printf("||  |____/   ||   || ||=== ||=== ||===       ||\n"); |  | ||||||
| 	printf("|_____________________________________________|\n\n"); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| int	main(const int argc, const char *argv[], char *const envp[]) | int	main(const int argc, const char *argv[], char *const envp[]) | ||||||
| { | { | ||||||
| 	char **const	path = get_path(envp); |  | ||||||
| 	t_memclass		mc; | 	t_memclass		mc; | ||||||
| 	const char		*command_str; | 	const char		*command_str; | ||||||
| 	t_command		command; |  | ||||||
| 	int				errorstatus; | 	int				errorstatus; | ||||||
| 
 | 
 | ||||||
| 	(void)argc; | 	(void)argc; | ||||||
| 	(void)argv; | 	(void)argv; | ||||||
| 	(void)path; | 	g_mc = NULL; | ||||||
| 	(void)command; | 	g_mc = mem_newclass(fatal_error); | ||||||
| 	execclear(); | 	start(envp); | ||||||
| 	print_hi(); |  | ||||||
| 	errorstatus = 0; | 	errorstatus = 0; | ||||||
| 	while (true) | 	while (true) | ||||||
| 	{ | 	{ | ||||||
| 		mc = mem_newclass(minishell_error); | 		mc = mem_subclass(fatal_error, g_mc); | ||||||
| 		command_str = ask_command(mc); | 		command_str = ask_command(mc); | ||||||
| 		command = parse_command(mc, command_str); | 		do_command(envp, command_str); | ||||||
| 		if (command.error) |  | ||||||
| 			continue ; |  | ||||||
| 		errorstatus = execute_command(mc, command, envp); |  | ||||||
| 		mem_freeall(mc); |  | ||||||
| 	} | 	} | ||||||
| 	return (errorstatus); | 	return (errorstatus); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | @ -6,17 +6,53 @@ | ||||||
| /*   By: mcolonna <marvin@42.fr>                    +#+  +:+       +#+        */ | /*   By: mcolonna <marvin@42.fr>                    +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2024/04/24 13:47:40 by mcolonna          #+#    #+#             */ | /*   Created: 2024/04/24 13:47:40 by mcolonna          #+#    #+#             */ | ||||||
| /*   Updated: 2024/04/25 17:58:54 by mcolonna         ###   ########.fr       */ | /*   Updated: 2024/05/07 13:59:30 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
| #include "include.h" | #include "include.h" | ||||||
| 
 | 
 | ||||||
| // To call when a parse error occurs (TODO)
 | // Ask the user for data and set readfd to the fd which will receive this
 | ||||||
| static void	parse_error(const char *msg) | // data.
 | ||||||
|  | // Returns 'errno' on error.
 | ||||||
|  | static int	heredoc(t_memclass mc, int *readfd, const char *eof) | ||||||
| { | { | ||||||
| 	(void)msg; | 	const t_memclass		mc_in = mem_subclass(fatal_error, mc); | ||||||
| 	fatal_error("parse error"); | 	int						outpipe[2]; | ||||||
|  | 	t_const_string			line; | ||||||
|  | 	const t_const_string	eof_line = str_join(fatal_error, mc_in, eof, "\n"); | ||||||
|  | 
 | ||||||
|  | 	if (pipe(outpipe) == -1) | ||||||
|  | 		minishell_error("errno"); | ||||||
|  | 	*readfd = outpipe[0]; | ||||||
|  | 	while (true) | ||||||
|  | 	{ | ||||||
|  | 		print_str(fatal_error, 1, "\e[38;5;33m( 'o')> \e[0m"); | ||||||
|  | 		line = NULL; | ||||||
|  | 		while (!line) | ||||||
|  | 			line = read_line(fatal_error, mc_in, 0); | ||||||
|  | 		if (str_eq(line, eof) || str_eq(line, eof_line)) | ||||||
|  | 			break ; | ||||||
|  | 		print_str(err_remember, outpipe[1], line); | ||||||
|  | 		mem_free((void *)line); | ||||||
|  | 		if (err_get()) | ||||||
|  | 			return (minishell_error("errno"), errno); | ||||||
|  | 	} | ||||||
|  | 	mem_freeall(mc_in); | ||||||
|  | 	if (close(outpipe[1]) == -1) | ||||||
|  | 		return (minishell_error("errno"), errno); | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // To call when a parse error occurs.
 | ||||||
|  | // Always returns 1 (parse error's status).
 | ||||||
|  | static int	parse_error(const char *msg) | ||||||
|  | { | ||||||
|  | 	const t_memclass	mc = mem_subclass(fatal_error, g_mc); | ||||||
|  | 
 | ||||||
|  | 	minishell_error(str_join(fatal_error, mc, "parse error: ", msg)); | ||||||
|  | 	mem_freeall(mc); | ||||||
|  | 	return (1); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Global variables for all the parsing functions
 | // Global variables for all the parsing functions
 | ||||||
|  | @ -27,6 +63,7 @@ typedef struct s_parsing_args | ||||||
| 	t_stream	stream; | 	t_stream	stream; | ||||||
| 	t_list		calls; | 	t_list		calls; | ||||||
| 	bool		got_first_call; // got at least the first program call?
 | 	bool		got_first_call; // got at least the first program call?
 | ||||||
|  | 	const char	*heredoc; | ||||||
| }			t_parsing_args; | }			t_parsing_args; | ||||||
| 
 | 
 | ||||||
| // Skip blank characters
 | // Skip blank characters
 | ||||||
|  | @ -35,98 +72,216 @@ static void	skip_blank(t_stream *stream) | ||||||
| 	stream_skip(stream, " \r\n\t"); | 	stream_skip(stream, " \r\n\t"); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | // Add 'c' at the end of 'str' and return the result.
 | ||||||
|  | // Also mem_free() 'str'.
 | ||||||
|  | static char	*str_addchar(t_err err, t_memclass mc, const char *str, char c) | ||||||
|  | { | ||||||
|  | 	char	*s; | ||||||
|  | 	char	*r; | ||||||
|  | 
 | ||||||
|  | 	s = str_dup(fatal_error, mc, "-"); | ||||||
|  | 	s[0] = c; | ||||||
|  | 	r = str_join(err, mc, str, s); | ||||||
|  | 	mem_free(s); | ||||||
|  | 	mem_free((void *)str); | ||||||
|  | 	return (r); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| // Read the string, stop if the char is in stop_charset
 | // Read the string, stop if the char is in stop_charset
 | ||||||
| // TODO quotes
 | // TODO variables if using "
 | ||||||
| static const char	*get_string(t_parsing_args *args, const char *stop_charset) | static const char	*get_string(t_parsing_args *args, const char *stop_charset) | ||||||
| { | { | ||||||
|  | 	char				quote; | ||||||
| 	const t_memclass	mc = mem_subclass(fatal_error, args->mc); | 	const t_memclass	mc = mem_subclass(fatal_error, args->mc); | ||||||
| 	const char			*stop_charset_2 | 	const char			*stop_charset_2; | ||||||
| 		= str_join(fatal_error, mc, stop_charset, " \n"); |  | ||||||
| 	char				*str; | 	char				*str; | ||||||
| 	char				str2[2]; |  | ||||||
| 	char				*str3; |  | ||||||
| 
 | 
 | ||||||
|  | 	quote = '\0'; | ||||||
|  | 	if (char_isin(stream_read(&args->stream), "\"'")) | ||||||
|  | 		quote = stream_pop(&args->stream); | ||||||
|  | 	if (!quote) | ||||||
|  | 		stop_charset_2 = str_join(fatal_error, mc, stop_charset, " \n"); | ||||||
|  | 	else | ||||||
|  | 		stop_charset_2 = str_addchar(fatal_error, mc, | ||||||
|  | 				str_dup(fatal_error, mc, ""), quote); | ||||||
| 	str = str_dup(fatal_error, mc, ""); | 	str = str_dup(fatal_error, mc, ""); | ||||||
| 	str2[1] = '\0'; |  | ||||||
| 	while (stream_read(&args->stream) | 	while (stream_read(&args->stream) | ||||||
| 		&& !char_isin(stream_read(&args->stream), stop_charset_2)) | 		&& !char_isin(stream_read(&args->stream), stop_charset_2)) | ||||||
| 	{ | 		str = str_addchar(fatal_error, mc, str, stream_pop(&args->stream)); | ||||||
| 		str2[0] = stream_pop(&args->stream); | 	if (quote) | ||||||
| 		str3 = str; | 		if (!stream_pop(&args->stream)) | ||||||
| 		str = str_join(fatal_error, mc, str, str2); | 			return (NULL); | ||||||
| 		mem_free(str3); |  | ||||||
| 	} |  | ||||||
| 	str = str_dup(fatal_error, args->mc, str); | 	str = str_dup(fatal_error, args->mc, str); | ||||||
| 	mem_freeall(mc); | 	mem_freeall(mc); | ||||||
| 	return (str); | 	return (str); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Get a program call (program names & its arguments) until stop_charset.
 | // Get a program call (program names & its arguments) until stop_charset.
 | ||||||
| static void	get_call(t_parsing_args *args, const char *stop_charset) | static int	get_call(t_parsing_args *args, const char *stop_charset) | ||||||
| { | { | ||||||
| 	t_call		*r; | 	t_call		*r; | ||||||
| 	t_list		arguments; | 	t_list		arguments; | ||||||
|  | 	const char	*str; | ||||||
| 
 | 
 | ||||||
| 	arguments = list_createempty(args->mc); | 	arguments = list_createempty(args->mc); | ||||||
| 	while (stream_read(&args->stream) | 	while (stream_read(&args->stream) | ||||||
| 		&& !char_isin(stream_read(&args->stream), stop_charset)) | 		&& !char_isin(stream_read(&args->stream), stop_charset)) | ||||||
| 	{ | 	{ | ||||||
|  | 		str = get_string(args, stop_charset); | ||||||
|  | 		if (!str) | ||||||
|  | 			return (parse_error("EOF unexpected")); | ||||||
| 		list_add(fatal_error, &arguments, | 		list_add(fatal_error, &arguments, | ||||||
| 			(char *)get_string(args, stop_charset)); | 			(char *)str); | ||||||
| 		skip_blank(&args->stream); | 		skip_blank(&args->stream); | ||||||
| 	} | 	} | ||||||
| 	r = mem_alloc(fatal_error, args->mc, sizeof(t_call)); | 	r = mem_alloc(fatal_error, args->mc, sizeof(t_call)); | ||||||
| 	r->program = (char *)list_get(parse_error, &arguments, 0); | 	r->program = (char *)list_get(err_remember, &arguments, 0); | ||||||
|  | 	if (err_get()) | ||||||
|  | 		return (parse_error("program name expected")); | ||||||
| 	r->argc = list_getsize(&arguments); | 	r->argc = list_getsize(&arguments); | ||||||
| 	r->argv = (char *const *)list_convert( | 	r->argv = (char *const *)list_convert( | ||||||
| 			fatal_error, args->mc, &arguments); | 			fatal_error, args->mc, &arguments); | ||||||
| 	list_add(fatal_error, &args->calls, (t_call *)r); | 	list_add(fatal_error, &args->calls, (t_call *)r); | ||||||
| 	args->got_first_call = true; | 	args->got_first_call = true; | ||||||
|  | 	return (0); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // Read an element (a call to a program, a '< FILE' or a '> FILE')
 | static int	get_inputfile(t_parsing_args *args, const char *stop_charset) | ||||||
| // (TODO redirections)
 |  | ||||||
| static void	get_element(t_parsing_args *args) |  | ||||||
| { | { | ||||||
| 	char	c; | 	const char	*str; | ||||||
|  | 	bool		heredoc; | ||||||
| 
 | 
 | ||||||
| 	while (stream_read(&args->stream)) | 	if (args->r.input_fd != 0) | ||||||
|  | 		return (parse_error("several input files")); | ||||||
|  | 	if (!stream_read(&args->stream)) | ||||||
|  | 		return (parse_error("EOF unexpected")); | ||||||
|  | 	heredoc = stream_read(&args->stream) == '<'; | ||||||
|  | 	if (heredoc) | ||||||
|  | 		stream_pop(&args->stream); | ||||||
|  | 	skip_blank(&args->stream); | ||||||
|  | 	str = get_string(args, stop_charset); | ||||||
|  | 	if (!str) | ||||||
|  | 		return (parse_error("EOF unexpected")); | ||||||
|  | 	if (heredoc) | ||||||
|  | 		args->heredoc = str; | ||||||
|  | 	else | ||||||
| 	{ | 	{ | ||||||
| 		c = stream_read(&args->stream); | 		args->r.input_fd = open(str, O_RDONLY); | ||||||
|  | 		if (args->r.input_fd == -1) | ||||||
|  | 			return (perror(str), errno); | ||||||
|  | 	} | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static int	get_outputfile(t_parsing_args *args, const char *stop_charset) | ||||||
|  | { | ||||||
|  | 	const char	*str; | ||||||
|  | 	int			flag; | ||||||
|  | 
 | ||||||
|  | 	if (args->r.output_fd != 1) | ||||||
|  | 		return (parse_error("several output files")); | ||||||
|  | 	if (!stream_read(&args->stream)) | ||||||
|  | 		return (parse_error("EOF unexpected")); | ||||||
|  | 	flag = O_TRUNC; | ||||||
|  | 	if (stream_read(&args->stream) == '>') | ||||||
|  | 	{ | ||||||
|  | 		stream_pop(&args->stream); | ||||||
|  | 		flag = O_APPEND; | ||||||
|  | 	} | ||||||
|  | 	skip_blank(&args->stream); | ||||||
|  | 	str = get_string(args, stop_charset); | ||||||
|  | 	if (!str) | ||||||
|  | 		return (parse_error("EOF unexpected")); | ||||||
|  | 	args->r.output_fd = open( | ||||||
|  | 			str, O_WRONLY | O_CREAT | flag, 0666); | ||||||
|  | 	if (args->r.output_fd == -1) | ||||||
|  | 		return (perror(str), errno); | ||||||
|  | 	return (0); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | static void	get_element2(t_parsing_args *args, int *error, char c) | ||||||
|  | { | ||||||
|  | 	stream_pop(&args->stream); | ||||||
|  | 	skip_blank(&args->stream); | ||||||
| 	if (c == '|') | 	if (c == '|') | ||||||
| 	{ | 	{ | ||||||
| 		if (!args->got_first_call) | 		if (!args->got_first_call) | ||||||
| 				parse_error(NULL); | 			*error = parse_error("'|', '>' or '<' expected"); | ||||||
| 			stream_pop(&args->stream); | 		*error = get_call(args, "<>|"); | ||||||
| 			skip_blank(&args->stream); |  | ||||||
| 			get_call(args, "<>|"); |  | ||||||
| 	} | 	} | ||||||
| 		else if (!args->got_first_call) | 	else if (c == '>') | ||||||
| 			get_call(args, "<>|"); | 		*error = get_outputfile(args, "<>|"); | ||||||
|  | 	else if (c == '<') | ||||||
|  | 		*error = get_inputfile(args, "<>|"); | ||||||
| 	else | 	else | ||||||
| 			parse_error(NULL); | 		fatal_error_msg("internal error u.u"); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // Read an element (a call to a program, a '< FILE' or a '> FILE')
 | ||||||
|  | // On success, return 0. On error, return the error status.
 | ||||||
|  | static int	get_element(t_parsing_args *args) | ||||||
|  | { | ||||||
|  | 	char							c; | ||||||
|  | 	int								error; | ||||||
|  | 
 | ||||||
|  | 	error = 0; | ||||||
|  | 	while (!error && stream_read(&args->stream)) | ||||||
|  | 	{ | ||||||
|  | 		c = stream_read(&args->stream); | ||||||
|  | 		if (char_isin(c, "|><")) | ||||||
|  | 			get_element2(args, &error, c); | ||||||
|  | 		else if (!args->got_first_call) | ||||||
|  | 			error = get_call(args, "<>|"); | ||||||
|  | 		else | ||||||
|  | 			return (parse_error("'|', '>' or '<'' expected")); | ||||||
| 		skip_blank(&args->stream); | 		skip_blank(&args->stream); | ||||||
| 	} | 	} | ||||||
|  | 	return (error); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | t_parsing_args	init_parsing_args(const t_memclass mc) | ||||||
|  | { | ||||||
|  | 	const t_parsing_args	r = { | ||||||
|  | 		.mc = mc, | ||||||
|  | 		.r = { | ||||||
|  | 		.error = 0, | ||||||
|  | 		.empty = false, | ||||||
|  | 		.input_fd = 0, | ||||||
|  | 		.output_fd = 1, | ||||||
|  | 	}, | ||||||
|  | 		.calls = list_createempty(mc), | ||||||
|  | 		.got_first_call = false, | ||||||
|  | 		.heredoc = NULL, | ||||||
|  | 	}; | ||||||
|  | 
 | ||||||
|  | 	return (r); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| t_command	parse_command(const t_memclass mc, const char *command) | t_command	parse_command(const t_memclass mc, const char *command) | ||||||
| { | { | ||||||
| 	t_parsing_args	args; | 	t_parsing_args	args; | ||||||
|  | 	int				error; | ||||||
| 
 | 
 | ||||||
| 	args.mc = mc; | 	error = 0; | ||||||
| 	args.r.error = false; | 	args = init_parsing_args(mc); | ||||||
| 	args.r.input_fd = 0; |  | ||||||
| 	args.r.output_fd = 1; |  | ||||||
| 	args.calls = list_createempty(mc); |  | ||||||
| 	args.got_first_call = false; |  | ||||||
| 	streamstr_init(&args.stream, command); | 	streamstr_init(&args.stream, command); | ||||||
| 	skip_blank(&args.stream); | 	skip_blank(&args.stream); | ||||||
| 	while (stream_read(&args.stream)) | 	if (!stream_read(&args.stream)) | ||||||
| 	{ | 	{ | ||||||
| 		get_element(&args); | 		args.r.empty = true; | ||||||
|  | 		return (args.r); | ||||||
|  | 	} | ||||||
|  | 	while (!error && stream_read(&args.stream)) | ||||||
|  | 	{ | ||||||
|  | 		error = get_element(&args); | ||||||
| 		skip_blank(&args.stream); | 		skip_blank(&args.stream); | ||||||
| 	} | 	} | ||||||
|  | 	if (!error) | ||||||
| 		args.r.calls = (t_call *)list_convert_type( | 		args.r.calls = (t_call *)list_convert_type( | ||||||
| 				fatal_error, args.mc, &args.calls, sizeof(t_call)); | 				fatal_error, args.mc, &args.calls, sizeof(t_call)); | ||||||
|  | 	if (error) | ||||||
|  | 		args.r.error = error; | ||||||
|  | 	if (args.heredoc) | ||||||
|  | 		heredoc(mc, &args.r.input_fd, args.heredoc); | ||||||
| 	return (args.r); | 	return (args.r); | ||||||
| } | } | ||||||
|  |  | ||||||
							
								
								
									
										12
									
								
								src/path.c
									
										
									
									
									
								
							
							
						
						
									
										12
									
								
								src/path.c
									
										
									
									
									
								
							|  | @ -6,28 +6,26 @@ | ||||||
| /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | /*   By: jschaft <cecile.schaft@orange.fr>          +#+  +:+       +#+        */ | ||||||
| /*                                                +#+#+#+#+#+   +#+           */ | /*                                                +#+#+#+#+#+   +#+           */ | ||||||
| /*   Created: 2023/11/16 12:07:26 by jschaft           #+#    #+#             */ | /*   Created: 2023/11/16 12:07:26 by jschaft           #+#    #+#             */ | ||||||
| /*   Updated: 2024/04/26 12:24:41 by mcolonna         ###   ########.fr       */ | /*   Updated: 2024/05/01 17:53:38 by mcolonna         ###   ########.fr       */ | ||||||
| /*                                                                            */ | /*                                                                            */ | ||||||
| /* ************************************************************************** */ | /* ************************************************************************** */ | ||||||
| 
 | 
 | ||||||
| #include "include.h" | #include "include.h" | ||||||
| 
 | 
 | ||||||
| char	**get_path(char *const envp[]) | const char	**get_path(const t_memclass mc, char *const envp[]) | ||||||
| { | { | ||||||
| 	int			i; | 	int			i; | ||||||
| 	char		**re; | 	const char	**re; | ||||||
| 	char		*path; | 	char		*path; | ||||||
| 
 | 
 | ||||||
| 	i = 0; | 	i = 0; | ||||||
| 	while (ft_strncmp(envp[i], "PATH=", 5) != 0) | 	while (ft_strncmp(envp[i], "PATH=", 5) != 0) | ||||||
| 		i++; | 		i++; | ||||||
| 	path = ft_substr(envp[i], 5, ft_strlen(envp[i]) - 5); | 	path = envp[i] + 5; | ||||||
| 	re = ft_split(path, ':'); | 	re = (const char **)str_split(fatal_error, mc, path, ":"); | ||||||
| 	free(path); |  | ||||||
| 	return (re); | 	return (re); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| // TODO does it return the good path if there is several possibilities?
 |  | ||||||
| const char	*search_path( | const char	*search_path( | ||||||
| 		const t_memclass mc, const char **path, const char *prog) | 		const t_memclass mc, const char **path, const char *prog) | ||||||
| { | { | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		
		Reference in a new issue
	
	 mcolonna
						mcolonna