init
This commit is contained in:
		
							
								
								
									
										8
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.editorconfig
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
[*]
 | 
			
		||||
charset = utf-8
 | 
			
		||||
end_of_line = lf
 | 
			
		||||
insert_final_newline = true
 | 
			
		||||
trim_trailing_whitespace = true
 | 
			
		||||
 | 
			
		||||
[*.v]
 | 
			
		||||
indent_style = tab
 | 
			
		||||
							
								
								
									
										8
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								.gitattributes
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,8 @@
 | 
			
		||||
* text=auto eol=lf
 | 
			
		||||
*.bat eol=crlf
 | 
			
		||||
 | 
			
		||||
*.v linguist-language=V
 | 
			
		||||
*.vv linguist-language=V
 | 
			
		||||
*.vsh linguist-language=V
 | 
			
		||||
v.mod linguist-language=V
 | 
			
		||||
.vdocignore linguist-language=ignore
 | 
			
		||||
							
								
								
									
										24
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								.gitignore
									
									
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,24 @@
 | 
			
		||||
# Binaries for programs and plugins
 | 
			
		||||
main
 | 
			
		||||
code
 | 
			
		||||
*.exe
 | 
			
		||||
*.exe~
 | 
			
		||||
*.so
 | 
			
		||||
*.dylib
 | 
			
		||||
*.dll
 | 
			
		||||
 | 
			
		||||
# Ignore binary output folders
 | 
			
		||||
bin/
 | 
			
		||||
 | 
			
		||||
# Ignore common editor/system specific metadata
 | 
			
		||||
.DS_Store
 | 
			
		||||
.idea/
 | 
			
		||||
.vscode/
 | 
			
		||||
*.iml
 | 
			
		||||
 | 
			
		||||
# ENV
 | 
			
		||||
.env
 | 
			
		||||
 | 
			
		||||
# vweb and database
 | 
			
		||||
*.db
 | 
			
		||||
*.js
 | 
			
		||||
							
								
								
									
										46
									
								
								shell.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										46
									
								
								shell.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,46 @@
 | 
			
		||||
module shell
 | 
			
		||||
 | 
			
		||||
import strings.textscanner
 | 
			
		||||
 | 
			
		||||
const safe_chars = '%+,-./0123456789:=@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz'
 | 
			
		||||
 | 
			
		||||
// quote returns a shell-escaped version of string `s`.
 | 
			
		||||
pub fn quote(s string) string {
 | 
			
		||||
	if s == '' {
 | 
			
		||||
		return "''"
 | 
			
		||||
	}
 | 
			
		||||
	if s.is_pure_ascii() && s.contains_only(safe_chars) {
 | 
			
		||||
		return s
 | 
			
		||||
	}
 | 
			
		||||
	return "'" + s.replace("'", '\'"\'"\'') + "'"
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// join joins `s` array members into a shell-escaped string.
 | 
			
		||||
pub fn join(s []string) string {
 | 
			
		||||
	mut quoted_args := []string{}
 | 
			
		||||
	for arg in s {
 | 
			
		||||
		quoted_args << quote(arg)
 | 
			
		||||
	}
 | 
			
		||||
	return quoted_args.join(' ')
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// // join_all joins their arguments into a shell-escaped string.
 | 
			
		||||
// pub fn join_all(s ...string) string {
 | 
			
		||||
// 	return join(s)
 | 
			
		||||
// }
 | 
			
		||||
 | 
			
		||||
// split splits the string `s` into array using shell-like syntax.
 | 
			
		||||
pub fn split(s string) []string {
 | 
			
		||||
	return []string{}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub struct Lexer {
 | 
			
		||||
pub:
 | 
			
		||||
	posix_mode    bool   = true
 | 
			
		||||
	comment_chars string = '#'
 | 
			
		||||
pub mut:
 | 
			
		||||
	tokens []string
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
pub fn (mut x Lexer) process(s string) {
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										9
									
								
								shell_test.v
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								shell_test.v
									
									
									
									
									
										Normal file
									
								
							@@ -0,0 +1,9 @@
 | 
			
		||||
import shell
 | 
			
		||||
 | 
			
		||||
fn test_quote() {
 | 
			
		||||
	assert shell.quote("janna d'arc") == '\'janna d\'"\'"\'arc\''
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
fn test_join() {
 | 
			
		||||
	assert shell.join(['sh', '-c', 'hostname -f']) == "sh -c 'hostname -f'"
 | 
			
		||||
}
 | 
			
		||||
		Reference in New Issue
	
	Block a user