Meikel  Brandmeyer avatar Meikel Brandmeyer committed c7b7bf4

Add writer for bencode

Comments (0)

Files changed (1)

vim/autoload/vimclojure/bencode.vim

 	return vimclojure#bencode#ReadToken(a:input, 0)[0][0]
 endfunction
 
+function! vimclojure#bencode#WriteString(string)
+	let encoded = iconv(a:string, &enc, "utf-8")
+	return strlen(encoded) . ":" . encoded
+endfunction
+
+function! vimclojure#bencode#WriteNumber(number)
+	return "i" . string(a:number) . "e"
+endfunction
+
+function! vimclojure#bencode#WriteList(list)
+	let encoded = "l"
+	for elt in map(copy(a:list), '[ v:val ]')
+		let encoded .= vimclojure#bencode#WriteBencode(elt[0])
+	endfor
+	let encoded .= "e"
+
+	return encoded
+endfunction
+
+function! vimclojure#bencode#WriteMap(map)
+	let encoded = "d"
+	for kv in items(a:map)
+		let encoded .= vimclojure#bencode#WriteBencode(kv[0])
+		let encoded .= vimclojure#bencode#WriteBencode(kv[1])
+	endfor
+	let encoded .= "e"
+
+	return encoded
+endfunction
+
+function! vimclojure#bencode#WriteBencode(thing)
+	if type("") == type(a:thing)
+		return vimclojure#bencode#WriteString(a:thing)
+	elseif type(0) == type(a:thing)
+		return vimclojure#bencode#WriteNumber(a:thing)
+	elseif type([]) == type(a:thing)
+		return vimclojure#bencode#WriteList(a:thing)
+	elseif type({}) == type(a:thing)
+		return vimclojure#bencode#WriteMap(a:thing)
+	endif
+endfunction
+
 " Epilog
 let &cpo = s:save_cpo
Tip: Filter by directory path e.g. /media app.js to search for public/media/app.js.
Tip: Use camelCasing e.g. ProjME to search for ProjectModifiedEvent.java.
Tip: Filter by extension type e.g. /repo .js to search for all .js files in the /repo directory.
Tip: Separate your search with spaces e.g. /ssh pom.xml to search for src/ssh/pom.xml.
Tip: Use ↑ and ↓ arrow keys to navigate and return to view the file.
Tip: You can also navigate files with Ctrl+j (next) and Ctrl+k (previous) and view the file with Ctrl+o.
Tip: You can also navigate files with Alt+j (next) and Alt+k (previous) and view the file with Alt+o.