/* $Id: $ */ /* Copyright (C) 1997 Sverre Hvammen Johansen, * Department of Informatics, University of Oslo. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; version 2. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "file.h" #include "simfile.h" /****************************************************************************** RUTINEOPTIONS */ static char __roptions (antarg, arg1) long antarg; char arg1[]; { long i, size = 0; if (antarg < 2) return (__TRUE); if (!__dynsize) return (__TRUE); if (arg1[0] != '-') return (__TRUE); if (arg1[1] != 'm' && arg1[1] != 'k' && arg1[1] != 'M' && arg1[1] != 'K') return (__TRUE); for (i = 2; arg1[i] >= '0' && arg1[i] <= '9'; i++) size = size * 10 + arg1[i] - '0'; if (arg1[1] == 'm' || arg1[1] == 'M') size *= 1024; if (arg1[i] == '\0') { __maxsize = __poolsize = size; if (arg1[1] == 'k' || arg1[1] == 'K') (void) fprintf (stderr, "Poolsize is changed to %dK\n", __poolsize); else (void) fprintf (stderr, "Poolsize is changed to %dM\n", __poolsize / 1024); } return (__TRUE); } /****************************************************************************** RutineAllocDynMem */ static void __rallocdynmem (size) long size; { __min = (__dhp) calloc ((unsigned) (size), (unsigned) 1); if (!__min) __rerror ("Allocdynmem: Virtual memory exhausted"); __fri = __min; __max = (__dhp) ((char *) __min + size); } /****************************************************************************** RUTINESTART */ #if HAVE_SIGNAL_H #include #endif #if HAVE_SIGFPE RETSIGTYPE __rfloat_trap () { __rerror ("Arithmetic overflow"); } #endif #if HAVE_SIGSEGV RETSIGTYPE __rseg_trap () { __rerror ("System error: Segmentation violation"); } #endif #if HAVE_SIGILL RETSIGTYPE __rillegal_trap () { __rerror ("System error: Illegal instruction"); } #endif #if HAVE_SIGTRAP RETSIGTYPE __rtrace_trap () { __rerror ("System error: Trace trap"); } #endif #if HAVE_SIGSYS RETSIGTYPE __rsys_trap () { __rerror ("System error: Bad argument to system call"); } #endif #if HAVE_SIGBUS RETSIGTYPE __rbus_trap () { __rerror ("System error: Bus error"); } #endif __rstart (argc, argv) int argc; char *argv[]; { #if CLOCK clock (); #endif __sysin.s.s.file = stdin; __sysout.s.s.s.file = stdout; __syserr.s.s.s.file = stderr; __argc = (long) argc; __argv = (long) argv; __progname = argv[0]; __roptions (argc, argv[1]); __init (); /* SYSIN :- new infile("..."); * SYSOUT :- new printfile("..."); * SYSIN.open(blanks(INPUT_LINE_LENGTH)); * SYSOUT.open(blanks(OUTPUT_LINE_LENGTH)); * inspect SYSIN do * inspect SYSOUT do */ if (__poolsize) __rallocdynmem (__poolsize * (long) 1024); else __rallocdynmem (DYNMEMSIZEKB * (long) 1024); __lb = __pb = (__dhp) & __blokk0FILE; /* Fyller IMAGE til stdin og stdout med blanke */ __rtextvalassign (&((__bs2FILE *) __rsysin ())->IMAGE, (__txtvp) & __tk0); __rtextvalassign (&((__bs2FILE *) __rsysout ())->IMAGE, (__txtvp) & __tk0); __rtextvalassign (&((__bs2FILE *) __rsyserr ())->IMAGE, (__txtvp) & __tk0); /* Kobler c1,c2 i blokk0 til objektene av infile og printfile * henholdsvis * * * * * * * * * * * sysin og sysout. */ __blokk0FILE.c1 = __rsysin (); __blokk0FILE.c2 = __rsysout (); #if HAVE_SIGFPE signal (SIGFPE, __rfloat_trap); #endif #if HAVE_SIGSEGV signal (SIGSEGV, __rseg_trap); #endif #if HAVE_SIGILL signal (SIGILL, __rillegal_trap); #endif #if HAVE_SIGTRAP signal (SIGTRAP, __rtrace_trap); #endif #if HAVE_SIGSYS signal (SIGSYS, __rsys_trap); #endif #if HAVE_SIGBUS signal (SIGBUS, __rbus_trap); #endif } /****************************************************************************** RUTINESLUTT */ __rslutt () { if (__gc && ((__bs1FILE *) __blokk0FILE.c2)->open) { __rpoutimage (__blokk0FILE.c2); printf ("%d garbage collection(s) in %.1f seconds.", __gc, __gbctime); if (__chpoolsize) { printf (" Poolsize changed to "); if (__poolsize >= 1024) printf ("%dM while running.", __poolsize / 1024); else printf ("%dK while running.", __poolsize); } printf ("\n"); } __riclose (__rsysin ()); __roclose (__rsysout ()); __roclose (__rsyserr ()); }