home *** CD-ROM | disk | FTP | other *** search
/ The Datafile PD-CD 4 / DATAFILE_PDCD4.iso / unix / unixlib36d / src / sys / c / syslib < prev    next >
Text File  |  1994-03-08  |  3KB  |  147 lines

  1. static char sccs_id[] = "@(#) syslib.c 4.2 " __DATE__ " HJR";
  2.  
  3. /* syslib.c (c) Copyright 1990 H.Rogers */
  4.  
  5. #include <signal.h>
  6. #include <stdlib.h>
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <string.h>
  10. #include <ctype.h>
  11.  
  12. #include "sys/syslib.h"
  13. #include "sys/os.h"
  14. #include "sys/unix.h"
  15.  
  16. struct env __Cenv[1] =
  17. {
  18.   {
  19.     {
  20.       {0, 0, 0},        /* MemoryLimit */
  21.       {__h_sigill, 0, 0},    /* Undefined Inst. */
  22.       {__h_sigsegv0, 0, 0},    /* Prefetch Abort */
  23.       {__h_sigsegv1, 0, 0},    /* Data Abort */
  24.       {__h_sigbus, 0, 0},    /* Address Exception */
  25.       {0, 0, 0},        /* Other Exception */
  26.       {__h_error, 0, 0},    /* Error */
  27.       {__h_cback, 0, (void *) __cbreg},        /* CallBack */
  28.       {0, 0, 0},        /* BreakPoint */
  29.       {__h_sigint, 0, 0},    /* Escape */
  30.       {__h_event, 0, 0},    /* Event */
  31.       {__h_exit, 0, 0},        /* Exit */
  32.       {0 /* __h_sigsys */ , 0, 0}    /* Unknown SWI */
  33.     }
  34.   }
  35. };
  36. struct env __Oenv[1];
  37.  
  38. struct proc *__u;
  39. int __riscos_ver;
  40.  
  41. extern int main (int, char **);
  42.  
  43. void
  44. _main (void)
  45. {
  46.   register struct env *e;
  47.   register int i;
  48.   int regs[3];
  49.  
  50.   e = __Oenv;
  51.   for (i = 0; i < 13; i++)
  52.     __rdenv (i, e->h + i);
  53.  
  54.   __h_errbuf = (char *) e->h[6].b;
  55.  
  56.   __sigrec = 0;
  57.  
  58.   for (i = 0; i < 20; i++)
  59.     __sigvec[i] = __sigdfl[i];    /*signal handlers */
  60.  
  61.   e = __Cenv;
  62.   for (i = 0; i < 13; i++)
  63.     __wrenv (i, e->h + i);
  64.  
  65.   /* handlers installed */
  66.  
  67.   __fpinit ();            /* flag FP presence */
  68.  
  69.   __allocinit ();        /* initialise malloc() & c. */
  70.  
  71.   __unixinit ();        /* initialise UNIX */
  72.  
  73.   if (___stdioinit)
  74.     (*___stdioinit) ();        /* initialise stdin,stdout & stderr */
  75.  
  76.   if (___do_global_ctors)
  77.     (*___do_global_ctors) ();    /* if C++ call constructors */
  78.  
  79.   /* bits for __uname() */
  80.   if (__uname_dont_pack_ptr)
  81.     __uname_dont_pack__ = *__uname_dont_pack_ptr;
  82.  
  83.   /* find out what version of RISC-OS is running */
  84.   os_byte (129, 0, 0xFF, regs);
  85.   __riscos_ver = regs[1];
  86.  
  87.   exit (main (__u->argc, __u->argv));    /* ... ignition */
  88.  
  89. /* not reached */
  90. }
  91.  
  92. void (*__ax[__MAX_AXCNT]) (void);
  93. int __axcnt = 0;
  94.  
  95. void
  96. exit (int r)
  97. {
  98.   register int i;
  99.  
  100.   i = __axcnt;
  101.   while (i)
  102.     (*__ax[--i]) ();
  103.  
  104.   if (___stdioexit)
  105.     (*___stdioexit) ();        /* close streams & delete tmpfile() */
  106.  
  107.   _exit (r);
  108. }
  109.  
  110. void
  111. __reset (void)
  112. {
  113.   register int i;
  114.   register struct env *e;
  115.  
  116.   if (__u)
  117.     __unixexit ();        /* shutdown UNIX (close all fds etc.) */
  118.  
  119.   e = __Oenv;
  120.   for (i = 0; i < 13; i++)
  121.     __wrenv (i, e->h + i);
  122. }
  123.  
  124. void
  125. _exit (register int r)
  126. {
  127.   if (__u)
  128.     alarm (0);
  129.  
  130.   if (!__u || !(__u->flag & __U_PPROC) || !___vret)
  131.     {
  132.       __reset ();
  133.       __exit (r);        /* OS_Exit with return value <r> */
  134.     }
  135.   else
  136.     (*___vret) (r);
  137. }
  138.  
  139. void
  140. __fpinit (void)
  141. {
  142.   __fpflag = -1;
  143.   signal (SIGILL, __fpclr);
  144.   __fptest ();
  145.   signal (SIGILL, SIG_DFL);
  146. }
  147.