home *** CD-ROM | disk | FTP | other *** search
/ Il CD di internet / CD.iso / SOURCE / D / CLISP / CLISPSRC.TAR / clisp-1995-01-01 / amiga / jchlib / startup / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-10-24  |  2.2 KB  |  75 lines

  1. /* Tiny GCC Library
  2.  * J÷rg H÷hle, 15-Jul-94
  3.  */
  4.  
  5. #include "defs.h"
  6. #include <libraries/dos.h>
  7. #include <libraries/dosextens.h>
  8. #include <exec/ports.h>
  9. #include <workbench/startup.h>
  10. #ifdef __GNUC__
  11.   #include <inline/exec.h>
  12.   #include <inline/dos.h>
  13. #else
  14.   #include <clib/exec.h>
  15.   #include <clib/dos.h>
  16. #endif
  17.  
  18. struct ExecBase * SysBase;
  19. struct DosLibrary * DOSBase = NULL;
  20. struct Process * _Process = NULL;
  21. struct WBStartup * WBenchMsg = NULL;
  22. UWORD _OS_Version;
  23.  
  24. long _main(LONG arglen, UBYTE* arg)
  25. {
  26.   register struct Process *proc =
  27.     _Process = (struct Process *)FindTask(NULL);
  28.   _OS_Version = SysBase->LibNode.lib_Version;
  29.   if (NULL == proc->pr_CLI) /* WB startup */
  30.     {
  31.       WaitPort(&proc->pr_MsgPort);
  32.       WBenchMsg = (struct WBStartup *)GetMsg(&proc->pr_MsgPort);
  33.     }
  34.  
  35.   if (NULL == (DOSBase = (struct DosLibrary *)OpenLibrary(DOSNAME,0L)))
  36.     { exit(-1L); } /* DOSBase will not necessarily be set in exit()! */
  37.  
  38.   if (NULL != proc->pr_CLI) /* CLI startup */
  39.     { register int argc;
  40.       char argcopy[arglen+1];   /* gcc allows dynamic allocation */
  41.       bcopy(arg,argcopy,arglen);
  42.       argcopy[arglen] = '\0';
  43.       argc = _tokenize(argcopy,arglen);
  44.       {
  45.         char *argv[argc+2];     /* room for argv[0] and last NULL */
  46.         _dumpargs(argcopy,&argv[1],argc);
  47.         ++argc;                 /* count commandname argv[0] */
  48.         { char *cname;
  49.           struct CommandLineInterface *cli
  50.             = (struct CommandLineInterface *)BADDR(proc->pr_CLI);
  51.           if (NULL != (cname = (char *)(BADDR(cli->cli_CommandName))))
  52.             {
  53.               arglen = *(cname++);      /* BCPL string contains length at [0] */
  54.               argv[0] = alloca(arglen+1);
  55.               bcopy(cname,argv[0],arglen);
  56.               argv[0][arglen] = '\0';
  57.             }
  58.           else { argv[0] = ""; }
  59.         }
  60.         argv[argc] = NULL;      /* put NULL at end of argv array */
  61.         Input_handle = Input();
  62.         Output_handle = Output();
  63.         exit(main(argc,argv));
  64.       }
  65.     }
  66.   else /* WB startup */
  67.     {
  68.       _WBOrigDir = CurrentDir(DupLock(WBenchMsg->sm_ArgList->wa_Lock));
  69.       if (_WBOrigDir == NULL) { D(ebug("WBDir is NULL")); }
  70.       D(ebug("Calling wbmain()\n"));
  71.       wbmain(WBenchMsg);
  72.       exit(0);
  73.     }
  74. }
  75.