История изменений
Исправление 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