This one uses the same memory received from lisp
//(SubList '(0 1 2 3 4 5) 2 3)
static int ads_sublist(void)
{
struct resbuf *pRbTmp = NULL;
struct resbuf *pRbOutHead = NULL;
struct resbuf *pRbOutTail = NULL;
struct resbuf *pRbInHead = acedGetArgs();
INT_PTR rtlb = 0;
INT_PTR rtle = 0;
INT_PTR startPos = 0;
INT_PTR length = 0;
INT_PTR listLength = 0;
INT_PTR inIdx = 0;
INT_PTR outIdx = 0;
for(const struct resbuf *piter = pRbInHead; piter!=NULL; piter=piter->rbnext)
{
if(piter->restype==RTLB)
{
rtlb = inIdx;
}
else if (piter->restype==RTLE)
{
rtle = inIdx;
if(piter->rbnext)
{
if(piter->rbnext->restype == RTSHORT ||
piter->rbnext->restype == RTLONG)
{
startPos = piter->rbnext->resval.rlong;
}
}
if(piter->rbnext->rbnext)
{
if(piter->rbnext->rbnext->restype == RTSHORT ||
piter->rbnext->rbnext->restype == RTLONG)
{
length = piter->rbnext->rbnext->resval.rlong;
}
}
}
inIdx++;
}
if(inIdx<4)
return (RSERR);
if(length == 0 || length > (rtle-1 - startPos) || length > (rtle-1+rtlb+1))
length = rtle-1 - startPos;
for(struct resbuf *piter = pRbInHead; piter!=NULL; piter=piter->rbnext)
{
if(outIdx == startPos+1)
pRbOutTail= pRbOutHead = piter;
if(outIdx > startPos+1 && length + startPos+1 > outIdx && outIdx < rtle)
pRbOutTail = pRbOutTail->rbnext = piter;
outIdx++;
}
if(pRbOutTail->rbnext)
{
pRbTmp = pRbOutTail->rbnext;
pRbOutTail->rbnext = NULL;
}
acedRetList(pRbOutHead);
pRbOutTail->rbnext =pRbTmp;
return (RSRSLT) ;
}