[BACK]Return to plot.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib / gnuplot

Annotation of OpenXM_contrib/gnuplot/plot.c, Revision 1.1

1.1     ! maekawa     1: #ifndef lint
        !             2: static char *RCSid = "$Id: plot.c,v 1.87 1998/04/14 00:16:05 drd Exp $";
        !             3: #endif
        !             4:
        !             5: /* GNUPLOT - plot.c */
        !             6:
        !             7: /*[
        !             8:  * Copyright 1986 - 1993, 1998   Thomas Williams, Colin Kelley
        !             9:  *
        !            10:  * Permission to use, copy, and distribute this software and its
        !            11:  * documentation for any purpose with or without fee is hereby granted,
        !            12:  * provided that the above copyright notice appear in all copies and
        !            13:  * that both that copyright notice and this permission notice appear
        !            14:  * in supporting documentation.
        !            15:  *
        !            16:  * Permission to modify the software is granted, but not the right to
        !            17:  * distribute the complete modified source code.  Modifications are to
        !            18:  * be distributed as patches to the released version.  Permission to
        !            19:  * distribute binaries produced by compiling modified sources is granted,
        !            20:  * provided you
        !            21:  *   1. distribute the corresponding source modifications from the
        !            22:  *    released version in the form of a patch file along with the binaries,
        !            23:  *   2. add special version identification to distinguish your version
        !            24:  *    in addition to the base release version number,
        !            25:  *   3. provide your name and address as the primary contact for the
        !            26:  *    support of your modified version, and
        !            27:  *   4. retain our contact information in regard to use of the base
        !            28:  *    software.
        !            29:  * Permission to distribute the released version of the source code along
        !            30:  * with corresponding source modifications in the form of a patch file is
        !            31:  * granted with same provisions 2 through 4 for binary distributions.
        !            32:  *
        !            33:  * This software is provided "as is" without express or implied warranty
        !            34:  * to the extent permitted by applicable law.
        !            35: ]*/
        !            36:
        !            37: #include <signal.h>
        !            38:
        !            39: #include "plot.h"
        !            40: #include "fit.h"
        !            41: #include "setshow.h"
        !            42: #include "fnproto.h"
        !            43: #include <setjmp.h>
        !            44:
        !            45: #if defined(MSDOS) || defined(DOS386) || defined(__EMX__)
        !            46: # include <io.h>
        !            47: #endif
        !            48:
        !            49: /* HBB: for the control87 function, if used with DJGPP V1: */
        !            50: #if defined(DJGPP) && (DJGPP!=2)
        !            51: # include "ctrl87.h"
        !            52: #endif
        !            53:
        !            54: #ifdef VMS
        !            55: # ifndef __GNUC__
        !            56: #  include <unixio.h>
        !            57: # endif
        !            58: # include <smgdef.h>
        !            59: extern int vms_vkid;
        !            60: extern smg$create_virtual_keyboard();
        !            61: extern int vms_ktid;
        !            62: extern smg$create_key_table();
        !            63: #endif /* VMS */
        !            64:
        !            65: #ifdef AMIGA_SC_6_1
        !            66: # include <proto/dos.h>
        !            67: #endif
        !            68:
        !            69: #ifdef _Windows
        !            70: # include <windows.h>
        !            71: # ifndef SIGINT
        !            72: #  define SIGINT 2             /* for MSC */
        !            73: # endif
        !            74: #endif /* _Windows */
        !            75:
        !            76: extern FILE *gpoutfile;
        !            77:
        !            78: TBOOLEAN interactive = TRUE;   /* FALSE if stdin not a terminal */
        !            79: TBOOLEAN noinputfiles = TRUE;  /* FALSE if there are script files */
        !            80:
        !            81: /*  these 2 could be in misc.c, but are here with all the other globals */
        !            82: TBOOLEAN do_load_arg_substitution = FALSE;
        !            83: char *call_args[10] = { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL };
        !            84:
        !            85: char *infile_name = NULL;      /* name of command file; NULL if terminal */
        !            86:
        !            87: #ifdef GNU_READLINE
        !            88: extern char *rl_readline_name;
        !            89: extern int rl_complete_with_tilde_expansion;
        !            90: #endif
        !            91:
        !            92: #ifdef X11
        !            93: extern int X11_args __PROTO((int, char **));
        !            94: #endif
        !            95:
        !            96: /* patch to get home dir, see command.c */
        !            97: #if (defined (__TURBOC__) && (defined (MSDOS) || defined(DOS386))) || defined(DJGPP)
        !            98: # include <dir.h>              /* MAXPATH */
        !            99: char HelpFile[MAXPATH];
        !           100: #endif /*   - DJL */
        !           101:
        !           102: #ifndef STDOUT
        !           103: # define STDOUT 1
        !           104: #endif
        !           105:
        !           106: /* a longjmp buffer to get back to the command line */
        !           107: #ifdef _Windows
        !           108: static jmp_buf far command_line_env;
        !           109: #else
        !           110: static jmp_buf command_line_env;
        !           111: #endif
        !           112:
        !           113: static void load_rcfile __PROTO((void));
        !           114: RETSIGTYPE inter __PROTO((int anint));
        !           115:
        !           116: /* built-in function table */
        !           117: struct ft_entry GPFAR ft[] =
        !           118: {
        !           119:     /* internal functions: */
        !           120:     {"push", (FUNC_PTR) f_push},
        !           121:     {"pushc", (FUNC_PTR) f_pushc},
        !           122:     {"pushd1", (FUNC_PTR) f_pushd1},
        !           123:     {"pushd2", (FUNC_PTR) f_pushd2},
        !           124:     {"pushd", (FUNC_PTR) f_pushd},
        !           125:     {"call", (FUNC_PTR) f_call},
        !           126:     {"calln", (FUNC_PTR) f_calln},
        !           127:     {"lnot", (FUNC_PTR) f_lnot},
        !           128:     {"bnot", (FUNC_PTR) f_bnot},
        !           129:     {"uminus", (FUNC_PTR) f_uminus},
        !           130:     {"lor", (FUNC_PTR) f_lor},
        !           131:     {"land", (FUNC_PTR) f_land},
        !           132:     {"bor", (FUNC_PTR) f_bor},
        !           133:     {"xor", (FUNC_PTR) f_xor},
        !           134:     {"band", (FUNC_PTR) f_band},
        !           135:     {"eq", (FUNC_PTR) f_eq},
        !           136:     {"ne", (FUNC_PTR) f_ne},
        !           137:     {"gt", (FUNC_PTR) f_gt},
        !           138:     {"lt", (FUNC_PTR) f_lt},
        !           139:     {"ge", (FUNC_PTR) f_ge},
        !           140:     {"le", (FUNC_PTR) f_le},
        !           141:     {"plus", (FUNC_PTR) f_plus},
        !           142:     {"minus", (FUNC_PTR) f_minus},
        !           143:     {"mult", (FUNC_PTR) f_mult},
        !           144:     {"div", (FUNC_PTR) f_div},
        !           145:     {"mod", (FUNC_PTR) f_mod},
        !           146:     {"power", (FUNC_PTR) f_power},
        !           147:     {"factorial", (FUNC_PTR) f_factorial},
        !           148:     {"bool", (FUNC_PTR) f_bool},
        !           149:     {"dollars", (FUNC_PTR) f_dollars}, /* for using extension */
        !           150:     {"jump", (FUNC_PTR) f_jump},
        !           151:     {"jumpz", (FUNC_PTR) f_jumpz},
        !           152:     {"jumpnz", (FUNC_PTR) f_jumpnz},
        !           153:     {"jtern", (FUNC_PTR) f_jtern},
        !           154:
        !           155: /* standard functions: */
        !           156:     {"real", (FUNC_PTR) f_real},
        !           157:     {"imag", (FUNC_PTR) f_imag},
        !           158:     {"arg", (FUNC_PTR) f_arg},
        !           159:     {"conjg", (FUNC_PTR) f_conjg},
        !           160:     {"sin", (FUNC_PTR) f_sin},
        !           161:     {"cos", (FUNC_PTR) f_cos},
        !           162:     {"tan", (FUNC_PTR) f_tan},
        !           163:     {"asin", (FUNC_PTR) f_asin},
        !           164:     {"acos", (FUNC_PTR) f_acos},
        !           165:     {"atan", (FUNC_PTR) f_atan},
        !           166:     {"atan2", (FUNC_PTR) f_atan2},
        !           167:     {"sinh", (FUNC_PTR) f_sinh},
        !           168:     {"cosh", (FUNC_PTR) f_cosh},
        !           169:     {"tanh", (FUNC_PTR) f_tanh},
        !           170:     {"int", (FUNC_PTR) f_int},
        !           171:     {"abs", (FUNC_PTR) f_abs},
        !           172:     {"sgn", (FUNC_PTR) f_sgn},
        !           173:     {"sqrt", (FUNC_PTR) f_sqrt},
        !           174:     {"exp", (FUNC_PTR) f_exp},
        !           175:     {"log10", (FUNC_PTR) f_log10},
        !           176:     {"log", (FUNC_PTR) f_log},
        !           177:     {"besj0", (FUNC_PTR) f_besj0},
        !           178:     {"besj1", (FUNC_PTR) f_besj1},
        !           179:     {"besy0", (FUNC_PTR) f_besy0},
        !           180:     {"besy1", (FUNC_PTR) f_besy1},
        !           181:     {"erf", (FUNC_PTR) f_erf},
        !           182:     {"erfc", (FUNC_PTR) f_erfc},
        !           183:     {"gamma", (FUNC_PTR) f_gamma},
        !           184:     {"lgamma", (FUNC_PTR) f_lgamma},
        !           185:     {"ibeta", (FUNC_PTR) f_ibeta},
        !           186:     {"igamma", (FUNC_PTR) f_igamma},
        !           187:     {"rand", (FUNC_PTR) f_rand},
        !           188:     {"floor", (FUNC_PTR) f_floor},
        !           189:     {"ceil", (FUNC_PTR) f_ceil},
        !           190:
        !           191:     {"norm", (FUNC_PTR) f_normal},     /* XXX-JG */
        !           192:     {"inverf", (FUNC_PTR) f_inverse_erf},      /* XXX-JG */
        !           193:     {"invnorm", (FUNC_PTR) f_inverse_normal},  /* XXX-JG */
        !           194:     {"asinh", (FUNC_PTR) f_asinh},
        !           195:     {"acosh", (FUNC_PTR) f_acosh},
        !           196:     {"atanh", (FUNC_PTR) f_atanh},
        !           197:
        !           198:     {"column", (FUNC_PTR) f_column},   /* for using */
        !           199:     {"valid", (FUNC_PTR) f_valid},     /* for using */
        !           200:     {"timecolumn", (FUNC_PTR) f_timecolumn},   /* for using */
        !           201:
        !           202:     {"tm_sec", (FUNC_PTR) f_tmsec},    /* for timeseries */
        !           203:     {"tm_min", (FUNC_PTR) f_tmmin},    /* for timeseries */
        !           204:     {"tm_hour", (FUNC_PTR) f_tmhour},  /* for timeseries */
        !           205:     {"tm_mday", (FUNC_PTR) f_tmmday},  /* for timeseries */
        !           206:     {"tm_mon", (FUNC_PTR) f_tmmon},    /* for timeseries */
        !           207:     {"tm_year", (FUNC_PTR) f_tmyear},  /* for timeseries */
        !           208:     {"tm_wday", (FUNC_PTR) f_tmwday},  /* for timeseries */
        !           209:     {"tm_yday", (FUNC_PTR) f_tmyday},  /* for timeseries */
        !           210:
        !           211:     {NULL, NULL}
        !           212: };
        !           213:
        !           214: static struct udvt_entry udv_pi = { NULL, "pi", FALSE };
        !           215: /* first in linked list */
        !           216: struct udvt_entry *first_udv = &udv_pi;
        !           217: struct udft_entry *first_udf = NULL;
        !           218:
        !           219: #ifdef OS2
        !           220: # define INCL_DOS
        !           221: # define INCL_REXXSAA
        !           222: # include <os2.h>
        !           223: # include <process.h>
        !           224: ULONG RexxInterface(PRXSTRING, PUSHORT, PRXSTRING);
        !           225: int ExecuteMacro(char *, int);
        !           226: void PM_intc_cleanup();
        !           227: void PM_setup();
        !           228: #endif /* OS2 */
        !           229:
        !           230: #if defined(ATARI) || defined(MTOS)
        !           231: /* For findfile () (?) */
        !           232: # include <support.h>
        !           233: void appl_exit(void);
        !           234: void MTOS_open_pipe(void);
        !           235: extern int aesid;
        !           236: #endif
        !           237:
        !           238: RETSIGTYPE inter(anint)
        !           239: int anint;
        !           240: {
        !           241: #ifdef OS2
        !           242:     (void) signal(anint, SIG_ACK);
        !           243: #else
        !           244:     (void) signal(SIGINT, (sigfunc) inter);
        !           245: #endif
        !           246:
        !           247: #ifndef DOSX286
        !           248:     (void) signal(SIGFPE, SIG_DFL);    /* turn off FPE trapping */
        !           249: #endif
        !           250: #ifdef OS2
        !           251:     PM_intc_cleanup();
        !           252: #else
        !           253:     term_reset();
        !           254:     (void) putc('\n', stderr);
        !           255:     longjmp(command_line_env, TRUE);   /* return to prompt */
        !           256: #endif
        !           257: }
        !           258:
        !           259:
        !           260: /* a wrapper for longjmp so we can keep everything local */
        !           261: void bail_to_command_line()
        !           262: {
        !           263:     longjmp(command_line_env, TRUE);
        !           264: }
        !           265:
        !           266: #if defined(_Windows) || defined(_Macintosh)
        !           267: int gnu_main(argc, argv)
        !           268: #else
        !           269: int main(argc, argv)
        !           270: #endif
        !           271: int argc;
        !           272: char **argv;
        !           273: {
        !           274: #ifdef LINUXVGA
        !           275:     LINUX_setup();
        !           276: #endif
        !           277: /* make sure that we really have revoked root access, this might happen if
        !           278:    gnuplot is compiled without vga support but is installed suid by mistake */
        !           279: #ifdef __linux__
        !           280:     setuid(getuid());
        !           281: #endif
        !           282: #if defined(MSDOS) && !defined(_Windows) && !defined(__GNUC__)
        !           283:     PC_setup();
        !           284: #endif /* MSDOS !Windows */
        !           285: /* HBB: Seems this isn't needed any more for DJGPP V2? */
        !           286: /* HBB: disable all floating point exceptions, just keep running... */
        !           287: #if defined(DJGPP) && (DJGPP!=2)
        !           288:     _control87(MCW_EM, MCW_EM);
        !           289: #endif
        !           290:
        !           291: #if defined(OS2)
        !           292:     int rc;
        !           293:     if (_osmode == OS2_MODE) {
        !           294:        PM_setup();
        !           295:        rc = RexxRegisterSubcomExe("GNUPLOT", (PFN) RexxInterface, NULL);
        !           296:     }
        !           297: #endif
        !           298:
        !           299: /* malloc large blocks, otherwise problems with fragmented mem */
        !           300: #ifdef OSK
        !           301:     _mallocmin(102400);
        !           302: #endif
        !           303:
        !           304: #ifdef MALLOCDEBUG
        !           305:     malloc_debug(7);
        !           306: #endif
        !           307:
        !           308: /* get helpfile from home directory */
        !           309: #ifndef DOSX286
        !           310: # ifndef _Windows
        !           311: #  if defined (__TURBOC__) && (defined (MSDOS) || defined(DOS386))
        !           312:     strcpy(HelpFile, argv[0]);
        !           313:     strcpy(strrchr(HelpFile, DIRSEP1), "\\gnuplot.gih");
        !           314: #  endif                       /*   - DJL */
        !           315: # endif                                /* !_Windows */
        !           316: #endif /* !DOSX286 */
        !           317: #ifdef __DJGPP__
        !           318:     {
        !           319:        char *s;
        !           320:        strcpy(HelpFile, argv[0]);
        !           321:        for (s = HelpFile; *s; s++)
        !           322:            if (*s == DIRSEP1)
        !           323:                *s = DIRSEP2;   /* '\\' to '/' */
        !           324:        strcpy(strrchr(HelpFile, DIRSEP2), "/gnuplot.gih");
        !           325:     }          /* Add also some "paranoid" tests for '\\':  AP */
        !           326: #endif /* DJGPP */
        !           327:
        !           328: #ifdef VMS
        !           329:     unsigned int status[2] = { 1, 0 };
        !           330: #endif
        !           331:
        !           332: #ifdef GNU_READLINE
        !           333:     rl_readline_name = argv[0];
        !           334:     rl_complete_with_tilde_expansion = 1;
        !           335: #endif
        !           336:
        !           337: #ifdef X11
        !           338:     {
        !           339:        int n = X11_args(argc, argv);
        !           340:        argv += n;
        !           341:        argc -= n;
        !           342:     }
        !           343: #endif
        !           344:
        !           345: #ifdef apollo
        !           346:     apollo_pfm_catch();
        !           347: #endif
        !           348:
        !           349: /* moved to ATARI_init in atariaes.trm */
        !           350: /* #ifdef ATARI
        !           351:    void application_init(void);
        !           352:    application_init();
        !           353:    #endif */
        !           354:
        !           355: #ifdef MTOS
        !           356:     MTOS_open_pipe();
        !           357: #endif
        !           358:
        !           359:     setbuf(stderr, (char *) NULL);
        !           360:
        !           361: #ifndef NO_SETVBUF
        !           362:     /* this was once setlinebuf(). Docs say this is
        !           363:      * identical to setvbuf(,NULL,_IOLBF,0), but MS C
        !           364:      * faults this (size out of range), so we try with
        !           365:      * size of 1024 instead. [SAS/C does that, too. -lh]
        !           366:      * Failing this, I propose we just make the call and
        !           367:      * ignore the return : its probably not a big deal
        !           368:      */
        !           369:     if (setvbuf(stdout, (char *) NULL, _IOLBF, (size_t) 1024) != 0)
        !           370:        fputs("Could not linebuffer stdout\n", stderr);
        !           371: #endif
        !           372:
        !           373:     gpoutfile = stdout;
        !           374:     (void) Gcomplex(&udv_pi.udv_value, Pi, 0.0);
        !           375:
        !           376:     init_memory();
        !           377:
        !           378:     interactive = FALSE;
        !           379:     init_terminal();           /* can set term type if it likes */
        !           380:
        !           381: #ifdef AMIGA_SC_6_1
        !           382:     if (IsInteractive(Input()) == DOSTRUE)
        !           383:        interactive = TRUE;
        !           384:     else
        !           385:        interactive = FALSE;
        !           386: #else
        !           387: # if (defined(__MSC__) && defined(_Windows)) || defined(__WIN32__)
        !           388:     interactive = TRUE;
        !           389: # else
        !           390:     interactive = isatty(fileno(stdin));
        !           391: # endif
        !           392: #endif /* !AMIGA_SC_6_1 */
        !           393:
        !           394:     if (argc > 1)
        !           395:        interactive = noinputfiles = FALSE;
        !           396:     else
        !           397:        noinputfiles = TRUE;
        !           398:
        !           399:     if (interactive)
        !           400:        show_version(stderr);
        !           401:
        !           402: #ifdef VMS
        !           403:     /* initialise screen management routines for command recall */
        !           404:     if (status[1] = smg$create_virtual_keyboard(&vms_vkid) != SS$_NORMAL)
        !           405:        done(status[1]);
        !           406:     if (status[1] = smg$create_key_table(&vms_ktid) != SS$_NORMAL)
        !           407:        done(status[1]);
        !           408: #endif /* VMS */
        !           409:
        !           410:     if (!setjmp(command_line_env)) {
        !           411:        /* first time */
        !           412:        interrupt_setup();
        !           413:        load_rcfile();
        !           414:        init_fit();             /* Initialization of fitting module */
        !           415:
        !           416:        if (interactive && term != 0)   /* not unknown */
        !           417:            fprintf(stderr, "\nTerminal type set to '%s'\n", term->name);
        !           418:     } else {
        !           419:        /* come back here from int_error() */
        !           420: #ifdef AMIGA_SC_6_1
        !           421:        (void) rawcon(0);
        !           422: #endif
        !           423:        load_file_error();      /* if we were in load_file(), cleanup */
        !           424: #ifdef _Windows
        !           425:        SetCursor(LoadCursor((HINSTANCE) NULL, IDC_ARROW));
        !           426: #endif
        !           427:
        !           428: #ifdef VMS
        !           429:        /* after catching interrupt */
        !           430:        /* VAX stuffs up stdout on SIGINT while writing to stdout,
        !           431:           so reopen stdout. */
        !           432:        if (gpoutfile == stdout) {
        !           433:            if ((stdout = freopen("SYS$OUTPUT", "w", stdout)) == NULL) {
        !           434:                /* couldn't reopen it so try opening it instead */
        !           435:                if ((stdout = fopen("SYS$OUTPUT", "w")) == NULL) {
        !           436:                    /* don't use int_error here - causes infinite loop! */
        !           437:                    fputs("Error opening SYS$OUTPUT as stdout\n", stderr);
        !           438:                }
        !           439:            }
        !           440:            gpoutfile = stdout;
        !           441:        }
        !           442: #endif /* VMS */
        !           443:        if (!interactive && !noinputfiles) {
        !           444:            term_reset();
        !           445: #if defined(ATARI) || defined(MTOS)
        !           446:            if (aesid > -1)
        !           447:                atexit(appl_exit);
        !           448: #endif
        !           449:            return (IO_ERROR);  /* exit on non-interactive error */
        !           450:        }
        !           451:     }
        !           452:
        !           453:     if (argc > 1) {
        !           454: #ifdef _Windows
        !           455:        int noend = 0;
        !           456: #endif
        !           457:
        !           458:        /* load filenames given as arguments */
        !           459:        while (--argc > 0) {
        !           460:            ++argv;
        !           461:            c_token = NO_CARET; /* in case of file not found */
        !           462: #ifdef _Windows
        !           463:            if (stricmp(*argv, "-noend") == 0 || stricmp(*argv, "/noend") == 0)
        !           464:                noend = 1;
        !           465:            else
        !           466: #endif
        !           467:            if (strcmp(*argv, "-") == 0) {
        !           468:                /* DBT 10-7-98  go interactive if "-" on command line */
        !           469:
        !           470:                interactive = TRUE;
        !           471:                /* will this work on all platforms? */
        !           472:
        !           473:                while (!com_line());
        !           474:
        !           475:                /* interactive = FALSE; /* should this be here? */
        !           476:
        !           477:            } else
        !           478:                load_file(fopen(*argv, "r"), *argv, FALSE);
        !           479:        }
        !           480: #ifdef _Windows
        !           481:        if (noend) {
        !           482:            interactive = TRUE;
        !           483:            while (!com_line());
        !           484:        }
        !           485: #endif
        !           486:     } else {
        !           487:        /* take commands from stdin */
        !           488:        while (!com_line());
        !           489:     }
        !           490:
        !           491:     term_reset();
        !           492:
        !           493: #ifdef OS2
        !           494:     if (_osmode == OS2_MODE)
        !           495:        RexxDeregisterSubcom("GNUPLOT", NULL);
        !           496: #endif
        !           497:
        !           498: #if defined(ATARI) || defined(MTOS)
        !           499:     if (aesid > -1)
        !           500:        atexit(appl_exit);
        !           501: #endif
        !           502:     return (IO_SUCCESS);
        !           503: }
        !           504:
        !           505: #if (defined(ATARI) || defined(MTOS)) && defined(__PUREC__)
        !           506: int purec_matherr(struct exception *e)
        !           507: {
        !           508:     char *c;
        !           509:     switch (e->type) {
        !           510:     case DOMAIN:
        !           511:        c = "domain error";
        !           512:        break;
        !           513:     case SING:
        !           514:        c = "argument singularity";
        !           515:        break;
        !           516:     case OVERFLOW:
        !           517:        c = "overflow range";
        !           518:        break;
        !           519:     case UNDERFLOW:
        !           520:        c = "underflow range";
        !           521:        break;
        !           522:     default:
        !           523:        c = "(unknown error";
        !           524:        break;
        !           525:     }
        !           526:     fprintf(stderr, "\
        !           527: math exception : %s\n\
        !           528:     name : %s\n\
        !           529:     arg 1: %e\n\
        !           530:     arg 2: %e\n\
        !           531:     ret  : %e\n",
        !           532:            c,
        !           533:            e->name,
        !           534:            e->arg1,
        !           535:            e->arg2,
        !           536:            e->retval);
        !           537:
        !           538:     return 1;
        !           539: }
        !           540: #endif /* (ATARI || MTOS) && PUREC */
        !           541:
        !           542:
        !           543: /* Set up to catch interrupts */
        !           544: void interrupt_setup()
        !           545: {
        !           546: #ifdef __PUREC__
        !           547:     setmatherr(purec_matherr);
        !           548: #endif
        !           549:
        !           550:     (void) signal(SIGINT, (sigfunc) inter);
        !           551:
        !           552: #ifdef SIGPIPE
        !           553:     /* ignore pipe errors, this might happen with set output "|head" */
        !           554:     (void) signal(SIGPIPE, SIG_IGN);
        !           555: #endif /* SIGPIPE */
        !           556: }
        !           557:
        !           558:
        !           559: /* Look for a gnuplot init file in . or home directory */
        !           560: static void load_rcfile()
        !           561: {
        !           562:     FILE *plotrc = NULL;
        !           563:     char home[80];
        !           564:     char rcfile[sizeof(PLOTRC) + 80];
        !           565:     char *tmp_home = NULL;
        !           566: #ifndef VMS
        !           567:     char *p;   /* points to last char in home path, or to \0, if none */
        !           568:
        !           569:     tmp_home = getenv(HOME);
        !           570:     if (tmp_home) {
        !           571:        safe_strncpy(home, tmp_home, sizeof(home));
        !           572:        if (strlen(home))
        !           573:            p = &home[strlen(home) - 1];
        !           574:        else
        !           575:            p = home;
        !           576:        if ((*p != DIRSEP1) && (*p != DIRSEP2) && (*p != NUL)) {
        !           577:            assert(p >= home && p <= (home + sizeof(home) - 1 - 2));
        !           578:            if (*p)
        !           579:                p++;
        !           580:            *p++ = DIRSEP1;
        !           581:            *p = NUL;
        !           582:        }
        !           583:     }
        !           584: #else /* VMS */
        !           585:     safe_strncpy(home, HOME, sizeof(home));
        !           586:     tmp_home = home;
        !           587: #endif /* VMS */
        !           588:
        !           589: #ifdef NOCWDRC
        !           590:     /* inhibit check of init file in current directory for security reasons */
        !           591: #else
        !           592:     (void) strcpy(rcfile, PLOTRC);
        !           593:     plotrc = fopen(rcfile, "r");
        !           594: #endif /* !NOCWDRC */
        !           595:
        !           596:     if (plotrc == NULL) {
        !           597:        if (tmp_home) {
        !           598:            (void) sprintf(rcfile, "%s%s", home, PLOTRC);
        !           599:            plotrc = fopen(rcfile, "r");
        !           600: #if defined(ATARI) || defined(MTOS)
        !           601:            if (plotrc == NULL) {
        !           602:                char const *const ext[] = { NULL };
        !           603:                char *ini_ptr = findfile(PLOTRC, getenv("GNUPLOTPATH"), ext);
        !           604:
        !           605:                if (ini_ptr)
        !           606:                    plotrc = fopen(ini_ptr, "r");
        !           607:            }
        !           608: #endif /* ATARI || MTOS */
        !           609:        }
        !           610:     }
        !           611:     if (plotrc)
        !           612:        load_file(plotrc, rcfile, FALSE);
        !           613: }
        !           614:
        !           615: #ifdef OS2
        !           616:
        !           617: int ExecuteMacro(char *argv, int namelength)
        !           618: {
        !           619:     RXSTRING rxRc;
        !           620:     RXSTRING rxArg;
        !           621:     char pszName[CCHMAXPATH];
        !           622:     short sRc;
        !           623:     int rc;
        !           624:
        !           625:     safe_strncpy(pszName, argv, sizeof(pszName));
        !           626:     MAKERXSTRING(rxArg, argv, strlen(argv));
        !           627:     rc = RexxStart(1,
        !           628:                   &rxArg,
        !           629:                   pszName,
        !           630:                   NULL,
        !           631:                   "GNUPLOT",
        !           632:                   RXCOMMAND,
        !           633:                   NULL,
        !           634:                   &sRc,
        !           635:                   &rxRc);
        !           636:     if (rc == -4)
        !           637:        rc = 0;                 /* run was cancelled-don't give error message */
        !           638:
        !           639: /* We don't use this value ?
        !           640:    BTW, don't use free() instead since it's allocated inside RexxStart() */
        !           641:     DosFreeMem(rxRc.strptr);
        !           642:     return rc;
        !           643: }
        !           644:
        !           645: ULONG RexxInterface(PRXSTRING rxCmd, PUSHORT pusErr, PRXSTRING rxRc)
        !           646: /*
        !           647:    ** Rexx command line interface
        !           648:  */
        !           649: {
        !           650:     int rc;
        !           651:     static jmp_buf keepenv;
        !           652:     int cmdlen;
        !           653:
        !           654:     memcpy(keepenv, command_line_env, sizeof(jmp_buf));
        !           655:     if (!setjmp(command_line_env)) {
        !           656:        /* set variable input_line.
        !           657:         * Watch out for line length of NOT_ZERO_TERMINATED strings ! */
        !           658:        cmdlen = rxCmd->strlength + 1;
        !           659:        safe_strncpy(input_line, rxCmd->strptr, cmdlen);
        !           660:        input_line[cmdlen] = NUL;
        !           661:
        !           662:        rc = do_line();
        !           663:        *pusErr = RXSUBCOM_OK;
        !           664:        rxRc->strptr[0] = rc + '0';
        !           665:        rxRc->strptr[1] = NUL;
        !           666:        rxRc->strlength = strlen(rxRc->strptr);
        !           667:     } else {
        !           668:        *pusErr = RXSUBCOM_ERROR;
        !           669:        RexxSetHalt(getpid(), 1);
        !           670:     }
        !           671:     memcpy(command_line_env, keepenv, sizeof(jmp_buf));
        !           672:     return 0;
        !           673: }
        !           674: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>