"Fossies" - the Fresh Open Source Software Archive

Member "grace-5.1.25/src/main.c" (14 Feb 2015, 29478 Bytes) of package /linux/misc/grace-5.1.25.tar.gz:


As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) C and C++ source code syntax highlighting (style: standard) with prefixed line numbers and code folding option. Alternatively you can here view or download the uninterpreted source code file. For more information about "main.c" see the Fossies "Dox" file reference documentation and the latest Fossies "Diffs" side-by-side code changes report: 5.1.24_vs_5.1.25.

    1 /*
    2  * Grace - GRaphing, Advanced Computation and Exploration of data
    3  * 
    4  * Home page: http://plasma-gate.weizmann.ac.il/Grace/
    5  * 
    6  * Copyright (c) 1991-1995 Paul J Turner, Portland, OR
    7  * Copyright (c) 1996-2009 Grace Development Team
    8  * 
    9  * Maintained by Evgeny Stambulchik
   10  * 
   11  * 
   12  *                           All Rights Reserved
   13  * 
   14  *    This program is free software; you can redistribute it and/or modify
   15  *    it under the terms of the GNU General Public License as published by
   16  *    the Free Software Foundation; either version 2 of the License, or
   17  *    (at your option) any later version.
   18  * 
   19  *    This program is distributed in the hope that it will be useful,
   20  *    but WITHOUT ANY WARRANTY; without even the implied warranty of
   21  *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   22  *    GNU General Public License for more details.
   23  * 
   24  *    You should have received a copy of the GNU General Public License
   25  *    along with this program; if not, write to the Free Software
   26  *    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
   27  */
   28 
   29 #include <config.h>
   30 
   31 #include <stdio.h>
   32 #include <stdlib.h>
   33 #include <unistd.h>
   34 #include <string.h>
   35 #ifdef HAVE_FCNTL_H
   36 #  include <fcntl.h>
   37 #endif
   38 
   39 /* for globals.h */
   40 #define MAIN
   41 
   42 #include "globals.h"
   43 
   44 #include "utils.h"
   45 #include "files.h"
   46 #include "ssdata.h"
   47 
   48 #include "graphs.h"
   49 #include "graphutils.h"
   50 #include "plotone.h"
   51 
   52 #include "device.h"
   53 #include "devlist.h"
   54 #ifndef NONE_GUI
   55 #  include "x11drv.h"
   56 #endif
   57 #include "parser.h"
   58 #include "protos.h"
   59 
   60 
   61 extern char batchfile[];
   62 extern char print_file[];
   63 extern int install_cmap;
   64 
   65 extern Input_buffer *ib_tbl;
   66 extern int ib_tblsize;
   67 
   68 static void usage(FILE *stream, char *progname);
   69 static void VersionInfo(void);
   70 
   71 int inpipe = FALSE;     /* if xmgrace is to participate in a pipe */
   72 
   73 #if defined(DEBUG)    
   74     extern int yydebug;
   75 #endif
   76 
   77 int main(int argc, char *argv[])
   78 {
   79     char *s;
   80     int i, j;
   81     int gno;
   82     int fd;
   83     world w;
   84     view v;
   85     int cur_graph;          /* default (current) graph */
   86     int loadlegend = FALSE; /* legend on and load file names */
   87     int gracebat;       /* if executed as 'gracebat' then TRUE */
   88     int cli = FALSE;            /* command line interface only */
   89     int remove_flag = FALSE;    /* remove file after read */
   90     int noprint = FALSE;    /* if gracebat, then don't print if true */
   91     int sigcatch = TRUE;    /* we handle signals ourselves */
   92 
   93     char fd_name[GR_MAXPATHLEN];
   94 
   95     int wpp, hpp;
   96     
   97     /*
   98      * set version
   99      */
  100     reset_project_version();
  101     /*
  102      * grace home directory
  103      */
  104     if ((s = getenv("GRACE_HOME")) != NULL) {
  105     set_grace_home(s);
  106     }
  107     
  108     /* define the user's name */
  109     init_username();
  110 
  111     /* define the user's home dir */
  112     init_userhome();
  113         
  114     /* set the starting directory */
  115     set_workingdir(NULL);
  116 
  117     /*
  118      * print command
  119      */
  120     if ((s = getenv("GRACE_PRINT_CMD")) != NULL) {
  121     set_print_cmd(s);
  122     }
  123 
  124     /* if no print command defined, print to file by default */
  125     s = get_print_cmd();
  126     if (s == NULL || s[0] == '\0') {
  127         set_ptofile(TRUE);
  128     } else {
  129         set_ptofile(FALSE);
  130     }
  131     
  132     /*
  133      * editor
  134      */
  135     if ((s = getenv("GRACE_EDITOR")) != NULL) {
  136     set_editor(s);
  137     }
  138     
  139     /*
  140      * check for changed help file viewer command
  141      */
  142     if ((s = getenv("GRACE_HELPVIEWER")) != NULL) {
  143     set_help_viewer(s);
  144     }
  145 
  146     /* initialize plots, strings, graphs */
  147     set_program_defaults();
  148 
  149     /* initialize the nonl-fit parameters */
  150     initialize_nonl();
  151 
  152     /* initialize the parser symbol table */
  153     init_symtab();
  154     
  155     /* initialize the rng */
  156     srand48(100L);
  157     
  158     /* initialize T1lib */
  159     if (init_t1() != RETURN_SUCCESS) {
  160         errmsg("--> Broken or incomplete installation - read the FAQ!");
  161     exit (1);
  162     }
  163 
  164     /* initialize colormap data */
  165     initialize_cmap();
  166 
  167     /*
  168      * if program name is gracebat* then don't initialize the X toolkit
  169      */
  170     s = mybasename(argv[0]);
  171 
  172     if (strstr(s, "gracebat") == s) {
  173     gracebat = TRUE;
  174     } else {
  175     gracebat = FALSE;
  176         if (strstr(s, "grace") == s) {
  177             cli = TRUE;
  178         } else {
  179 #ifndef NONE_GUI    
  180             cli = FALSE;
  181             if (initialize_gui(&argc, argv) != RETURN_SUCCESS) {
  182             errmsg("Failed initializing GUI, exiting");
  183                 exit(1);
  184             }
  185 #endif
  186         }
  187     }
  188 
  189     /* initialize devices */
  190 #ifndef NONE_GUI
  191     if (cli == TRUE || gracebat == TRUE) {
  192         tdevice = register_dummy_drv();
  193     } else {
  194         tdevice = register_x11_drv();
  195     }
  196 #else
  197     tdevice = register_dummy_drv();
  198 #endif
  199     select_device(tdevice);
  200 
  201     hdevice = register_ps_drv();
  202     register_eps_drv();
  203 
  204 #ifdef HAVE_LIBPDF
  205     register_pdf_drv();
  206 #endif
  207     register_mif_drv();
  208     register_svg_drv();
  209     register_pnm_drv();
  210 #ifdef HAVE_LIBJPEG
  211     register_jpg_drv();
  212 #endif
  213 #ifdef HAVE_LIBPNG
  214     register_png_drv();
  215 #endif
  216 
  217     register_mf_drv();
  218 
  219     /* check whether locale is correctly set */
  220     if (init_locale() != RETURN_SUCCESS) {
  221         errmsg("Invalid or unsupported locale");
  222     }
  223     /* default is POSIX */
  224     set_locale_num(FALSE);
  225     
  226     /* load startup file */
  227     getparms("gracerc");
  228 
  229     /* load default template */
  230     new_project(NULL);
  231 
  232     cur_graph = get_cg();
  233     
  234     if (argc >= 2) {
  235     for (i = 1; i < argc; i++) {
  236         if (argv[i][0] == '-' && argv[i][1] != '\0') {
  237         if (argmatch(argv[i], "-version", 2)) {
  238                     VersionInfo();
  239             exit(0);
  240         }
  241 #if defined(DEBUG)
  242         if (argmatch(argv[i], "-debug", 6)) {
  243             i++;
  244             if (i == argc) {
  245             fprintf(stderr, "Missing argument for debug flag\n");
  246             usage(stderr, argv[0]);
  247             } else {
  248                 set_debuglevel(atoi(argv[i]));
  249                 if (get_debuglevel() == 4) { 
  250                 /* turn on debugging in pars.y */
  251                 yydebug = TRUE;
  252                 }
  253             }
  254         } else
  255 #endif
  256                if (argmatch(argv[i], "-nosigcatch", 6)) {
  257             sigcatch = FALSE;
  258         } else if (argmatch(argv[i], "-autoscale", 2)) {
  259             i++;
  260             if (i == argc) {
  261             errmsg("Missing argument for autoscale flag");
  262             usage(stderr, argv[0]);
  263             } else {
  264             if (!strcmp("x", argv[i])) {
  265                 autoscale_onread = AUTOSCALE_X;
  266             } else if (!strcmp("y", argv[i])) {
  267                 autoscale_onread = AUTOSCALE_Y;
  268             } else if (!strcmp("xy", argv[i])) {
  269                 autoscale_onread = AUTOSCALE_XY;
  270             } else if (!strcmp("none", argv[i])) {
  271                 autoscale_onread = AUTOSCALE_NONE;
  272             } else {
  273                 errmsg("Improper argument for autoscale flag");
  274                 usage(stderr, argv[0]);
  275             }
  276             }
  277         } else if (argmatch(argv[i], "-batch", 2)) {
  278             i++;
  279             if (i == argc) {
  280             fprintf(stderr, "Missing argument for batch file\n");
  281             usage(stderr, argv[0]);
  282             } else {
  283             strcpy(batchfile, argv[i]);
  284             }
  285         } else if (argmatch(argv[i], "-datehint", 5)) {
  286             i++;
  287             if (i == argc) {
  288             errmsg("Missing argument for datehint flag");
  289             usage(stderr, argv[0]);
  290             } else {
  291             if (!strcmp("iso", argv[i])) {
  292                 set_date_hint(FMT_iso);
  293             } else if (!strcmp("european", argv[i])) {
  294                 set_date_hint(FMT_european);
  295             } else if (!strcmp("us", argv[i])) {
  296                 set_date_hint(FMT_us);
  297             } else if (!strcmp("nohint", argv[i])) {
  298                 set_date_hint(FMT_nohint);
  299             } else {
  300                 errmsg("Improper argument for datehint flag");
  301                 usage(stderr, argv[0]);
  302             }
  303             }
  304         } else if (argmatch(argv[i], "-pipe", 5)) {
  305             inpipe = TRUE;
  306         } else if (argmatch(argv[i], "-noprint", 8)) {
  307             noprint = TRUE;
  308         } else if (argmatch(argv[i], "-dpipe", 6)) {
  309             i++;
  310             if (i == argc) {
  311             fprintf(stderr, "Missing argument for descriptor pipe\n");
  312             usage(stderr, argv[0]);
  313             } else {
  314                         fd = atoi(argv[i]);
  315                         sprintf(fd_name, "pipe<%d>", fd);
  316                         if (register_real_time_input(fd, fd_name, FALSE) !=
  317                             RETURN_SUCCESS) {
  318                             exit(1);
  319                         }
  320             }
  321         } else if (argmatch(argv[i], "-npipe", 6)) {
  322             i++;
  323             if (i == argc) {
  324             fprintf(stderr, "Missing argument for named pipe\n");
  325             usage(stderr, argv[0]);
  326             } else {
  327                         fd = open(argv[i], O_RDONLY | O_NONBLOCK);
  328                         if (fd < 0) {
  329                             fprintf(stderr, "Can't open fifo\n");
  330                         } else {
  331                             if (register_real_time_input(fd, argv[i], TRUE) !=
  332                                 RETURN_SUCCESS) {
  333                                 exit(1);
  334                             }
  335                         }
  336             }
  337 #ifdef HAVE_NETCDF
  338         } else if (argmatch(argv[i], "-netcdf", 7) || argmatch(argv[i], "-hdf", 4)) {
  339             i++;
  340             if (i == argc) {
  341             fprintf(stderr, "Missing argument for netcdf file\n");
  342             usage(stderr, argv[0]);
  343             } else {
  344             strcpy(netcdf_name, argv[i]);
  345             }
  346         } else if (argmatch(argv[i], "-netcdfxy", 9) || argmatch(argv[i], "-hdfxy", 6)) {
  347             i++;
  348             if (i == argc) {
  349             fprintf(stderr, "Missing argument for netcdf X variable name\n");
  350             usage(stderr, argv[0]);
  351             } else {
  352             strcpy(xvar_name, argv[i]);
  353             }
  354             i++;
  355             if (i == argc) {
  356             fprintf(stderr, "Missing argument for netcdf Y variable name\n");
  357             usage(stderr, argv[0]);
  358             } else {
  359             strcpy(yvar_name, argv[i]);
  360             }
  361             if (strcmp(xvar_name, "null")) {
  362             readnetcdf(cur_graph, -1, netcdf_name, xvar_name, yvar_name, -1, -1, 1);
  363             } else {
  364             readnetcdf(cur_graph, -1, netcdf_name, NULL, yvar_name, -1, -1, 1);
  365             }
  366 #endif              /* HAVE_NETCDF */
  367         } else if (argmatch(argv[i], "-timer", 6)) {
  368             i++;
  369             if (i == argc) {
  370             fprintf(stderr, "Missing argument for time delay\n");
  371             usage(stderr, argv[0]);
  372             } else {
  373             timer_delay = atoi(argv[i]);
  374             }
  375 #ifndef NONE_GUI
  376         } else if (argmatch(argv[i], "-install", 7)) {
  377             install_cmap = CMAP_INSTALL_ALWAYS;
  378         } else if (argmatch(argv[i], "-noinstall", 9)) {
  379             install_cmap = CMAP_INSTALL_NEVER;
  380         } else if (argmatch(argv[i], "-barebones", 9)) {
  381             set_barebones( TRUE );
  382 #endif
  383         } else if (argmatch(argv[i], "-timestamp", 10)) {
  384             timestamp.active = TRUE;
  385         } else if (argmatch(argv[i], "-remove", 7)) {
  386             remove_flag = TRUE;
  387         } else if (argmatch(argv[i], "-fixed", 5)) {
  388             i++;
  389             if (i == argc) {
  390             fprintf(stderr, "Missing argument for fixed canvas width\n");
  391             usage(stderr, argv[0]);
  392             } else {
  393                 if (i == argc - 1) {
  394                 fprintf(stderr, "Missing argument for fixed canvas height\n");
  395                 usage(stderr, argv[0]);
  396                 } else {
  397                             wpp = atoi(argv[i]);
  398                     i++;
  399                     hpp = atoi(argv[i]);
  400                             set_page_dimensions(wpp, hpp, FALSE);
  401 #ifndef NONE_GUI
  402                     set_pagelayout(PAGE_FIXED);
  403 #endif
  404             }
  405             }
  406 #ifndef NONE_GUI
  407         } else if (argmatch(argv[i], "-free", 5)) {
  408             set_pagelayout(PAGE_FREE);
  409 #endif
  410         } else if (argmatch(argv[i], "-noask", 5)) {
  411             noask = TRUE;
  412 #ifndef NONE_GUI
  413         } else if (argmatch(argv[i], "-mono", 5)) {
  414             monomode = TRUE;
  415 #endif
  416         } else if (argmatch(argv[i], "-hdevice", 5)) {
  417             i++;
  418             if (i == argc) {
  419             fprintf(stderr, "Missing argument for hardcopy device select flag\n");
  420             usage(stderr, argv[0]);
  421             } else {
  422                 if (set_printer_by_name(argv[i]) != RETURN_SUCCESS) {
  423                             errmsg("Unknown or unsupported device");
  424                             exit(1);
  425                         }
  426                     }
  427         } else if (argmatch(argv[i], "-log", 2)) {
  428             i++;
  429             if (i == argc) {
  430             fprintf(stderr, "Missing argument for log plots flag\n");
  431             usage(stderr, argv[0]);
  432             }
  433             if (!strcmp("x", argv[i])) {
  434             set_graph_xscale(cur_graph, SCALE_LOG);
  435             } else if (!strcmp("y", argv[i])) {
  436             set_graph_yscale(cur_graph, SCALE_LOG);
  437             } else if (!strcmp("xy", argv[i])) {
  438             set_graph_xscale(cur_graph, SCALE_LOG);
  439             set_graph_yscale(cur_graph, SCALE_LOG);
  440             } else {
  441             fprintf(stderr, "%s: Improper argument for -l flag; should be one of 'x', 'y', 'xy'\n", argv[0]);
  442             }
  443         } else if (argmatch(argv[i], "-printfile", 6)) {
  444             i++;
  445             if (i == argc) {
  446             fprintf(stderr, "Missing file name for printing\n");
  447             usage(stderr, argv[0]);
  448             } else {
  449             set_ptofile(TRUE);
  450                         strcpy(print_file, argv[i]);
  451             }
  452         } else if (argmatch(argv[i], "-hardcopy", 6)) {
  453             gracebat = TRUE;
  454         } else if (argmatch(argv[i], "-pexec", 6)) {
  455             i++;
  456             if (i == argc) {
  457             fprintf(stderr, "Missing argument for exec\n");
  458             usage(stderr, argv[0]);
  459             } else {
  460             scanner(argv[i]);
  461             }
  462         } else if (argmatch(argv[i], "-graph", 6)) {
  463             i++;
  464             if (i == argc) {
  465             fprintf(stderr, "Missing parameter for graph select\n");
  466             usage(stderr, argv[0]);
  467             } else {
  468             sscanf(argv[i], "%d", &gno);
  469             if (set_graph_active(gno) == RETURN_SUCCESS) {
  470                 cur_graph = gno;
  471                             select_graph(gno);
  472             } else {
  473                 fprintf(stderr, "Error activating graph %d\n", gno);
  474             }
  475             }
  476         } else if (argmatch(argv[i], "-block", 6)) {
  477             i++;
  478             if (i == argc) {
  479             fprintf(stderr, "Missing filename for block data\n");
  480             usage(stderr, argv[0]);
  481             } else {
  482             getdata(cur_graph, argv[i], cursource, LOAD_BLOCK);
  483             }
  484         } else if (argmatch(argv[i], "-bxy", 4)) {
  485             i++;
  486             if (i == argc) {
  487             fprintf(stderr, "Missing parameter for block data set creation\n");
  488             usage(stderr, argv[0]);
  489             } else {
  490                         int nc, *cols, scol;
  491                         if (field_string_to_cols(argv[i], &nc, &cols, &scol) !=
  492                             RETURN_SUCCESS) {
  493                             errmsg("Erroneous field specifications");
  494                             return 1;
  495                         }
  496                 create_set_fromblock(cur_graph, NEW_SET,
  497                             curtype, nc, cols, scol, autoscale_onread);
  498                         xfree(cols);
  499                     }
  500         } else if (argmatch(argv[i], "-nxy", 4)) {
  501             i++;
  502             if (i == argc) {
  503             fprintf(stderr, "Missing filename for nxy data\n");
  504             usage(stderr, argv[0]);
  505             } else {
  506             getdata(cur_graph, argv[i], cursource, LOAD_NXY);
  507             }
  508         } else if (argmatch(argv[i], "-type", 2) ||
  509                            argmatch(argv[i], "-settype", 8)) {
  510             /* set types */
  511             i++;
  512                     curtype = get_settype_by_name(argv[i]);
  513                     if (curtype == -1) {
  514             fprintf(stderr, "%s: Unknown set type '%s'\n", argv[0], argv[i]);
  515             usage(stderr, argv[0]);
  516             }
  517         } else if (argmatch(argv[i], "-graphtype", 7)) {
  518             i++;
  519             if (i == argc) {
  520             fprintf(stderr, "Missing argument for graph type\n");
  521             } else {
  522             if (!strcmp("xy", argv[i])) {
  523                 set_graph_type(cur_graph, GRAPH_XY);
  524             } else
  525                         if (!strcmp("polar", argv[i])) {
  526                 set_graph_type(cur_graph, GRAPH_POLAR);
  527             } else
  528                         if (!strcmp("bar", argv[i]) || !strcmp("chart", argv[i])) {
  529                 set_graph_type(cur_graph, GRAPH_CHART);
  530             } else
  531                         if (!strcmp("smith", argv[i])) {
  532                 set_graph_type(cur_graph, GRAPH_SMITH);
  533             } else
  534                         if (!strcmp("fixed", argv[i])) {
  535                 set_graph_type(cur_graph, GRAPH_FIXED);
  536             } else
  537                         if (!strcmp("pie", argv[i])) {
  538                 set_graph_type(cur_graph, GRAPH_PIE);
  539             } else {
  540                 fprintf(stderr, "%s: Improper argument for -graphtype\n", argv[0]);
  541                 usage(stderr, argv[0]);
  542             }
  543             }
  544         } else if (argmatch(argv[i], "-legend", 4)) {
  545             i++;
  546             if (i == argc) {
  547             fprintf(stderr, "Missing argument for -legend\n");
  548             usage(stderr, argv[0]);
  549             } else {
  550             if (!strcmp("load", argv[i])) {
  551                 loadlegend = TRUE;
  552                 set_graph_legend_active(cur_graph, TRUE);
  553             } else {
  554                 fprintf(stderr, "Improper argument for -legend\n");
  555                 usage(stderr, argv[0]);
  556             }
  557             }
  558         } else if (argmatch(argv[i], "-rvideo", 7)) {
  559             reverse_video();
  560         } else if (argmatch(argv[i], "-param", 2)) {
  561             i++;
  562             if (i == argc) {
  563             fprintf(stderr, "Missing parameter file name\n");
  564             usage(stderr, argv[0]);
  565             } else {
  566             if (!getparms(argv[i])) {
  567                 fprintf(stderr, "Unable to read parameter file %s\n", argv[i]);
  568             }
  569             }
  570         } else if (argmatch(argv[i], "-results", 2)) {
  571             i++;
  572             if (i == argc) {
  573             fprintf(stderr, "Missing results file name\n");
  574             usage(stderr, argv[0]);
  575             } else {
  576                         /*  open resfile if -results option given */
  577                 if ((resfp = grace_openw(argv[i])) == NULL) {
  578                     exit(1);
  579                 }
  580             setvbuf(resfp, NULL, _IOLBF, 0);
  581             }
  582         } else if (argmatch(argv[i], "-saveall", 8)) {
  583             i++;
  584             if (i == argc) {
  585             fprintf(stderr, "Missing save file name\n");
  586             usage(stderr, argv[0]);
  587             } else {
  588             save_project(argv[i]);
  589             }
  590         } else if (argmatch(argv[i], "-wd", 3)) {
  591             i++;
  592             if (i == argc) {
  593             fprintf(stderr, "Missing parameters for working directory\n");
  594             usage(stderr, argv[0]);
  595             } else {
  596             if (set_workingdir(argv[i]) != RETURN_SUCCESS) {
  597                 fprintf(stderr, "Can't change to directory %s, fatal error", argv[i]);
  598                 exit(1);
  599             }
  600             }
  601         } else if (argmatch(argv[i], "-source", 2)) {
  602             i++;
  603             if (i == argc) {
  604             fprintf(stderr, "Missing argument for data source parameter\n");
  605             usage(stderr, argv[0]);
  606             }
  607             if (argmatch(argv[i], "pipe", 4)) {
  608             cursource = SOURCE_PIPE;
  609             } else if (argmatch(argv[i], "disk", 4)) {
  610             cursource = SOURCE_DISK;
  611             }
  612         } else if (argmatch(argv[i], "-viewport", 2)) {
  613             i++;
  614             if (i > argc - 4) {
  615             fprintf(stderr, "Missing parameter(s) for viewport setting\n");
  616             usage(stderr, argv[0]);
  617             } else {
  618             v.xv1 = atof(argv[i++]);
  619             v.yv1 = atof(argv[i++]);
  620             v.xv2 = atof(argv[i++]);
  621             v.yv2 = atof(argv[i]);
  622             set_graph_viewport(cur_graph, v);
  623             }
  624         } else if (argmatch(argv[i], "-world", 2)) {
  625             i++;
  626             if (i > argc - 4) {
  627             fprintf(stderr, "Missing parameter(s) for world setting\n");
  628             usage(stderr, argv[0]);
  629             } else {
  630             w.xg1 = atof(argv[i++]);
  631             w.yg1 = atof(argv[i++]);
  632             w.xg2 = atof(argv[i++]);
  633             w.yg2 = atof(argv[i]);
  634                         set_graph_world(cur_graph, w);
  635             }
  636         } else if (argmatch(argv[i], "-seed", 5)) {
  637             i++;
  638             if (i == argc) {
  639             fprintf(stderr, "Missing seed for srand48()\n");
  640             usage(stderr, argv[0]);
  641             } else {
  642             srand48(atol(argv[i])); /* note atol() */
  643             }
  644         } else if (argmatch(argv[i], "-maxpath", 8)) {
  645             i++;
  646             if (i == argc) {
  647             fprintf(stderr, "Missing argument for max drawing path\n");
  648             usage(stderr, argv[0]);
  649             } else {
  650             set_max_path_limit(atoi(argv[i]));
  651             }
  652         } else if (argmatch(argv[i], "-safe", 5)) {
  653             safe_mode = TRUE;
  654         } else if (argmatch(argv[i], "-nosafe", 7)) {
  655             safe_mode = FALSE;
  656         } else if (argmatch(argv[i], "-help", 2)) {
  657             usage(stdout, argv[0]);
  658         } else if (argmatch(argv[i], "-usage", 5)) {
  659             usage(stdout, argv[0]);
  660         } else {
  661             fprintf(stderr, "No option %s\n", argv[i]);
  662             usage(stderr, argv[0]);
  663         }
  664         } else {
  665         if (i != argc) {
  666             if (getdata(cur_graph, argv[i], cursource, LOAD_SINGLE) ==
  667                                                         RETURN_SUCCESS) {
  668             set_docname(argv[i]);
  669             if (remove_flag) {
  670                 unlink(argv[i]);
  671             }
  672             clear_dirtystate();
  673             }
  674         }       /* end if */
  675         }           /* end else */
  676     }           /* end for */
  677     }               /* end if */
  678 
  679     
  680     /*
  681      * Process events.
  682      */
  683     if (sigcatch == TRUE) {
  684         installSignal();
  685     }
  686 
  687 /*
  688  * load legend
  689  */
  690     if (loadlegend) {
  691     for (i = 0; i < number_of_graphs(); i++) {
  692         if (is_graph_active(i)) {
  693         for (j = 0; j < number_of_sets(i); j++) {
  694             load_comments_to_legend(i, j);
  695         }
  696         }
  697     }
  698     }
  699 
  700 /*
  701  * if -hardcopy on command line or executed as gracebat,
  702  * just plot the graph and quit
  703  */
  704     if (gracebat == TRUE) {
  705     if (hdevice == 0) {
  706         errmsg("Terminal device can't be used for batch plotting");
  707         exit(1);
  708     }
  709     if (inpipe == TRUE) {
  710             getdata(cur_graph, "stdin", SOURCE_DISK, LOAD_SINGLE);
  711         inpipe = FALSE;
  712     }
  713     if (batchfile[0]) {
  714         getparms(batchfile);
  715     }
  716         while (real_time_under_monitoring()) {
  717             monitor_input(ib_tbl, ib_tblsize, 0);
  718         }
  719     if (!noprint) {
  720         do_hardcopy();
  721     }
  722         
  723     bailout();
  724     } else {
  725 /*
  726  * go main loop
  727  */
  728 #ifndef NONE_GUI
  729         if (cli == TRUE) {
  730             cli_loop();
  731         } else {
  732             startup_gui();
  733         }
  734 #else
  735         cli_loop();
  736 #endif        
  737     }
  738     /* never reaches */
  739     exit(0);
  740 }
  741 
  742 /*
  743  * command interface loop
  744  */
  745 void cli_loop(void)
  746 {
  747     Input_buffer *ib_stdin;
  748     int previous = -1;
  749 
  750     if (inpipe == TRUE) {
  751         getdata(get_cg(), "stdin", SOURCE_DISK, LOAD_SINGLE);
  752         inpipe = FALSE;
  753     }
  754     if (batchfile[0]) {
  755         getparms(batchfile);
  756     }
  757     
  758     if (register_real_time_input(STDIN_FILENO, "stdin", 0)
  759         != RETURN_SUCCESS) {
  760         exit(1);
  761     }
  762     for (ib_stdin = ib_tbl; ib_stdin->fd != STDIN_FILENO; ib_stdin++) {
  763         ;
  764     }
  765 
  766     while (ib_stdin->fd == STDIN_FILENO) {
  767         /* the standard input is still under monitoring */
  768         if (ib_stdin->lineno != previous) {
  769             printf("grace:%d> ", ib_stdin->lineno + 1);
  770             fflush(stdout);
  771             previous = ib_stdin->lineno;
  772         }
  773         monitor_input(ib_tbl, ib_tblsize, 0);
  774     }
  775 
  776 }
  777 
  778 static void usage(FILE *stream, char *progname)
  779 {
  780 /* We use alphabetial order */
  781 
  782     fprintf(stream, "Usage of %s command line arguments: \n", progname);
  783 
  784     fprintf(stream, "-autoscale [x|y|xy|none]              Set autoscale type\n");
  785 #ifndef NONE_GUI
  786     fprintf(stream, "-barebones                            Turn off all toolbars\n");
  787 #endif
  788     fprintf(stream, "-batch     [batch_file]               Execute batch_file on start up\n");
  789     fprintf(stream, "-block     [block_data]               Assume data file is block data\n");
  790     fprintf(stream, "-bxy       [x:y:etc.]                 Form a set from the current block data set\n");
  791     fprintf(stream, "                                        using the current set type from columns\n");
  792     fprintf(stream, "                                        given in the argument\n");
  793     fprintf(stream, "-datehint  [iso|european|us\n");
  794     fprintf(stream, "            |days|seconds|nohint]     Set the hint for dates analysis\n");
  795     fprintf(stream, "                                        (it is only a hint for the parser)\n");
  796 #if defined(DEBUG)
  797     fprintf(stream, "-debug     [debug_level]              Set debugging options\n");
  798 #endif
  799     fprintf(stream, "-dpipe     [descriptor]               Read data from descriptor on startup\n");
  800     fprintf(stream, "-fixed     [width] [height]           Set canvas size fixed to width*height\n");
  801 #ifndef NONE_GUI
  802     fprintf(stream, "-free                                 Use free page layout\n");
  803 #endif
  804     fprintf(stream, "-graph     [graph_number]             Set the current graph number\n");
  805     fprintf(stream, "-graphtype [xy|chart|fixed|polar|pie] Set the type of the current graph\n");
  806     fprintf(stream, "-hardcopy                             No interactive session, just print and\n");
  807     fprintf(stream, "                                        quit\n");
  808     fprintf(stream, "-hdevice   [hardcopy_device_name]     Set default hardcopy device\n");
  809 #ifndef NONE_GUI
  810     fprintf(stream, "-install                              Install private colormap\n");
  811 #endif
  812     fprintf(stream, "-legend    [load]                     Turn the graph legend on\n");
  813     fprintf(stream, "-log       [x|y|xy]                   Set the axis scaling of the current graph\n");
  814     fprintf(stream, "                                        to logarithmic\n");
  815     fprintf(stream, "-maxpath   [length]                   Set the maximal drawing path length\n");
  816 #ifndef NONE_GUI
  817     fprintf(stream, "-mono                                 Run Grace in monochrome mode (affects\n");
  818     fprintf(stream, "                                        the display only)\n");
  819 #endif
  820 #ifdef HAVE_NETCDF
  821     fprintf(stream, "-netcdf    [netcdf file]              Assume data file is in netCDF format\n");
  822     fprintf(stream, "-netcdfxy  [X var name] [Y var name]  If -netcdf was used previously, read from\n");
  823     fprintf(stream, "                                        the netCDF file 'X var name' and 'Y\n");
  824     fprintf(stream, "                                        var name' and create a set. If 'X var\n");
  825     fprintf(stream, "                                        name' is \"null\" then load the\n");
  826     fprintf(stream, "                                        index of Y to X\n");
  827 #endif
  828     fprintf(stream, "-noask                                Assume the answer is yes to all requests -\n");
  829     fprintf(stream, "                                        if the operation would overwrite a file,\n");
  830     fprintf(stream, "                                        grace will do so without prompting\n");
  831 #ifndef NONE_GUI
  832     fprintf(stream, "-noinstall                            Don't use private colormap\n");
  833 #endif
  834     fprintf(stream, "-noprint                              In batch mode, do not print\n");
  835     fprintf(stream, "-nosafe                               Disable safe mode\n");
  836     fprintf(stream, "-nosigcatch                           Don't catch signals\n");
  837     fprintf(stream, "-npipe     [file]                     Read data from named pipe on startup\n");
  838     fprintf(stream, "-nxy       [nxy_file]                 Assume data file is in X Y1 Y2 Y3 ...\n");
  839     fprintf(stream, "                                        format\n");
  840     fprintf(stream, "-param     [parameter_file]           Load parameters from parameter_file to the\n");
  841     fprintf(stream, "                                        current graph\n");
  842     fprintf(stream, "-pexec     [parameter_string]         Interpret string as a parameter setting\n");
  843     fprintf(stream, "-pipe                                 Read data from stdin on startup\n");
  844     fprintf(stream, "-printfile [file for hardcopy output] Save print output to file \n");
  845     fprintf(stream, "-remove                               Remove data file after read\n");
  846     fprintf(stream, "-results   [results_file]             Write results of some data manipulations\n");
  847     fprintf(stream, "                                        to results_file\n");
  848     fprintf(stream, "-rvideo                               Exchange the color indices for black and\n");
  849     fprintf(stream, "                                        white\n");
  850     fprintf(stream, "-safe                                 Safe mode (default)\n");
  851     fprintf(stream, "-saveall   [save_file]                Save all to save_file\n");
  852     fprintf(stream, "-seed      [seed_value]               Integer seed for random number generator\n");
  853     fprintf(stream, "-source    [disk|pipe]                Source type of next data file\n");
  854     fprintf(stream, "-timer     [delay]                    Set allowed time slice for real time\n");
  855     fprintf(stream, "                                        inputs to delay ms\n");
  856     fprintf(stream, "-timestamp                            Add timestamp to plot\n");
  857     fprintf(stream, "-settype   [xy|xydx|...]              Set the type of the next data file\n");
  858     fprintf(stream, "-version                              Show the program version\n");
  859     fprintf(stream, "-viewport  [xmin ymin xmax ymax]      Set the viewport for the current graph\n");
  860     fprintf(stream, "-wd        [directory]                Set the working directory\n");
  861     fprintf(stream, "-world     [xmin ymin xmax ymax]      Set the world coordinates for the\n");
  862     fprintf(stream, "                                        current graph\n");
  863 
  864     fprintf(stream, "-usage|-help                          This message\n");
  865     fprintf(stream, "\n");
  866     fprintf(stream, " ** If it scrolls too fast, run `%s -help | more\' **\n", progname);
  867     exit(0);
  868 }
  869 
  870 static void VersionInfo(void)
  871 {
  872     int i;
  873     
  874     fprintf(stdout, "\n%s\n\n", bi_version_string());
  875 
  876 /* We don't want to reproduce the complete config.h,
  877    but those settings which may be related to problems on runtime */
  878 
  879     fprintf(stdout, "GUI toolkit: %s\n", bi_gui());
  880 #ifdef MOTIF_GUI
  881     fprintf(stdout, "Xbae version: %s\n", bi_gui_xbae());
  882 #endif
  883     fprintf(stdout, "T1lib: %s\n", bi_t1lib());
  884 #ifdef HAVE_FFTW
  885     fprintf(stdout, "FFT: FFTW\n");
  886 #else
  887     fprintf(stdout, "FFT: built-in\n");
  888 #endif
  889 #ifdef HAVE_NETCDF
  890     fprintf(stdout, "NetCDF support: on\n");
  891 #else
  892     fprintf(stdout, "NetCDF support: off\n");
  893 #endif
  894 #ifdef HAVE_LIBPNG
  895 fprintf(stdout, "libpng: %s\n", bi_pnglib());
  896 #endif
  897 #ifdef HAVE_LIBJPEG
  898 fprintf(stdout, "libjpeg: %s\n", bi_libjpeg());
  899 #endif
  900 #ifdef HAVE_LIBPDF
  901 fprintf(stdout, "PDFlib: %s\n", bi_libpdf());
  902 #endif
  903 
  904 
  905 #ifdef DEBUG
  906     fprintf(stdout, "Debugging: enabled\n");
  907 #endif
  908     fprintf(stdout, "Built: %s on %s\n", bi_date(), bi_system());
  909     fprintf(stdout, "Compiler flags: %s\n", bi_ccompiler());
  910  
  911     fprintf(stdout, "\n");
  912     
  913     fprintf(stdout, "Registered devices:\n");
  914     for (i = 0; i < number_of_devices(); i++) {
  915         fprintf(stdout, "%s ", get_device_name(i));
  916     }
  917     fprintf(stdout, "\n\n");
  918     
  919     fprintf(stdout, "(C) Copyright 1991-1995 Paul J Turner\n");
  920     fprintf(stdout, "(C) Copyright 1996-2015 Grace Development Team\n");
  921     fprintf(stdout, "All Rights Reserved\n");
  922 
  923     return;
  924 }