74 lines
1.5 KiB
Go
74 lines
1.5 KiB
Go
package compiler
|
|
|
|
import "c65gm/internal/preproc"
|
|
|
|
const (
|
|
asmStringDeclStart = " !raw "
|
|
asmStringDeclEnd = " !8 0"
|
|
asmCBMStringDeclStart = " !pet "
|
|
asmCBMStringDeclEnd = " !8 0"
|
|
)
|
|
|
|
type ConstantString struct {
|
|
label string
|
|
value string
|
|
compressable bool
|
|
useCBMStrings bool
|
|
}
|
|
|
|
type ConstantStringHandler struct {
|
|
strings []*ConstantString
|
|
compressMap map[string]string
|
|
}
|
|
|
|
func NewConstantStringHandler() *ConstantStringHandler {
|
|
return &ConstantStringHandler{
|
|
strings: make([]*ConstantString, 0),
|
|
compressMap: make(map[string]string),
|
|
}
|
|
}
|
|
|
|
func (h *ConstantStringHandler) AddConstStr(label, value string, compress bool, ps preproc.PragmaSet) string {
|
|
useCBM := ps.GetPragma("_P_USE_CBM_STRINGS") != ""
|
|
|
|
if compress {
|
|
if existingLabel, exists := h.compressMap[value]; exists {
|
|
return existingLabel
|
|
}
|
|
}
|
|
|
|
cs := &ConstantString{
|
|
label: label,
|
|
value: value,
|
|
compressable: compress,
|
|
useCBMStrings: useCBM,
|
|
}
|
|
|
|
h.strings = append(h.strings, cs)
|
|
|
|
if compress {
|
|
h.compressMap[value] = label
|
|
}
|
|
|
|
return label
|
|
}
|
|
|
|
func (h *ConstantStringHandler) GenerateConstStrDecls() []string {
|
|
result := make([]string, 0, len(h.strings)*3)
|
|
|
|
for _, cs := range h.strings {
|
|
startStr := asmStringDeclStart
|
|
endStr := asmStringDeclEnd
|
|
|
|
if cs.useCBMStrings {
|
|
startStr = asmCBMStringDeclStart
|
|
endStr = asmCBMStringDeclEnd
|
|
}
|
|
|
|
result = append(result, cs.label)
|
|
result = append(result, startStr+cs.value)
|
|
result = append(result, endStr)
|
|
}
|
|
|
|
return result
|
|
}
|