138 lines
3.4 KiB
Go
138 lines
3.4 KiB
Go
|
// Copyright 2015 The Go Authors. All rights reserved.
|
||
|
// Use of this source code is governed by a BSD-style
|
||
|
// license that can be found in the LICENSE file.
|
||
|
|
||
|
// +build ignore
|
||
|
|
||
|
package main
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/xml"
|
||
|
"fmt"
|
||
|
"io"
|
||
|
"log"
|
||
|
"strings"
|
||
|
|
||
|
"golang.org/x/text/internal/gen"
|
||
|
)
|
||
|
|
||
|
type registry struct {
|
||
|
XMLName xml.Name `xml:"registry"`
|
||
|
Updated string `xml:"updated"`
|
||
|
Registry []struct {
|
||
|
ID string `xml:"id,attr"`
|
||
|
Record []struct {
|
||
|
Name string `xml:"name"`
|
||
|
Xref []struct {
|
||
|
Type string `xml:"type,attr"`
|
||
|
Data string `xml:"data,attr"`
|
||
|
} `xml:"xref"`
|
||
|
Desc struct {
|
||
|
Data string `xml:",innerxml"`
|
||
|
// Any []struct {
|
||
|
// Data string `xml:",chardata"`
|
||
|
// } `xml:",any"`
|
||
|
// Data string `xml:",chardata"`
|
||
|
} `xml:"description,"`
|
||
|
MIB string `xml:"value"`
|
||
|
Alias []string `xml:"alias"`
|
||
|
MIME string `xml:"preferred_alias"`
|
||
|
} `xml:"record"`
|
||
|
} `xml:"registry"`
|
||
|
}
|
||
|
|
||
|
func main() {
|
||
|
r := gen.OpenIANAFile("assignments/character-sets/character-sets.xml")
|
||
|
reg := ®istry{}
|
||
|
if err := xml.NewDecoder(r).Decode(®); err != nil && err != io.EOF {
|
||
|
log.Fatalf("Error decoding charset registry: %v", err)
|
||
|
}
|
||
|
if len(reg.Registry) == 0 || reg.Registry[0].ID != "character-sets-1" {
|
||
|
log.Fatalf("Unexpected ID %s", reg.Registry[0].ID)
|
||
|
}
|
||
|
|
||
|
w := &bytes.Buffer{}
|
||
|
fmt.Fprintf(w, "const (\n")
|
||
|
for _, rec := range reg.Registry[0].Record {
|
||
|
constName := ""
|
||
|
for _, a := range rec.Alias {
|
||
|
if strings.HasPrefix(a, "cs") && strings.IndexByte(a, '-') == -1 {
|
||
|
// Some of the constant definitions have comments in them. Strip those.
|
||
|
constName = strings.Title(strings.SplitN(a[2:], "\n", 2)[0])
|
||
|
}
|
||
|
}
|
||
|
if constName == "" {
|
||
|
switch rec.MIB {
|
||
|
case "2085":
|
||
|
constName = "HZGB2312" // Not listed as alias for some reason.
|
||
|
default:
|
||
|
log.Fatalf("No cs alias defined for %s.", rec.MIB)
|
||
|
}
|
||
|
}
|
||
|
if rec.MIME != "" {
|
||
|
rec.MIME = fmt.Sprintf(" (MIME: %s)", rec.MIME)
|
||
|
}
|
||
|
fmt.Fprintf(w, "// %s is the MIB identifier with IANA name %s%s.\n//\n", constName, rec.Name, rec.MIME)
|
||
|
if len(rec.Desc.Data) > 0 {
|
||
|
fmt.Fprint(w, "// ")
|
||
|
d := xml.NewDecoder(strings.NewReader(rec.Desc.Data))
|
||
|
inElem := true
|
||
|
attr := ""
|
||
|
for {
|
||
|
t, err := d.Token()
|
||
|
if err != nil {
|
||
|
if err != io.EOF {
|
||
|
log.Fatal(err)
|
||
|
}
|
||
|
break
|
||
|
}
|
||
|
switch x := t.(type) {
|
||
|
case xml.CharData:
|
||
|
attr = "" // Don't need attribute info.
|
||
|
a := bytes.Split([]byte(x), []byte("\n"))
|
||
|
for i, b := range a {
|
||
|
if b = bytes.TrimSpace(b); len(b) != 0 {
|
||
|
if !inElem && i > 0 {
|
||
|
fmt.Fprint(w, "\n// ")
|
||
|
}
|
||
|
inElem = false
|
||
|
fmt.Fprintf(w, "%s ", string(b))
|
||
|
}
|
||
|
}
|
||
|
case xml.StartElement:
|
||
|
if x.Name.Local == "xref" {
|
||
|
inElem = true
|
||
|
use := false
|
||
|
for _, a := range x.Attr {
|
||
|
if a.Name.Local == "type" {
|
||
|
use = use || a.Value != "person"
|
||
|
}
|
||
|
if a.Name.Local == "data" && use {
|
||
|
attr = a.Value + " "
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
case xml.EndElement:
|
||
|
inElem = false
|
||
|
fmt.Fprint(w, attr)
|
||
|
}
|
||
|
}
|
||
|
fmt.Fprint(w, "\n")
|
||
|
}
|
||
|
for _, x := range rec.Xref {
|
||
|
switch x.Type {
|
||
|
case "rfc":
|
||
|
fmt.Fprintf(w, "// Reference: %s\n", strings.ToUpper(x.Data))
|
||
|
case "uri":
|
||
|
fmt.Fprintf(w, "// Reference: %s\n", x.Data)
|
||
|
}
|
||
|
}
|
||
|
fmt.Fprintf(w, "%s MIB = %s\n", constName, rec.MIB)
|
||
|
fmt.Fprintln(w)
|
||
|
}
|
||
|
fmt.Fprintln(w, ")")
|
||
|
|
||
|
gen.WriteGoFile("mib.go", "identifier", w.Bytes())
|
||
|
}
|