Annotation of OpenXM_contrib/gnuplot/win/winmain.c, Revision 1.1
1.1 ! maekawa 1: #ifndef lint
! 2: static char *RCSid = "$Id: winmain.c,v 1.15 1998/03/22 23:32:01 drd Exp $";
! 3: #endif
! 4:
! 5: /* GNUPLOT - win/winmain.c */
! 6: /*[
! 7: * Copyright 1992, 1993, 1998 Maurice Castro, Russell Lang
! 8: *
! 9: * Permission to use, copy, and distribute this software and its
! 10: * documentation for any purpose with or without fee is hereby granted,
! 11: * provided that the above copyright notice appear in all copies and
! 12: * that both that copyright notice and this permission notice appear
! 13: * in supporting documentation.
! 14: *
! 15: * Permission to modify the software is granted, but not the right to
! 16: * distribute the complete modified source code. Modifications are to
! 17: * be distributed as patches to the released version. Permission to
! 18: * distribute binaries produced by compiling modified sources is granted,
! 19: * provided you
! 20: * 1. distribute the corresponding source modifications from the
! 21: * released version in the form of a patch file along with the binaries,
! 22: * 2. add special version identification to distinguish your version
! 23: * in addition to the base release version number,
! 24: * 3. provide your name and address as the primary contact for the
! 25: * support of your modified version, and
! 26: * 4. retain our contact information in regard to use of the base
! 27: * software.
! 28: * Permission to distribute the released version of the source code along
! 29: * with corresponding source modifications in the form of a patch file is
! 30: * granted with same provisions 2 through 4 for binary distributions.
! 31: *
! 32: * This software is provided "as is" without express or implied warranty
! 33: * to the extent permitted by applicable law.
! 34: ]*/
! 35:
! 36: /*
! 37: * AUTHORS
! 38: *
! 39: * Maurice Castro
! 40: * Russell Lang
! 41: *
! 42: * Send your comments or suggestions to
! 43: * info-gnuplot@dartmouth.edu.
! 44: * This is a mailing list; to join it send a note to
! 45: * majordomo@dartmouth.edu.
! 46: * Send bug reports to
! 47: * bug-gnuplot@dartmouth.edu.
! 48: */
! 49:
! 50: /* This file implements the initialization code for running gnuplot */
! 51: /* under Microsoft Windows. The code currently compiles only with the */
! 52: /* Borland C++ 3.1 compiler.
! 53: /* */
! 54: /* The modifications to allow Gnuplot to run under Windows were made */
! 55: /* by Maurice Castro. (maurice@bruce.cs.monash.edu.au) 3 Jul 1992 */
! 56: /* and Russell Lang (rjl@monu1.cc.monash.edu.au) 30 Nov 1992 */
! 57: /* */
! 58:
! 59: #define STRICT
! 60: #include <windows.h>
! 61: #include <windowsx.h>
! 62: #include <dos.h>
! 63: #include <stdio.h>
! 64: #include <stdlib.h>
! 65: #include <string.h>
! 66: #include <stdarg.h>
! 67: #include <ctype.h>
! 68: #ifdef __MSC__
! 69: #include <malloc.h>
! 70: #else
! 71: # ifdef __TURBOC__ /* HBB 981201: MinGW32 doesn't have this */
! 72: #include <alloc.h>
! 73: #endif
! 74: #endif
! 75: #include <io.h>
! 76: #include "plot.h"
! 77: #include "setshow.h"
! 78: #include "wgnuplib.h"
! 79: #include "wtext.h"
! 80:
! 81: /* limits */
! 82: #define MAXSTR 255
! 83: #define MAXPRINTF 1024
! 84:
! 85: /* globals */
! 86: TW textwin;
! 87: GW graphwin;
! 88: PW pausewin;
! 89: MW menuwin;
! 90: LPSTR szModuleName;
! 91: LPSTR winhelpname;
! 92: LPSTR szMenuName;
! 93: #define MENUNAME "wgnuplot.mnu"
! 94: #ifndef HELPFILE /* HBB 981203: makefile.win predefines this... */
! 95: #define HELPFILE "wgnuplot.hlp"
! 96: #endif
! 97:
! 98: extern char version[];
! 99: extern char patchlevel[];
! 100: extern char date[];
! 101: /*extern char *authors[];*/
! 102: char *authors[]={
! 103: "Colin Kelly",
! 104: "Thomas Williams"
! 105: };
! 106:
! 107: extern char gnuplot_copyright[];
! 108: void WinExit(void);
! 109: int gnu_main(int argc, char *argv[], char *env[]);
! 110:
! 111: void
! 112: CheckMemory(LPSTR str)
! 113: {
! 114: if (str == (LPSTR)NULL) {
! 115: MessageBox(NULL, "out of memory", "gnuplot", MB_ICONSTOP | MB_OK);
! 116: exit(1);
! 117: }
! 118: }
! 119:
! 120: int
! 121: Pause(LPSTR str)
! 122: {
! 123: pausewin.Message = str;
! 124: return (PauseBox(&pausewin) == IDOK);
! 125: }
! 126:
! 127: /* atexit procedure */
! 128: void
! 129: WinExit(void)
! 130: {
! 131: term_reset();
! 132:
! 133: #ifndef __MINGW32__ /* HBB 980809: FIXME: doesn't exist for MinGW32. So...? */
! 134: fcloseall();
! 135: #endif
! 136: if (graphwin.hWndGraph && IsWindow(graphwin.hWndGraph))
! 137: GraphClose(&graphwin);
! 138: TextMessage(); /* process messages */
! 139: WinHelp(textwin.hWndText,(LPSTR)winhelpname,HELP_QUIT,(DWORD)NULL);
! 140: TextClose(&textwin);
! 141: TextMessage(); /* process messages */
! 142: return;
! 143: }
! 144:
! 145: /* call back function from Text Window WM_CLOSE */
! 146: int CALLBACK WINEXPORT
! 147: ShutDown(void)
! 148: {
! 149: WinExit();
! 150: exit(0);
! 151: return 0;
! 152: }
! 153:
! 154: int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
! 155: LPSTR lpszCmdLine, int nCmdShow)
! 156: {
! 157: /*WNDCLASS wndclass;*/
! 158: LPSTR tail;
! 159:
! 160: #ifdef __MSC__ /* MSC doesn't give us _argc and _argv[] so ... */
! 161: #define MAXCMDTOKENS 128
! 162: int _argc=0;
! 163: LPSTR _argv[MAXCMDTOKENS];
! 164: _argv[_argc] = "wgnuplot.exe";
! 165: _argv[++_argc] = _fstrtok( lpszCmdLine, " ");
! 166: while (_argv[_argc] != NULL)
! 167: _argv[++_argc] = _fstrtok( NULL, " ");
! 168: #endif /* __MSC__ */
! 169:
! 170: szModuleName = (LPSTR)farmalloc(MAXSTR+1);
! 171: CheckMemory(szModuleName);
! 172:
! 173: /* get path to EXE */
! 174: GetModuleFileName(hInstance, (LPSTR) szModuleName, MAXSTR);
! 175: #ifndef WIN32
! 176: if (CheckWGNUPLOTVersion(WGNUPLOTVERSION)) {
! 177: MessageBox(NULL, "Wrong version of WGNUPLOT.DLL", szModuleName, MB_ICONSTOP | MB_OK);
! 178: exit(1);
! 179: }
! 180: #endif
! 181: if ((tail = (LPSTR)_fstrrchr(szModuleName,'\\')) != (LPSTR)NULL)
! 182: {
! 183: tail++;
! 184: *tail = 0;
! 185: }
! 186: szModuleName = (LPSTR)farrealloc(szModuleName, _fstrlen(szModuleName)+1);
! 187: CheckMemory(szModuleName);
! 188:
! 189: winhelpname = (LPSTR)farmalloc(_fstrlen(szModuleName)+_fstrlen(HELPFILE)+1);
! 190: CheckMemory(winhelpname);
! 191: _fstrcpy(winhelpname,szModuleName);
! 192: _fstrcat(winhelpname,HELPFILE);
! 193:
! 194: szMenuName = (LPSTR)farmalloc(_fstrlen(szModuleName)+_fstrlen(MENUNAME)+1);
! 195: CheckMemory(szMenuName);
! 196: _fstrcpy(szMenuName,szModuleName);
! 197: _fstrcat(szMenuName,MENUNAME);
! 198:
! 199: textwin.hInstance = hInstance;
! 200: textwin.hPrevInstance = hPrevInstance;
! 201: textwin.nCmdShow = nCmdShow;
! 202: textwin.Title = "gnuplot";
! 203: textwin.IniFile = "wgnuplot.ini";
! 204: textwin.IniSection = "WGNUPLOT";
! 205: textwin.DragPre = "load '";
! 206: textwin.DragPost = "'\n";
! 207: textwin.lpmw = &menuwin;
! 208: textwin.ScreenSize.x = 80;
! 209: textwin.ScreenSize.y = 80;
! 210: textwin.KeyBufSize = 2048;
! 211: textwin.CursorFlag = 1; /* scroll to cursor after \n & \r */
! 212: textwin.shutdown = MakeProcInstance((FARPROC)ShutDown, hInstance);
! 213: textwin.AboutText = (LPSTR)farmalloc(1024);
! 214: CheckMemory(textwin.AboutText);
! 215: sprintf(textwin.AboutText,"Version %s\nPatchlevel %s\nLast Modified %s\n%s\n%s, %s and many others",
! 216: version, patchlevel, date, gnuplot_copyright, authors[1], authors[0]);
! 217: textwin.AboutText = (LPSTR)farrealloc(textwin.AboutText, _fstrlen(textwin.AboutText)+1);
! 218: CheckMemory(textwin.AboutText);
! 219:
! 220: menuwin.szMenuName = szMenuName;
! 221:
! 222: pausewin.hInstance = hInstance;
! 223: pausewin.hPrevInstance = hPrevInstance;
! 224: pausewin.Title = "gnuplot pause";
! 225:
! 226: graphwin.hInstance = hInstance;
! 227: graphwin.hPrevInstance = hPrevInstance;
! 228: graphwin.Title = "gnuplot graph";
! 229: graphwin.lptw = &textwin;
! 230: graphwin.IniFile = textwin.IniFile;
! 231: graphwin.IniSection = textwin.IniSection;
! 232: graphwin.color=TRUE;
! 233: graphwin.fontsize = WINFONTSIZE;
! 234:
! 235: if (TextInit(&textwin))
! 236: exit(1);
! 237: textwin.hIcon = LoadIcon(hInstance, "TEXTICON");
! 238: #ifdef WIN32
! 239: SetClassLong(textwin.hWndParent, GCL_HICON, (DWORD)textwin.hIcon);
! 240: #else
! 241: SetClassWord(textwin.hWndParent, GCW_HICON, (WORD)textwin.hIcon);
! 242: #endif
! 243: if (_argc>1) {
! 244: int i,noend=FALSE;
! 245: for (i=0; i<_argc; ++i)
! 246: if (!stricmp(_argv[i],"-noend") || !stricmp(_argv[i],"/noend"))
! 247: noend = TRUE;
! 248: if (noend)
! 249: ShowWindow(textwin.hWndParent, textwin.nCmdShow);
! 250: }
! 251: else
! 252: ShowWindow(textwin.hWndParent, textwin.nCmdShow);
! 253: if (IsIconic(textwin.hWndParent)) { /* update icon */
! 254: RECT rect;
! 255: GetClientRect(textwin.hWndParent, (LPRECT) &rect);
! 256: InvalidateRect(textwin.hWndParent, (LPRECT) &rect, 1);
! 257: UpdateWindow(textwin.hWndParent);
! 258: }
! 259:
! 260:
! 261: atexit(WinExit);
! 262:
! 263: gnu_main(_argc, _argv, environ);
! 264:
! 265: return 0;
! 266: }
! 267:
! 268:
! 269: /* replacement stdio routines that use Text Window for stdin/stdout */
! 270: /* WARNING: Do not write to stdout/stderr with functions not listed
! 271: in win/wtext.h */
! 272:
! 273: #undef kbhit
! 274: #undef getche
! 275: #undef getch
! 276: #undef putch
! 277:
! 278: #undef fgetc
! 279: #undef getchar
! 280: #undef getc
! 281: #undef fgets
! 282: #undef gets
! 283:
! 284: #undef fputc
! 285: #undef putchar
! 286: #undef putc
! 287: #undef fputs
! 288: #undef puts
! 289:
! 290: #undef fprintf
! 291: #undef printf
! 292: #undef vprintf
! 293: #undef vfprintf
! 294:
! 295: #undef fwrite
! 296: #undef fread
! 297:
! 298: #if defined(__MSC__)|| defined(WIN32)
! 299: #define isterm(f) (f==stdin || f==stdout || f==stderr)
! 300: #else
! 301: #define isterm(f) isatty(fileno(f))
! 302: #endif
! 303:
! 304: int
! 305: MyPutCh(int ch)
! 306: {
! 307: return TextPutCh(&textwin, (BYTE)ch);
! 308: }
! 309:
! 310: int
! 311: MyKBHit(void)
! 312: {
! 313: return TextKBHit(&textwin);
! 314: }
! 315:
! 316: int
! 317: MyGetCh(void)
! 318: {
! 319: return TextGetCh(&textwin);
! 320: }
! 321:
! 322: int
! 323: MyGetChE(void)
! 324: {
! 325: return TextGetChE(&textwin);
! 326: }
! 327:
! 328: int
! 329: MyFGetC(FILE *file)
! 330: {
! 331: if (isterm(file)) {
! 332: return MyGetChE();
! 333: }
! 334: return fgetc(file);
! 335: }
! 336:
! 337: char *
! 338: MyGetS(char *str)
! 339: {
! 340: TextPutS(&textwin,"\nDANGER: gets() used\n");
! 341: MyFGetS(str,80,stdin);
! 342: if (strlen(str) > 0
! 343: && str[strlen(str)-1]=='\n')
! 344: str[strlen(str)-1] = '\0';
! 345: return str;
! 346: }
! 347:
! 348: char *
! 349: MyFGetS(char *str, unsigned int size, FILE *file)
! 350: {
! 351: char FAR *p;
! 352: if (isterm(file)) {
! 353: p = TextGetS(&textwin, str, size);
! 354: if (p != (char FAR *)NULL)
! 355: return str;
! 356: return (char *)NULL;
! 357: }
! 358: return fgets(str,size,file);
! 359: }
! 360:
! 361: int
! 362: MyFPutC(int ch, FILE *file)
! 363: {
! 364: if (isterm(file)) {
! 365: MyPutCh((BYTE)ch);
! 366: TextMessage();
! 367: return ch;
! 368: }
! 369: return fputc(ch,file);
! 370: }
! 371:
! 372: int
! 373: MyFPutS(char *str, FILE *file)
! 374: {
! 375: if (isterm(file)) {
! 376: TextPutS(&textwin, str);
! 377: TextMessage();
! 378: return (*str); /* different from Borland library */
! 379: }
! 380: return fputs(str,file);
! 381: }
! 382:
! 383: int
! 384: MyPutS(char *str)
! 385: {
! 386: TextPutS(&textwin, str);
! 387: MyPutCh('\n');
! 388: TextMessage();
! 389: return 0; /* different from Borland library */
! 390: }
! 391:
! 392: int MyFPrintF(FILE *file, char *fmt, ...)
! 393: {
! 394: int count;
! 395: va_list args;
! 396: va_start(args,fmt);
! 397: if (isterm(file)) {
! 398: char buf[MAXPRINTF];
! 399: count = vsprintf(buf,fmt,args);
! 400: TextPutS(&textwin,buf);
! 401: }
! 402: else
! 403: count = vfprintf(file, fmt, args);
! 404: va_end(args);
! 405: return count;
! 406: }
! 407:
! 408: int MyPrintF(char *fmt, ...)
! 409: {
! 410: int count;
! 411: char buf[MAXPRINTF];
! 412: va_list args;
! 413: va_start(args,fmt);
! 414: count = vsprintf(buf,fmt,args);
! 415: TextPutS(&textwin,buf);
! 416: va_end(args);
! 417: return count;
! 418: }
! 419:
! 420: size_t MyFWrite(const void *ptr, size_t size, size_t n, FILE *file)
! 421: {
! 422: if (isterm(file)) {
! 423: size_t i;
! 424: for (i=0; i<n; i++)
! 425: TextPutCh(&textwin, ((BYTE *)ptr)[i]);
! 426: TextMessage();
! 427: return n;
! 428: }
! 429: return fwrite(ptr, size, n, file);
! 430: }
! 431:
! 432: size_t MyFRead(void *ptr, size_t size, size_t n, FILE *file)
! 433: {
! 434: if (isterm(file)) {
! 435: size_t i;
! 436: for (i=0; i<n; i++)
! 437: ((BYTE *)ptr)[i] = TextGetChE(&textwin);
! 438: TextMessage();
! 439: return n;
! 440: }
! 441: return fread(ptr, size, n, file);
! 442: }
! 443:
! 444: /* public interface to printer routines : Windows PRN emulation
! 445: * (formerly in win.trm)
! 446: */
! 447:
! 448: #define MAX_PRT_LEN 256
! 449: static char win_prntmp[MAX_PRT_LEN+1];
! 450:
! 451: extern GW graphwin;
! 452:
! 453: FILE *
! 454: open_printer()
! 455: {
! 456: char *temp;
! 457: if ((temp = getenv("TEMP")) == (char *)NULL)
! 458: *win_prntmp='\0';
! 459: else {
! 460: strncpy(win_prntmp,temp,MAX_PRT_LEN);
! 461: /* stop X's in path being converted by mktemp */
! 462: for (temp=win_prntmp; *temp; temp++)
! 463: *temp = tolower(*temp);
! 464: if ( strlen(win_prntmp) && (win_prntmp[strlen(win_prntmp)-1]!='\\') )
! 465: strcat(win_prntmp,"\\");
! 466: }
! 467: strncat(win_prntmp, "_gptmp",MAX_PRT_LEN-strlen(win_prntmp));
! 468: strncat(win_prntmp, "XXXXXX",MAX_PRT_LEN-strlen(win_prntmp));
! 469: mktemp(win_prntmp);
! 470: return fopen(win_prntmp, "w");
! 471: }
! 472:
! 473: void
! 474: close_printer(FILE *outfile)
! 475: {
! 476: fclose(outfile);
! 477: DumpPrinter(graphwin.hWndGraph, graphwin.Title, win_prntmp);
! 478: }
! 479:
! 480: void
! 481: screen_dump(void)
! 482: {
! 483: GraphPrint(&graphwin);
! 484: }
! 485:
! 486:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>