github.com/tardisgo/tardisgo@v0.0.0-20161119180838-e0dd9a7e46b5/pogo/multifile.go (about) 1 package pogo 2 3 import ( 4 "bytes" 5 "io/ioutil" 6 "os" 7 ) 8 9 func writeIfChanged(filename string, data []byte) error { 10 content, err := ioutil.ReadFile(filename) 11 if err == nil { 12 if bytes.Equal(content, data) { 13 //println("DEBUG writeIfChanged() unchanged: " + filename) 14 return nil 15 } 16 } 17 //println("DEBUG writeIfChanged() changed: " + filename) // TODO add a flag to show this 18 return ioutil.WriteFile(filename, data, 0666) 19 } 20 21 // WriteAsClass writes the contents of the buffer as a given class file name. 22 func (comp *Compilation) WriteAsClass(name, code string) { 23 l := comp.TargetLang 24 if LanguageList[l].files == nil { 25 LanguageList[l].files = make([]FileOutput, 0, 100) 26 } 27 _, err := LanguageList[l].buffer.WriteString(code) 28 if err != nil { 29 panic(err) 30 } 31 var data = make([]byte, LanguageList[l].buffer.Len()) 32 copy(data, LanguageList[l].buffer.Bytes()) 33 LanguageList[l].files = append(LanguageList[l].files, FileOutput{name, data}) 34 LanguageList[l].buffer.Reset() 35 comp.emitFileStart() 36 } 37 38 func (comp *Compilation) targetDir() error { 39 if err := os.Mkdir(LanguageList[comp.TargetLang].TgtDir, os.ModePerm); err != nil { 40 if !os.IsExist(err) { // no problem if it already exists 41 comp.LogError("Unable to create tardis output directory", "pogo", err) 42 return err 43 } 44 } 45 return nil 46 } 47 48 // Write out the target language file 49 func (comp *Compilation) writeFiles() { 50 l := comp.TargetLang 51 if LanguageList[l].buffer.Len() > 0 { 52 comp.WriteAsClass("Remnants", "") 53 } 54 err := comp.targetDir() 55 if err == nil { 56 for _, fo := range LanguageList[l].files { 57 err = writeIfChanged( 58 LanguageList[comp.TargetLang].TgtDir+ 59 string(os.PathSeparator)+fo.filename+ 60 LanguageList[l].FileTypeSuffix(), 61 fo.data) 62 if err != nil { 63 break 64 } 65 } 66 } 67 if err != nil { 68 comp.LogError("Unable to write output file", "pogo", err) 69 } 70 }