1 | // Copyright 2020 The CCGO Authors. All rights reserved.
|
---|
2 | // Use of this source code is governed by a BSD-style
|
---|
3 | // license that can be found in the LICENSE file.
|
---|
4 |
|
---|
5 | package ccgo // import "modernc.org/ccgo/v3/lib"
|
---|
6 |
|
---|
7 | import (
|
---|
8 | "fmt"
|
---|
9 | "math"
|
---|
10 | "math/big"
|
---|
11 |
|
---|
12 | "modernc.org/cc/v3"
|
---|
13 | )
|
---|
14 |
|
---|
15 | var (
|
---|
16 | reservedNames = map[string]bool{
|
---|
17 | "bool": false, // ccgo can use
|
---|
18 | "break": true, // keyword
|
---|
19 | "case": true, // keyword
|
---|
20 | "chan": true, // keyword
|
---|
21 | "const": true, // keyword
|
---|
22 | "continue": true, // keyword
|
---|
23 | "default": true, // keyword
|
---|
24 | "defer": true, // keyword
|
---|
25 | "else": true, // keyword
|
---|
26 | "fallthrough": true, // keyword
|
---|
27 | "false": false, // ccgo can use
|
---|
28 | "float32": false, // ccgo can use
|
---|
29 | "float64": false, // ccgo can use
|
---|
30 | "for": true, // keyword
|
---|
31 | "func": true, // keyword
|
---|
32 | "go": true, // keyword
|
---|
33 | "goto": true, // keyword
|
---|
34 | "if": true, // keyword
|
---|
35 | "import": true, // keyword
|
---|
36 | "init": false, // special name
|
---|
37 | "int16": false, // ccgo can use
|
---|
38 | "int32": false, // ccgo can use
|
---|
39 | "int64": false, // ccgo can use
|
---|
40 | "int8": false, // ccgo can use
|
---|
41 | "interface": true, // keyword
|
---|
42 | "map": true, // keyword
|
---|
43 | "math": false, // package name
|
---|
44 | "nil": false, // ccgo can use
|
---|
45 | "package": true, // keyword
|
---|
46 | "range": true, // keyword
|
---|
47 | "return": true, // keyword
|
---|
48 | "select": true, // keyword
|
---|
49 | "struct": true, // keyword
|
---|
50 | "switch": true, // keyword
|
---|
51 | "true": false, // ccgo can use
|
---|
52 | "type": true, // keyword
|
---|
53 | "types": false, // package name
|
---|
54 | "uint16": false, // ccgo can use
|
---|
55 | "uint32": false, // ccgo can use
|
---|
56 | "uint64": false, // ccgo can use
|
---|
57 | "uint8": false, // ccgo can use
|
---|
58 | "uintptr": false, // ccgo can use
|
---|
59 | "unsafe": false, // package name
|
---|
60 | "var": true, // keyword
|
---|
61 | }
|
---|
62 |
|
---|
63 | reservedIds []cc.StringID
|
---|
64 |
|
---|
65 | maxInt32 = big.NewInt(math.MaxInt32)
|
---|
66 | maxInt64 = big.NewInt(math.MaxInt64)
|
---|
67 | maxUint32 = big.NewInt(math.MaxUint32)
|
---|
68 | maxUint64 = big.NewInt(0).SetUint64(math.MaxUint64)
|
---|
69 | minInt32 = big.NewInt(math.MinInt32)
|
---|
70 | minInt64 = big.NewInt(math.MinInt64)
|
---|
71 | )
|
---|
72 |
|
---|
73 | func init() {
|
---|
74 | for k := range reservedNames {
|
---|
75 | reservedIds = append(reservedIds, cc.String(k))
|
---|
76 | }
|
---|
77 | }
|
---|
78 |
|
---|
79 | type scope map[cc.StringID]int32
|
---|
80 |
|
---|
81 | func newScope() scope {
|
---|
82 | s := scope{}
|
---|
83 | for _, k := range reservedIds {
|
---|
84 | s[k] = 0
|
---|
85 | }
|
---|
86 | return s
|
---|
87 | }
|
---|
88 |
|
---|
89 | func (s scope) take(t cc.StringID) string {
|
---|
90 | if t == 0 {
|
---|
91 | panic(todo("internal error"))
|
---|
92 | }
|
---|
93 |
|
---|
94 | n, ok := s[t]
|
---|
95 | if !ok {
|
---|
96 | s[t] = 0
|
---|
97 | return t.String()
|
---|
98 | }
|
---|
99 |
|
---|
100 | for {
|
---|
101 | n++
|
---|
102 | s[t] = n
|
---|
103 | r := fmt.Sprintf("%s%d", t, n)
|
---|
104 | id := cc.String(r)
|
---|
105 | if _, ok := s[id]; !ok {
|
---|
106 | s[id] = 0
|
---|
107 | return r
|
---|
108 | }
|
---|
109 | }
|
---|
110 | }
|
---|