From 08dc7bad19f482df679fa664f2dd1a3e0f30e7fd Mon Sep 17 00:00:00 2001 From: Softonik Date: Sat, 19 Nov 2022 22:05:39 +0300 Subject: [PATCH] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B0=20=D0=BF=D0=BE=D0=B4=D0=B4=D0=B5=D1=80=D0=B6=D0=BA?= =?UTF-8?q?=D0=B0=20=D0=B7=D0=B0=D0=BF=D0=B8=D1=81=D0=B8=20.h=20=D1=84?= =?UTF-8?q?=D0=B0=D0=B9=D0=BB=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- cmd/go-tr/main.go | 28 +++++++++++++++------ transpile/service.go | 60 +++++++++++++++++++++++++++----------------- 2 files changed, 57 insertions(+), 31 deletions(-) diff --git a/cmd/go-tr/main.go b/cmd/go-tr/main.go index 7c2e8a6..f7b1808 100644 --- a/cmd/go-tr/main.go +++ b/cmd/go-tr/main.go @@ -14,13 +14,14 @@ const ( ) func main() { - mode, source, target := getFlags() - checkFlagsAreValid(source, target) - safeTranspile(mode, source, target) + mode, source, target, header_file := getFlags() + checkFlagsAreValid(source) + safeTranspile(mode, source, target, header_file) } -func getFlags() (int, string, string) { +func getFlags() (int, string, string, string) { pmode := flag.Bool("p", false, "Mode: C++ or Python") + header_file := flag.String("h", "", "Write headers to file also") flag.Parse() source := flag.Arg(0) @@ -31,10 +32,10 @@ func getFlags() (int, string, string) { mode = PYTHON_MODE } - return mode, source, target + return mode, source, target, *header_file } -func checkFlagsAreValid(source, target string) { +func checkFlagsAreValid(source string) { if source == "" { printUsage() os.Exit(1) @@ -50,7 +51,7 @@ func printUsage() { fmt.Printf("\tgo-tr [-p] controller.go controller.ino\n\n") } -func safeTranspile(mode int, source, target string) { +func safeTranspile(mode int, source, target, header_file string) { // Read the Golang source file. in, err := os.Open(source) if err != nil { @@ -63,16 +64,27 @@ func safeTranspile(mode int, source, target string) { if target != "" { // Create the Arduino sketch file. os.Remove(target) - out, err = os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_SYNC, 0666) + out, err = os.OpenFile(target, os.O_CREATE|os.O_RDWR|os.O_SYNC, 0644) if err != nil { fmt.Fprintf(os.Stderr, "Arduino sketch file [%s] could not be opened! %v", target, err) os.Exit(1) } } + + var header_f *os.File + if header_file != "" { + os.Remove(header_file) + header_f, err = os.OpenFile(header_file, os.O_CREATE|os.O_RDWR|os.O_SYNC, 0644) + if err != nil { + fmt.Fprintf(os.Stderr, "Header file [%s] could not be opened! %v", header_file, err) + os.Exit(1) + } + } switch mode { case CPP_MODE: // Transpiles the Golang source into Arduino sketch. service := transpile.NewService(in, out) + service.SetHeaderWriter(header_f) if err := service.Start(); err != nil { fmt.Fprintf(os.Stderr, "%v", err) os.Exit(1) diff --git a/transpile/service.go b/transpile/service.go index a248281..777d041 100644 --- a/transpile/service.go +++ b/transpile/service.go @@ -15,6 +15,7 @@ import ( // Service specifies the api logic of transforming a source code format into another target format. type Service interface { Start() error + SetHeaderWriter(io.Writer) error } const ( @@ -34,8 +35,9 @@ var ( // defaultService specifies the api logic of transforming a source code format into another target format. type defaultService struct { - in io.Reader - out io.Writer + in io.Reader + out io.Writer + header io.Writer } // NewService creates a a new transpile and returns its address. @@ -46,6 +48,15 @@ func NewService(in io.Reader, out io.Writer) Service { } } +func (s *defaultService) SetHeaderWriter(w io.Writer) error { + if w == nil { + return fmt.Errorf("Empty") + } + + s.header = w + return nil +} + // Start ... func (s *defaultService) Start() error { if s.in == nil { @@ -89,8 +100,8 @@ func (s *defaultService) Start() error { } } - printFunctionDeclarations(s.out) - printGoHelperDeclarations(s.out) + s.printFunctionDeclarations() + s.printGoHelperDeclarations() // Print the ordered result. for i := 0; i < count; i++ { @@ -106,38 +117,41 @@ func (s *defaultService) Start() error { return nil } -func addFunctionDeclaration(f string) { - dlock.Lock() - defer dlock.Unlock() - - funcDeclarations = append(funcDeclarations, f) -} -func printFunctionDeclarations(out io.Writer) { +func (s *defaultService) printFunctionDeclarations() { dlock.Lock() defer dlock.Unlock() for _, f := range funcDeclarations { - out.Write([]byte(f + "\n")) + s.out.Write([]byte(f + "\n")) + if s.header != nil { + s.header.Write([]byte(f + "\n")) + } } - out.Write([]byte("\n")) + s.out.Write([]byte("\n")) } - -func addGoHelperDeclaration(f string) { - dlock.Lock() - defer dlock.Unlock() - - helpersForDeclarations = append(helpersForDeclarations, f) -} -func printGoHelperDeclarations(out io.Writer) { +func (s *defaultService) printGoHelperDeclarations() { dlock.Lock() defer dlock.Unlock() for _, f := range helpersForDeclarations { helper := fmt.Sprintf(`void %v%v(void*) { %v(); vTaskDelete(NULL); }`, FunctionGoHelperPrefix, f, f) - out.Write([]byte(helper + "\n")) + s.out.Write([]byte(helper + "\n")) } - out.Write([]byte("\n")) + s.out.Write([]byte("\n")) +} + +func addFunctionDeclaration(f string) { + dlock.Lock() + defer dlock.Unlock() + + funcDeclarations = append(funcDeclarations, f) +} +func addGoHelperDeclaration(f string) { + dlock.Lock() + defer dlock.Unlock() + + helpersForDeclarations = append(helpersForDeclarations, f) } func handleAssignStmt(as *ast.AssignStmt) string {