home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 8 / FreshFishVol8-CD1.bin / new / util / edit / jade / src / amiga_display.c < prev    next >
C/C++ Source or Header  |  1994-10-01  |  5KB  |  197 lines

  1. /* amiga_display.c -- Initialisation for Amiga window-system
  2.    Copyright (C) 1993, 1994 John Harper <jsh@ukc.ac.uk>
  3.  
  4.    This file is part of Jade.
  5.  
  6.    Jade is free software; you can redistribute it and/or modify it
  7.    under the terms of the GNU General Public License as published by
  8.    the Free Software Foundation; either version 2, or (at your option)
  9.    any later version.
  10.  
  11.    Jade is distributed in the hope that it will be useful, but
  12.    WITHOUT ANY WARRANTY; without even the implied warranty of
  13.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.    GNU General Public License for more details.
  15.  
  16.    You should have received a copy of the GNU General Public License
  17.    along with Jade; see the file COPYING.    If not, write to
  18.    the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  19.  
  20. #include "jade.h"
  21. #include "jade_protos.h"
  22.  
  23. #include <string.h>
  24. #include <stdlib.h>
  25. #include <exec/libraries.h>
  26. #include <exec/tasks.h>
  27.  
  28. _PR void sys_usage(void);
  29. _PR int sys_init(int, char **);
  30. _PR int ami_interrupt_handler(void);
  31.  
  32. extern    struct Library *SysBase;
  33. _PR bool ami_from_wb;
  34.     bool ami_from_wb;
  35. _PR short ami_os_version;
  36.     short ami_os_version;
  37.  
  38. _PR VALUE def_font_str, ami_def_pub_screen;
  39. VALUE def_font_str = MKSTR(DEFAULT_FONT), ami_def_pub_screen;
  40. _PR int ami_def_font_size;
  41. int ami_def_font_size = DEFAULT_FONT_SIZE;
  42.  
  43. _PR struct Process *ami_jade_process;
  44. struct Process *ami_jade_process;
  45.  
  46. void
  47. sys_usage(void)
  48. {
  49.     fputs("where SYSTEM-OPTIONS are,\n"
  50.     "    -pubscreen SCREEN\n"
  51.     "    -font FONT   FONT is something like `topaz.font-8'\n"
  52. #if AMIGA_V39 && (!defined(NO_STACK_SWAP))
  53.         "    -stack STACK-SIZE\n"
  54. #endif
  55.     , stderr);
  56. }
  57.  
  58. int
  59. sys_init(int argc, char **argv)
  60. {
  61.     /* This variable is static to ensure that if a new stack is created
  62.        it's still accessible. */
  63.     static int rc;
  64.     int new_stack = 0;
  65.  
  66.     if(argc == 0)
  67.     ami_from_wb = TRUE;
  68.     else
  69.     {
  70.     argc--;
  71.     argv++;
  72.     }
  73.     if((ami_os_version = SysBase->lib_Version) < 37)
  74.     {
  75.     doconmsg("error: need system version 2.04 or greater\n");
  76.     return(10);
  77.     }
  78.     ami_jade_process = (struct Process *)FindTask(NULL);
  79.     ami_def_pub_screen = null_string;
  80.     while((argc >= 1) && (**argv == '-'))
  81.     {
  82.     if(argc >= 2)
  83.     {
  84.         if(!strcmp("-pubscreen", *argv))
  85.         ami_def_pub_screen = string_dup(argv[1]);
  86.         else if(!strcmp("-font", *argv))
  87.         {
  88.         char *tmp = strrchr(argv[1], '-');
  89.         if(!tmp)
  90.         {
  91.             doconmsg("error: no size in `-font' arg\n");
  92.             return(5);
  93.         }
  94.         ami_def_font_size = atol(tmp+1);
  95.         def_font_str = string_dupn(argv[1], tmp - argv[1]);
  96.         }
  97. #if AMIGA_V39 && (!defined(NO_STACK_SWAP))
  98.             else if(!strcmp("-stack", *argv))
  99.         {
  100.         new_stack = atol(argv[1]);
  101.         if(new_stack < 4096)
  102.         {
  103.             doconmsg("error: stack size too small\n");
  104.             return(5);
  105.         }
  106.         }
  107. #endif
  108.         else
  109.         break;
  110.         argc--; argv++;
  111.     }
  112.     else
  113.         break;
  114.     argc--; argv++;
  115.     }
  116.  
  117.     /* Install ^C handler to take stdio caught signals. */
  118. #ifdef HAVE_ONBREAK
  119.     onbreak(ami_interrupt_handler);
  120. #endif
  121.  
  122.     rexx_init();
  123.     ami_menus_init();
  124.  
  125. #if AMIGA_V39 && (!defined(NO_STACK_SWAP))
  126.     /* The StackSwap() function only seems to be in my V39 includes even
  127.        though it's in the V37 library??
  128.          Note that the two calls of StackSwap() must be done inline! a stub
  129.        would rely on the old stack!  */
  130.     if(new_stack > 0)
  131.     {
  132.     char *stk_mem = mymalloc(new_stack);
  133.     if(stk_mem == NULL)
  134.     {
  135.         doconmsg("error: can't allocate new stack\n");
  136.         rc = 10;
  137.     }
  138.     else
  139.     {
  140.         static struct StackSwapStruct ss;
  141.         static int argc_copy;
  142.         static char **argv_copy;
  143.  
  144.         /* These are copied into non-stack memory. */
  145.         argc_copy = argc;
  146.         argv_copy = argv;
  147.  
  148.         /* Setup SS and swap the stacks over. */
  149.         ss.stk_Lower = (APTR)stk_mem;
  150.         ss.stk_Upper = (ULONG)(stk_mem + new_stack);
  151.         ss.stk_Pointer = (APTR)(stk_mem + new_stack);
  152.         StackSwap(&ss);
  153.  
  154.         /* Call the main loop */
  155.         rc = inner_main(argc_copy, argv_copy);
  156.  
  157.         /* Reinstall the original stack. */
  158.         StackSwap(&ss);
  159.  
  160.         myfree(stk_mem);
  161.     }
  162.     }
  163.     else
  164. #endif
  165.         rc = inner_main(argc, argv);
  166.  
  167.     clip_kill();
  168.     freq_kill();
  169.     ami_menus_kill();
  170.     rexx_kill();
  171.     return(rc);
  172. }
  173.  
  174. int
  175. ami_interrupt_handler(void)
  176. {
  177.     /* Clear the outstanding signal */
  178.     SetSignal(0, SIGBREAKF_CTRL_C);
  179.     throw_value = int_cell;
  180.     /* Ignore ^C if from onbreak(). */
  181.     return(0);
  182. }
  183.  
  184. #ifdef _DCC
  185. /*
  186.  * I think this is what DICE's wbmain() is like? All I want to
  187.  * do is call main() with argc=0
  188.  */
  189. void
  190. wbmain(void *unused)
  191. {
  192.     char *argv[1];
  193.     argv[0] = NULL;
  194.     main(0, argv);
  195. }
  196. #endif
  197.