/* 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); }