/* NOENGINE.C */

#include <notes.g>
#include <notes.rsg>
#include <hwim.h>

GLREF_D PR_VAFLAT *DatApp1;

GLDEF_C NOTE *ePointToNote(INT pos)
    {
    return((NOTE *)p_send3(DatApp1,O_VA_PREC,pos));
    }

GLDEF_C INT eAppendNullEntry(VOID)
    {
    NOTE note;

    if (DatApp1->varoot.nrec==MAX_NUMBER_NOTES)
        {
        hInfoPrint(NOSTR_MAX_NUMBER_NOTES);
        p_leave(RUN_ACTIVE_CLEANUP_NONOTIFY);
        }
    p_bfil(&note,sizeof(NOTE),0);
    p_send3(DatApp1,O_VA_APPEND,&note);
    return(DatApp1->varoot.nrec-1);
    }

LOCAL_C VOID ZeroLenBuf(LENBUF *lb)
    {
    p_free(lb->buf);
    lb->buf=NULL;
    lb->len=0;
    }

GLDEF_C VOID eZeroNote(NOTE *pn)
    {
    ZeroLenBuf(&pn->title);
    ZeroLenBuf(&pn->note);
    pn->tagged=FALSE;
    }

GLDEF_C INT eDeleteNote(INT pos)
    {
    if (DatApp1->varoot.nrec==1)
        {
        eZeroNote(ePointToNote(0));
        return(0);
        }
    p_send3(DatApp1,O_VA_DELETE,pos);
    p_send(DatApp1,O_VA_COMPRESS);
    if (pos==DatApp1->varoot.nrec)
        pos--;
    return(pos);
    }

GLDEF_C VOID eInitialiseEngine(VOID)
    {
    DatApp1=f_newsend(CAT_NOTES_OLIB,C_VAFLAT,O_VA_INIT,sizeof(NOTE),4);
    eAppendNullEntry();
    }

GLDEF_C INT eCountTaggedNotes(VOID)
    {
    INT ret;
    INT i;
    NOTE *pn;

    ret=0;
    pn=ePointToNote(0);
    i=DatApp1->varoot.nrec;
    while (i--)
        {
        if (pn->tagged)
            ret++;
        pn++;
        }
    return(ret);
    }

GLDEF_C VOID eTagAllNotes(INT clear)
    {
    INT set;
    INT i;
    NOTE *pn;

    set=(!clear);
    pn=ePointToNote(0);
    i=DatApp1->varoot.nrec;
    while (i--)
        {
        pn->tagged=set;
        pn++;
        }
    }

#pragma save,ENTER_CALL

LOCAL_C INT TakeCopyLenBuf(LENBUF *targ,LENBUF *src)
    {
    targ->buf=f_alloc(src->len);
    p_bcpy(targ->buf,src->buf,src->len);
    targ->len=src->len;
    return(0);
    }

#pragma restore

GLDEF_C VOID eTakeCopy(NOTE *targ,NOTE *src)
    {
    INT ret;

    TakeCopyLenBuf(&targ->title,&src->title);
    ret=p_enter3(TakeCopyLenBuf,&targ->note,&src->note);
    if (ret)
        {
        p_free(targ->title.buf);
        targ->title.buf=0;
        p_leave(ret);
        }
    targ->tagged=src->tagged;
    }

GLDEF_C VOID eMoveNoteTo(INT newpos,INT pos)
    {
    NOTE moving;

    moving=*ePointToNote(pos);
    p_send3(DatApp1,O_VA_DELETE,pos);
    p_send4(DatApp1,O_VA_INSERT,newpos,&moving);
    }
