|
/*ScianMain.c
Eric Pepke
Main routines for SciAn
*/
#include "Scian.h"
#include "ScianTypes.h"
#include "ScianArrays.h"
#include "ScianLists.h"
#include "ScianEvents.h"
#include "ScianWindows.h"
#include "ScianObjWindows.h"
#include "ScianObjFunctions.h"
#include "ScianVisWindows.h"
#include "ScianDialogs.h"
#include "ScianDatasets.h"
#include "ScianColors.h"
#include "ScianControls.h"
#include "ScianDrawings.h"
#include "ScianIcons.h"
#include "ScianRecorders.h"
#include "ScianFiles.h"
#include "ScianFileSystem.h"
#include "ScianGarbageMan.h"
#include "ScianScripts.h"
#include "ScianTimers.h"
#include "ScianErrors.h"
#include "ScianIDs.h"
#include "ScianSpaces.h"
#include "ScianPreferences.h"
#include "ScianSciences.h"
#include "ScianSnap.h"
#include "ScianAxes.h"
#include "ScianTextFiles.h"
Bool stuffInited = false;
extern Bool recordEnabled;
Bool runningRemote = false;
real missingData = 1.1E37;
real plusInf = 1E37;
real minusInf = -1E37;
Bool demoP = false;
Bool scriptSelectP = false;
Bool abortScriptP = true;
extern Bool runningScript; /*True iff running script*/
#ifdef GRAPHICS
#ifdef CURSORS4D
/*Cursors*/
Cursor watchCursor =
{
0x07e0,
0x07e0,
0x07e0,
0x07e0,
0x0810,
0x1008,
0x1008,
0x11cc,
0x110c,
0x1108,
0x1108,
0x0810,
0x07e0,
0x07e0,
0x07e0,
0x07e0
};
Cursor questionCursor =
{
0x0300,
0x0300,
0x0000,
0x0300,
0x0300,
0x0300,
0x0380,
0x0180,
0x0070,
0x0038,
0x0018,
0x1818,
0x1818,
0x1c38,
0x0ff0,
0x07e0
};
Cursor iconCursor =
{
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF,
0xFFFF
};
#endif
#endif
/*Read states*/
#define RS_FILE 0 /*Read names as file names*/
#define RS_FORMAT 1 /*Read names as formats*/
#define RS_LOG 2 /*Read names as log files*/
#define RS_SCRIPT 3 /*Read names as script files*/
#define RS_DIRECTORY 4 /*Read names as directory files*/
void ParseArgs(argc, argv)
int argc;
char *argv[];
/*Parses the arguments in argc and argv*/
{
int k;
char format[256]; /*Current file format*/
ObjPtr corral; /*Corral in the datasets window*/
char *a;
Bool scriptSet;
int readState = RS_FILE;
scriptSet = false;
strcpy(format, "");
for (k = 1; k < argc; ++k)
{
/*Go through arguments, parsing them*/
if (readState != RS_FILE)
{
/*Read this argument as a whatever*/
switch(readState)
{
case RS_FORMAT:
strncpy(format, argv[k], 255);
format[255] = 0;
break;
case RS_SCRIPT:
if (scriptSet)
{
fprintf(stderr, "%s: Only one script can be given on the command line.\n", argv[0]);
exit(-1);
}
scriptSet = true;
BeginScript(argv[k]);
break;
case RS_LOG:
if (strcmp(argv[k], "-") == 0)
{
OpenLogFile((char *) 0);
}
else
{
OpenLogFile(argv[k]);
}
break;
case RS_DIRECTORY:
{
char t[MAXPATHLEN + 1];
if (chdir(argv[k]) == 0) /* check if valid directory */
{
getwd(t); /* get expanded name back */
GetFileWindow(t);
chdir(dirSave); /* return to original directory */
}
else
{
fprintf(stderr, "%s: '%s' is an invalid directory.\n", argv[0], argv[k]);
exit(-1);
}
}
break;
}
readState = RS_FILE;
}
else if (argv[k][0] == '-')
{
/*It's a switch*/
readState = RS_FILE;
for (a = &(argv[k][1]); *a; ++a)
{
switch (*a)
{
case 'f':
/*New file format*/
readState = RS_FORMAT;
break;
case '1':
/*One observer, clock, whatever*/
++a;
switch (*a)
{
case 'c':
case 'C':
oneClock = true;
break;
case 'o':
case 'O':
oneObserver = true;
break;
case 'l':
case 'L':
oneLights = true;
break;
case 'r':
case 'R':
oneRenderer = true;
break;
case 'p':
case 'P':
onePalette = true;
break;
default:
fprintf(stderr, "%s: Unrecognized object type for -1 flag\n", argv[0]);
exit(-1);
}
break;
case 's':
/*Script to run*/
readState = RS_SCRIPT;
break;
case 'S':
/*Select in scripts*/
scriptSelectP = true;
break;
case 'C':
/*Continue in scripts*/
abortScriptP = false;
break;
case 'l':
/*Open log file*/
readState = RS_LOG;
break;
case 'v':
/*Enable recording*/
#ifdef GRAPHICS
#ifdef IRIS
blankscreen(FALSE);
blanktime(0);
#endif
#endif
recordEnabled = true;
break;
case 'd':
/*Demo mode*/
demoP = true;
break;
case 'o':
/*Open a directory*/
readState = RS_DIRECTORY;
break;
default:
/*Undefined switch*/
fprintf(stderr, "%s: Switch %s is undefined.\n", argv[0], argv[k]);
exit(-1);
}
}
}
else
{
WinInfoPtr datasetsWindow;
/*It must be a file name*/
datasetsWindow = DatasetsWindow();
SelWindow(datasetsWindow);
IdleAllWindows();
LongOperation();
ReadFile(argv[k], format);
}
}
}
Bool handlingSignals = true;
#ifdef SIGNALS
#ifdef PROTO
void SignalHandler(int sig, int code, struct sigcontext *context)
#else
void SignalHandler(sig, code, context)
int sig;
int code;
struct sigcontext *context;
#endif
/*Handles signals*/
{
if (0 == handlingSignals)
{
/*Just expire*/
return;
}
switch(sig)
{
#ifdef SIGALRM
case SIGALRM:
/*Get some new events*/
NewEvents();
{
struct itimerval value, ovalue;
value . it_interval . tv_sec = 0;
value . it_interval . tv_usec = 0;
value . it_value . tv_sec = 0;
value . it_value . tv_usec = 100000L;
setitimer(ITIMER_REAL, &value, &ovalue);
}
signal(SIGALRM, SignalHandler);
break;
#endif
#ifdef SIGDANGER
case SIGDANGER:
signal(SIGDANGER, SignalHandler);
break;
#endif
}
}
#endif
TestTextFile()
{
TextFilePtr file;
file = OpenTextFile("testo.txt", TF_READ + TF_CONTINUATION + TF_HASHCOMMENTS);
if (file)
{
char *curLine;
while (curLine = GetNextLine(file))
{
char *chickenWhere;
chickenWhere = strstr(curLine, "chicken");
if (chickenWhere)
{
CurLineError(file, "'chicken' may not appear", chickenWhere,
chickenWhere + strlen("chicken"));
}
}
CloseTextFile(file);
}
else
{
perror("testo.txt");
}
}
main(argc, argv)
int argc;
char *argv[];
{
#ifdef MALLOCH
#ifdef M_MXFAST
mallopt(M_MXFAST, 1024);
#endif
#endif
#ifdef GRAPHICS
#ifdef IRIS
foreground();
#endif
#endif
#ifdef SIGNALS
/*Set up signals*/
#ifdef SIGDANGER
signal(SIGDANGER, SignalHandler);
#endif
#endif
#ifndef GETGDESCAFTER
GetConfiguration();
#endif
InitNames();
InitObjects();
InitTextFiles();
InitArrays();
InitLists();
InitControls();
InitDatabase();
InitSciences();
InitAxes();
MainWindow();
ParseArgs(argc, argv);
#ifdef INTERACTIVE
QueueDevices();
#endif
InitEvents();
InitSnapshots();
MainLoop();
KillSnapshots();
KillEvents();
#ifdef INTERACTIVE
UnqueueDevices();
#endif
CloseAllLogFiles();
#ifdef GRAPHICS
#ifdef IRIS
if (recordEnabled)
{
blanktime(100000);
}
#endif
#endif
handlingSignals = false;
DisposeAllWindows();
KillAnimation();
KillGlobalFunctions();
KillRecorders();
KillPreferences();
KillColors();
KillDialogs();
KillObjFunctions();
KillVisWindows();
KillObjWindows();
KillWindows();
KillPictures();
KillVisObjects();
KillTimers();
KillSpaces();
KillFilters();
KillDatasets();
KillGeometry();
KillDrawings();
KillIcons();
KillSockets();
KillDraw();
KillAxes();
KillSciences();
KillDatabase();
KillControls();
KillJohnFiles();
KillFiles();
TrashDay();
KillLists();
KillArrays();
KillTextFiles();
KillObjects();
KillNames();
exit(0);
}
InitStuff()
/*Initializes stuff. Has to be called after one window has been opened.*/
{
if (!stuffInited)
{
#ifdef GRAPHICS
#ifdef GL4D
#ifdef IRIS
defaultMonitor = getmonitor();
#else
#ifdef HZ60
defaultMonitor = HZ60;
#else
defaultMonitor = 1;
#endif
#endif
#endif
#endif
#ifdef GETGDESCAFTER
GetConfiguration();
#endif
InitDraw();
InitIcons();
InitSockets();
InitColors();
InitDrawings();
InitSpaces();
InitTimers();
InitGeometry();
InitDatasets();
InitFilters();
InitFiles();
InitJohnFiles();
InitPictures();
InitFonts();
InitWindows();
InitObjWindows();
InitObjFunctions();
InitVisWindows();
InitVisObjects();
InitDialogs();
InitPreferences();
InitRecorders();
InitGlobalFunctions();
InitAnimation();
/*Set up cursors*/
#ifdef GRAPHICS
#ifdef CURSORS4D
#ifdef GL4D
curstype(C16X1);
#endif
defcursor(WATCHCURSOR, watchCursor);
curorigin(WATCHCURSOR, 8, 8);
defcursor(QUESTIONCURSOR, questionCursor);
curorigin(QUESTIONCURSOR, 8, 8);
defcursor(ICONCURSOR, iconCursor);
curorigin(ICONCURSOR, 8, 8);
#endif
#endif
stuffInited = true;
#ifdef SIGNALS
#ifdef SIGALRM
signal(SIGALRM, SignalHandler);
{
struct itimerval value, ovalue;
value . it_interval . tv_sec = 0;
value . it_interval . tv_usec = 0;
value . it_value . tv_sec = 0;
value . it_value . tv_usec = 100000L;
setitimer(ITIMER_REAL, &value, &ovalue);
}
#endif
#endif
}
}
|