#ifndef lint static char *RCSid = "$Id: winmain.c,v 1.15 1998/03/22 23:32:01 drd Exp $"; #endif /* GNUPLOT - win/winmain.c */ /*[ * Copyright 1992, 1993, 1998 Maurice Castro, Russell Lang * * Permission to use, copy, and distribute this software and its * documentation for any purpose with or without fee is hereby granted, * provided that the above copyright notice appear in all copies and * that both that copyright notice and this permission notice appear * in supporting documentation. * * Permission to modify the software is granted, but not the right to * distribute the complete modified source code. Modifications are to * be distributed as patches to the released version. Permission to * distribute binaries produced by compiling modified sources is granted, * provided you * 1. distribute the corresponding source modifications from the * released version in the form of a patch file along with the binaries, * 2. add special version identification to distinguish your version * in addition to the base release version number, * 3. provide your name and address as the primary contact for the * support of your modified version, and * 4. retain our contact information in regard to use of the base * software. * Permission to distribute the released version of the source code along * with corresponding source modifications in the form of a patch file is * granted with same provisions 2 through 4 for binary distributions. * * This software is provided "as is" without express or implied warranty * to the extent permitted by applicable law. ]*/ /* * AUTHORS * * Maurice Castro * Russell Lang * * Send your comments or suggestions to * info-gnuplot@dartmouth.edu. * This is a mailing list; to join it send a note to * majordomo@dartmouth.edu. * Send bug reports to * bug-gnuplot@dartmouth.edu. */ /* This file implements the initialization code for running gnuplot */ /* under Microsoft Windows. The code currently compiles only with the */ /* Borland C++ 3.1 compiler. /* */ /* The modifications to allow Gnuplot to run under Windows were made */ /* by Maurice Castro. (maurice@bruce.cs.monash.edu.au) 3 Jul 1992 */ /* and Russell Lang (rjl@monu1.cc.monash.edu.au) 30 Nov 1992 */ /* */ #define STRICT #include #include #include #include #include #include #include #include #ifdef __MSC__ #include #else # ifdef __TURBOC__ /* HBB 981201: MinGW32 doesn't have this */ #include #endif #endif #include #include "plot.h" #include "setshow.h" #include "wgnuplib.h" #include "wtext.h" /* limits */ #define MAXSTR 255 #define MAXPRINTF 1024 /* globals */ TW textwin; GW graphwin; PW pausewin; MW menuwin; LPSTR szModuleName; LPSTR winhelpname; LPSTR szMenuName; #define MENUNAME "wgnuplot.mnu" #ifndef HELPFILE /* HBB 981203: makefile.win predefines this... */ #define HELPFILE "wgnuplot.hlp" #endif extern char version[]; extern char patchlevel[]; extern char date[]; /*extern char *authors[];*/ char *authors[]={ "Colin Kelly", "Thomas Williams" }; extern char gnuplot_copyright[]; void WinExit(void); int gnu_main(int argc, char *argv[], char *env[]); void CheckMemory(LPSTR str) { if (str == (LPSTR)NULL) { MessageBox(NULL, "out of memory", "gnuplot", MB_ICONSTOP | MB_OK); exit(1); } } int Pause(LPSTR str) { pausewin.Message = str; return (PauseBox(&pausewin) == IDOK); } /* atexit procedure */ void WinExit(void) { term_reset(); #ifndef __MINGW32__ /* HBB 980809: FIXME: doesn't exist for MinGW32. So...? */ fcloseall(); #endif if (graphwin.hWndGraph && IsWindow(graphwin.hWndGraph)) GraphClose(&graphwin); TextMessage(); /* process messages */ WinHelp(textwin.hWndText,(LPSTR)winhelpname,HELP_QUIT,(DWORD)NULL); TextClose(&textwin); TextMessage(); /* process messages */ return; } /* call back function from Text Window WM_CLOSE */ int CALLBACK WINEXPORT ShutDown(void) { WinExit(); exit(0); return 0; } int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { /*WNDCLASS wndclass;*/ LPSTR tail; #ifdef __MSC__ /* MSC doesn't give us _argc and _argv[] so ... */ #define MAXCMDTOKENS 128 int _argc=0; LPSTR _argv[MAXCMDTOKENS]; _argv[_argc] = "wgnuplot.exe"; _argv[++_argc] = _fstrtok( lpszCmdLine, " "); while (_argv[_argc] != NULL) _argv[++_argc] = _fstrtok( NULL, " "); #endif /* __MSC__ */ szModuleName = (LPSTR)farmalloc(MAXSTR+1); CheckMemory(szModuleName); /* get path to EXE */ GetModuleFileName(hInstance, (LPSTR) szModuleName, MAXSTR); #ifndef WIN32 if (CheckWGNUPLOTVersion(WGNUPLOTVERSION)) { MessageBox(NULL, "Wrong version of WGNUPLOT.DLL", szModuleName, MB_ICONSTOP | MB_OK); exit(1); } #endif if ((tail = (LPSTR)_fstrrchr(szModuleName,'\\')) != (LPSTR)NULL) { tail++; *tail = 0; } szModuleName = (LPSTR)farrealloc(szModuleName, _fstrlen(szModuleName)+1); CheckMemory(szModuleName); winhelpname = (LPSTR)farmalloc(_fstrlen(szModuleName)+_fstrlen(HELPFILE)+1); CheckMemory(winhelpname); _fstrcpy(winhelpname,szModuleName); _fstrcat(winhelpname,HELPFILE); szMenuName = (LPSTR)farmalloc(_fstrlen(szModuleName)+_fstrlen(MENUNAME)+1); CheckMemory(szMenuName); _fstrcpy(szMenuName,szModuleName); _fstrcat(szMenuName,MENUNAME); textwin.hInstance = hInstance; textwin.hPrevInstance = hPrevInstance; textwin.nCmdShow = nCmdShow; textwin.Title = "gnuplot"; textwin.IniFile = "wgnuplot.ini"; textwin.IniSection = "WGNUPLOT"; textwin.DragPre = "load '"; textwin.DragPost = "'\n"; textwin.lpmw = &menuwin; textwin.ScreenSize.x = 80; textwin.ScreenSize.y = 80; textwin.KeyBufSize = 2048; textwin.CursorFlag = 1; /* scroll to cursor after \n & \r */ textwin.shutdown = MakeProcInstance((FARPROC)ShutDown, hInstance); textwin.AboutText = (LPSTR)farmalloc(1024); CheckMemory(textwin.AboutText); sprintf(textwin.AboutText,"Version %s\nPatchlevel %s\nLast Modified %s\n%s\n%s, %s and many others", version, patchlevel, date, gnuplot_copyright, authors[1], authors[0]); textwin.AboutText = (LPSTR)farrealloc(textwin.AboutText, _fstrlen(textwin.AboutText)+1); CheckMemory(textwin.AboutText); menuwin.szMenuName = szMenuName; pausewin.hInstance = hInstance; pausewin.hPrevInstance = hPrevInstance; pausewin.Title = "gnuplot pause"; graphwin.hInstance = hInstance; graphwin.hPrevInstance = hPrevInstance; graphwin.Title = "gnuplot graph"; graphwin.lptw = &textwin; graphwin.IniFile = textwin.IniFile; graphwin.IniSection = textwin.IniSection; graphwin.color=TRUE; graphwin.fontsize = WINFONTSIZE; if (TextInit(&textwin)) exit(1); textwin.hIcon = LoadIcon(hInstance, "TEXTICON"); #ifdef WIN32 SetClassLong(textwin.hWndParent, GCL_HICON, (DWORD)textwin.hIcon); #else SetClassWord(textwin.hWndParent, GCW_HICON, (WORD)textwin.hIcon); #endif if (_argc>1) { int i,noend=FALSE; for (i=0; i<_argc; ++i) if (!stricmp(_argv[i],"-noend") || !stricmp(_argv[i],"/noend")) noend = TRUE; if (noend) ShowWindow(textwin.hWndParent, textwin.nCmdShow); } else ShowWindow(textwin.hWndParent, textwin.nCmdShow); if (IsIconic(textwin.hWndParent)) { /* update icon */ RECT rect; GetClientRect(textwin.hWndParent, (LPRECT) &rect); InvalidateRect(textwin.hWndParent, (LPRECT) &rect, 1); UpdateWindow(textwin.hWndParent); } atexit(WinExit); gnu_main(_argc, _argv, environ); return 0; } /* replacement stdio routines that use Text Window for stdin/stdout */ /* WARNING: Do not write to stdout/stderr with functions not listed in win/wtext.h */ #undef kbhit #undef getche #undef getch #undef putch #undef fgetc #undef getchar #undef getc #undef fgets #undef gets #undef fputc #undef putchar #undef putc #undef fputs #undef puts #undef fprintf #undef printf #undef vprintf #undef vfprintf #undef fwrite #undef fread #if defined(__MSC__)|| defined(WIN32) #define isterm(f) (f==stdin || f==stdout || f==stderr) #else #define isterm(f) isatty(fileno(f)) #endif int MyPutCh(int ch) { return TextPutCh(&textwin, (BYTE)ch); } int MyKBHit(void) { return TextKBHit(&textwin); } int MyGetCh(void) { return TextGetCh(&textwin); } int MyGetChE(void) { return TextGetChE(&textwin); } int MyFGetC(FILE *file) { if (isterm(file)) { return MyGetChE(); } return fgetc(file); } char * MyGetS(char *str) { TextPutS(&textwin,"\nDANGER: gets() used\n"); MyFGetS(str,80,stdin); if (strlen(str) > 0 && str[strlen(str)-1]=='\n') str[strlen(str)-1] = '\0'; return str; } char * MyFGetS(char *str, unsigned int size, FILE *file) { char FAR *p; if (isterm(file)) { p = TextGetS(&textwin, str, size); if (p != (char FAR *)NULL) return str; return (char *)NULL; } return fgets(str,size,file); } int MyFPutC(int ch, FILE *file) { if (isterm(file)) { MyPutCh((BYTE)ch); TextMessage(); return ch; } return fputc(ch,file); } int MyFPutS(char *str, FILE *file) { if (isterm(file)) { TextPutS(&textwin, str); TextMessage(); return (*str); /* different from Borland library */ } return fputs(str,file); } int MyPutS(char *str) { TextPutS(&textwin, str); MyPutCh('\n'); TextMessage(); return 0; /* different from Borland library */ } int MyFPrintF(FILE *file, char *fmt, ...) { int count; va_list args; va_start(args,fmt); if (isterm(file)) { char buf[MAXPRINTF]; count = vsprintf(buf,fmt,args); TextPutS(&textwin,buf); } else count = vfprintf(file, fmt, args); va_end(args); return count; } int MyPrintF(char *fmt, ...) { int count; char buf[MAXPRINTF]; va_list args; va_start(args,fmt); count = vsprintf(buf,fmt,args); TextPutS(&textwin,buf); va_end(args); return count; } size_t MyFWrite(const void *ptr, size_t size, size_t n, FILE *file) { if (isterm(file)) { size_t i; for (i=0; i