/* ======================================================= * * Copyright 1998-2005 Stephen C. Grubb * * http://ploticus.sourceforge.net * * Covered by GPL; see the file ./Copyright for details. * * ======================================================= */ #include "pl.h" #include "tdhkit.h" #ifndef PREFABS_DIR #define PREFABS_DIR "" #endif #ifndef CONFIGFILE #define CONFIGFILE "" #endif #ifdef LOCALE #include #endif extern int PLGS_setparms(), PLGF_setparms(); extern int fchmod(), chdir(); /* =========================================== */ /* DO_PRELIMINARIES - set defaults, read config file, etc. */ int PL_do_preliminaries() { char buf[512]; FILE *fp; char *filename, *getenv(); char attr[80]; char val[512]; char *lineval; int ix; int valused, found; int i, stat, j; int projectrootfound; char pathslash; char uniq[80]; char configfile[MAXPATH]; char cgierrfile[80]; TDH_errprog( "pl" ); /* set pre-config (hard-coded) defaults.. */ PLS.debug = 0; PLS.echolines = 0; PLS.skipout = 0; PLS.eready = 0; PLS.prefabsdir = NULL; strcpy( PLS.outfile, "" ); PLS.winx = 100; PLS.winy = 0; PLS.winw = 8.0; PLS.winh = 8.0; PLS.winsizegiven = 0; PLS.bkcolorgiven = 0; PLS.clickmap = 0; PLS.usingcm = 0; strcpy( PLS.viewer, "" ); strcpy( PLS.mapfile, "" ); PLS.noshell = 0; TDH_prohibit_shell( 0 ); #ifndef NORLIMIT TDH_reslimits( "cpu", CPULIMIT ); #endif #ifdef LOCALE setlocale(LC_CTYPE, "" ); setlocale(LC_COLLATE, "" ); #endif #ifdef NOX11 PLS.device = 'e'; #else PLS.device = 'x'; #endif PLD.currow = 0; PLD.curdf = 0; PLD.curds = -1; PLD.maxrows = MAXDROWS; PLD.maxdf = MAXD; PLL.maxproclines = MAXPROCLINES; PLVsize = MAXDAT; PLG_set_early_defaults(); PLS.errfp = stderr; /* portability? */ PLS.diagfp = stderr; /* portability? */ PLS.bignumspacer = '\0'; /* use standard number notation */ PLS.bignumthres = 4; suppress_convmsg( 1 ); /* suppress unplottable data msgs by default - user can turn on */ DT_checkdatelengths( 0 ); /* don't be strict about the length of date items */ setintvar( "CM_UNITS", 0 ); projectrootfound = 0; strcpy( TDH_tmpdir, TMPDIR ); pathslash = PATH_SLASH; /* set this now, but it might be updated depending on what's in config file.. */ GL_make_unique_string( uniq, 0 ); sprintf( PLS.tmpname, "%s%cplo%s", TDH_tmpdir, pathslash, uniq ); /* make cgierrfile (default /tmp/plcgi_err) for cgi errors */ sprintf( cgierrfile, "%s%cplcgi_err", TDH_tmpdir, PATH_SLASH ); /* reads and process config file, if any.. */ if( PLS.cgiargs != NULL ) { /* determine name of config file.. (can't use PLOTICUS_CONFIG in CGI context) */ char *cgiprogname; strcpy( buf, "file=" ); strcat( buf, CONFIGFILE ); if( strlen( buf ) == 5 ) { /* CONFIGFILE not set.. retrieve prog name from CGI environment and build config file name from that.. */ cgiprogname = getenv( "SCRIPT_FILENAME" ); if( cgiprogname == NULL ) { PLS.errfp = fopen( cgierrfile, "w" ); if( PLS.errfp != NULL ) { fprintf( PLS.errfp, "cgi var SCRIPT_FILENAME not found.\n" ); #ifdef UNIX fchmod( fileno( PLS.errfp ), 00666 ); #endif } TDH_errfile( PLS.errfp ); /* set it for TDH */ return( 1 ); } strcat( buf, cgiprogname ); j = strlen( buf ) -4; if( strcmp( &buf[ j ], ".cgi" )==0 ) buf[ j ] = '\0'; else if( strcmp( &buf[ j ], ".exe" )==0 ) buf[ j ] = '\0'; strcat( buf, ".cnf" ); } strcpy( configfile, buf ); } else { /* command line usage.. check PLOTICUS_CONFIG.. */ filename = getenv( "PLOTICUS_CONFIG" ); if( filename == NULL ) goto SKIPCONFIG; sprintf( configfile, "file=%s", filename ); } if( strlen( configfile ) == 5 ) { if( PLS.cgiargs != NULL ) goto BAD_CGI_CONFIG; else goto SKIPCONFIG; /* no config file given.. */ } stat = TDH_readconfig( configfile ); /* no point in checking return stat.. */ /* do this again because TDH_tmpdir might have been updated.. */ GL_make_unique_string( uniq, 0 ); sprintf( PLS.tmpname, "%s%cplo%s", TDH_tmpdir, pathslash, uniq ); /* now read it again to get pl-specific items.. */ fp = fopen( &configfile[5], "r" ); if( fp == NULL ) { if( PLS.cgiargs != NULL ) { BAD_CGI_CONFIG: PLS.errfp = fopen( cgierrfile, "w" ); if( PLS.errfp != NULL ) { fprintf( PLS.errfp, "cgi mode: cannot open config file (%s).\n", &configfile[5] ); #ifdef UNIX fchmod( fileno( PLS.errfp ), 00666 ); #endif } return( 1 ); } else Eerr( 15060, "Cannot open ploticus config file", &configfile[5] ); return( 0 ); } /* get user settings.. */ while( fgets( buf, 511, fp ) != NULL ) { buf[ strlen( buf ) -1 ] = '\0'; ix = 0; strcpy( attr, GL_getok( buf, &ix ) ); if( attr[0] == '\0' ) continue; if( attr[0] == '#' || attr[0] == '/' ) continue; /* skip comments of various kinds */ while( isspace( (int) buf[ix] ) )ix++; lineval = &buf[ix]; strcpy( val, GL_getok( buf, &ix ) ); if( attr[ strlen( attr ) -1 ] == ':' ) attr[ strlen( attr ) - 1 ] = '\0'; /* attributes that exist in config file, but not proc settings, go here: */ if( strcmp( attr, "projectroot" )==0 ) { stat = chdir( val ); if( stat != 0 ) goto CGI_BAD_CHDIR; projectrootfound = 1; if( PLS.debug ) fprintf( PLS.diagfp, "config: found projectroot.. chdir to %s..\n", val ); } else if( strcmp( attr, "option" )==0 ) { val[0] = '\0'; sscanf( buf, "%*s %s %s", attr, val ); /* check for embedded '=' in attr.. if found indicates prefab parm setting.. send lineval as attr.. */ for( i = 0, found = 0; attr[i] != '\0'; i++ ) if( attr[i] == '=' ) { found = 1; break; } if( found ) { strcpy( attr, lineval ); strcpy( val, "" ); } if( PLS.debug ) fprintf( PLS.diagfp, "config file: got option: %s %s\n", attr, val ); PL_process_arg( attr, val, &valused, &found ); if( !found ) Eerr( 2784, "invalid 'option:' in config file", attr ); } /* shared settings takes care of settings that can be set in config file OR proc settings */ else { stat = PL_sharedsettings( attr, val, lineval ); if( stat == 0 && PLS.debug ) fprintf( PLS.diagfp, "config: setting %s to %s\n", attr, lineval ); } /* don't forget that there are other settings (tmpdir, date-related, etc.) * that were handled by the TDH config file reader !! */ } fclose( fp ); SKIPCONFIG: if( PLS.cgiargs != NULL && !projectrootfound ) { CGI_BAD_CHDIR: PLS.errfp = fopen( cgierrfile, "w" ); if( PLS.errfp != NULL ) { fprintf( PLS.errfp, "cgi mode: no projectroot in config file, or could not chdir to projectroot\n" ); #ifdef UNIX fchmod( fileno( PLS.errfp ), 00666 ); #endif } return( 1 ); } /* get prefabs directory name if available.. */ /* this must come after config file is read, because in cgi mode PLOTICUS_PREFABS is set via config file. */ PLS.prefabsdir = getenv( "PLOTICUS_PREFABS" ); /* maybe PREFABS_DIR was set in the Makefile... */ #ifdef UNIX if( PLS.prefabsdir == NULL ) PLS.prefabsdir = PREFABS_DIR ; else if( PLS.prefabsdir[0] == '\0' ) PLS.prefabsdir = PREFABS_DIR ; if( PLS.prefabsdir[0] == '\0' ) PLS.prefabsdir = NULL; #endif if( PLS.prefabsdir != NULL ) { TDH_setspecialincdir( PLS.prefabsdir ); /* set special include directory (#include $foo) */ /* note: prefabsdir must reference static storage, either via getenv() or constant */ } return( 0 ); } /* ====================================== */ /* BEGIN - initializations that are done AFTER config file and args are looked at.. */ int PL_begin() { char buf[128]; /* graphcore initializations.. */ Esetsize( PLS.winw, PLS.winh, PLS.winx, PLS.winy ); EDXlo = 0.0; EDXhi = 0.0; EDYlo = 0.0; EDYhi = 0.0; PLS.eready = 0; #ifndef NOSVG if( PLS.device == 's' ) PLGS_setparms( PLS.debug, PLS.tmpname, PLS.clickmap ); #endif #ifndef NOSWF if( PLS.device == 'f' ) PLGF_setparms( PLS.debug, PLS.tmpname, Estandard_font ); /* pass user selected -font if any */ #endif /* initialize the data structures.. */ PL_init_mem(); if( PLS.debug ) { fprintf( PLS.diagfp, "Version: pl %s\n", PLVERSION ); if( PLS.cgiargs != NULL ) fprintf( PLS.diagfp, "operating in CGI mode\n" ); Epcodedebug( 1, PLS.diagfp ); /* tell pcode.c to output diagnostics too */ } /* set PLVERSION variable.. */ sprintf( buf, "ploticus %s http://ploticus.sourceforge.net (GPL)", PLVERSION ); TDH_setvar( "PLVERSION", buf ); if( PLS.clickmap ) { /* .map filename */ if( PLS.mapfile[0] == '\0' ) { if( PLS.clickmap == 2 ) strcpy( PLS.mapfile, "stdout" ); /* csmap defaults to stdout.. scg 8/26/04 */ else if( PLS.outfile[0] != '\0' ) makeoutfilename( PLS.outfile, PLS.mapfile, 'm', 1); else strcpy( PLS.mapfile, "unnamed.map" ); } PL_clickmap_init(); } return( 0 ); } /* ======================================================= * * Copyright 1998-2005 Stephen C. Grubb * * http://ploticus.sourceforge.net * * Covered by GPL; see the file ./Copyright for details. * * ======================================================= */