1 /*--------------------------------------------------------------------
2 	nxeditor
3 			FILE NAME:ed.h
4 			Programed by : I.Neva
5 			R & D  ADVANCED SYSTEMS. IMAGING PRODUCTS.
6 			1992.06.01
7 
8     Copyright (c) 1998,1999,2000
9         SASAKI Shunsuke <ele@pop17.odn.ne.jp> All rights reserved.
10 --------------------------------------------------------------------*/
11 #include	"config.h"
12 
13 #include	<stdio.h>
14 #include	<stdlib.h>
15 #include	<string.h>
16 
17 #include	<sys/param.h>
18 
19 #ifdef	HAVE_UNISTD_H
20 #	include	<unistd.h>
21 #endif
22 
23 #include	"../lib/generic.h"
24 #include	"../lib/hash.h"
25 #include	"kanji.h"
26 
27 
28 #define	SHELL
29 
30 #ifdef	VAL_impl
31 #	define  VAL
32 #else
33 #	define  VAL	extern
34 #endif
35 
36 
37 #define	LN_path		2048
38 #define	LN_dspbuf	2048
39 #define	LN_buf		2048
40 
41 #define	MAX_val		64
42 
43 
44 #include	"../lib/term.h"
45 #include	"disp.h"
46 
47 
48 
49 
50 #define	UNDO_SYSTEM		(0+MAX_edfiles)
51 #define	SEARCHS_SYSTEM	(1+MAX_edfiles)
52 #define	SYSTEM_SYSTEM	(2+MAX_edfiles)
53 #define	SHELLS_SYSTEM	(3+MAX_edfiles)
54 #define	FOPEN_SYSTEM	(4+MAX_edfiles)
55 
56 #define	MAX_edfiles		8
57 #define	MAX_edbuf		(MAX_edfiles+5)
58 
59 
60 #define	ESCAPE	(-1)
61 
62 #define	NONE		0
63 #define	DELETE		1
64 #define	BACKSPACE	2
65 #define	STAY		3
66 
67 #define	MAXKEYDEF	200
68 #define	MAXSYSKEYDEF	200
69 #define	NumWidth	(sysinfo.numberf ? 6: 0)
70 
71 //#define	MAXLINESTR	255
72 #define	MAXLINESTR	2048
73 //#define	MAXEDITLINE	1024
74 #define	MAXEDITLINE	2048
75 #define	MAXFILEMENU	512
76 
77 #define	PROFILE_VERSION	"neprof02"
78 
79 
80 typedef	struct _ed
81 {
82 	struct _ed	*prev;
83 	struct _ed	*next;
84 	char		*buffer;
85 
86 	size_t		size;		/* ���ݤ��Ƥ���Хåե��Υ����� */
87 	size_t		bytes;		/* �Хåե���μºݤ�ʸ��������*/
88 }	EditLine;
89 
90 typedef	struct
91 {
92 
93 	int 	x,y;			/* ɽ���ε��� */
94 	int 	sizex,sizey;	/* �ǥ����ץ쥤������ */
95 
96 
97 	int 	cy;			/* ���̾�ǤΥ���������� */
98 	long 	ly;			/* ���ֹ� */
99 	EditLine	*ed;	/* ���ιԤΥХåե� */
100 
101 	int 	f_cx,f_sx;	/* fix �����ޤ�Ʊ�����֤�ݻ����褦�Ȥ��롣 */
102 
103 	int 	l_cy;		/* latest. */
104 	long 	l_sy;		/* ����餬�Ѳ�����к����褬ɬ�� */
105 
106 	size_t	bytes;		/* ���Τ��Խ������� */
107 
108 	bool	gf;			/* �����ޡ�����ä����ե饰 */
109 }	se_t;
110 
111 typedef	struct
112 {
113 	char	buf[MAXEDITLINE+1];	/* �Խ��Хåե� */
114 	int 	size;		/* �Խ��Хåե��Υ����� */
115 
116 	int 	dsize;		/* ɽ����ǽ������ */
117 	int 	dx;			/* ɽ������ */
118 
119 	int 	cx,sx;		/* ����������������/����������� */
120 	int 	lx;			/* ���������Хåե���ΰ��� */
121 
122 	int 	l_sx;		/* latest. */
123 }	le_t;
124 
125 #define	csrse	edbuf[CurrentFileNo].se
126 #define	csrle	edbuf[CurrentFileNo].le
127 
128 //�����ƥ����
129 
130 typedef	struct
131 {
132 	char	nxpath[LN_path];
133 	hash_t	*vp_def;
134 	const char	*shell;
135 
136 	int 		tabstop;
137 	char		tabcode;
138 
139 	color_t		c_crmark;
140 	color_t		c_block;
141 	color_t		c_linenum;
142 	color_t		c_ctrl;
143 	color_t		c_sysmsg;
144 	color_t		c_search;
145 	color_t		c_menuc;
146 	color_t		c_menun;
147 	color_t		c_eff_dirc;
148 	color_t		c_eff_dirn;
149 	color_t		c_eff_normc;
150 	color_t		c_eff_normn;
151 
152 	bool		crmarkf;	/* crmark������Ԥ����ɤ��� */
153 	bool		tabmarkf;
154 	bool		autoindentf;
155 	bool		numberf;
156 	bool		freecursorf;
157 	bool		overwritef;
158 	bool		japanesef;
159 
160 	bool		backupf;
161 	bool		nocasef;
162 
163 	bool		f_report;
164 
165 	char		systemline[MAXEDITLINE+1];
166 	dspreg_t	*sl_drp;
167 	char		doublekey[4+1];
168 }	sysinfo_t;
169 
170 VAL	sysinfo_t	sysinfo;
171 	VAL int 	CurrentFileNo;
172 	VAL int 	BackFileNo;
173 
174 //csrse
175 	VAL int 	OnMessage_Flag;
176 
177 
178 typedef	enum	{REPLM_all,REPLM_before,REPLM_after,REPLM_block}	replm_t;
179 
180 
181 typedef	enum	{BLKM_none, BLKM_x, BLKM_y}	blkm_t;
182 
183 typedef	struct
184 {
185 	long	y_st, y_ed;
186 	int 	x_st, x_ed;
187 
188 	blkm_t	blkm;
189 }	block_t;
190 
191 typedef	struct
192 {
193 	char	path[LN_path+1];
194 	int 	ct;					/* Create Time */
195 	bool	cf;					/* file Change Flag */
196 	int 	kc;					/* EUC/JIS/SJIS */
197 	int 	rm;					/* LF/CRLF/CR */
198 
199 
200 	bool	pm;					/* Paging Mode */
201 	replm_t	replm;				/* replace Mode */
202 
203 	se_t	se;
204 	le_t	le;
205 
206 	block_t	block;
207 }	edbuf_t;
208 
209 
210 VAL	edbuf_t	edbuf[MAX_edbuf];
211 
212 #define	CNTRL(c)	((c)-'@')
213 
214 
215 
216 extern	void	eff_init(const char *s1,const char *s2);
217 
218 extern	void	search_init();
219 
220 extern	void	InitLine();
221 extern	void	Realloc(EditLine *li,const char *s);
222 extern	EditLine	*GetTop();
223 extern	EditLine	*GetLast();
224 extern	EditLine	*MakeLine(const char *buffer);
225 extern	void	AppendLast(EditLine *li);
226 extern	void	InsertLine(EditLine *bli,EditLine *li);
227 extern	void	DeleteList(EditLine *li);
228 extern	EditLine	*GetList(long o_number);
229 extern	long	GetTopNumber();
230 extern	long	GetLastNumber();
231 extern	void	lists_proc(void func(),void *gp,long n_st,long n_en);
232 extern	size_t	lists_size(long n_st,long n_en);
233 extern	void	lists_add(void *func(),void *gp);
234 
235 extern	void	inkey_wait(const char *buffer);
236 extern	int 	keysel(const char *s,const char *t);
237 extern	bool	keysel_ynq(const char *s);
238 extern	int 	keysel_yneq(const char *s);
239 
240 extern	void	se_insert(const char *s,bool f);
241 extern	void	se_delete(int n, bool f);
242 
243 
244 
245 extern	void	undo_paste();
246 extern	void	undo_add(bool df,const char *s);
247 extern	void	udbuf_set(bool df,const char *s);
248 extern	void	udbuf_get(char *s);
249 extern	void	udbuf_init();
250 
251 extern	void	le_setlx(le_t *lep,int lx);
252 extern	void	le_csrleftside(le_t *lep);
253 extern	void	le_csrrightside(le_t *lep);
254 extern	void	le_csrleft(le_t *lep);
255 extern	void	le_csrright(le_t *lep);
256 extern	void	le_edit(le_t *lep,int ch,int cm);
257 extern	size_t	le_regbuf(const char *s,char *t);
258 
259 
260 
261 typedef	struct
262 {
263 	char	str[MAXLINESTR+1];
264 	color_t	nc;	/* normal�� */
265 	color_t	cc;	/* cursor������� */
266 
267 	bool	mf;	/* mark flag */
268 }	mitem_t;
269 
270 typedef	struct
271 {
272 	mitem_t		*mitem;
273 	size_t		nums;
274 
275 	char		*title;
276 	bool		df;				/* filer�����Ѥ���disable flag */
277 
278 	int 		sy,cy;			/* ���ߤκ�ɸ */
279 
280 	dspreg_t	*drp;
281 }	menu_t;
282 
283 extern	void	menu_itemmake(menu_t *mnp,void func(int,mitem_t *,void *),size_t nums,void *vp);
284 extern	void	menu_itemmakelists(menu_t *mnp,size_t width,size_t num,char *s);
285 extern	void	menu_iteminit(menu_t *mnp);
286 extern	void	menu_itemfin(menu_t *mnp);
287 extern	void	menu_dview(menu_t *mnp);
288 extern	void	menu_itemview(menu_t *mnp,int a,bool f);
289 extern	void	menu_view(menu_t *mnp);
290 extern	void	menu_csrmove(menu_t *mnp,int ly);
291 extern	void	menu_csrnext(menu_t *mnp,char c);
292 extern	int 	menu_select(menu_t *mnp);
293 extern	int 	menu_vselect(int x, int y, size_t num, ...);
294 
295 extern	dspreg_t	*menu_regset(menu_t *mnp);
296 
297 
298 typedef	struct
299 {
300 	FILE	*fp;
301 	int 	kc;
302 	int 	jm;	/* jis������ */
303 
304 	int 	n_cr,n_lf;
305 }	kinfo_t;
306 
307 #define	issjis1(c)	(((u_char)(c)>=0x81 &&(u_char)(c)<=0x9f) || ((u_char)(c)>=0xe0 &&(u_char)(c)<=0xfc))
308 #define	issjis2(c)	( (u_char)(c)>=0x40 &&(u_char)(c)<=0xfc)
309 #define	iskana(c)	( (u_char)(c)>=0xa0 &&(u_char)(c)<=0xdf)
310 #define	iseuc(c)	( (u_char)(c)>=0xa1 &&(u_char)(c)<=0xfe)
311 #define	isjis(c)	( (u_char)(c)>=0x21 &&(u_char)(c)<=0x7e)
312 
313 extern	const	char	*kanji_fromeuc(char *s, size_t bytes, const char *t, int kc);
314 
315 extern	int 	file_knjchk(FILE *fp);
316 extern	int 	file_gets(char *s, size_t bytes, FILE *fp, int *n_cr, int *n_lf);
317 extern	void	kanji_toeuc(char *s,size_t bytes, const char *t
318 									, bool f_sjis, int *jm);
319 
320 #define	JM_ank	0
321 #define	JM_kana	1
322 #define	JM_kanji	2
323 #define	JM_so	3
324 
325 #define	KC_euc	0
326 #define	KC_jis	1
327 #define	KC_sjis	2
328 
329 #define	RM_lf	0
330 #define	RM_crlf	1
331 #define	RM_cr	2
332 
333 extern	int 	kanji_poscanon(int offset, const char *buf);
334 extern	int 	kanji_poscandsp(int offset, const char *buf);
335 extern	int 	kanji_posnext(int offset, const char *buf);
336 extern	int 	kanji_posprev(int offset, const char *buf);
337 
338 extern	int 	kanji_posbuf(int offset, const char *buf);
339 extern	int 	kanji_posdsp(int offset, const char *buf);
340 
341 extern	int 	kanji_countdsp(char c, int n);
342 extern	int 	kanji_countbuf(char c);
343 
344 
345 extern	void	strjfcpy(char *s,const char *t,size_t bytes,size_t len);
346 
347 extern	const char	*keyf_getarg(int n);
348 extern	int 	keyf_numarg();
349 
350 extern	void	lm_mark(int ln, int n);
351 extern	int 	lm_line(int n);
352 
353 extern	void	keyf_set(int region,const char *k,const char *s);
354 extern	int 	keyf_getname(const char *s,int n);
355 
356