/*{{{  #includes*/
#ifdef CONFIG_H
#   include "config.h"
#endif

#include <sys/types.h>
#include <limits.h>
#include <errno.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>

#include <local/bool.h>

#define MAIN_C
#define I_DISPLAY_C
#define I_FOLDFILING_C
#define I_GETMSG_C
#define I_GETTK_C
#define I_INIT_C
#define I_KEYBOARD_C
#define I_LOOP_C
#define I_MESSAGES_C
#define I_ORIEDT_C
#define I_PROMPT_C
#define I_SCREEN_C
#define I_SIGNALS_C
#define I_VIRTUAL_C

#include "origami.h"
/*}}}  */

/*{{{  variables*/
/*{{{  prototypes for getopt*/
int getopt(int,char**,char*);
extern char *optarg;
extern int optind;
/*}}}  */
public char *rc_name=0;
public char *filearg;
public bool dir_edit=FALSE,
            c_hash_front=FALSE,
            split_line,
            auto_save=FALSE,
            do_auto_save=FALSE,
            verbose=FALSE,
            aborted,
#            if defined(SIGWINCH) || defined(MGR)
              win_changed=FALSE,
#            endif
            interrupt_restore=FALSE;
public f_c_types dialect= -1;
                 /* -1: variable is used to setup the OCL-argument! */
public int current_ind;
public element *null_item_ptr, *new_file_ptr;
public bool overwrite=FALSE,
            file_changed = FALSE,
            user_view = FALSE,
            read_only = FALSE;
public element *part_line;
public int *tab_size = 0;
public int new_exit= -1;
public bool no_suspend=FALSE;
public bool no_pipe=FALSE;
/*}}}  */

/*{{{  language data*/
/* Language User, Inmos must be last in list */
/*{{{  dialect_start*/
private unsigned char dus[tag_length]="   ";
public language_comment dialect_start = {
                  empty_text,       /* none    */
  (unsigned char*)"--",             /* occam   */
  (unsigned char*)"(*",             /* pascal  */
  (unsigned char*)"/*",             /* c       */
  (unsigned char*)";",              /* lisp    */
  (unsigned char*)".\\\"",          /* roff    */
  (unsigned char*)"%",              /* tex     */
  (unsigned char*)"#",              /* script  */
                  dus,              /* user    */
                  empty_text        /* inmos   */
};
/*}}}  */
/*{{{  dialect_end*/
private unsigned char due[tag_length]="   ";
public language_comment dialect_end = {
                  empty_text,       /* none    */
                  empty_text,       /* occam   */
  (unsigned char*)"*)",             /* pascal  */
  (unsigned char*)"*/",             /* c       */
                  empty_text,       /* lisp    */
                  empty_text,       /* roff    */
                  empty_text,       /* tex     */
                  empty_text,       /* script  */
                  due,              /* user    */
                  empty_text        /* inmos   */
};
/*}}}  */
/*{{{  language_string*/
public unsigned char language_string[]=
   " None Occam Pascal C Lisp Roff TeX Script   User   Inmos";
public unsigned char l_tags[]="NOPCLRTSUI";
/*}}}  */
/*}}}  */
/*{{{  fold-marks*/
public unsigned char fold_open_str[tag_length]=begin_standard;
public unsigned char fold_close_str[tag_length]=end_standard;
public unsigned char fold_file_str[tag_length]=file_standard;
public unsigned char fold_line_str[tag_length]=line_standard;
/*}}}  */

