LINUX.ORG.RU

История изменений

Исправление qulinxao3, (текущая версия) :

крч классический цикл с входом в середину deep-purple


void
foo(self, new_data /* на каждый вызов будут новые данные */ )
{
    // предыдущие вызовы могли завершится с ошибкой
    if (self->state == ERROR) {
        self->state == ERROR;return;                        //!!! for symmetry :)
    }

    /*
        тут реаллок внутреннего буфера
        если добавление новых данных в его конец
        не влезают в имеющийся размер
        и добавление новых данных в конец буфера
    */

    switch(self->state){
    case SEARCH:   // else {
    default:
        for ( /* для каждой доступной позиции в буфере */ ) {

            if ( /* в этой позиции ЕСТЬ пакета */ ) {       //!!! inversion

    case FOUND:
                // пакет нашёлся
                //self->state = FOUND;                      //!!! not needed bytechanging
                // попробуем добавить его в цепочку готовых
                /*
                даже если начало пакета найдено
                и его размер известен из заголовка пакета
                данных в буфере на позиции начала пакета
                может быть не достаточно
                */

                if ( /* не достаточно данных в буфере */ ) {
                    self->state = FOUND;return;             //!!! need set cose maybe from first SEARCH
                }

                /*
                    копируем данные из буфера в отдельный новый пакет
                    и вставляем его в конец цепочки готовых пакетов,
                    двигаем оставшиеся данные из конца буфера в его начало
                */
                                                            //!!! Если буфер кольцевой то двигать излишне
                                                            //!!!   так же:цикл тогда заменется с for(0,<length) на cur=start;do{    }while(start!=(cur=next(cur))) //!!!
                                                            //!!!   где next(cur) is: (cur+1)%length 
                                                            //!!!   так же: goto default;  вытесняется do-while'ом   
            //self->state = SEARCH;                         //!!! not needed bytechanging

            /*
                может быть достаточно данных в буфере
                для того чтобы найти там ещё N пакетов
            */

            //goto try_more;                                //!!! fallthrough  
    goto default;                                           //!!! RESTART SEARCH    
            }
        }
}
    
    self->state = SEARCH;return;}                           //!!! maybe fallthrough after first FOUND 

Исходная версия qulinxao3, :

continue refining:

крч классический цикл с входом в середину deep-purple


void
foo(self, new_data /* на каждый вызов будут новые данные */ )
{
    // предыдущие вызовы могли завершится с ошибкой
    if (self->state == ERROR) {
        self->state == ERROR;return;                        //!!! for symmetry :)
    }

    /*
        тут реаллок внутреннего буфера
        если добавление новых данных в его конец
        не влезают в имеющийся размер
        и добавление новых данных в конец буфера
    */

    switch(self->state){
    case SEARCH:   // else {
    default:
        for ( /* для каждой доступной позиции в буфере */ ) {

            if ( /* в этой позиции ЕСТЬ пакета */ ) {       //!!! inversion

    case FOUND:
                // пакет нашёлся
                //self->state = FOUND;                      //!!! not needed bytechanging
                // попробуем добавить его в цепочку готовых
                /*
                даже если начало пакета найдено
                и его размер известен из заголовка пакета
                данных в буфере на позиции начала пакета
                может быть не достаточно
                */

                if ( /* не достаточно данных в буфере */ ) {
                    self->state = FOUND;return;             //!!! need set cose maybe from first SEARCH
                }

                /*
                    копируем данные из буфера в отдельный новый пакет
                    и вставляем его в конец цепочки готовых пакетов,
                    двигаем оставшиеся данные из конца буфера в его начало
                */
                                                            //!!! Если буфер колцевой то двигать излишне
                                                            //!!!   так же:цикл тогда заменется с for(0,<length) на cur=start;do{    }while(start!=(cur=next(cur))) //!!!
                                                            //!!!   где next(cur) is: (cur+1)%length 
                                                            //!!!   так же: goto default;  вытесняется do-while'ом   
            //self->state = SEARCH;                         //!!! not needed bytechanging

            /*
                может быть достаточно данных в буфере
                для того чтобы найти там ещё N пакетов
            */

            //goto try_more;                                //!!! fallthrough  
    goto default;                                           //!!! RESTART SEARCH    
            }
        }
}
    
    self->state = SEARCH;return;}                           //!!! maybe fallthrough after first FOUND