utils.go 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package stdout
  2. import (
  3. "fmt"
  4. "io"
  5. "strconv"
  6. "strings"
  7. )
  8. func SafeString(str string) string {
  9. str = strings.Replace(str, "\\", "\\\\", -1)
  10. str = strings.Replace(str, "\"", "\\\"", -1)
  11. return "\"" + str + "\""
  12. }
  13. func PrintMatrix(writer io.Writer, matrix [][]int64, indent int, name string, fixNegative bool) {
  14. // determine the maximum length of each value
  15. var maxnum int64 = -(1 << 32)
  16. var minnum int64 = 1 << 32
  17. for _, status := range matrix {
  18. for _, val := range status {
  19. if val > maxnum {
  20. maxnum = val
  21. }
  22. if val < minnum {
  23. minnum = val
  24. }
  25. }
  26. }
  27. width := len(strconv.FormatInt(maxnum, 10))
  28. if !fixNegative && minnum < 0 {
  29. negativeWidth := len(strconv.FormatInt(minnum, 10))
  30. if negativeWidth > width {
  31. width = negativeWidth
  32. }
  33. }
  34. last := len(matrix[len(matrix)-1])
  35. if name != "" {
  36. fmt.Fprintf(writer, "%s%s: |-\n", strings.Repeat(" ", indent), SafeString(name))
  37. indent += 2
  38. }
  39. // print the resulting triangular matrix
  40. first := true
  41. for _, status := range matrix {
  42. fmt.Fprint(writer, strings.Repeat(" ", indent-1))
  43. for i := 0; i < last; i++ {
  44. var val int64
  45. if i < len(status) {
  46. val = status[i]
  47. // not sure why this sometimes happens...
  48. // TODO(vmarkovtsev): find the root cause of tiny negative balances
  49. if fixNegative && val < 0 {
  50. val = 0
  51. }
  52. }
  53. if !first {
  54. fmt.Fprintf(writer, " %[1]*[2]d", width, val)
  55. } else {
  56. first = false
  57. fmt.Fprintf(writer, " %d%s", val, strings.Repeat(" ", width-len(strconv.FormatInt(val, 10))))
  58. }
  59. }
  60. fmt.Fprintln(writer)
  61. }
  62. }