/*{{{  main*/
int main(int argc, char *argv[])
{
  os_init();
  /*{{{  parse arguments*/
  { int c;
    char *nok=0;

    /*{{{  parse arguments*/
    while ((c=getopt(argc,argv,"a:ehik:l:m:nops:t:vN:O:PT:VW:X:Z"))!=EOF)
    switch (c)
     {
       /*{{{  a delay,       alarmtime*/
       case 'a':
        { alarm_time=atoi(optarg);
          if (alarm_time)
           /*{{{  set auto-save and test time*/
           { auto_save=TRUE;
             if (alarm_time<MIN_ALARMTIME || alarm_time>MAX_ALARMTIME)
                nok=M_ALARM;
           }
           /*}}}  */
          else
           /*{{{  don't use autosave*/
           { auto_save=FALSE;alarm_time=NORM_ALARMTIME; }
           /*}}}  */
          break;
        }
       /*}}}  */
       /*{{{  e,             echo disabled*/
       case 'e': { echo_disabled=TRUE;break; }
       /*}}}  */
       /*{{{  h,             help*/
       case 'h': { aborted=TRUE;break; }
       /*}}}  */
       /*{{{  i,             inverse controls*/
       case 'i': { inv_ctrl=TRUE;break; }
       /*}}}  */
       /*{{{  k basename,    rc-basename*/
       case 'k': { rc_name=optarg;break; }
       /*}}}  */
       /*{{{  l line,        first line to display*/
       case 'l':
        { if (scr_pos || (scr_pos=atoi(optarg))<=0) nok=M_LINE;
          break;
        }
       /*}}}  */
       /*{{{  m markname,    marktype*/
       case 'm':
        { if (mark_mode) nok=M_MARK; else mark_mode=optarg;
          break;
        }
       /*}}}  */
       /*{{{  n,             no folding*/
       case 'n': { fold_in=TRUE;break; }
       /*}}}  */
       /*{{{  o,             overwrite*/
       case 'o': { overwrite=TRUE;break; }
       /*}}}  */
       /*{{{  p,             c-hash-mode*/
       case 'p': { c_hash_front=TRUE;break; }
       /*}}}  */
       /*{{{  s size,        set ocl-stack-size*/
       case 's':
        { if ((m_s_depth=atoi(optarg))<0) nok=M_STACK;
          break;
        }
       /*}}}  */
       /*{{{  t size,        tab-mode*/
       case 't':
        { if ((hard_tab=atoi(optarg))<-1) nok=M_TAB;
          break;
        }
       /*}}}  */
       /*{{{  v,             view-mode*/
       case 'v': { user_view=TRUE;break; }
       /*}}}  */
       /*{{{  N buffsize,    tablesize*/
       case 'N':
        {
#          ifdef VIRTUAL
            if ((vir_nodes=atoi(optarg))<0) nok=M_VN;
#          endif
          break;
        }
       /*}}}  */
       /*{{{  O value,       set OCL-var*/
       case 'O': { dialect=atoi(optarg);break; }
       /*}}}  */
       /*{{{  P,             no open for /dev/tty*/
       case 'P': { no_pipe=TRUE;break; }
       /*}}}  */
       /*{{{  T title,       titlename*/
       case 'T':
        {
#          ifdef WINDOW_TITLE_CHANGE
              w_title=optarg;
#          endif
          break;
        }
       /*}}}  */
       /*{{{  V,             verbose*/
       case 'V': { verbose=TRUE;break; }
       /*}}}  */
       /*{{{  W,             statusline extension: window name*/
       case 'W':
          w_name=optarg;
          break;
       /*}}}  */
       /*{{{  X,             extensions*/
       case 'X':
#          ifdef OWN_ARG_HANDLE
             OWN_ARG_HANDLE
#          endif
          break;
       /*}}}  */
       /*{{{  Z,             no suspend*/
       case 'Z': { no_suspend=TRUE;break; }
       /*}}}  */
       /*{{{  else, error*/
       case '?':
       default:  { nok=(char*)empty_text;break; }
       /*}}}  */
    }
    /*}}}  */
    /*{{{  errorcases in args*/
    if (nok || aborted)
     { if (nok && *nok) { eputs(nok);eputc('\n'); }
       eputs(M_S_USAGE);
       if (!nok) eputs(M_L_USAGE); else eputs(M_MORE_INFO);
       exit(nok?r_arg_err:r_ok);
     }
    /*}}}  */
    /*{{{  handle inputfiles*/
    c=optind;
    while (c!=argc) add_edit_file(argv[c++],FALSE);
    filearg=argv[optind];
    /*}}}  */
  }
  read_only=user_view;
  /*}}}  */
  /*{{{  copyright message*/
#  ifndef NO_MSG
    eputs(M_COPYRIGHT);
    sleep(1);
#  endif
  /*}}}  */
  os_init_args_read();
  /*{{{  init the editor*/
  if (HostBegin(argv[0])) exit(r_init_err);
  init_terminal();
  if (init_data_handle()) exit_origami(r_vir_err,get_msg(F_VM_FAIL,"access",strerror(errno)));
  initialise();
  /*}}}  */
  os_init_rc_read();
  main_editor_loop(argv);
  /*{{{  try to do a pretty exit*/
  message(get_msg(M_BYE),TRUE);
  exit_origami( new_exit >= 0 ? new_exit :
                file_changed  ? r_file_nok :
                                r_ok,
                new_exit >= 0 ? (prompt_string(print_buffer),print_buffer) :
                                (unsigned char*)0);
  /*}}}  */
  return exit_failure;
}
/*}}}  */
