home *** CD-ROM | disk | FTP | other *** search
/ Fresh Fish 4 / FreshFish_May-June1994.bin / new / util / edit / jade / src / main.c < prev    next >
C/C++ Source or Header  |  1994-04-19  |  6KB  |  237 lines

  1. /* main.c -- Entry point for Jade
  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. #include "revision.h"
  23.  
  24. #include <string.h>
  25.  
  26. #define INIT_SCR "init"
  27.  
  28. _PR int main(int, char **);
  29. _PR void doconmsg(u_char *);
  30. _PR void main_init(void);
  31.  
  32. _PR u_char NoMemMsg[];
  33.     u_char NoMemMsg[] = "panic: no memory!";
  34. _PR bool ILock;
  35.     bool ILock;
  36. _PR STRMEM MainStrMem;
  37.     STRMEM MainStrMem;
  38.  
  39. _PR int RecurseDepth;
  40. int RecurseDepth = -1;
  41.  
  42. _PR VALUE sym_exit, sym_quit, sym_top_level, sym_command_line_args;
  43. VALUE sym_exit, sym_quit, sym_top_level, sym_command_line_args;
  44.  
  45. static u_char *InitScript = INIT_SCR;
  46.  
  47. static void
  48. usage(void)
  49. {
  50.     fputs("usage: jade [SYSTEM-OPTIONS...] [STANDARD-OPTIONS...] [LISP-OPTIONS...]\n", stderr);
  51.     sys_usage();
  52.     fputs("STANDARD-OPTIONS are,\n"
  53.     "    -rc FILE     use FILE instead of `init.jl' to boot from\n"
  54.     "    -v           print version/revision details\n"
  55.     "    -log-msgs    print all messages to standard-error as well\n"
  56.     "and LISP-OPTIONS are,\n"
  57.     "    -f FUNCTION  call the Lisp function FUNCTION\n"
  58.     "    -l FILE      load the file of Lisp forms called FILE\n"
  59.     "    -q           quit\n"
  60.     "    FILE         load FILE into a new buffer\n"
  61.     , stderr);
  62. }
  63.  
  64. static int
  65. getmainoptions(int *argc_p, char ***argv_p)
  66. {
  67.     int argc = *argc_p;
  68.     char **argv = *argv_p;
  69.     VALUE head, *last;
  70.     while(argc && (**argv == '-'))
  71.     {
  72.     if((argc >= 2) && !strcmp("-rc", *argv))
  73.     {
  74.         InitScript = *(++argv);
  75.         argc--;
  76.     }
  77.     else if(!strcmp("-v", *argv))
  78.     {
  79.         doconmsg(VERSSTRING "\n");
  80.         return(FALSE);
  81.     }
  82.     else if(!strcmp("-log-msgs", *argv))
  83.         LogMsgs = TRUE;
  84.     else if(!strcmp("-?", *argv) || !strcmp("-help", *argv))
  85.     {
  86.         usage();
  87.         return(FALSE);
  88.     }
  89.     else
  90.         break;
  91.     argc--;
  92.     argv++;
  93.     }
  94.     /* any command line args left now get made into a list of strings
  95.        in symbol "command-line-args".  */
  96.     head = sym_nil;
  97.     last = &head;
  98.     while(argc > 0)
  99.     {
  100.     *last = cmd_cons(valstrdup(*argv), sym_nil);
  101.     last = &VCDR(*last);
  102.     argc--;
  103.     argv++;
  104.     }
  105.     VSYM(sym_command_line_args)->sym_Value = head;
  106.     *argc_p = argc;
  107.     *argv_p = argv;
  108.     return(TRUE);
  109. }
  110.  
  111. int
  112. main(int argc, char **argv)
  113. {
  114.     int rc = 5;
  115.     if(!initmem())
  116.     return(10);
  117.     sm_init(&MainStrMem);
  118.     values_init();
  119.     if(symbols_init() && initwinsys(&argc, &argv))
  120.     {
  121.     values_init2();
  122.     lisp_init();
  123.     lispcmds_init();
  124.     lispmach_init();
  125.     buffers_init();
  126.     commandline_init();
  127.     edit_init();
  128.     find_init();
  129.     io_init();
  130.     keys_init();
  131.     main_init();
  132.     misc_init();
  133.     movement_init();
  134.     refresh_init();
  135.     streams_init();
  136.     windows_init();
  137.     sys_misc_init();
  138.     sys_windows_init();
  139. #ifdef HAVE_UNIX
  140.     sys_proc_init();
  141. #endif
  142.     if(getmainoptions(&argc, &argv) && firstbuffer())
  143.     {
  144.         VALUE arg, res;
  145.         if((arg = valstrdup(InitScript))
  146.            && (res = cmd_load(arg, sym_nil, sym_nil, sym_nil)))
  147.         {
  148.         rc = 0;
  149.         cursor(CurrVW, CURS_ON);
  150.         res = eventloop();
  151.         }
  152.         else if(ThrowValue && VCAR(ThrowValue) == sym_quit)
  153.         {
  154.         if(NUMBERP(VCDR(ThrowValue)))
  155.             rc = VNUM(VCDR(ThrowValue));
  156.         else
  157.             rc = 0;
  158.         }
  159.         else
  160.         doconmsg("jade: error in initialisation script\n");
  161. #ifdef HAVE_UNIX
  162.         sys_proc_kill();
  163. #endif
  164.         windows_kill();
  165.         buffers_kill();
  166.         commandline_kill();
  167.         keys_kill();
  168.         streams_kill();
  169.     }
  170.     symbols_kill();
  171.     killwinsys();
  172.     }
  173.     values_kill();
  174.     sm_kill(&MainStrMem);
  175.     killmem();
  176.     return(rc);
  177. }
  178.  
  179. _PR VALUE cmd_recursive_edit(void);
  180. DEFUN("recursive-edit", cmd_recursive_edit, subr_recursive_edit, (void), V_Subr0, DOC_recursive_edit) /*
  181. ::doc:recursive_edit::
  182. (recursive-edit)
  183. Enter a new recursive-edit.
  184. ::end:: */
  185. {
  186.     VALUE res;
  187.     cursor(CurrVW, CURS_ON);
  188.     res = eventloop();
  189.     if(CurrVW)
  190.     cursor(CurrVW, CURS_OFF);
  191.     return(res);
  192. }
  193.  
  194. _PR VALUE cmd_recursion_depth(void);
  195. DEFUN("recursion-depth", cmd_recursion_depth, subr_recursion_depth, (void), V_Subr0, DOC_recursion_depth) /*
  196. ::doc:recursion_depth::
  197. (recursion-depth)
  198. Returns the number of recursive-edit's deep we are, zero signifies the
  199. original level.
  200. ::end:: */
  201. {
  202.     return(newnumber(RecurseDepth));
  203. }
  204.  
  205. _PR VALUE cmd_input_lock(VALUE status);
  206. DEFUN("input-lock", cmd_input_lock, subr_input_lock, (VALUE args), V_SubrN, DOC_input_lock) /*
  207. ::doc:input_lock::
  208. (input-lock [STATUS])
  209. Sets or returns the status of the input lock. When this value is non-zero
  210. no user input is accepted, only messages from ARexx can get through.
  211. ::end:: */
  212. {
  213.     if(CONSP(args))
  214.     {
  215.     args = VCAR(args);
  216.     if(NILP(args))
  217.         ILock = FALSE;
  218.     else
  219.         ILock = TRUE;
  220.     }
  221.     if(ILock)
  222.     return(sym_t);
  223.     return(sym_nil);
  224. }
  225.  
  226. void
  227. main_init(void)
  228. {
  229.     ADD_SUBR(subr_recursive_edit);
  230.     ADD_SUBR(subr_recursion_depth);
  231.     ADD_SUBR(subr_input_lock);
  232.     INTERN(sym_quit, "quit");
  233.     INTERN(sym_exit, "exit");
  234.     INTERN(sym_top_level, "top-level");
  235.     INTERN(sym_command_line_args, "command-line-args");
  236. }
  237.