belt.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869
  1. // package belt -- лента для исходных данных и результатов
  2. package belt
  3. import (
  4. "log"
  5. "os"
  6. "sync"
  7. . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
  8. )
  9. type Лента struct {
  10. бинИсх []uint32
  11. бинВых []uint32
  12. размерИсход int // Оригинальный размер
  13. }
  14. var (
  15. сам *Лента
  16. блок sync.Mutex
  17. )
  18. // ЛентаПолуч -- возвращает ленту
  19. func ЛентаПолуч() *Лента {
  20. блок.Lock()
  21. defer блок.Unlock()
  22. if сам != nil {
  23. return сам
  24. }
  25. сам = &Лента{
  26. бинИсх: []uint32{},
  27. бинВых: []uint32{},
  28. }
  29. сам.файлЧитать()
  30. return сам
  31. }
  32. func (сам *Лента) файлЧитать() {
  33. файлИмя := os.Getenv("PACK_FILE")
  34. Hassert(файлИмя != "", "Пакер.файлЧитать(): env PACK_FILE not set")
  35. binData, err := os.ReadFile(файлИмя)
  36. Hassert(err == nil, "Пакер.файлЧитать(): in read %q, err=\n\t%v", файлИмя, err)
  37. сам.размерИсход = len(binData)
  38. for _, val := range binData {
  39. сам.бинИсх = append(сам.бинИсх, uint32(val))
  40. }
  41. сам.бинВых = сам.бинИсх
  42. log.Printf("Лента.файлЧитать(): len(%q)=%v\n", файлИмя, len(сам.бинИсх))
  43. }
  44. // Вых -- выходная лента
  45. func (сам *Лента) Вых() []uint32 {
  46. return сам.бинВых
  47. }
  48. // Исх -- исходный текст ленты
  49. func (сам *Лента) Исх() []uint32 {
  50. return сам.бинИсх
  51. }
  52. // ИсхРазмер -- возвращает исходный размер ленты
  53. func (сам *Лента) ИсхРазмер() int {
  54. return len(сам.бинИсх)
  55. }
  56. // ВыхУст -- устанавливает выходной срез
  57. func (сам *Лента) ВыхУст(бинВых []uint32) {
  58. сам.бинВых = бинВых
  59. }