/* This is just plain clipboard handling */

IMPORT struct IOClipReq *ClipReq;

ULONG ReadClip(ClipReq, Buf, BufSize, Action)
struct IOClipReq *ClipReq;
STRPTR Buf;
ULONG BufSize;
SHORT Action;
{
    ULONG Length;
    ClipReq->io_Command = CMD_READ;
    ClipReq->io_Data = Buf;
    ClipReq->io_Length = BufSize-1L;       /* space for '\0' */
    if (Action == CLIP_FIRST) {
        ClipReq->io_Offset = 0L;
        ClipReq->io_ClipID = 0L;
    }
    DoIO(ClipReq);
    Length = ClipReq->io_Actual;
    Buf[Length] = '\0';
    if (Action == CLIP_LAST) {
        ClipReq->io_Command = CMD_READ;
        ClipReq->io_Data = NULL;
        ClipReq->io_Length = 1L;
        DoIO(ClipReq);                    /* Null read to terminate */
    }
    return(Length);
}

VOID WriteClip(ClipReq, Buf, BufSize, Action)
struct IOClipReq *ClipReq;
STRPTR Buf;
ULONG BufSize;
SHORT Action;
{
    if (Action == CLIP_FIRST) {
        ClipReq->io_Offset = 0L;
        ClipReq->io_ClipID = 0L;
    }
    ClipReq->io_Command = CMD_WRITE;
    ClipReq->io_Data = Buf;
    ClipReq->io_Length = BufSize;
    DoIO(ClipReq);
    if (Action == CLIP_LAST) {
        ClipReq->io_Command = CMD_UPDATE;
        DoIO(ClipReq);
    }
}

VOID SaveClip(SnapSpace, SnapSize)
UBYTE *SnapSpace;
ULONG SnapSize;
{
    ULONG Len;
    WriteClip(ClipReq, "FORM", 4L, CLIP_FIRST);
    Len = SnapSize+12;
    WriteClip(ClipReq, (STRPTR)&Len, 4L, CLIP_CONT);
    WriteClip(ClipReq, "FTXT", 4L, CLIP_CONT);
    WriteClip(ClipReq, "CHRS", 4L, CLIP_CONT);
    Len = SnapSize;
    WriteClip(ClipReq, (STRPTR)&Len, 4L, CLIP_CONT);
    WriteClip(ClipReq, SnapSpace, Len, CLIP_LAST);
}

struct Snap *FetchClip()
{
    struct Snap *Snap = NULL;
    ULONG temp;
    ULONG ID[2];

    (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_FIRST);    /* FORM */
    if (!strcmp((STRPTR)&ID, "FORM")) {
        (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* size */
        (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* FTXT */
        if (!strcmp((STRPTR)&ID, "FTXT")) {
            (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT);     /* CHRS */
            if (!strcmp((STRPTR)&ID, "CHRS")) {
                (VOID)ReadClip(ClipReq, (STRPTR)&ID, 5L, CLIP_CONT); /* #chars */
                temp = ID[0];
                Snap = AllocMem((LONG)sizeof(struct Snap)+temp,
                  MEMF_PUBLIC|MEMF_CLEAR);
                Snap->Size = sizeof(struct Snap)+temp;
                ReadClip(ClipReq, &Snap->Chars[0], Snap->Size+1L, CLIP_LAST);
            }
        }
    }
    return(Snap);
}
