| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364 |
- // package arena_string -- потокобезопасный компонент списка строк для анализа арены
- package arena_string
- import (
- "strings"
- "sync"
- . "gitp78su.ipnodns.ru/svi/kern"
- . "gitp78su.ipnodns.ru/svi/kern/kc/helpers"
- . "gitp78su.ipnodns.ru/svi/kern/krn/ktypes"
- )
- // АренаСтроки -- потокобезопасный список строк арены
- type АренаСтроки struct {
- val []string
- strControl string // Контрольная строка в исходной строке для анализа арены
- block sync.RWMutex
- }
- // НовАренаСтроки -- возвращает новый потокобезопасный список строк арены
- func НовАренаСтроки(конт ILocalCtx, strControl string) *АренаСтроки {
- лог := NewLogBuf()
- лог.Debug("НовАренаСтроки(): strControl=%q", strControl)
- Hassert(strControl != "", "НовАренаСтроки(): strControl is empty")
- сам := &АренаСтроки{
- val: make([]string, 0),
- strControl: strControl,
- }
- return сам
- }
- // Получ -- возвращает список строк для анализа
- func (сам *АренаСтроки) Получ() []string {
- сам.block.RLock()
- defer сам.block.RUnlock()
- return сам.val
- }
- // Set -- устанавливает список строк для анализа
- func (сам *АренаСтроки) Set(lstString []string) {
- сам.block.Lock()
- defer сам.block.Unlock()
- Hassert(lstString != nil, "АренаСтроки.Set(): lstString == nil")
- Hassert(len(lstString) > 0, "АренаСтроки.Set(): lstString ничего не содержит")
- isOk := false
- for _, strControl := range lstString {
- if strings.Contains(strControl, сам.strControl) {
- isOk = true
- break
- }
- }
- if isOk {
- сам.val = lstString
- return
- }
- // Найти заголовок
- var strOut string
- for _, strOut = range lstString {
- if strings.Contains(strOut, "<title>") {
- break
- }
- }
- Hassert(false, "АренаСтроки.Set(): lstString не имеет правильный title(%q), фактически(%q)", сам.strControl, strOut)
- }
|