aboutsummaryrefslogtreecommitdiffstats
path: root/prog/rand.go
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2018-04-02 14:21:45 +0200
committerDmitry Vyukov <dvyukov@google.com>2018-04-02 20:10:07 +0200
commit3e679c51c03ac13a5b4b601873689925eda3cc16 (patch)
treecc4d32d731ff4eca66ae2af36d3bd229b8f08a4d /prog/rand.go
parent374050e90404a9eeea577d7c97fbc6ef0dacd478 (diff)
pkg/compiler: support non-zero terminated filenames
Now file names become: string[filename] with a possibility of using other string features: stringnoz[filename] string[filename, CONST_SIZE] and filename is left as type alias as it is commonly used: type filename string[filename]
Diffstat (limited to 'prog/rand.go')
-rw-r--r--prog/rand.go32
1 files changed, 21 insertions, 11 deletions
diff --git a/prog/rand.go b/prog/rand.go
index ec5e378ca..1c31468e0 100644
--- a/prog/rand.go
+++ b/prog/rand.go
@@ -152,32 +152,42 @@ func (r *randGen) flags(vv []uint64) (v uint64) {
func (r *randGen) filename(s *state, typ *BufferType) string {
fn := r.filenameImpl(s)
+ if len(fn) != 0 && fn[len(fn)-1] == 0 {
+ panic(fmt.Sprintf("zero-terminated filename: %q", fn))
+ }
if !typ.Varlen() {
size := typ.Size()
if uint64(len(fn)) < size {
fn += string(make([]byte, size-uint64(len(fn))))
}
fn = fn[:size]
+ } else if !typ.NoZ {
+ fn += "\x00"
}
return fn
}
+var specialFiles = []string{"", "/", "."}
+
func (r *randGen) filenameImpl(s *state) string {
- dir := "."
- if r.oneOf(2) && len(s.files) != 0 {
- files := make([]string, 0, len(s.files))
- for f := range s.files {
- files = append(files, f)
- }
- dir = files[r.Intn(len(files))]
- if len(dir) > 0 && dir[len(dir)-1] == 0 {
- dir = dir[:len(dir)-1]
- }
+ if r.oneOf(100) {
+ return specialFiles[r.Intn(len(specialFiles))]
}
if len(s.files) == 0 || r.oneOf(10) {
// Generate a new name.
+ dir := "."
+ if r.oneOf(2) && len(s.files) != 0 {
+ files := make([]string, 0, len(s.files))
+ for f := range s.files {
+ files = append(files, f)
+ }
+ dir = files[r.Intn(len(files))]
+ if len(dir) > 0 && dir[len(dir)-1] == 0 {
+ dir = dir[:len(dir)-1]
+ }
+ }
for i := 0; ; i++ {
- f := fmt.Sprintf("%v/file%v\x00", dir, i)
+ f := fmt.Sprintf("%v/file%v", dir, i)
if !s.files[f] {
return f
}