U0 LinkedLstDel(U8 **_lst)
{//Free entire linked-list.
U8 **tmpl;
while (_lst) {
tmpl=*_lst;
Free(_lst);
_lst=tmpl;
}
}
U8 *LinkedLstCopy(U8 **_lst,CTask *mem_task=NULL)
{//MAlloc ident copy of entire linked-list.
U8 *res=NULL,**tmpl=&res;
while (_lst) {
tmpl=*tmpl=MAllocIdent(_lst,mem_task);
_lst=*_lst;
}
return res;
}
I64 LinkedLstCnt(U8 **_lst)
{//Count of nodes in linked-list.
I64 res=0;
while (_lst) {
res++;
_lst=*_lst;
}
return res;
}
I64 LinkedLstSize(U8 **_lst)
{//Mem size of all nodes in linked-list.
I64 res=0;
while (_lst) {
res+=MSize2(_lst);
_lst=*_lst;
}
return res;
}
U0 QueDel(CQue *head,Bool querem=FALSE)
{//Free entries in queue, not head.
CQue *tmpq=head->next,*tmpq1;
while (tmpq!=head) {
tmpq1=tmpq->next;
if (querem)
QueRem(tmpq);
Free(tmpq);
tmpq=tmpq1;
}
}
CQue *QueCopy(CQue *head,CTask *mem_task=NULL)
{//MAlloc ident copy of entire queue and head.
CQue *res=MAllocIdent(head,mem_task),*tmpq=head->next,*tmpq1;
QueInit(res);
while (tmpq!=head) {
tmpq1=MAllocIdent(tmpq,mem_task);
QueIns(tmpq1,res->last);
tmpq=tmpq->next;
}
return res;
}
I64 QueCnt(CQue *head)
{//Count of nodes in queue, not head.
CQue *tmpq=head->next;
I64 res=0;
while (tmpq!=head) {
res++;
tmpq=tmpq->next;
}
return res;
}
I64 QueSize(CQue *head)
{//Mem size of all nodes in queue, not head.
CQue *tmpq=head->next;
I64 res=0;
while (tmpq!=head) {
res+=MSize2(tmpq);
tmpq=tmpq->next;
}
return res;
}
CQueVectU8 *QueVectU8New(I64 min_idx=0)
{//Create new queue vecter.
CQueVectU8 *res=MAlloc(sizeof(CQueVectU8));
QueInit(res);
res->total_cnt=res->node_cnt=0;
res->min_idx=min_idx;
return res;
}
U0 QueVectU8Put(CQueVectU8 *v,I64 idx,U8 ch)
{//Put U8 at idx i.
CQueVectU8 *tmpv;
idx-=v->min_idx;
if (idx<0) return;
if (idx<v->total_cnt) {
tmpv=v;
do {
idx-=tmpv->node_cnt;
if (idx<0) {
tmpv->body[idx+tmpv->node_cnt]=ch;
return;
}
tmpv=tmpv->next;
} while (tmpv!=v);
} else
idx-=v->total_cnt;
while (TRUE) {
tmpv=v->last;
if (tmpv->node_cnt>=QUE_VECT_U8_CNT) {
tmpv=MAlloc(sizeof(CQueVectU8));
tmpv->node_cnt=0;
QueIns(tmpv,v->last);
}
if (idx--) {
tmpv->body[tmpv->node_cnt++]=0;
v->total_cnt++;
} else {
tmpv->body[tmpv->node_cnt++]=ch;
v->total_cnt++;
break;
}
}
}
U0 QueVectU8Del(CQueVectU8 *v)
{//Free entire queue vector.
if (v) {
QueDel(v);
Free(v);
}
}
I64 QueVectU8Get(CQueVectU8 *v,I64 idx)
{//Get U8 at idx i.
CQueVectU8 *tmpv;
idx-=v->min_idx;
if (!(0<=idx<v->total_cnt)) return 0;
tmpv=v;
do {
idx-=tmpv->node_cnt;
if (idx<0)
return tmpv->body[idx+tmpv->node_cnt];
tmpv=tmpv->next;
} while (tmpv!=v);
return 0;
}
CFifoU8 *FifoU8New(I64 size,CTask *mem_task=NULL)
{//Create new fifo.
CFifoU8 *f;
if (!mem_task) mem_task=Fs;
f=MAlloc(sizeof(CFifoU8),mem_task);
f->buf=MAlloc(size,mem_task);
f->mask=size-1;
f->in_ptr=0;
f->out_ptr=0;
return f;
}
U0 FifoU8Del(CFifoU8 *f)
{//Free fifo.
Free(f->buf);
Free(f);
}
Bool FifoU8Ins(CFifoU8 *f,U8 b)
{//Insert U8 into fifo.
I64 new_in_ptr;
PUSHFD
CLI
new_in_ptr=(f->in_ptr+1)&f->mask;
if (new_in_ptr==f->out_ptr) {
POPFD
return FALSE;
} else {
f->buf[f->in_ptr]=b;
f->in_ptr=new_in_ptr;
POPFD
return TRUE;
}
}
Bool FifoU8Rem(CFifoU8 *f,U8 *_b)
{//Remove U8 from fifo.
PUSHFD
CLI
if (f->in_ptr==f->out_ptr) {
POPFD
return FALSE;
} else {
*_b=f->buf[f->out_ptr];
f->out_ptr=(f->out_ptr+1)&f->mask;
POPFD
return TRUE;
}
}
Bool FifoU8Peek(CFifoU8 *f,U8 *_b)
{//Peek at front of fifo and don't remove.
PUSHFD
CLI
if (f->in_ptr==f->out_ptr) {
POPFD
return FALSE;
} else {
*_b=f->buf[f->out_ptr];
POPFD
return TRUE;
}
}
U0 FifoU8Flush(CFifoU8 *f)
{//Flush fifo getting rid of all U8's.
PUSHFD
CLI
f->out_ptr=f->in_ptr;
POPFD
}
I64 FifoU8Cnt(CFifoU8 *f)
{//Count of U8's in fifo.
I64 res;
PUSHFD
CLI
if (f->out_ptr>f->in_ptr)
res=f->mask+1-(f->out_ptr-f->in_ptr);
else
res=f->in_ptr-f->out_ptr;
POPFD
return res;
}
CFifoI64 *FifoI64New(I64 size,CTask *mem_task=NULL)
{//Create new fifo.
CFifoI64 *f;
if (!mem_task) mem_task=Fs;
f=MAlloc(sizeof(CFifoI64),mem_task);
f->buf=MAlloc(size*sizeof(I64),mem_task);
f->mask=size-1;
f->in_ptr=0;
f->out_ptr=0;
return f;
}
U0 FifoI64Del(CFifoI64 *f)
{//Free fifo.
Free(f->buf);
Free(f);
}
Bool FifoI64Ins(CFifoI64 *f,I64 q)
{//Insert I64 into fifo.
I64 new_in_ptr;
PUSHFD
CLI
new_in_ptr=(f->in_ptr+1)&f->mask;
if (new_in_ptr==f->out_ptr) {
POPFD
return FALSE;
} else {
f->buf[f->in_ptr]=q;
f->in_ptr=new_in_ptr;
POPFD
return TRUE;
}
}
Bool FifoI64Rem(CFifoI64 *f,I64 *_q)
{//Remove I64 from fifo.
PUSHFD
CLI
if (f->in_ptr==f->out_ptr) {
POPFD
return FALSE;
} else {
*_q=f->buf[f->out_ptr];
f->out_ptr=(f->out_ptr+1)&f->mask;
POPFD
return TRUE;
}
}
Bool FifoI64Peek(CFifoI64 *f,I64 *_q)
{//Peek at front of fifo and don't remove.
PUSHFD
CLI
if (f->in_ptr==f->out_ptr) {
POPFD
return FALSE;
} else {
*_q=f->buf[f->out_ptr];
POPFD
return TRUE;
}
}
U0 FifoI64Flush(CFifoI64 *f)
{//Flush fifo getting rid of all I64's.
PUSHFD
CLI
f->out_ptr=f->in_ptr;
POPFD
}
I64 FifoI64Cnt(CFifoI64 *f)
{//Count of I64's in fifo.
I64 res;
PUSHFD
CLI
if (f->out_ptr>f->in_ptr)
res=f->mask+1-(f->out_ptr-f->in_ptr);
else
res=f->in_ptr-f->out_ptr;
POPFD
return res;
}