new tool: bin2v to convert arbitrary files to a .v static module file

pull/3428/head
Delyan Angelov 2020-01-13 18:54:18 +02:00 committed by Alexander Medvednikov
parent 4a82770f16
commit cb3ac33e18
4 changed files with 98 additions and 0 deletions

1
.gitignore vendored
View File

@ -14,6 +14,7 @@ fns.txt
/tools/vtest-compiler /tools/vtest-compiler
/tools/vtest-fmt /tools/vtest-fmt
/tools/vfmt /tools/vfmt
/tools/vbin2v
/tools/vup /tools/vup
/tools/vpm /tools/vpm
/tools/vcreate /tools/vcreate

View File

@ -1,5 +1,6 @@
import ( import (
os os
os.cmdline
flag flag
filepath filepath
scripting scripting

95
tools/vbin2v.v 100644
View File

@ -0,0 +1,95 @@
module main
import os
import flag
import filepath
const (
tool_version = '0.0.3'
tool_description = 'Converts a list of arbitrary files into a single v module file.'
)
struct Context {
mut:
files []string
prefix string
show_help bool
module_name string
}
fn (context Context) header() {
println('module ${context.module_name}')
println('')
allfiles := context.files.join(' ')
mut options := []string
if context.prefix.len > 0 {
options << '-p ${context.prefix}'
}
if context.module_name.len > 0 {
options << '-m ${context.module_name}'
}
soptions := options.join(' ')
println('// File generated by:')
println('// v bin2v ${allfiles} ${soptions}')
println('// Please, do not edit this file.')
println('// Your changes may be overwritten.')
println('')
println('const (')
}
fn (context Context) footer() {
println(')')
}
fn (context Context) file2v(file string) {
fname := filepath.filename(file)
fname_no_dots := fname.replace('.', '_')
byte_name := '${context.prefix}${fname_no_dots}'
fbytes := os.read_bytes(file) or {
eprintln('Error: $err')
return
}
fbyte := fbytes[0]
println(' ${byte_name}_len = ${fbytes.len}')
print(' ${byte_name} = [ byte(${fbyte}), \n ')
for i := 1; i < fbytes.len; i++ {
b := int(fbytes[i]).str()
print('${b:4s}, ')
if 0 == i % 16 {
print('\n ')
}
}
println('\n]!!')
println('')
}
fn main() {
mut context := Context{}
mut fp := flag.new_flag_parser(os.args[1..])
fp.application('v bin2v')
fp.version(tool_version)
fp.description(tool_description)
fp.arguments_description('FILE [FILE]...')
context.show_help = fp.bool_('help', `h`, false, 'Show this help screen.')
context.module_name = fp.string_('module', `m`, 'binary', 'Name of the generated module.\n')
context.prefix = fp.string_('prefix', `p`, '', 'A prefix put before each resource name.\n')
if (context.show_help) {
println(fp.usage())
exit(0)
}
files := fp.finalize() or {
eprintln('Error: ' + err)
exit(1)
}
real_files := files.filter(it != 'bin2v')
if real_files.len == 0 {
println(fp.usage())
exit(0)
}
context.files = real_files
context.header()
for file in real_files {
context.file2v(file)
}
context.footer()
}

1
v.v
View File

@ -15,6 +15,7 @@ import (
const ( const (
known_commands = ['run', 'build', 'version', 'doc'] known_commands = ['run', 'build', 'version', 'doc']
simple_tools = ['fmt', 'up', 'create', 'test', 'test-fmt', 'test-compiler', 'build-tools', simple_tools = ['fmt', 'up', 'create', 'test', 'test-fmt', 'test-compiler', 'build-tools',
'bin2v',
'build-examples', 'build-vbinaries'] 'build-examples', 'build-vbinaries']
) )