===================================================================
RCS file: /home/cvs/OpenXM_contrib2/windows/post-msg-asirgui/cmdasir.c,v
retrieving revision 1.3
retrieving revision 1.8
diff -u -p -r1.3 -r1.8
--- OpenXM_contrib2/windows/post-msg-asirgui/cmdasir.c	2013/08/28 05:33:02	1.3
+++ OpenXM_contrib2/windows/post-msg-asirgui/cmdasir.c	2013/11/28 18:53:32	1.8
@@ -1,4 +1,4 @@
-/* $OpenXM: OpenXM_contrib2/windows/post-msg-asirgui/cmdasir.c,v 1.2 2013/08/27 07:41:22 ohara Exp $ */
+/* $OpenXM: OpenXM_contrib2/windows/post-msg-asirgui/cmdasir.c,v 1.7 2013/11/27 15:47:18 ohara Exp $ */
 // cl test.c user32.lib
 
 #include <windows.h>
@@ -7,6 +7,7 @@
 #include <string.h>
 #include <io.h>
 #include <process.h>
+#include <fcntl.h>
 
 char *winname2uxname(char winname[]);
 FILE *findAsirHandler();
@@ -15,7 +16,33 @@ int loadFile(HWND hnd, char *uname);
 int terminateAsir(HWND hnd);
 int hasTemp(char *s);
 int pasteFile(HWND hnd, char *uname);
+int containEnd(char s[]);
+int abortAsir(HWND hnd);
+int main(int argc, char *argv[]);
 
+FILE *open_stdio(DWORD type) {
+    HANDLE hnd;
+    int fd;
+    if((hnd = GetStdHandle(type)) != INVALID_HANDLE_VALUE && (fd = _open_osfhandle((intptr_t)hnd, _O_TEXT)) >= 0) {
+        return _fdopen(fd, "w");
+    }
+    return NULL;
+}
+
+int WINAPI WinMain(HINSTANCE hins, HINSTANCE prev, LPSTR arg, int show) {
+    FILE *fp;
+#if (_WIN32_WINNT > 0x0500)
+    if(AttachConsole(ATTACH_PARENT_PROCESS)) {
+        if(fp = open_stdio(STD_OUTPUT_HANDLE)) {
+            *stdout = *fp;
+            setvbuf(stdout, NULL, _IONBF, 0);
+        }
+    }
+#endif
+    main(__argc, __argv);
+    return 0;
+}
+
 int main(int argc, char *argv[])
 {
   HWND hnd;
@@ -28,30 +55,35 @@ int main(int argc, char *argv[])
   char msg[1024];
   char cmd[1024];
   int paste_contents=0;
+  int abort=0;
 
   /* MessageBox(NULL,TEXT("test"),TEXT("Error in cmdasir.c"),MB_OK); */
-  sprintf(snameWin,"%s\\cmdasir-%d.txt",getenv("TEMP"),getpid());
+  sprintf(snameWin,"%s\\cmdasir-%d.txt",getenv("TEMP"),_getpid());
   snameUx = winname2uxname(snameWin);
   if ((argc > 1) && (strcmp(argv[1],"--delete-tmp")==0)) {
     sprintf(cmd,"del %s\\cmdasir-*",getenv("TEMP"));
     system(cmd);
     return(0);
   }
+
   fp = findAsirHandler();
   if (fp == NULL) {
-    fprintf(stderr,"handler file is not found.\n"); return(-1);
+    printf("handler file is not found.\n"); return(-1);
   }
   fscanf(fp,"%d",&hnd);
   fclose(fp);
   if ((argc > 1) && (strcmp(argv[1],"--quit")==0)) {
     return terminateAsir(hnd);
   }
+  if ((argc > 1) && (strcmp(argv[1],"--abort")==0)) {
+    return abortAsir(hnd);
+  }
   printf("Handler is %d\n",hnd);
   paste_contents=0;
   for (ii=1; ii<argc; ii++) {
-  	if (strcmp(argv[ii],"--paste-contents")==0) {
-  		paste_contents=1; continue;
-  	}
+    if (strcmp(argv[ii],"--paste-contents")==0) {
+      paste_contents=1; continue;
+    }
     uname = NULL;
     if (hasTemp(argv[ii])) {
       fp = fopen(winname2uxname(argv[ii]),"r");
@@ -67,7 +99,7 @@ int main(int argc, char *argv[])
       uname=snameUx;
     }
     printf("filename=%s\n",argv[ii]);
-    if(access(argv[ii],0)==0) {
+    if(_access(argv[ii],0)==0) {
     	if (paste_contents) return pasteFile(hnd, (uname != NULL)? uname: winname2uxname(argv[ii]));
     	else return loadFile(hnd, (uname != NULL)? uname: winname2uxname(argv[ii]));
     }
@@ -201,7 +233,7 @@ int pasteFile(HWND hnd, char *uname) {
 		return -1;
 	}
 	s = (char *)malloc(size+1);
-	i = 0;
+	i = 0;s[0]=0;
 	while ((c=fgetc(fp)) != EOF) {
 		s[i] = c; s[i+1]=0;
 		if (i >= size-1) {
@@ -213,8 +245,46 @@ int pasteFile(HWND hnd, char *uname) {
 		}
 		i++;
 	}
-	sendFileName(hnd,s);
+	if (containEnd(s)) {
+		MessageBox(NULL,TEXT("The string contains end$ or end;"),TEXT(uname),MB_OK);
+		return(0);
+	}
+	if (strlen(s)>0) sendFileName(hnd,s); else {
+		MessageBox(NULL,TEXT("Empty string: "),TEXT(uname),MB_OK);
+		return 0;
+	}
 	free(s);
 	PostMessage(hnd,WM_CHAR,0xa,1);
 	return 0;
+}
+
+int containEnd(char s[]) {
+	int i;
+	for (i=0; i<strlen(s)-4; i++) {
+		if (strncmp(&(s[i]),"end$",4)==0) return 1;
+		if (strncmp(&(s[i]),"end;",4)==0) return 1;
+	}
+	return(0);
+}
+
+int abortAsir(HWND hnd) {
+  int c;
+  int result;
+  result=MessageBox(NULL,TEXT("Do you abort this computation?"),TEXT("Abort"),MB_OKCANCEL);
+  if (result == IDCANCEL) return(0);
+  c=0x3;
+  if (!PostMessage(hnd,WM_CHAR,c,1)) {
+    MessageBox(NULL,TEXT("asirgui is not running."), TEXT("ERROR in cmdasir.c"),MB_OK);
+    return(-1);
+  }
+        
+  printf("Sending ctrl-C\n");
+  /* Sleep(3*1000); */
+  result=MessageBox(NULL,TEXT("Interrupt is displayed in asirgui?"),TEXT("Sent ctrl-C."),MB_OKCANCEL);
+  if (result == IDCANCEL) return(0);
+  c='t'; PostMessage(hnd,WM_CHAR,c,1);
+  c=0xd; PostMessage(hnd,WM_CHAR,c,1); 
+  c='y'; PostMessage(hnd,WM_CHAR,c,1);
+  c=0xd; PostMessage(hnd,WM_CHAR,c,1);
+  return(0);
 }