2011-06-17 16:01:49 +00:00
// This work is subject to the CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
// license. Its contents can be found at:
// http://creativecommons.org/publicdomain/zero/1.0/
2011-06-17 15:44:59 +00:00
package main
import (
"flag"
"fmt"
2011-12-07 12:49:06 +00:00
"os"
2011-06-17 15:44:59 +00:00
"path"
"runtime"
2011-12-07 12:49:06 +00:00
"strings"
2011-06-27 16:45:39 +00:00
"unicode"
2011-06-17 15:44:59 +00:00
)
const (
2012-03-27 23:39:01 +00:00
AppName = "bindata"
2012-06-22 12:12:15 +00:00
AppVersion = "1.0.0"
)
var (
pipe = false
in = flag . String ( "i" , "" , "Path to the input file. Alternatively, pipe the file data into stdin." )
out = flag . String ( "o" , "" , "Optional path to the output file." )
pkgname = flag . String ( "p" , "" , "Optional name of the package to generate." )
funcname = flag . String ( "f" , "" , "Optional name of the function/variable to generate." )
uncompressed = flag . Bool ( "u" , false , "The specified resource will /not/ be GZIP compressed when this flag is specified. This alters the generated output code." )
nomemcopy = flag . Bool ( "m" , false , "Use the memcopy hack to get rid of unnecessary memcopies. Refer to the documentation to see what implications this carries." )
version = flag . Bool ( "v" , false , "Display version information." )
2011-06-17 15:44:59 +00:00
)
func main ( ) {
2012-06-22 12:12:15 +00:00
parseArgs ( )
if pipe {
translate ( os . Stdin , os . Stdout , * pkgname , * funcname , * uncompressed , * nomemcopy )
} else {
fs , err := os . Open ( * in )
if err != nil {
fmt . Fprintf ( os . Stderr , "[e] %s\n" , err )
return
}
defer fs . Close ( )
fd , err := os . Create ( * out )
if err != nil {
fmt . Fprintf ( os . Stderr , "[e] %s\n" , err )
return
}
defer fd . Close ( )
translate ( fs , fd , * pkgname , * funcname , * uncompressed , * nomemcopy )
2013-01-26 20:06:46 +00:00
fmt . Fprintln ( os . Stdout , "[i] Done." )
}
2012-06-22 12:12:15 +00:00
}
2011-06-17 15:44:59 +00:00
2012-06-22 12:12:15 +00:00
// parseArgs processes and verifies commandline arguments.
func parseArgs ( ) {
2011-06-17 15:44:59 +00:00
flag . Parse ( )
if * version {
fmt . Fprintf ( os . Stdout , "%s v%s (Go runtime %s)\n" ,
2012-03-27 23:39:01 +00:00
AppName , AppVersion , runtime . Version ( ) )
2012-06-22 12:12:15 +00:00
os . Exit ( 0 )
2011-06-17 15:44:59 +00:00
}
2012-06-22 12:12:15 +00:00
pipe = len ( * in ) == 0
2011-06-17 15:44:59 +00:00
2011-06-17 16:52:40 +00:00
if ! pipe && len ( * out ) == 0 {
2011-06-17 15:44:59 +00:00
// Ensure we create our own output filename that does not already exist.
dir , file := path . Split ( * in )
* out = path . Join ( dir , file ) + ".go"
if _ , err := os . Lstat ( * out ) ; err == nil {
// File already exists. Pad name with a sequential number until we
// find a name that is available.
count := 0
for {
f := path . Join ( dir , fmt . Sprintf ( "%s.%d.go" , file , count ) )
if _ , err := os . Lstat ( f ) ; err != nil {
* out = f
break
}
count ++
}
}
fmt . Fprintf ( os . Stderr , "[w] No output file specified. Using '%s'.\n" , * out )
}
if len ( * pkgname ) == 0 {
fmt . Fprintln ( os . Stderr , "[w] No package name specified. Using 'main'." )
* pkgname = "main"
2011-06-27 16:45:39 +00:00
} else {
2011-10-26 09:59:30 +00:00
if unicode . IsDigit ( rune ( ( * pkgname ) [ 0 ] ) ) {
2011-06-27 16:45:39 +00:00
// Identifier can't start with a digit.
* pkgname = "_" + * pkgname
}
2011-06-17 15:44:59 +00:00
}
if len ( * funcname ) == 0 {
2011-06-17 16:52:40 +00:00
if pipe {
// Can't infer from input file name in this mode.
fmt . Fprintln ( os . Stderr , "[e] No function name specified." )
2012-06-22 12:12:15 +00:00
os . Exit ( 1 )
2012-06-07 21:34:34 +00:00
}
2012-06-07 21:28:16 +00:00
2012-06-07 21:34:34 +00:00
_ , file := path . Split ( * in )
file = strings . ToLower ( file )
file = strings . Replace ( file , " " , "_" , - 1 )
file = strings . Replace ( file , "." , "_" , - 1 )
file = strings . Replace ( file , "-" , "_" , - 1 )
if unicode . IsDigit ( rune ( file [ 0 ] ) ) {
// Identifier can't start with a digit.
file = "_" + file
2011-06-17 16:52:40 +00:00
}
2012-06-07 21:34:34 +00:00
fmt . Fprintf ( os . Stderr , "[w] No function name specified. Using '%s'.\n" , file )
* funcname = file
2011-06-17 15:44:59 +00:00
}
}