| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| // +build !build_with_native_toolchain |
| |
| package util |
| |
| import ( |
| "fmt" |
| "gen/config" |
| "strings" |
| ) |
| |
| // Generates a string containing a sequence of the specified size. |
| // 0x01, 0x02, ... |
| func List(n int, values ValueGenerator) string { |
| if n <= 256 { |
| // Note: if this if block wasn't here, then a comment would be |
| // generated when n == 256. |
| return ListNoComments(n, values) |
| } |
| |
| var builder strings.Builder |
| bytes256 := ListNoComments(256, values) |
| nBlocks256 := n / 256 |
| nRemaining := n % 256 |
| |
| for i := 0; i < nBlocks256; i++ { |
| start := i*256 + 1 |
| end := (i + 1) * 256 |
| if i > 0 { |
| builder.WriteString("\n\n") |
| } |
| builder.WriteString(fmt.Sprintf("// %d - %d\n", start, end)) |
| builder.WriteString(bytes256) |
| } |
| |
| if nRemaining > 0 { |
| builder.WriteString("\n\n") |
| start := nBlocks256*256 + 1 |
| end := nBlocks256*256 + nRemaining |
| builder.WriteString(fmt.Sprintf("// %d - %d\n", start, end)) |
| builder.WriteString(ListNoComments(nRemaining, values)) |
| } |
| return builder.String() |
| } |
| |
| // Generates a string containing a sequence of a specified size that has |
| // no section breaks or comments. |
| func ListNoComments(n int, values ValueGenerator) string { |
| var builder strings.Builder |
| for i := 0; i < n/8; i++ { |
| if i > 0 { |
| builder.WriteRune('\n') |
| } |
| builder.WriteString(fmt.Sprintf("%s, %s, %s, %s, %s, %s, %s, %s,", |
| values.next(), values.next(), values.next(), values.next(), values.next(), values.next(), values.next(), values.next())) |
| } |
| if n/8 > 0 && n%8 > 0 { |
| builder.WriteRune('\n') |
| } |
| for i := 0; i < n%8; i++ { |
| if i != 0 { |
| builder.WriteRune(' ') |
| } |
| builder.WriteString(fmt.Sprintf("%s,", values.next())) |
| } |
| return builder.String() |
| } |
| |
| func Fields(start, end int, fieldPrefix string, values ValueGenerator) string { |
| var builder strings.Builder |
| for i := start; i <= end; i++ { |
| if i > start { |
| builder.WriteRune('\n') |
| } |
| builder.WriteString(fmt.Sprintf("%s%d: %s,", fieldPrefix, i, values.next())) |
| } |
| return builder.String() |
| } |
| |
| func RepeatHandleDef(hd config.HandleDef, n int) []config.HandleDef { |
| defs := make([]config.HandleDef, n) |
| for i := range defs { |
| defs[i] = hd |
| } |
| return defs |
| } |