diff options
| author | Dmitry Vyukov <dvyukov@google.com> | 2018-04-02 14:21:45 +0200 |
|---|---|---|
| committer | Dmitry Vyukov <dvyukov@google.com> | 2018-04-02 20:10:07 +0200 |
| commit | 3e679c51c03ac13a5b4b601873689925eda3cc16 (patch) | |
| tree | cc4d32d731ff4eca66ae2af36d3bd229b8f08a4d /prog/rand.go | |
| parent | 374050e90404a9eeea577d7c97fbc6ef0dacd478 (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.go | 32 |
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 } |
