home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / CLISP-1.LHA / CLISP960530-sr.lha / amiga / jchlib / startup / main.c < prev    next >
Encoding:
C/C++ Source or Header  |  1996-07-09  |  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. #include <proto/exec.h>
  11. #include <proto/dos.h>
  12.  
  13. struct ExecBase * const SysBase;
  14. struct DosLibrary * DOSBase = NULL;
  15. struct WBStartup * WBenchMsg = NULL;
  16. #ifdef SUPPORT_1_3
  17. UWORD _OS_Version;
  18. #define MINIMAL_VERSION 0L
  19. #else
  20. #define MINIMAL_VERSION 37L
  21. #endif
  22.  
  23. long _main(LONG arglen, UBYTE* arg)
  24. {
  25.   register struct Process *proc = (struct Process *)FindTask(NULL);
  26. #ifdef SUPPORT_1_3
  27.   _OS_Version = SysBase->LibNode.lib_Version;
  28. #endif
  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,MINIMAL_VERSION)))
  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.