-DEFUN ("mswindows-set-clipboard", Fmswindows_set_clipboard, 1, 1, 0, /*
-Copy STRING to the mswindows clipboard.
-*/
- (string))
-{
- int rawsize, size, i;
- unsigned char *src, *dst, *next;
- HGLOBAL h = NULL;
- struct frame *f = NULL;
-
- CHECK_STRING (string);
-
- /* Calculate size with LFs converted to CRLFs because
- * CF_TEXT format uses CRLF delimited ASCIIZ */
- src = XSTRING_DATA (string);
- size = rawsize = XSTRING_LENGTH (string) + 1;
- for (i=0; i<rawsize; i++)
- if (src[i] == '\n')
- size++;
-
- f = selected_frame ();
- if (!OpenClipboard (FRAME_MSWINDOWS_HANDLE (f)))
- return Qnil;
-
- if (!EmptyClipboard () ||
- (h = GlobalAlloc (GMEM_MOVEABLE | GMEM_DDESHARE, size)) == NULL ||
- (dst = (unsigned char *) GlobalLock (h)) == NULL)
- {
- if (h != NULL) GlobalFree (h);
- CloseClipboard ();
- return Qnil;
- }
-
- /* Convert LFs to CRLFs */
- do
- {
- /* copy next line or remaining bytes including '\0' */
- next = memccpy (dst, src, '\n', rawsize);
- if (next)
- {
- /* copied one line ending with '\n' */
- int copied = next - dst;
- rawsize -= copied;
- src += copied;
- /* insert '\r' before '\n' */
- next[-1] = '\r';
- next[0] = '\n';
- dst = next+1;
- }
- }
- while (next);
-
- GlobalUnlock (h);
-
- i = (SetClipboardData (CF_TEXT, h) != NULL);
-
- CloseClipboard ();
-
- return i ? Qt : Qnil;
-}