changes from H.G. Muller; version 4.3.13
[xboard.git] / winboard / wclipbrd.c
index 66a3638..55b9dfd 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * wclipbrd.c -- Clipboard routines for WinBoard\r
- * $Id$\r
+ * $Id: wclipbrd.c,v 2.1 2003/10/27 19:21:02 mann Exp $\r
  *\r
  * Copyright 2000 Free Software Foundation, Inc.\r
  *\r
@@ -27,7 +27,6 @@
 #include <stdio.h>\r
 #include <stdlib.h>\r
 #include <malloc.h>\r
-#include <io.h>\r
 #include <sys/stat.h>\r
 \r
 #include "common.h"\r
@@ -48,7 +47,7 @@ CopyFENToClipboard()
 {\r
   char *fen = NULL;\r
 \r
-  fen = PositionToFEN(currentMove);\r
+  fen = PositionToFEN(currentMove,1);\r
   if (!fen) {\r
     DisplayError("Unable to convert position to FEN.", 0);\r
     return;\r
@@ -58,6 +57,38 @@ CopyFENToClipboard()
   free(fen);\r
 }\r
 \r
+/* [AS] */\r
+HGLOBAL ExportGameListAsText();\r
+\r
+VOID CopyGameListToClipboard()\r
+{\r
+    HGLOBAL hMem = ExportGameListAsText();\r
+    \r
+    if( hMem != NULL ) {\r
+        /* Assign memory block to clipboard */\r
+        BOOL ok = OpenClipboard( hwndMain );\r
+\r
+        if( ok ) {\r
+            ok = EmptyClipboard();\r
+\r
+            if( ok ) {\r
+                if( hMem != SetClipboardData( CF_TEXT, hMem ) ) {\r
+                    ok = FALSE;\r
+                }\r
+            }\r
+\r
+            CloseClipboard();\r
+\r
+            if( ! ok ) {\r
+                GlobalFree( hMem );\r
+            }\r
+        }\r
+\r
+        if( ! ok ) {\r
+            DisplayError( "Cannot copy list to clipboard.", 0 );\r
+        }\r
+    }\r
+}\r
 \r
 VOID\r
 CopyGameToClipboard()\r
@@ -72,13 +103,13 @@ CopyGameToClipboard()
   struct stat st;\r
 \r
   if (!copyTemp) {\r
-    copyTemp = tmpnam(NULL);\r
+    copyTemp = tempnam(NULL, "wbcp");\r
   }\r
   if (!copyTemp) {\r
       DisplayError("Cannot create temporary file name.",0);\r
       return;\r
   }\r
-  f = fopen(copyTemp, "w"); \r
+  f = fopen(copyTemp, "w");\r
   if (!f) {\r
     DisplayError("Cannot open temporary file.", 0);\r
     return;\r
@@ -195,6 +226,16 @@ CopyTextToClipboard(char *text)
   return TRUE;\r
 }\r
 \r
+/* [AS] Reworked paste functions so they can work with strings too */\r
+\r
+VOID PasteFENFromString( char * fen )\r
+{\r
+  if (appData.debugMode) {\r
+    fprintf(debugFP, "PasteFenFromString(): fen '%s'\n", fen);\r
+  }\r
+  EditPositionPasteFEN(fen); /* call into backend */\r
+  free(fen);\r
+}\r
 \r
 \r
 VOID\r
@@ -205,42 +246,68 @@ PasteFENFromClipboard()
       DisplayError("Unable to paste FEN from clipboard.", 0);\r
       return;\r
   }\r
-  if (appData.debugMode) {\r
-    fprintf(debugFP, "PasteFenFromClipboard(): fen '%s'\n", fen);\r
-  }\r
-  EditPositionPasteFEN(fen); /* call into backend */\r
-  free(fen);\r
+  PasteFENFromString( fen );\r
 }\r
 \r
-\r
-VOID\r
-PasteGameFromClipboard()\r
+VOID PasteGameFromString( char * buf )\r
 {\r
-  /* Write the clipboard to a temp file, then let LoadGameFromFile()\r
-   * do all the work.  */\r
-  char *buf;\r
   FILE *f;\r
   size_t len;\r
-  if (!PasteTextFromClipboard(&buf)) {\r
-    return;\r
-  }\r
   if (!pasteTemp) {\r
-    pasteTemp = tmpnam(NULL);\r
+    pasteTemp = tempnam(NULL, "wbpt");\r
   }\r
-  f = fopen(pasteTemp, "wb+");\r
+  f = fopen(pasteTemp, "w");\r
   if (!f) {\r
     DisplayError("Unable to create temporary file.", 0);\r
+    free(buf); /* [AS] */\r
     return;\r
   }\r
   len = fwrite(buf, sizeof(char), strlen(buf), f);\r
   fclose(f);\r
   if (len != strlen(buf)) {\r
     DisplayError("Error writing to temporary file.", 0);\r
+    free(buf); /* [AS] */\r
     return;\r
   }\r
   LoadGameFromFile(pasteTemp, 0, "Clipboard", TRUE);\r
+  free( buf ); /* [AS] */\r
+}\r
+\r
+\r
+VOID\r
+PasteGameFromClipboard()\r
+{\r
+  /* Write the clipboard to a temp file, then let LoadGameFromFile()\r
+   * do all the work.  */\r
+  char *buf;\r
+  if (!PasteTextFromClipboard(&buf)) {\r
+    return;\r
+  }\r
+  PasteGameFromString( buf );\r
 }\r
 \r
+/* [AS] Try to detect whether the clipboard contains FEN or PGN data */\r
+VOID PasteGameOrFENFromClipboard()\r
+{\r
+  char *buf;\r
+  char *tmp;\r
+\r
+  if (!PasteTextFromClipboard(&buf)) {\r
+    return;\r
+  }\r
+\r
+  tmp = buf;\r
+  while( *tmp == ' ' || *tmp == '\t' || *tmp == '\r' || *tmp == '\n' ) {\r
+      tmp++;\r
+  }\r
+\r
+  if( *tmp == '[' ) {\r
+      PasteGameFromString( buf );\r
+  }\r
+  else {\r
+      PasteFENFromString( buf );\r
+  }\r
+}\r
 \r
 int \r
 PasteTextFromClipboard(char **text)\r