gtsocial-umbx

Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

etc.go (2758B)


      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 }