#ifndef _EX_H
#define _EX_H
#ifdef __cplusplus
extern "C" {
#endif
#ifdef UCBV7
#include <whoami.h>
#endif
#include <sys/types.h>
#include <ctype.h>
#include <errno.h>
#include <signal.h>
#include <setjmp.h>
#include <sys/stat.h>
#include <stdlib.h>
#include <limits.h>
#include <libintl.h>
#define MULTI_BYTE_MAX MB_LEN_MAX
#define FTYPE(A) (A.st_mode)
#define FMODE(A) (A.st_mode)
#define IDENTICAL(A,B) (A.st_dev==B.st_dev && A.st_ino==B.st_ino)
#define ISBLK(A) ((A.st_mode & S_IFMT) == S_IFBLK)
#define ISCHR(A) ((A.st_mode & S_IFMT) == S_IFCHR)
#define ISDIR(A) ((A.st_mode & S_IFMT) == S_IFDIR)
#define ISFIFO(A) ((A.st_mode & S_IFMT) == S_IFIFO)
#define ISREG(A) ((A.st_mode & S_IFMT) == S_IFREG)
#ifdef USG
#include <termio.h>
typedef struct termios SGTTY;
#else
#include <sgtty.h>
typedef struct sgttyb SGTTY;
#endif
#ifdef PAVEL
#define SGTTY struct sgttyb
#endif
typedef char bool;
typedef unsigned long chtype;
#include <term.h>
#define bool vi_bool
#ifdef PAVEL
#undef SGTTY
#endif
#ifndef var
#define var extern
#endif
var char *exit_bold;
#ifdef USG
#define CBREAK xxxxx
#endif
#ifndef VMUNIX
typedef short line;
#else
typedef int line;
#endif
typedef short bool;
#include "ex_tune.h"
#include "ex_vars.h"
struct option {
unsigned char *oname;
unsigned char *oabbrev;
short otype;
short odefault;
short ovalue;
unsigned char *osvalue;
};
#define ONOFF 0
#define NUMERIC 1
#define STRING 2
#define OTERM 3
#define value(a) options[a].ovalue
#define svalue(a) options[a].osvalue
extern struct option options[vi_NOPTS + 1];
#ifdef TRACE
#include <stdio.h>
var FILE *trace;
var bool trubble;
var bool techoin;
var unsigned char tracbuf[BUFSIZ];
#undef putchar
#undef getchar
#else
#ifdef u370
#define BUFSIZE 4096
#else
#define BUFSIZE (LINE_MAX*2)
#endif
#undef NULL
#define NULL 0
#undef EOF
#define EOF -1
#endif
#define QUOTE 020000000000
#define TRIM 017777777777
#define NL '\n'
#define CR '\r'
#define DELETE 0177
#define ESCAPE 033
#undef CTRL
#define CTRL(c) (c & 037)
var bool multibyte;
var bool aiflag;
var bool tagflg;
var bool anymarks;
var int chng;
var unsigned char *Command;
var short defwind;
var int dirtcnt;
#ifdef SIGTSTP
var bool dosusp;
#endif
var bool edited;
var line *endcore;
extern bool endline;
var line *fendcore;
var unsigned char file[FNSIZE];
var unsigned char genbuf[LBSIZE];
var bool hush;
var unsigned char *globp;
var bool holdcm;
var bool inappend;
var bool inglobal;
var unsigned char *initev;
var bool inopen;
var unsigned char *input;
var bool intty;
var short io;
extern short lastc;
var bool laste;
var unsigned char lastmac;
var unsigned char lasttag[TAGSIZE];
var unsigned char *linebp;
var unsigned char linebuf[LBSIZE];
var bool listf;
var line names['z'-'a'+2];
var int notecnt;
var bool numberf;
var unsigned char obuf[BUFSIZE];
var short oprompt;
var short ospeed;
var int otchng;
var int peekc;
var unsigned char *pkill[2];
var bool pfast;
var pid_t pid;
var pid_t ppid;
var jmp_buf resetlab;
var pid_t rpid;
var bool ruptible;
var bool seenprompt;
var bool shudclob;
var int status;
var int tchng;
extern short tfile;
var bool vcatch;
var jmp_buf vreslab;
var bool writing;
var int xchng;
#ifndef PRESUNEUC
var char mc_filler;
var bool mc_wrap;
#endif
var int inexrc;
extern int termiosflag;
#define CP(a, b) ((void)strcpy(a, b))
#define FIXUNDO (inopen >= 0 && (inopen || !inglobal))
#define ckaw() {if (chng && value(vi_AUTOWRITE) && !value(vi_READONLY)) \
wop(0);\
}
#define copy(a,b,c) Copy((char *) (a), (char *) (b), (c))
#define eq(a, b) ((a) && (b) && strcmp(a, b) == 0)
#define getexit(a) copy(a, resetlab, sizeof (jmp_buf))
#define lastchar() lastc
#define outchar(c) (*Outchar)(c)
#define pastwh() ((void)skipwh())
#define pline(no) (*Pline)(no)
#define reset() longjmp(resetlab,1)
#define resexit(a) copy(resetlab, a, sizeof (jmp_buf))
#define setexit() setjmp(resetlab)
#define setlastchar(c) lastc = c
#define ungetchar(c) peekc = c
#define CATCH vcatch = 1; if (setjmp(vreslab) == 0) {
#define ONERR } else { vcatch = 0;
#define ENDCATCH } vcatch = 0;
var unsigned char altfile[FNSIZE];
extern unsigned char direct[ONMSZ];
extern unsigned char shell[ONMSZ];
var unsigned char uxb[UXBSIZE + 2];
var line *addr1;
var line *addr2;
var line *dol;
var line *dot;
var line *one;
var line *truedol;
var line *unddol;
var line *zero;
var short undkind;
var line *unddel;
var line *undap1;
var line *undap2;
var line *undadot;
#define UNDCHANGE 0
#define UNDMOVE 1
#define UNDALL 2
#define UNDNONE 3
#define UNDPUT 4
#define KSIZE 9
var int xflag;
var int xtflag;
var int kflag;
var int crflag;
var int perm[2];
var int tperm[2];
var int permflag;
var int tpermflag;
var unsigned char *key;
var unsigned char crbuf[CRSIZE];
char *getpass();
var bool write_quit;
var int errcnt;
#define NOSTR (char *) 0
#define NOLINE (line *) 0
#define setterm visetterm
#define draino vidraino
#define gettmode vigettmode
extern int (*Outchar)();
extern int (*Pline)();
extern int (*Putchar)();
var void (*oldhup)();
int (*setlist())();
int (*setnorm())();
int (*setnorm())();
int (*setnumb())();
#ifndef PRESUNEUC
extern int (*wdwc)(wchar_t);
extern int (*wdbdg)(wchar_t, wchar_t, int);
extern wchar_t *(*wddlm)(wchar_t, wchar_t, int);
extern wchar_t (*mcfllr)(void);
#endif
line *address();
unsigned char *cgoto();
unsigned char *genindent();
unsigned char *getblock();
char *getenv();
line *getmark();
unsigned char *mesg();
unsigned char *place();
unsigned char *plural();
line *scanfor();
void setin(line *);
unsigned char *strend();
unsigned char *tailpath();
char *tgetstr();
char *tgoto();
char *ttyname();
line *vback();
unsigned char *vfindcol();
unsigned char *vgetline();
unsigned char *vinit();
unsigned char *vpastwh();
unsigned char *vskipwh();
int put(void);
int putreg(unsigned char);
int YANKreg(int);
int delete(bool);
int vi_filter();
int getfile();
int getsub();
int gettty();
int join(int);
int listchar(wchar_t);
int normchar(wchar_t);
int normline(void);
int numbline(int);
var void (*oldquit)();
void onhup(int);
void onintr(int);
void oncore(int);
#ifdef CBREAK
void vintr(int);
#endif
void onsusp(int);
int putch(char);
int plodput(char);
int vputch(char);
void shift(int, int);
int termchar(wchar_t);
int vfilter();
int vshftop();
int yank(void);
unsigned char *lastchr();
unsigned char *nextchr();
extern bool putoctal;
void error();
void error0(void);
void error1(unsigned char *);
void fixol(void);
void resetflav(void);
void serror(unsigned char *, unsigned char *);
void setflav(void);
void tailprim(unsigned char *, int, bool);
void vcontin(bool);
void squish(void);
void move1(int, line *);
void pragged(bool);
void zop2(int, int);
void plines(line *, line *, bool);
void pofix(void);
void undo(bool);
void somechange(void);
void savetag(char *);
void unsavetag(void);
void checkjunk(unsigned char);
void getone(void);
void rop3(int);
void rop2(void);
void putfile(int);
void wrerror(void);
void clrstats(void);
void slobber(int);
void flush(void);
void flush1(void);
void flush2(void);
void fgoto(void);
void flusho(void);
void comprhs(int);
int dosubcon(bool, line *);
void ugo(int, int);
void dosub(void);
void snote(int, int);
void cerror(unsigned char *);
void unterm(void);
int setend(void);
void prall(void);
void propts(void);
void propt(struct option *);
void killcnt(int);
void markpr(line *);
void merror1(unsigned char *);
void notempty(void);
int qcolumn(unsigned char *, unsigned char *);
void netchange(int);
void putmk1(line *, int);
int nqcolumn(unsigned char *, unsigned char *);
void syserror(int);
void cleanup(bool);
void blkio(short, unsigned char *, int (*)());
void tflush(void);
short partreg(unsigned char);
void kshift(void);
void YANKline(void);
void rbflush(void);
void waitfor(void);
void ovbeg(void);
void fixzero(void);
void savevis(void);
void undvis(void);
void setwind(void);
void vok(wchar_t *, int);
void vsetsiz(int);
void vinslin(int, int, int);
void vopenup(int, bool, int);
void vadjAL(int, int);
void vup1(void);
void vmoveitup(int, bool);
void vscroll(int);
void vscrap(void);
void vredraw(int);
void vdellin(int, int, int);
void vadjDL(int, int);
void vsyncCL(void);
void vsync(int);
void vsync1(int);
void vcloseup(int, int);
void sethard(void);
void vdirty(int, int);
void setBUF(unsigned char *);
void addto(unsigned char *, unsigned char *);
void macpush();
void setalarm(void);
void cancelalarm(void);
void grabtag(void);
void prepapp(void);
void vremote();
void vsave(void);
void vzop(bool, int, int);
void warnf();
int wordof(unsigned char, unsigned char *);
void setpk(void);
void back1(void);
void vdoappend(unsigned char *);
void vclrbyte(wchar_t *, int);
void vclreol(void);
void vsetcurs(unsigned char *);
void vigoto(int, int);
void vcsync(void);
void vgotoCL(int);
void vgoto(int, int);
void vmaktop(int, wchar_t *);
void vrigid(void);
void vneedpos(int);
void vnpins(int);
void vishft(void);
void viin(wchar_t);
void godm(void);
void enddm(void);
void goim(void);
void endim(void);
void vjumpto(line *, unsigned char *, unsigned char);
void vup(int, int, bool);
void vdown(int, int, bool);
void vcontext(line *, unsigned char);
void vclean(void);
void vshow(line *, line*);
void vreset(bool);
void vroll(int);
void vrollR(int);
void vnline(unsigned char *);
void noerror();
void getaline(line);
void viprintf();
void gettmode(void);
void setterm(unsigned char *);
void draino(void);
int lfind();
void source();
void commands();
void addmac();
void vmoveto();
void vrepaint();
void getDOT(void);
void vclear(void);
unsigned char *lastchr();
unsigned char *nextchr();
void setdot1(void);
#ifdef __cplusplus
}
#endif
#endif