/* ======================================================= *
* 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 <locale.h>
#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. *
* ======================================================= */
syntax highlighted by Code2HTML, v. 0.9.1