/* This is just plain clipboard handling */ #include "snap.h" 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, &Len, 4L, CLIP_CONT); WriteClip(ClipReq, "FTXT", 4L, CLIP_CONT); WriteClip(ClipReq, "CHRS", 4L, CLIP_CONT); Len = SnapSize; WriteClip(ClipReq, &Len, 4L, CLIP_CONT); WriteClip(ClipReq, SnapSpace, Len, CLIP_LAST); } UBYTE *FetchClip() { UBYTE *SnapSpace = NULL; ULONG SnapSize; 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 */ SnapSize = ID[0]; SnapSpace = AllocMem(SnapSize+5L, MEMF_PUBLIC|MEMF_CLEAR); *(ULONG *)SnapSpace = SnapSize+5L; /* Save size */ ReadClip(ClipReq, SnapSpace+4L, SnapSize+1L, CLIP_LAST); } } } return(SnapSpace); }