diff options
Diffstat (limited to 'vendor/modernc.org/ccgo/v3/lib/etc.go')
-rw-r--r-- | vendor/modernc.org/ccgo/v3/lib/etc.go | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/vendor/modernc.org/ccgo/v3/lib/etc.go b/vendor/modernc.org/ccgo/v3/lib/etc.go new file mode 100644 index 00000000..e3b8c577 --- /dev/null +++ b/vendor/modernc.org/ccgo/v3/lib/etc.go @@ -0,0 +1,110 @@ +// Copyright 2020 The CCGO Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package ccgo // import "modernc.org/ccgo/v3/lib" + +import ( + "fmt" + "math" + "math/big" + + "modernc.org/cc/v3" +) + +var ( + reservedNames = map[string]bool{ + "bool": false, // ccgo can use + "break": true, // keyword + "case": true, // keyword + "chan": true, // keyword + "const": true, // keyword + "continue": true, // keyword + "default": true, // keyword + "defer": true, // keyword + "else": true, // keyword + "fallthrough": true, // keyword + "false": false, // ccgo can use + "float32": false, // ccgo can use + "float64": false, // ccgo can use + "for": true, // keyword + "func": true, // keyword + "go": true, // keyword + "goto": true, // keyword + "if": true, // keyword + "import": true, // keyword + "init": false, // special name + "int16": false, // ccgo can use + "int32": false, // ccgo can use + "int64": false, // ccgo can use + "int8": false, // ccgo can use + "interface": true, // keyword + "map": true, // keyword + "math": false, // package name + "nil": false, // ccgo can use + "package": true, // keyword + "range": true, // keyword + "return": true, // keyword + "select": true, // keyword + "struct": true, // keyword + "switch": true, // keyword + "true": false, // ccgo can use + "type": true, // keyword + "types": false, // package name + "uint16": false, // ccgo can use + "uint32": false, // ccgo can use + "uint64": false, // ccgo can use + "uint8": false, // ccgo can use + "uintptr": false, // ccgo can use + "unsafe": false, // package name + "var": true, // keyword + } + + reservedIds []cc.StringID + + maxInt32 = big.NewInt(math.MaxInt32) + maxInt64 = big.NewInt(math.MaxInt64) + maxUint32 = big.NewInt(math.MaxUint32) + maxUint64 = big.NewInt(0).SetUint64(math.MaxUint64) + minInt32 = big.NewInt(math.MinInt32) + minInt64 = big.NewInt(math.MinInt64) +) + +func init() { + for k := range reservedNames { + reservedIds = append(reservedIds, cc.String(k)) + } +} + +type scope map[cc.StringID]int32 + +func newScope() scope { + s := scope{} + for _, k := range reservedIds { + s[k] = 0 + } + return s +} + +func (s scope) take(t cc.StringID) string { + if t == 0 { + panic(todo("internal error")) + } + + n, ok := s[t] + if !ok { + s[t] = 0 + return t.String() + } + + for { + n++ + s[t] = n + r := fmt.Sprintf("%s%d", t, n) + id := cc.String(r) + if _, ok := s[id]; !ok { + s[id] = 0 + return r + } + } +} |