mirror of
https://github.com/fumiama/gozel.git
synced 2026-06-29 23:30:39 +08:00
feat(gen): finish def func & simple typedef parsing
This commit is contained in:
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +1,84 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
// Code generated by gen. DO NOT EDIT.
|
||||||
|
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2019-2025 Intel Corporation
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* @file ze_api.h
|
||||||
|
* @version v1.15-r1.15.31
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
package core
|
package core
|
||||||
|
|
||||||
|
/// @brief Generates generic 'oneAPI' API versions
|
||||||
|
func ZE_MAKE_VERSION[T ~int | ~uint64 | ~uintptr](_major T, _minor T) T {
|
||||||
|
return (( _major << 16 )|( _minor & 0x0000ffff))
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Extracts 'oneAPI' API major version
|
||||||
|
func ZE_MAJOR_VERSION[T ~int | ~uint64 | ~uintptr](_ver T) T {
|
||||||
|
return ( _ver >> 16 )
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief Extracts 'oneAPI' API minor version
|
||||||
|
func ZE_MINOR_VERSION[T ~int | ~uint64 | ~uintptr](_ver T) T {
|
||||||
|
return ( _ver & 0x0000ffff )
|
||||||
|
}
|
||||||
|
|
||||||
|
/// @brief compiler-independent type
|
||||||
|
type ZeBool uint8
|
||||||
|
|
||||||
|
/// @brief Handle of a driver instance
|
||||||
|
type ZeDriverHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's device object
|
||||||
|
type ZeDeviceHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's context object
|
||||||
|
type ZeContextHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's command queue object
|
||||||
|
type ZeCommandQueueHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's command list object
|
||||||
|
type ZeCommandListHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's fence object
|
||||||
|
type ZeFenceHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's event pool object
|
||||||
|
type ZeEventPoolHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's event object
|
||||||
|
type ZeEventHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's image object
|
||||||
|
type ZeImageHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's module object
|
||||||
|
type ZeModuleHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of module's build log object
|
||||||
|
type ZeModuleBuildLogHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's kernel object
|
||||||
|
type ZeKernelHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's sampler object
|
||||||
|
type ZeSamplerHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of physical memory object
|
||||||
|
type ZePhysicalMemHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's fabric vertex object
|
||||||
|
type ZeFabricVertexHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Handle of driver's fabric edge object
|
||||||
|
type ZeFabricEdgeHandle uintptr
|
||||||
|
|
||||||
|
/// @brief Maximum IPC handle size
|
||||||
|
const ZE_MAX_IPC_HANDLE_SIZE = 64
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
// Code generated by gen. DO NOT EDIT.
|
|
||||||
|
|
||||||
package core
|
|
||||||
10
gen/main.go
10
gen/main.go
@@ -22,6 +22,7 @@ func main() {
|
|||||||
if strings.HasPrefix(*spec, "v") {
|
if strings.HasPrefix(*spec, "v") {
|
||||||
ver := (*spec)[1:]
|
ver := (*spec)[1:]
|
||||||
u := fmt.Sprintf("https://github.com/oneapi-src/level-zero/releases/download/v%s/level-zero-win-sdk-%s.zip", ver, ver)
|
u := fmt.Sprintf("https://github.com/oneapi-src/level-zero/releases/download/v%s/level-zero-win-sdk-%s.zip", ver, ver)
|
||||||
|
fmt.Println("[main] downloading spec from", u)
|
||||||
resp, err := http.Get(u)
|
resp, err := http.Get(u)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
@@ -37,6 +38,7 @@ func main() {
|
|||||||
}
|
}
|
||||||
specdir = r
|
specdir = r
|
||||||
} else {
|
} else {
|
||||||
|
fmt.Println("[main] reading local spec from", *spec)
|
||||||
specdir = os.DirFS(*spec)
|
specdir = os.DirFS(*spec)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,7 +47,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
scanheader("core", bufio.NewScanner(f))
|
scanHeader("core", bufio.NewScanner(f))
|
||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
fmt.Println("[main] finish parsing core")
|
fmt.Println("[main] finish parsing core")
|
||||||
|
|
||||||
@@ -54,7 +56,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
scanheader("rntm", bufio.NewScanner(f))
|
scanHeader("rntm", bufio.NewScanner(f))
|
||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
fmt.Println("[main] finish parsing runtime")
|
fmt.Println("[main] finish parsing runtime")
|
||||||
|
|
||||||
@@ -63,7 +65,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
scanheader("sysm", bufio.NewScanner(f))
|
scanHeader("sysm", bufio.NewScanner(f))
|
||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
fmt.Println("[main] finish parsing sysman")
|
fmt.Println("[main] finish parsing sysman")
|
||||||
|
|
||||||
@@ -72,7 +74,7 @@ func main() {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(err)
|
panic(err)
|
||||||
}
|
}
|
||||||
scanheader("tols", bufio.NewScanner(f))
|
scanHeader("tols", bufio.NewScanner(f))
|
||||||
_ = f.Close()
|
_ = f.Close()
|
||||||
fmt.Println("[main] finish parsing tools")
|
fmt.Println("[main] finish parsing tools")
|
||||||
}
|
}
|
||||||
|
|||||||
118
gen/scan.go
118
gen/scan.go
@@ -19,7 +19,7 @@ func infh(name string) string {
|
|||||||
return s
|
return s
|
||||||
}
|
}
|
||||||
|
|
||||||
func scanheader(name string, scan *bufio.Scanner) {
|
func scanHeader(name string, scan *bufio.Scanner) {
|
||||||
ln := 0
|
ln := 0
|
||||||
var regionfile *os.File
|
var regionfile *os.File
|
||||||
symtab := symbolTable{
|
symtab := symbolTable{
|
||||||
@@ -27,13 +27,19 @@ func scanheader(name string, scan *bufio.Scanner) {
|
|||||||
"ZE_APIEXPORT": symbol{symbolTypeConst, "ZE_APIEXPORT", []string{""}},
|
"ZE_APIEXPORT": symbol{symbolTypeConst, "ZE_APIEXPORT", []string{""}},
|
||||||
"ZE_DLLEXPORT": symbol{symbolTypeConst, "ZE_DLLEXPORT", []string{""}},
|
"ZE_DLLEXPORT": symbol{symbolTypeConst, "ZE_DLLEXPORT", []string{""}},
|
||||||
}
|
}
|
||||||
|
fileheadersb := strings.Builder{}
|
||||||
|
region := ""
|
||||||
for scan.Scan() {
|
for scan.Scan() {
|
||||||
ln++
|
ln++
|
||||||
t := scan.Text()
|
t := scan.Text()
|
||||||
switch {
|
switch {
|
||||||
|
// file headers
|
||||||
|
case strings.HasPrefix(t, "/*") || strings.HasPrefix(t, " *") || strings.HasPrefix(t, " */"):
|
||||||
|
fileheadersb.WriteString(t)
|
||||||
|
fileheadersb.WriteString("\n")
|
||||||
// pragma start
|
// pragma start
|
||||||
case strings.HasPrefix(t, "#pragma region "):
|
case strings.HasPrefix(t, "#pragma region "):
|
||||||
region := strings.TrimSpace(t[15:])
|
region = strings.TrimSpace(t[15:])
|
||||||
if region == "" {
|
if region == "" {
|
||||||
panic(fmt.Sprintf("%s L%d: unexpected empty region", name, ln))
|
panic(fmt.Sprintf("%s L%d: unexpected empty region", name, ln))
|
||||||
}
|
}
|
||||||
@@ -47,25 +53,49 @@ func scanheader(name string, scan *bufio.Scanner) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
panic(fmt.Sprintf("%s L%d: cannot create region %s, err: %v", name, ln, region, err))
|
panic(fmt.Sprintf("%s L%d: cannot create region %s, err: %v", name, ln, region, err))
|
||||||
}
|
}
|
||||||
f.WriteString("// Code generated by gen. DO NOT EDIT.\n\npackage ")
|
f.WriteString("// Code generated by gen. DO NOT EDIT.\n\n")
|
||||||
f.WriteString(name)
|
f.WriteString(fileheadersb.String())
|
||||||
f.WriteString("\n")
|
f.WriteString("\n")
|
||||||
|
f.WriteString("package ")
|
||||||
|
f.WriteString(name)
|
||||||
|
f.WriteString("\n\n")
|
||||||
regionfile = f
|
regionfile = f
|
||||||
// block barrier
|
// block barrier
|
||||||
case strings.HasPrefix(t, "///////////////////////////////////////////////////////////////////////////////"):
|
case strings.HasPrefix(t, "///////////////////////////////////////////////////////////////////////////////"):
|
||||||
regionfile.WriteString(t)
|
fmt.Println(" [scan] enter", region, "block")
|
||||||
regionfile.WriteString("\n")
|
ln = scanBlocks(name, scan, regionfile, ln, symtab)
|
||||||
ln = scanblocks(name, scan, regionfile, ln, symtab)
|
fmt.Println(" [scan] leave", region, "block")
|
||||||
// pragma end
|
// pragma end
|
||||||
case strings.HasPrefix(t, "#pragma endregion"):
|
case strings.HasPrefix(t, "#pragma endregion"):
|
||||||
fmt.Println(infh(name), "close region", regionfile.Name())
|
fmt.Println(infh(name), "close region", regionfile.Name())
|
||||||
_ = regionfile.Close()
|
_ = regionfile.Close()
|
||||||
regionfile = nil
|
regionfile = nil
|
||||||
|
// skip outer #
|
||||||
|
case strings.HasPrefix(t, "#") || t == "" || strings.HasPrefix(t, "// ") ||
|
||||||
|
strings.HasPrefix(t, "extern "):
|
||||||
|
fmt.Println(" [scan] skip", t)
|
||||||
|
continue
|
||||||
|
default:
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected line %s", name, ln, t))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func scanblocks(
|
func checkSymbolName(
|
||||||
|
symtab symbolTable, ln int, name, sname string,
|
||||||
|
sb *strings.Builder, f *os.File, eq func() symbol) {
|
||||||
|
if _, ok := symtab[sname]; ok {
|
||||||
|
panic(fmt.Sprintf("%s L%d: func #define %s has been defined", name, ln, sname))
|
||||||
|
}
|
||||||
|
symtab[sname] = eq()
|
||||||
|
if sb.Len() == 0 {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected non-comment for symbol %s", name, ln, sname))
|
||||||
|
}
|
||||||
|
f.WriteString(sb.String())
|
||||||
|
sb.Reset()
|
||||||
|
}
|
||||||
|
|
||||||
|
func scanBlocks(
|
||||||
name string, scan *bufio.Scanner, f *os.File,
|
name string, scan *bufio.Scanner, f *os.File,
|
||||||
ln int, symtab symbolTable,
|
ln int, symtab symbolTable,
|
||||||
) int {
|
) int {
|
||||||
@@ -119,7 +149,77 @@ func scanblocks(
|
|||||||
panic(fmt.Sprintf("%s L%d: unexpected unpaired #endif", name, ln))
|
panic(fmt.Sprintf("%s L%d: unexpected unpaired #endif", name, ln))
|
||||||
}
|
}
|
||||||
case strings.HasPrefix(t, "#define "):
|
case strings.HasPrefix(t, "#define "):
|
||||||
|
if !strings.Contains(t, "(") { // is const define
|
||||||
|
argseval := trimEmptyStringArray(strings.Split(t[8:], " "))
|
||||||
|
if len(argseval) != 2 {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected const #define line %s", name, ln, t))
|
||||||
|
}
|
||||||
|
sname := strings.TrimSpace(argseval[0])
|
||||||
|
val := strings.TrimSpace(argseval[1])
|
||||||
|
checkSymbolName(symtab, ln, name, sname, &sb, f, func() symbol {
|
||||||
|
return newSymbolConst(sname, val)
|
||||||
|
})
|
||||||
|
f.WriteString("const ")
|
||||||
|
f.WriteString(sname)
|
||||||
|
f.WriteString(" = ")
|
||||||
|
f.WriteString(val)
|
||||||
|
f.WriteString("\n\n")
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
sname, argseval, ok := strings.Cut(t[8:], "(")
|
||||||
|
if !ok {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected #define line %s", name, ln, t))
|
||||||
|
}
|
||||||
|
args, n, err := getInsideRoundBrakets(argseval)
|
||||||
|
if err != nil {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected args bracket err: %v", name, ln, err))
|
||||||
|
}
|
||||||
|
sname = strings.TrimSpace(sname)
|
||||||
|
args = strings.TrimSpace(args)
|
||||||
|
eval := strings.TrimSpace(argseval[n+1:])
|
||||||
|
checkSymbolName(symtab, ln, name, sname, &sb, f, func() symbol {
|
||||||
|
return newSymbolFunc(sname, args, eval)
|
||||||
|
})
|
||||||
|
f.WriteString("func ")
|
||||||
|
f.WriteString(sname)
|
||||||
|
f.WriteString("[T ~int | ~uint64 | ~uintptr](")
|
||||||
|
f.WriteString(strings.Join(strings.Split(args, ","), " T,"))
|
||||||
|
f.WriteString(" T) T {\n\treturn ")
|
||||||
|
f.WriteString(eval)
|
||||||
|
f.WriteString("\n}\n\n")
|
||||||
|
case strings.HasPrefix(t, "typedef "):
|
||||||
|
s, newln := get1sentence(t, scan, ln)
|
||||||
|
if newln < 0 {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected sentence end from", name, ln))
|
||||||
|
}
|
||||||
|
ln = newln
|
||||||
|
typs := trimEmptyStringArray(strings.Split(s[8:], " "))
|
||||||
|
if len(typs) == 0 {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected typdef line %s", name, ln, t))
|
||||||
|
}
|
||||||
|
if strings.TrimSpace(typs[0]) == "struct" {
|
||||||
|
if len(typs) != 3 || !strings.Contains(typs[1], "handle_t") ||
|
||||||
|
!strings.Contains(typs[2], "*") {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected typdef line %s", name, ln, t))
|
||||||
|
}
|
||||||
|
typs = typs[1:]
|
||||||
|
typs[0] = "uintptr"
|
||||||
|
typs[1] = strings.TrimPrefix(strings.TrimSpace(typs[1]), "*")
|
||||||
|
}
|
||||||
|
if len(typs) != 2 {
|
||||||
|
panic(fmt.Sprintf("%s L%d: unexpected typdef line %s", name, ln, t))
|
||||||
|
}
|
||||||
|
sname := strings.TrimSpace(strings.TrimSuffix(strings.TrimSpace(typs[1]), ";"))
|
||||||
|
val := us2camel(strings.TrimSuffix(sname, "_t"))
|
||||||
|
origtyp := strings.TrimSuffix(strings.TrimSpace(typs[0]), "_t")
|
||||||
|
checkSymbolName(symtab, ln, name, sname, &sb, f, func() symbol {
|
||||||
|
return newSymbolConst(sname, val)
|
||||||
|
})
|
||||||
|
f.WriteString("type ")
|
||||||
|
f.WriteString(val)
|
||||||
|
f.WriteString(" ")
|
||||||
|
f.WriteString(origtyp)
|
||||||
|
f.WriteString("\n\n")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return ln
|
return ln
|
||||||
|
|||||||
46
gen/skip.go
46
gen/skip.go
@@ -1,46 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bufio"
|
|
||||||
"errors"
|
|
||||||
"strings"
|
|
||||||
)
|
|
||||||
|
|
||||||
func skip2endif(scan *bufio.Scanner, ln int) int {
|
|
||||||
depth := 1
|
|
||||||
for scan.Scan() {
|
|
||||||
ln++
|
|
||||||
t := scan.Text()
|
|
||||||
switch {
|
|
||||||
case strings.HasPrefix(t, "#endif"):
|
|
||||||
depth--
|
|
||||||
case strings.HasPrefix(t, "#if"):
|
|
||||||
depth++
|
|
||||||
default:
|
|
||||||
}
|
|
||||||
if depth <= 0 {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return ln
|
|
||||||
}
|
|
||||||
|
|
||||||
func getinside0brakets(txt string) (string, int, error) {
|
|
||||||
depth := 0
|
|
||||||
a := 0
|
|
||||||
for i, t := range txt {
|
|
||||||
switch t {
|
|
||||||
case '(':
|
|
||||||
if depth == 0 {
|
|
||||||
a = i + 1
|
|
||||||
}
|
|
||||||
depth++
|
|
||||||
case ')':
|
|
||||||
depth--
|
|
||||||
if depth <= 0 {
|
|
||||||
return txt[a:i], i, nil
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return "", 0, errors.New("no round brakets pair in " + txt)
|
|
||||||
}
|
|
||||||
@@ -40,7 +40,7 @@ type symbol struct {
|
|||||||
fields []string
|
fields []string
|
||||||
}
|
}
|
||||||
|
|
||||||
func newsymbolconst(name, val string) symbol {
|
func newSymbolConst(name, val string) symbol {
|
||||||
return symbol{
|
return symbol{
|
||||||
stype: symbolTypeConst,
|
stype: symbolTypeConst,
|
||||||
name: name,
|
name: name,
|
||||||
@@ -48,7 +48,7 @@ func newsymbolconst(name, val string) symbol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func newsymbolfunc(name, paras, evals string) symbol {
|
func newSymbolFunc(name, paras, evals string) symbol {
|
||||||
return symbol{
|
return symbol{
|
||||||
stype: symbolTypeConst,
|
stype: symbolTypeConst,
|
||||||
name: name,
|
name: name,
|
||||||
@@ -56,7 +56,7 @@ func newsymbolfunc(name, paras, evals string) symbol {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *symbol) extractfirstfunc(txt string) (args []string, a, b int, err error) {
|
func (s *symbol) extract1stFunc(txt string) (args []string, a, b int, err error) {
|
||||||
if s.stype == symbolTypeConst {
|
if s.stype == symbolTypeConst {
|
||||||
return nil, 0, 0, errIsConstReplace
|
return nil, 0, 0, errIsConstReplace
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ func (s *symbol) extractfirstfunc(txt string) (args []string, a, b int, err erro
|
|||||||
if a < 0 {
|
if a < 0 {
|
||||||
return nil, 0, 0, errNoSuchSymbol
|
return nil, 0, 0, errNoSuchSymbol
|
||||||
}
|
}
|
||||||
str, off, err := getinside0brakets(txt[a:])
|
str, off, err := getInsideRoundBrakets(txt[a:])
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, 0, 0, err
|
return nil, 0, 0, err
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ func (s *symbol) replace(txt string) string {
|
|||||||
case symbolTypeFunc:
|
case symbolTypeFunc:
|
||||||
paras := strings.Split(s.fields[0], ",")
|
paras := strings.Split(s.fields[0], ",")
|
||||||
for {
|
for {
|
||||||
args, a, b, err := s.extractfirstfunc(txt)
|
args, a, b, err := s.extract1stFunc(txt)
|
||||||
if err == errNoSuchSymbol {
|
if err == errNoSuchSymbol {
|
||||||
return txt
|
return txt
|
||||||
}
|
}
|
||||||
88
gen/utils.go
Normal file
88
gen/utils.go
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"errors"
|
||||||
|
"strings"
|
||||||
|
"unicode"
|
||||||
|
)
|
||||||
|
|
||||||
|
func skip2endif(scan *bufio.Scanner, ln int) int {
|
||||||
|
depth := 1
|
||||||
|
for scan.Scan() {
|
||||||
|
ln++
|
||||||
|
t := scan.Text()
|
||||||
|
switch {
|
||||||
|
case strings.HasPrefix(t, "#endif"):
|
||||||
|
depth--
|
||||||
|
case strings.HasPrefix(t, "#if"):
|
||||||
|
depth++
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
if depth <= 0 {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ln
|
||||||
|
}
|
||||||
|
|
||||||
|
func getInsideRoundBrakets(txt string) (string, int, error) {
|
||||||
|
depth := 0
|
||||||
|
a := 0
|
||||||
|
for i, t := range txt {
|
||||||
|
switch t {
|
||||||
|
case '(':
|
||||||
|
if depth == 0 {
|
||||||
|
a = i + 1
|
||||||
|
}
|
||||||
|
depth++
|
||||||
|
case ')':
|
||||||
|
depth--
|
||||||
|
if depth <= 0 {
|
||||||
|
return txt[a:i], i, nil
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", 0, errors.New("no round brakets pair in " + txt)
|
||||||
|
}
|
||||||
|
|
||||||
|
func get1sentence(firstln string, scan *bufio.Scanner, ln int) (string, int) {
|
||||||
|
if strings.Contains(firstln, ";") {
|
||||||
|
return firstln, ln
|
||||||
|
}
|
||||||
|
sb := strings.Builder{}
|
||||||
|
sb.WriteString(firstln)
|
||||||
|
for scan.Scan() {
|
||||||
|
sb.WriteString("\n")
|
||||||
|
t := scan.Text()
|
||||||
|
ln++
|
||||||
|
sb.WriteString(t)
|
||||||
|
if strings.Contains(t, ";") {
|
||||||
|
return sb.String(), ln
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return "", -1
|
||||||
|
}
|
||||||
|
|
||||||
|
func us2camel(t string) string {
|
||||||
|
sb := strings.Builder{}
|
||||||
|
for s := range strings.SplitSeq(t, "_") {
|
||||||
|
rs := []rune(s)
|
||||||
|
sb.WriteRune(unicode.ToUpper(rs[0]))
|
||||||
|
for _, r := range rs[1:] {
|
||||||
|
sb.WriteRune(unicode.ToLower(r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sb.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func trimEmptyStringArray(arr []string) []string {
|
||||||
|
news := make([]string, 0, len(arr))
|
||||||
|
for _, s := range arr {
|
||||||
|
if s == "" {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
news = append(news, s)
|
||||||
|
}
|
||||||
|
return news
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user