diff --git a/cmd/tools/vbin2v.v b/cmd/tools/vbin2v.v index 802e055cec..26b0a04fbd 100644 --- a/cmd/tools/vbin2v.v +++ b/cmd/tools/vbin2v.v @@ -2,9 +2,10 @@ module main import os import flag +import strings const ( - tool_version = '0.0.3' + tool_version = '0.0.4' tool_description = 'Converts a list of arbitrary files into a single v module file.' ) @@ -14,12 +15,15 @@ mut: prefix string show_help bool module_name string + write_file bool } -fn (context Context) header() { - println('module ${context.module_name}') - println('') +fn (context Context) header() string { + mut header_s := '' + header_s += 'module ${context.module_name}\n' + header_s += '\n' allfiles := context.files.join(' ') + mut options := []string{} if context.prefix.len > 0 { options << '-p ${context.prefix}' @@ -27,39 +31,48 @@ fn (context Context) header() { if context.module_name.len > 0 { options << '-m ${context.module_name}' } + if context.write_file { + options << '-w' + } 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 (') + + header_s += '// File generated by:\n' + header_s += '// v bin2v ${allfiles} ${soptions}\n' + header_s += '// Please, do not edit this file.\n' + header_s += '// Your changes may be overwritten.\n' + header_s += '\n' + header_s += 'const (\n' + + return header_s } -fn (context Context) footer() { - println(')') +fn (context Context) footer() string { + return ')\n' } -fn (context Context) file2v(file string) { +fn (context Context) file2v(file string) string { + mut sb := strings.new_builder(1000) fname := os.file_name(file) fname_no_dots := fname.replace('.', '_') byte_name := '${context.prefix}${fname_no_dots}' fbytes := os.read_bytes(file) or { eprintln('Error: $err') - return + return '' } fbyte := fbytes[0] - println(' ${byte_name}_len = ${fbytes.len}') - print(' ${byte_name} = [ byte(${fbyte}), \n ') + sb.write(' ${byte_name}_len = ${fbytes.len}\n') + sb.write(' ${byte_name} = [ byte(${fbyte}), \n ') for i := 1; i < fbytes.len; i++ { b := int(fbytes[i]).str() - print('${b:4s}, ') + sb.write('${b:4s}, ') if 0 == i % 16 { - print('\n ') + sb.write('\n ') } } - println('\n]!!') - println('') + sb.write('\n]!!\n') + sb.write('\n') + + return sb.str() } fn main() { @@ -70,8 +83,9 @@ fn main() { 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') + context.module_name = fp.string('module', `m`, 'binary', 'Name of the generated module.') + context.prefix = fp.string('prefix', `p`, '', 'A prefix put before each resource name.') + context.write_file = fp.bool('write', `w`, false, 'Write directly to a file. The module name is used as filename.') if context.show_help { println(fp.usage()) exit(0) @@ -86,9 +100,20 @@ fn main() { exit(0) } context.files = real_files - context.header() - for file in real_files { - context.file2v(file) + + if context.write_file { + mut out_file := os.create('${context.module_name}.v') or { panic(err) } + out_file.write(context.header()) + for file in real_files { + out_file.write(context.file2v(file)) + } + out_file.write(context.footer()) + } + else { + println(context.header()) + for file in real_files { + println(context.file2v(file)) + } + println(context.footer()) } - context.footer() } diff --git a/cmd/v/help/bin2v.txt b/cmd/v/help/bin2v.txt index 71a7e05ca6..c6714cd95b 100644 --- a/cmd/v/help/bin2v.txt +++ b/cmd/v/help/bin2v.txt @@ -1,9 +1,9 @@ -Usage: +Usage: v bin2v [options] FILE [FILE]... Converts a list of arbitrary files into a single v module file. -You can use this tool to embed binary files, like pictures or fonts inside +You can use this tool to embed binary files, like pictures or fonts inside the executable of a v program, such that it would not need access to external resources during runtime, and it would be as self-contained as possible. @@ -11,3 +11,4 @@ Options: -h, --help Show this help screen. -m, --module Name of the generated module. -p, --prefix A prefix put before each resource name. + -w, --write Write directly to a file. The module name is used as filename.