Skip to content

Instantly share code, notes, and snippets.

@ericlagergren
Last active January 20, 2016 22:48
Show Gist options
  • Save ericlagergren/720864e0ce16db66e681 to your computer and use it in GitHub Desktop.
Save ericlagergren/720864e0ce16db66e681 to your computer and use it in GitHub Desktop.
package main
import (
"archive/zip"
"bufio"
"fmt"
"io"
"log"
"os"
"sort"
"strings"
)
type lang struct {
name, url string
}
var langs = [...]lang{
{"cs", "https://msdn.microsoft.com/en-us/library/x53a06bb.aspx"},
{"cpp", "http://en.cppreference.com/w/cpp/keyword"},
{"go", "https://golang.org/ref/spec#Keywords"},
{"java", "https://docs.oracle.com/javase/tutorial/java/nutsandbolts/_keywords.html"},
{"js", "http://www.w3schools.com/js/js_reserved.asp"},
{"php", "https://secure.php.net/manual/en/reserved.keywords.php"},
{"python", "https://docs.python.org/2.5/ref/keywords.html"},
}
func main() {
file, err := os.Open("keywords.zip")
if err != nil {
log.Fatalln(err)
}
defer file.Close()
stat, err := file.Stat()
if err != nil {
log.Fatalln(err)
}
r, err := zip.NewReader(file, stat.Size())
if err != nil {
log.Fatalln(err)
}
keywords := make(map[lang][]string)
for i, f := range r.File {
zf, err := f.Open()
if err != nil {
log.Fatalln(err)
}
if err := readLines(langs[i], zf, keywords); err != nil {
log.Fatalln(err)
}
sort.Strings(keywords[langs[i]])
zf.Close()
}
fmt.Println(`#include <stdbool.h>
#include <string.h>
static bool contains(const char* const* kws, const char* name) {
while(*++kws) {
if (strcmp(*kws, name) == 0) {
return true;
}
}
return false;
}
`)
for lang, kws := range keywords {
print(lang, kws)
}
}
func readLines(lang lang, zf io.ReadCloser, m map[lang][]string) error {
r := bufio.NewScanner(zf)
var kw []string
for r.Scan() {
kw = append(kw, strings.TrimSpace(r.Text()))
}
m[lang] = kw
return r.Err()
}
func print(lang lang, m []string) {
fmt.Println("//" + lang.url)
fmt.Print("static const char* const ")
fmt.Print(lang.name)
fmt.Println("_identifiers[] = {")
ctr, _ := fmt.Print(`"` + m[0] + `"`)
if len(m) > 1 {
for _, k := range m[1:] {
n, _ := fmt.Print(`, "` + k + `"`)
ctr += n
if ctr >= 79 {
fmt.Print("\n")
ctr = 0
}
}
}
fmt.Println("\n};")
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment