1 /*--------------------------------------------------------------------
2 	nxeditor
3 			FILE NAME:crt.c
4 			Programed by : I.Neva
5 			R & D  ADVANCED SYSTEMS. IMAGING PRODUCTS.
6 			1992.06.01
7 
8     Copyright (c) 1998,1999,2000 SASAKI Shunsuke.
9     All rights reserved.
10 --------------------------------------------------------------------*/
11 #include "ed.h"
12 #include <ctype.h>
13 
14 
15 /* !! */
GetMinRow()16 int 	GetMinRow()		{return 1;}
GetMaxRow()17 int 	GetMaxRow()		{return term_sizey()-1;}
GetRowWidth()18 int 	GetRowWidth()	{return term_sizey()-1;}
19 
GetMinCol()20 int 	GetMinCol()		{return 0;}
GetMaxCol()21 int 	GetMaxCol()		{return term_sizex()-1;}
GetColWidth()22 int 	GetColWidth()	{return term_sizex()-1;}
23 
24 
widthputs(const char * s,size_t len)25 void	widthputs(const char *s,size_t len)
26 {
27 	char	buf[MAXLINESTR+1];
28 
29 	strjfcpy(buf, s, MAXLINESTR, len);
30 	term_puts(buf);
31 }
32 
33 
34 
crt_crmark()35 void	crt_crmark()
36 {
37 //fprintf(stderr, "crmark");
38 
39 	term_color(sysinfo.c_crmark);
40 	term_putch('!');
41 
42 //	term_color_normal();
43 }
44 
45 
46 
47 typedef	struct
48 {
49 	int 	dline;	// ���̾�Υ饤��
50 	long	line;	// �Хåե��� row
51 
52 	block_t	bm;
53 }	crt_draw_t;
54 
crt_draw_proc(const char * s,crt_draw_t * gp)55 void	crt_draw_proc(const char *s, crt_draw_t *gp)
56 {
57 	char	buf[MAXEDITLINE+1];
58 	char	buf_dsp[MAXEDITLINE+1], *p;
59 	bool	cf, bf;
60 	int 	ln,sx,n,m;
61 	int 	x_st, x_ed;
62 
63 
64 	if (sysinfo.numberf)
65 		{
66 		 term_locate(gp->dline, 0);
67 		 term_color(sysinfo.c_linenum);
68 		 term_printf("%5ld:", gp->line);
69 		}
70 
71 	p=buf_dsp;
72 	cf=FALSE;
73 	bf=FALSE;
74 	if (s==NULL)
75 		strcpy(buf_dsp,"~"); else
76 		{
77 		 strcpy(buf, gp->line==GetLineOffset()? csrle.buf : s);
78 
79 		 if (*s=='\0'|| s[strlen(s)-1]!='\n')
80 		 	strcat(buf, "[EOF]"); else
81 		 	cf=sysinfo.crmarkf;
82 		 if (*buf!='\0'&& buf[strlen(buf)-1]=='\n')
83 		 	 buf[strlen(buf)-1]='\0';
84 
85 		 ln=le_regbuf(buf, p);
86 
87 		 sx=GetScroll();
88 		 n =kanji_poscandsp(sx, p);
89 		 if (sx>0)
90 		 	{
91 		 	 m= kanji_posbuf(n, p);
92 		 	 if (m==ln)
93 		 	 	sx=ln; else
94 		 	 	{
95 		 	 	 if (sx!=n)
96 		 	 	 	memset(p+m, ' ', kanji_countbuf(p[m]));
97 		 	 	 sx=kanji_posbuf(sx, p);
98 		 	 	}
99 		 	 p+=sx;
100 		 	}
101 		 n=kanji_posbuf(kanji_poscandsp(GetColWidth()- NumWidth, p),p);
102 		 if (p[n]!='\0')
103 		 	cf=FALSE;
104 		 p[n]='\0';
105 
106 		 if (cf && n==GetColWidth())
107 		 	cf=FALSE;
108 		}
109 
110 	term_locate(gp->dline, NumWidth);
111 
112 	if (!block_range(gp->line, &gp->bm, &x_st, &x_ed))
113 		{
114 		 term_color_normal();
115 		 term_puts(p);
116 		} else
117 		{
118 		 n=0;
119 
120 		 x_st=kanji_posdsp(x_st, buf)-sx;
121 		 x_ed=kanji_posdsp(x_ed, buf)-sx;
122 		 if (x_st<0)
123 		 	x_st=0;
124 
125 		 if (gp->bm.blkm==BLKM_x && gp->line==GetLineOffset()
126 		 		&& gp->bm.x_st==GetBufferOffset() && x_st<x_ed)
127 		 	{
128 		 	 ++x_st;
129 		 	 if (kanji_chk(p, p+x_st))
130 		 	 	++x_st;
131 		 	}
132 
133 		 if (x_st>0)
134 		 	{
135 		 	 if (x_st>strlen(p))
136 		 	 	x_st=strlen(p);
137 		 	 memcpy(buf, p, x_st);
138 		 	 buf[x_st]='\0';
139 		 	 p+=x_st;
140 		 	 x_ed-=x_st;
141 		 	 n=x_st;
142 
143 		 	 term_color_normal();
144 		 	 term_puts(buf);
145 		 	}
146 
147 		 term_color(sysinfo.c_block);
148 		 if (x_ed<=strlen(p))
149 		 	{
150 		 	 memcpy(buf, p, x_ed);
151 		 	 buf[x_ed]='\0';
152 		 	 p+=x_ed;
153 		 	 n+=x_ed;
154 
155 		 	 term_puts(buf);
156 
157 		 	 term_color_normal();
158 		 	}
159 		 term_puts(p);
160 
161 		 if (gp->bm.blkm==BLKM_x && cf && *p=='\0')
162 		 	{
163 		 	 cf=FALSE;
164 		 	 term_color(sysinfo.c_block);
165 		 	 term_putch('!');
166 		 	}
167 
168 		 if (gp->bm.blkm==BLKM_y)
169 		 	{
170 		 	 cf=FALSE;
171 		 	 term_color(sysinfo.c_block);
172 		 	 widthputs("", GetColWidth()- NumWidth -(strlen(p)+n));
173 		 	}
174 		}
175 
176 	if (cf)
177 		crt_crmark();
178 
179 	term_color_normal();
180 	term_clrtoe();
181 
182 	++gp->line;
183 	++gp->dline;
184 }
185 
186 
CrtDrawAll()187 void	CrtDrawAll()
188 {
189 	crt_draw_t	cd;
190 	int 	sline;
191 
192 	block_set(&cd.bm);
193 
194 
195 	if (csrle.l_sx==csrle.sx)
196 		{
197 		 sline=csrse.l_sy-csr_getsy();
198 		 if (abs(sline)<GetRowWidth()-3)	// !!
199 		 	{
200 		 	 int 	i;
201 
202 			 term_locate(GetMinRow(), 0);
203 			 term_scroll(sline);
204 		 	}
205 		}
206 
207 	cd.dline=GetMinRow();
208 	cd.line=csr_getsy()+cd.dline;
209 	lists_proc(crt_draw_proc, &cd, cd.line, csr_getsy()+GetRowWidth());
210 
211 	csrle.l_sx=csrle.sx;
212 	csrse.l_sy=csr_getsy();
213 	csrse.l_cy=csrse.cy;
214 }
215 
216 
217 
DeleteAndDraw()218 void	DeleteAndDraw()
219 {
220 	term_locate(GetRow(), 0);
221 	term_scroll(-1);
222 }
223 
InsertAndDraw()224 void	InsertAndDraw()
225 {
226 	term_locate(GetRow(), 0);
227 	term_scroll(1);
228 }
229 
RefreshMessage()230 void	RefreshMessage()
231 {
232 	if (OnMessage_Flag)
233 	{
234 		OnMessage_Flag = FALSE;
235 		*sysinfo.systemline='\0';
236 
237 		if (sysinfo.sl_drp!=NULL)
238 			{
239 			 dsp_regfin(sysinfo.sl_drp);
240 			 sysinfo.sl_drp=NULL;
241 			}
242 	}
243 }
244 
245 
246 /*-------------------------------------------------------------------
247 	Put Guide Line
248 
249 	2000/03/11 by Mia	upd
250 		If GetLastNumber( ) == 0, causes SIGFPE and dumps core.
251 		This occurs when filer is kicked with no file opened.
252 ------------------------------------------------------------------*/
253 #define	LN_guide	34
254 
dspreg_guide(void * vp,int a,int sizex,int sizey)255 dspfmt_t	*dspreg_guide(void *vp,int a,int sizex,int sizey)
256 {
257 	dspfmt_t	*dfp,*dfpb;
258 	char		*p, tmp[1024+1], tmp2[1024+1];
259 	int 		length;
260 	int 		cn;
261 
262 	char		kc_char[]={'E','J','S'};
263 	char		rm_char[]={'L','+','C'};
264 
265 
266 /*	if (CurrentFileNo<0 || CurrentFileNo>=MAX_files)
267 		return NULL;
268 */
269 	if (sizex<=LN_guide)
270 		{
271 		 dfp=dsp_fmtinit("",NULL);
272 		 dfp->col = AC_reverse;
273 		 return dfp;
274 		}
275 
276 
277 	if (edbuf[CurrentFileNo].pm)
278 		dfp=dsp_fmtinit("S",NULL); else
279 		{
280 		 dfp=dsp_fmtinit("P",NULL);
281 		 dfp->col = AC_reverse;
282 		}
283 	dfpb=dfp;
284 
285 	if (sysinfo.overwritef)
286 		dfp=dsp_fmtinit("R",dfp); else
287 		{
288 		 dfp=dsp_fmtinit("i",dfp);
289 		 dfp->col = AC_reverse;
290 		}
291 
292 	if (GetBufferOffset()>=strlen(csrle.buf))
293 		cn=0; else
294 		{
295 		 cn=csrle.buf[GetBufferOffset()]&0xff;
296 		 if (iskanji(cn))
297 		 	cn=(cn<<8) + (csrle.buf[GetBufferOffset()+1]&0xff);
298 		}
299 
300 	if (*sysinfo.doublekey!='\0')
301 		strcpy(tmp2,sysinfo.doublekey); else
302 		sprintf(tmp2,"%04x",cn);
303 
304 	p = edbuf[CurrentFileNo].path;
305 	length = strlen(p);
306 	if (sizex-LN_guide < length)
307 		p += length-(sizex-LN_guide);
308 
309 	sprintf(tmp, " %05d/%3d%%:%03d[%4.4s]%6d %2d%c%c%c%s"
310 			,GetLineOffset()
311 			,GetLineOffset()== 1 || GetLastNumber( ) == 0 ? 0 : GetLineOffset()*100/GetLastNumber()
312 			,le_getcsx(&csrle)
313 			,tmp2
314 			,csrse.bytes+GetLastNumber()-1
315 			,CurrentFileNo+1
316 			,kc_char[edbuf[CurrentFileNo].kc]
317 			,rm_char[edbuf[CurrentFileNo].rm]
318 			,edbuf[CurrentFileNo].cf? '*':':'
319 			,p
320 		);
321 
322 	dfp=dsp_fmtinit(tmp, dfp);
323 	dfp->col = AC_reverse;
324 
325 	return dfpb;
326 }
327 
putDoubleKey(int key)328 void	putDoubleKey(int key)
329 {
330 	sprintf(sysinfo.doublekey,"^%c  ", key+'@');
331 }
332 
delDoubleKey()333 void	delDoubleKey()
334 {
335 	*sysinfo.doublekey='\0';
336 }
337 
system_guide_init()338 void	system_guide_init()
339 {
340 	dspreg_t	*drp;
341 
342 	drp=dsp_reginit();
343 	drp->sizey=1;
344 	drp->func=dspreg_guide;
345 
346 	dsp_regadd(drp);
347 }
348 
system_guide()349 void	system_guide()
350 {
351 	dsp_allview();
352 }
353 
354 
dspreg_sysmsg(void * vp,int a,int sizex,int sizey)355 dspfmt_t	*dspreg_sysmsg(void *vp,int a,int sizex,int sizey)
356 {
357 	dspfmt_t	*dfp;
358 
359 	dfp=dsp_fmtinit(sysinfo.systemline, NULL);
360 	dfp->col=sysinfo.c_sysmsg;
361 
362 	return dfp;
363 }
364 
365 
system_msg(const char * buffer)366 void	system_msg(const char *buffer)	// ����Ūdsp��
367 {
368 	OnMessage_Flag = TRUE;
369 
370 	strcpy(sysinfo.systemline, buffer);
371 
372 	if (*buffer=='\0')
373 		{
374 		 term_locate(GetMaxRow(), 0);
375 		 term_clrtoe();					// !!
376 
377 		 return;
378 		}
379 
380 	if (sysinfo.sl_drp!=NULL)
381 		dsp_regfin(sysinfo.sl_drp);
382 
383 
384 	sysinfo.sl_drp=dsp_reginit();
385 	sysinfo.sl_drp->y    =dspall.sizey-1;
386 	sysinfo.sl_drp->sizey=1;
387 	sysinfo.sl_drp->func =dspreg_sysmsg;
388 
389 	dsp_regadd(sysinfo.sl_drp);
390 
391 	dsp_regview(sysinfo.sl_drp);
392 
393 	term_locate(GetMaxRow(), strlen(buffer));
394 	term_color_normal();
395 }
396 
397