1 /* @(#)ved.h	1.49 21/08/20 Copyr 1984-86, 88-89,97, 2000-2018 J. Schilling */
2 /*
3  *	Main include file for VED
4  *
5  *	Copyright (c) 1984, 85, 86, 88, 89, 97, 2000-2018 J. Schilling
6  */
7 /*
8  * The contents of this file are subject to the terms of the
9  * Common Development and Distribution License, Version 1.0 only
10  * (the "License").  You may not use this file except in compliance
11  * with the License.
12  *
13  * See the file CDDL.Schily.txt in this distribution for details.
14  * A copy of the CDDL is also available via the Internet at
15  * http://www.opensource.org/licenses/cddl1.txt
16  *
17  * When distributing Covered Code, include this CDDL HEADER in each
18  * file and include the License file CDDL.Schily.txt from this distribution.
19  */
20 
21 #include <schily/mconfig.h>
22 #include <schily/stdio.h>
23 #include <schily/stdlib.h>
24 #include <schily/unistd.h>
25 #include <schily/string.h>
26 #include <schily/utypes.h>
27 #include <schily/standard.h>
28 #include <schily/nlsdefs.h>
29 #include <schily/limits.h>	/* for  MB_LEN_MAX	*/
30 #include <schily/ctype.h>	/* For isprint()	*/
31 #include <schily/wchar.h>	/* wchar_t		*/
32 #include <schily/wctype.h>	/* For iswprint()	*/
33 #define	GT_COMERR		/* #define comerr gtcomerr */
34 #define	GT_ERROR		/* #define error gterror   */
35 #include <schily/schily.h>
36 #include <schily/nlsdefs.h>
37 
38 #define	C	(char *)
39 #define	UC	(unsigned char *)
40 #define	CP	(char **)
41 #define	UCP	(unsigned char **)
42 #define	CPP	(char ***)
43 #define	UCPP	(unsigned char ***)
44 
45 #ifndef	DO_WCHAR
46 #undef	MB_LEN_MAX
47 #define	MB_LEN_MAX	1
48 #endif
49 
50 #if	MB_LEN_MAX > 1			/* This is multi byte mode	  */
51 typedef	wchar_t		echar_t;	/* A ved internal character	  */
52 typedef	wint_t		eint_t;		/* A ved internal "getc()" result */
53 
54 #else					/* This is single byte mode	  */
55 typedef	unsigned char	echar_t;	/* A ved internal character	  */
56 typedef	int		eint_t;		/* A ved internal "getc()" result */
57 #endif
58 
59 /*#define	USE_LONGLONG_POS*/
60 
61 #if	defined(HAVE_LARGEFILES) || defined(USE_LONGLONG_POS)
62 /*
63  * do not use long long to allow compilation on non long long
64  * aware systems.
65  */
66 /*typedef	long long	epos_t;*/
67 /*typedef	long long	ecnt_t;*/
68 /*
69  * Rather use the "best effort" long long "Llong"
70  */
71 typedef	Llong		epos_t;
72 typedef	Llong		ecnt_t;
73 #else
74 typedef	long		epos_t;
75 typedef	long		ecnt_t;
76 #endif
77 
78 #ifdef	TESTLONGLONG
79 enum nicht { blau, besoffen };
80 
81 /*typedef	long		epos_t;*/
82 /*typedef	Llong		epos_t;*/
83 /*typedef	double		epos_t;*/
84 /*typedef	char		epos_t;*/
85 /*typedef	enum nicht	epos_t;*/
86 
87 /*typedef	double	ecnt_t;*/
88 /*typedef	Llong	ecnt_t;*/
89 #endif
90 
91 /*
92  * We do our own buffering for outout to the screen to make ved
93  * fast on all operating systems independent of the I/O implementation.
94  * Our output buffer size should be more than the size of a usual screen.
95  * As most lines are shorter that 40 characters, a bufsize of 4096 chars
96  * will be sufficient for a 100 line display.
97  */
98 #define	BFSIZE	8192
99 
100 #ifdef	BFSIZE
101 typedef struct {
102 	short	_count;
103 	Uchar	_buf[BFSIZE];
104 	Uchar	*_ptr;
105 } iobuf_t;
106 
107 extern	iobuf_t	_bb;
108 
109 #ifdef	putchar
110 #undef	putchar
111 #endif
112 #ifdef	JOS
113 #define	putchar(c) {if (--_bb._count >= 0) *_bb._ptr++ = (c); \
114 				else _bflush(c); }
115 #else
116 #define	putchar(c) (--_bb._count >= 0 ? *_bb._ptr++ = (c): _bflush(c))
117 #endif
118 
119 #ifdef	flush
120 #undef	flush
121 #endif
122 #define	flush()	_bufflush()
123 #endif	/* BFSIZE */
124 
125 #ifdef	JOS
126 #define	ENOENT	ENOFILE
127 #endif
128 
129 #define	SP	0x20				/* The vanilla space	*/
130 #define	TAB	0x09				/* The TAB character	*/
131 #define	DEL	0x7F				/* The DEL character	*/
132 #define	SP8	0xA0				/* The non-breakable space */
133 #ifdef	USE_DEL8
134 #define	DEL8	0xFF				/* Bef. y diaresis was added */
135 #endif
136 
137 #define	TABNONE	255				/* No table		*/
138 #define	TABFIRST CTAB				/* The first table	*/
139 #define	CTAB	0				/* The chartable	*/
140 #define	ESCTAB	1				/* The ESC table	*/
141 #define	ALTTAB	2				/* The ALT table	*/
142 #define	AESCTAB	3				/* The ALT-ESC table	*/
143 #define	XTAB	4				/* The X table		*/
144 #define	TABLAST	XTAB				/* The last table number */
145 #define	NCTAB	(TABLAST+1)			/* The number of tables	*/
146 
147 /*
148  * XXX Only correct on a two's complement machine.
149  */
150 #define	MAXULONG	(~((unsigned long)0))
151 #define	MAXLONG		(MAXULONG >> 1)
152 
153 #undef	min
154 #define	min(x, y)	(((x) < (y)) ? (x) : (y))
155 #undef	max
156 #define	max(x, y)	(((x) < (y)) ? (y) : (x))
157 /*#define	abs(x)	(((x) > 0) ? (x) : (-x))*/
158 
159 #define	TMPNSIZE	28	/* Size of temporary filename buffers	*/
160 #define	NAMESIZE	256	/* Size of several temporary buffers	*/
161 #define	FNAMESIZE	1024	/* Size of edited filename		*/
162 
163 #ifdef	JOS
164 #define	DEFSHELL	"/bin/command"
165 #define	HELPFILE	UC "/doc/cmds/ved.help"
166 #else
167 #define	DEFSHELL	"/bin/sh"
168 #define	HELPFILE	UC "/opt/schily/share/man/help/ved.help"
169 #endif
170 
171 /*
172  * A pair of horizontal and vertical position.
173  */
174 typedef struct {
175 	int	hp;
176 	int	vp;
177 } cpos_t;
178 
179 typedef struct {
180 	/*
181 	 * Current Window status.
182 	 */
183 	epos_t	dot;		/* The byte offset of the cursor position   */
184 	epos_t	eof;		/* The byte offset of the last character + 1 */
185 	epos_t	mark;		/* The byte offset of the selection mark    */
186 	epos_t	window;		/* The byte offset of the window start	    */
187 	epos_t	ewindow;	/* The byte offset of the window end	    */
188 
189 	int	eflags;		/* XXX					    */
190 	BOOL	markvalid;	/* if true: there is a mark		    */
191 	BOOL	overstrikemode;	/* if true: overwrite in favor of insert    */
192 	BOOL	visible;	/* if true: make TAB, CR, EOL, EOF visible  */
193 	BOOL	dosmode;	/* if true: supress '\r' in \r\n sequence   */
194 	BOOL	raw8;		/* if true: do not map non acsii 8bit chars */
195 	BOOL	markwrap;	/* if true: mark linewraps with a '\\' at eol */
196 
197 	int	pmargin;	/* Max Abstand vom oberen/unteren Rand	    */
198 	int	tabstop;	/* Breite eines 'tabs'			    */
199 	int	optline;	/* Vorzugszeile fuer Window - Adjust	    */
200 
201 	int	wrapmargin;	/* autowrap based on margin from linelen    */
202 	int	maxlinelen;	/* autowrap based on linelen		    */
203 	BOOL	autoindent;	/* whether to indent next line like current */
204 
205 	void	*bhead;		/* Head of the linked list of used headers  */
206 	void	*gaplink;	/* Pointer to the header where the gap starts */
207 	epos_t	gap;		/* Byte offset of first char after the gap   */
208 	int	gapoff;		/* Offset within the header the gap starts in */
209 
210 				/* Three variables used by findpos() only   */
211 	void	*winlink;	/* Header containing the start of the window */
212 	epos_t	winpos;		/* Byte offset of the current window start  */
213 	epos_t	winoff;		/* Byte offset for start of data in winlink */
214 
215 	Uchar	*curfile;	/* current file name			    */
216 	FILE	*curfp;		/* current file pointer (if file is locked) */
217 	long	curftime;	/* last modification time of current file   */
218 	int	curfd;		/* fd used to hold writelock to current file */
219 	echar_t	lastch;		/* a global copy of the last read char	    */
220 	BOOL	magic;		/* wether to search in 'magic' mode	    */
221 	long	modflg;		/* number of modifications since last save  */
222 	ecnt_t	curnum;		/* mult # fot next edit command		    */
223 	ecnt_t	number;		/* curnum is copied from this mult # master */
224 	int	column;		/* the remembered not mapped hp of the cursor */
225 	/*
226 	 * Global stuff.
227 	 */
228 	int	psize;		/* page size of the screen		    */
229 	int	llen;		/* line length of the screen		    */
230 } ewin_t;
231 
232 extern	cpos_t	cursor;		/* position of cursor in window hp not mapped */
233 extern	cpos_t	cpos;		/* real pos of cursor on screen hp mapped   */
234 
235 #define	COLUPDATE	0x0001	/* if set: update 'column' to current hp    */
236 #define	SAVENUM		0x0002	/* if set: keep value in 'number'	    */
237 #define	SAVEDEL		0x0004	/* if set: keep next del in delete buffer   */
238 #define	KEEPDEL		0x0010	/* if set: keep content of delete buffer    */
239 #define	DELDONE		0x0020	/* if set: last command filled delete buffer */
240 
241 #define	FREADONLY	0x10000	/* if set: forced readonly on current file  */
242 #define	FNOLOCK		0x20000	/* if set: could not lock file		    */
243 #define	FLOCKLOCAL	0x40000	/* if set: lock to file is local only	    */
244 
245 #ifdef	notused
246 #define	MARKVALID	0x0008	/* if set: there is a mark		    */
247 #define	OVERSTRIKE	0x0100	/* if set: overwrite in favor of insert	    */
248 #define	VISIBLE		0x0200	/* if set: make TAB, CR, EOL, EOF visible   */
249 #define	DOSMODE		0x0400	/* if set: supress '\r' in \r\n sequence    */
250 #define	RAW8		0x0800	/* if set: do not map non acsii 8bit chars  */
251 #define	MARKWRAP	0x1000	/* if set: mark linewraps with a '\\' at eol */
252 #endif
253 
254 #define	LOCK_OK		2	/* A networkwide file lock is present	    */
255 #define	LOCK_LOCAL	1	/* The lock is local only because of flock() */
256 #define	LOCK_CANNOT	0	/* The system does not support to lock	    */
257 #define	LOCK_ALREADY	-1	/* The file is already locked		    */
258 
259 
260 extern	int	pid;		/* process id used for unique tmp file names */
261 
262 extern	int	mflag;		/* if > 0 : take characters from macro	    */
263 
264 
265 /*
266  * Used by ved.c and io.c
267  */
268 extern	char	ved_version[];
269 
270 /*
271  * Used by ved.c and *cmds.c
272  */
273 extern	FILE	*takefile;	/* FILE * of current take buffer	    */
274 extern	epos_t	takesize;	/* file size of current take buffer	    */
275 extern	Uchar	takename[TMPNSIZE]; /* file name of current take buffer	    */
276 
277 extern	FILE	*delfile;	/* FILE * of delete buffer		    */
278 extern	epos_t	delsize;	/* file size of delete buffer		    */
279 extern	Uchar	delname[TMPNSIZE]; /* file name of delete buffer	    */
280 
281 extern	FILE	*rubfile;	/* FILE * of rubout buffer		    */
282 extern	epos_t	rubsize;	/* file size of rubout buffer		    */
283 extern	Uchar	rubname[TMPNSIZE]; /* file name of rubout buffer	    */
284 
285 extern	int	ReadOnly;	/* if > 0 : do not allow to write back mods */
286 extern	int	nobak;		/* Es wird kein ___.bak angelegt	    */
287 extern	int	nolock;		/* Es wird kein record locking versucht	    */
288 extern	int	noedtmp;	/* Kein .vedtmp.* erzeugen		    */
289 extern	int	recover;	/* altes File reparieren		    */
290 extern	BOOL	autodos;	/* wp->dosmode aus isdos() bestimmen	    */
291 extern	int	nfiles;		/* Anzahl der zu editierenden Files	    */
292 extern	int	fileidx;	/* Index des editierten Files		    */
293 extern	Uchar	**files;	/* Array der zu editierenden Files	    */
294 
295 /*
296  * Used by io.c and screen.c
297  */
298 extern	BOOL	markon;		/* if true: we are just printing the mark    */
299 
300 /*
301  * Used by ved.c, message.c and cmdline.c
302  */
303 extern	BOOL	updatemsg;	/* infostr is temporary			    */
304 extern	BOOL	updateerr;	/* errorstr is temporary		    */
305 extern	BOOL	updatesysline;	/* whole systemline should be redrawn	    */
306 
307 /*
308  * Used by ved.c and executecmds.c
309  */
310 extern Uchar execname[TMPNSIZE]; /* file name of execute buffer		    */
311 
312 /*
313  * Used by ved.c and filecmds.c
314  */
315 extern Uchar curfname[FNAMESIZE]; /* global file name storage space	    */
316 
317 /*
318  * Used by tags.c and coloncmdsds.c
319  */
320 extern int taglength;		/* Maxnimum number of chars to compare	    */
321 extern Uchar tags[];		/* List of files to search for tags	    */
322 
323 /*
324  * Make function prototypes available for all.
325  */
326 #include "func.h"
327