| // Copyright 2017 The Wuffs Authors. |
| // |
| // Licensed under the Apache License, Version 2.0 (the "License"); |
| // you may not use this file except in compliance with the License. |
| // You may obtain a copy of the License at |
| // |
| // https://www.apache.org/licenses/LICENSE-2.0 |
| // |
| // Unless required by applicable law or agreed to in writing, software |
| // distributed under the License is distributed on an "AS IS" BASIS, |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| // See the License for the specific language governing permissions and |
| // limitations under the License. |
| |
| // +build ignore |
| |
| package main |
| |
| // gen.go converts base.* to data.go. |
| // |
| // Invoke it via "go generate". |
| |
| import ( |
| "bytes" |
| "fmt" |
| "go/format" |
| "io/ioutil" |
| "os" |
| ) |
| |
| const columns = 1024 |
| |
| func main() { |
| if err := main1(); err != nil { |
| os.Stderr.WriteString(err.Error() + "\n") |
| os.Exit(1) |
| } |
| } |
| |
| func main1() error { |
| out := &bytes.Buffer{} |
| out.WriteString("// Code generated by running \"go generate\". DO NOT EDIT.\n") |
| out.WriteString("\n") |
| out.WriteString("// Copyright 2017 The Wuffs Authors.\n") |
| out.WriteString("//\n") |
| out.WriteString("// Licensed under the Apache License, Version 2.0 (the \"License\");\n") |
| out.WriteString("// you may not use this file except in compliance with the License.\n") |
| out.WriteString("// You may obtain a copy of the License at\n") |
| out.WriteString("//\n") |
| out.WriteString("// https://www.apache.org/licenses/LICENSE-2.0\n") |
| out.WriteString("//\n") |
| out.WriteString("// Unless required by applicable law or agreed to in writing, software\n") |
| out.WriteString("// distributed under the License is distributed on an \"AS IS\" BASIS,\n") |
| out.WriteString("// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n") |
| out.WriteString("// See the License for the specific language governing permissions and\n") |
| out.WriteString("// limitations under the License.\n") |
| out.WriteString("\n") |
| out.WriteString("package cgen\n") |
| out.WriteString("\n") |
| |
| if err := genBase(out); err != nil { |
| return err |
| } |
| |
| formatted, err := format.Source(out.Bytes()) |
| if err != nil { |
| return err |
| } |
| return ioutil.WriteFile("data.go", formatted, 0644) |
| } |
| |
| func genBase(out *bytes.Buffer) error { |
| files := []struct { |
| filename, varname string |
| }{ |
| {"base/all-impl.c", "baseAllImplC"}, |
| {"base/image-impl.c", "baseImageImplC"}, |
| |
| {"base/core-private.h", "baseCorePrivateH"}, |
| {"base/core-public.h", "baseCorePublicH"}, |
| {"base/memory-private.h", "baseMemoryPrivateH"}, |
| {"base/memory-public.h", "baseMemoryPublicH"}, |
| {"base/image-private.h", "baseImagePrivateH"}, |
| {"base/image-public.h", "baseImagePublicH"}, |
| {"base/io-private.h", "baseIOPrivateH"}, |
| {"base/io-public.h", "baseIOPublicH"}, |
| {"base/range-private.h", "baseRangePrivateH"}, |
| {"base/range-public.h", "baseRangePublicH"}, |
| } |
| |
| prefixAfterEditing := []byte("// After editing this file,") |
| prefixCopyright := []byte("// Copyright ") |
| copyright := []byte(nil) |
| |
| for _, f := range files { |
| in, err := ioutil.ReadFile(f.filename) |
| if err != nil { |
| return err |
| } |
| |
| if !bytes.HasPrefix(in, prefixAfterEditing) { |
| return fmt.Errorf("%s's contents do not start with %q", f.filename, prefixAfterEditing) |
| } |
| if i := bytes.Index(in, []byte("\n\n")); i >= 0 { |
| in = in[i+2:] |
| } |
| |
| if !bytes.HasPrefix(in, prefixCopyright) { |
| return fmt.Errorf("%s's contents do not start with %q", f.filename, prefixCopyright) |
| } |
| if i := bytes.Index(in, []byte("\n\n")); i >= 0 { |
| if len(copyright) == 0 { |
| copyright = in[:i+2] |
| } |
| in = in[i+2:] |
| } |
| |
| fmt.Fprintf(out, "const %s = \"\" +\n", f.varname) |
| writeStringConst(out, in) |
| out.WriteString("\"\"\n\n") |
| } |
| |
| fmt.Fprintf(out, "const baseCopyright = \"\" +\n") |
| writeStringConst(out, copyright) |
| out.WriteString("\"\"\n\n") |
| return nil |
| } |
| |
| var dashDashDashDash = []byte("// ----") |
| |
| func writeStringConst(out *bytes.Buffer, s []byte) { |
| for len(s) > 0 { |
| remaining := []byte(nil) |
| if i := bytes.Index(s[1:], dashDashDashDash); i >= 0 { |
| s, remaining = s[:i+1], s[i+1:] |
| } |
| |
| for len(s) > 0 { |
| t := s |
| if len(t) > columns { |
| t = t[:columns] |
| } |
| s = s[len(t):] |
| fmt.Fprintf(out, "%q +\n", t) |
| } |
| |
| s = remaining |
| if len(s) > 0 { |
| out.WriteString("\"\" +\n") |
| } |
| } |
| } |