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