mirror of
https://github.com/php/frankenphp.git
synced 2026-03-24 00:52:11 +01:00
83 lines
1.7 KiB
Go
83 lines
1.7 KiB
Go
package extgen
|
|
|
|
import (
|
|
"github.com/Masterminds/sprig/v3"
|
|
|
|
"bytes"
|
|
_ "embed"
|
|
"path/filepath"
|
|
"strings"
|
|
"text/template"
|
|
)
|
|
|
|
//go:embed templates/extension.c.tpl
|
|
var cFileContent string
|
|
|
|
type cFileGenerator struct {
|
|
generator *Generator
|
|
}
|
|
|
|
type cTemplateData struct {
|
|
BaseName string
|
|
Functions []phpFunction
|
|
Classes []phpClass
|
|
Constants []phpConstant
|
|
Namespace string
|
|
}
|
|
|
|
func (cg *cFileGenerator) generate() error {
|
|
filename := filepath.Join(cg.generator.BuildDir, cg.generator.BaseName+".c")
|
|
content, err := cg.buildContent()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
return writeFile(filename, content)
|
|
}
|
|
|
|
func (cg *cFileGenerator) buildContent() (string, error) {
|
|
var builder strings.Builder
|
|
|
|
templateContent, err := cg.getTemplateContent()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
builder.WriteString(templateContent)
|
|
|
|
for _, fn := range cg.generator.Functions {
|
|
fnGen := PHPFuncGenerator{
|
|
paramParser: &ParameterParser{},
|
|
namespace: cg.generator.Namespace,
|
|
}
|
|
builder.WriteString(fnGen.generate(fn))
|
|
}
|
|
|
|
return builder.String(), nil
|
|
}
|
|
|
|
func (cg *cFileGenerator) getTemplateContent() (string, error) {
|
|
funcMap := sprig.FuncMap()
|
|
funcMap["namespacedClassName"] = NamespacedName
|
|
funcMap["cString"] = escapeCString
|
|
|
|
tmpl := template.Must(template.New("cfile").Funcs(funcMap).Parse(cFileContent))
|
|
|
|
var buf bytes.Buffer
|
|
if err := tmpl.Execute(&buf, cTemplateData{
|
|
BaseName: cg.generator.BaseName,
|
|
Functions: cg.generator.Functions,
|
|
Classes: cg.generator.Classes,
|
|
Constants: cg.generator.Constants,
|
|
Namespace: cg.generator.Namespace,
|
|
}); err != nil {
|
|
return "", err
|
|
}
|
|
|
|
return buf.String(), nil
|
|
}
|
|
|
|
// escapeCString escapes backslashes for C string literals
|
|
func escapeCString(s string) string {
|
|
return strings.ReplaceAll(s, `\`, `\\`)
|
|
}
|