1 /* we_wind.c                                             */
2 /* Copyright (C) 1993 Fred Kruse                          */
3 /* This is free software; you can redistribute it and/or  */
4 /* modify it under the terms of the                       */
5 /* GNU General Public License, see the file COPYING.      */
6 
7 #include "messages.h"
8 #include "edit.h"
9 
10 #define MAXSVSTR 20
11 
12 int e_make_xr_rahmen(int xa, int ya, int xe, int ye, int sw);
13 
14 /* break string into multiple line to fit into windows
15 
16    REM: Caller has to free returned vector!!!
17 */
StringToStringArray(char * str,int * maxLen,int minWidth,int * anzahl)18 char **StringToStringArray(char *str, int *maxLen, int minWidth, int *anzahl)
19 {
20  int i, j, k, anz = 0, mxlen = 0, max = 0.8 * MAXSCOL;
21  char **s = MALLOC(sizeof(char*));
22 
23  for (k = 0, i = 0; str[i]; i++)
24  {
25   if((i-k) == max || str[i] == '\n')
26   {
27    j = i-1;
28    if (str[i] != '\n')
29     for (; j > 0 && !isspace(str[j]); j--)
30      ;
31    if(j > k)
32     i = j;
33    anz++;
34    s = REALLOC(s, anz * sizeof(char *));
35    s[anz-1] = MALLOC((i - k + 2) * sizeof(char));
36    for (j = k; j <= i; j++)
37     s[anz-1][j-k] = str[j];
38    if (isspace(str[j-1]))
39     j--;
40    if (mxlen < (j-k))
41     mxlen = j - k;
42    s[anz-1][j-k] = '\0';
43    k = i+1;
44   }
45  }
46  anz++;
47  s = REALLOC(s, anz * sizeof(char *));
48  s[anz-1] = MALLOC((i - k + 2) * sizeof(char));
49  for (j = k; j <= i; j++)
50   s[anz-1][j-k] = str[j];
51  if (mxlen < (j-k))
52   mxlen = j - k;
53  if (mxlen < minWidth)
54   mxlen = minWidth;
55 
56  *maxLen = mxlen;
57  *anzahl = anz;
58 
59  return (s);
60 }
61 
62 /*
63       Print error message        */
e_error(char * text,int sw,FARBE * f)64 int e_error(char *text, int sw, FARBE *f)
65 {
66  PIC *pic = NULL;
67  int len, i, xa, xe, ya = 8, ye = 14;
68  char *header = NULL;
69 
70  fk_cursor(0);
71  WpeMouseChangeShape(WpeErrorShape);
72  if ((len = strlen((char *)text)) < 20 ) len = 20;
73  xa = (80-len)/2 - 2;
74  xe = 82 - (80-len)/2;
75  if (sw == -1) header = "Message";
76  else if (sw == 0) header = "Error";
77  else if (sw == 1) header = "Serious Error";
78  else if (sw == 2) header = "Fatal Error";
79 
80  if (sw < 2) pic = e_std_kst(xa, ya, xe, ye, header, 1, f->nr.fb, f->nt.fb, f->ne.fb);
81  if (sw == 2 || pic == NULL)
82  {
83   pic = e_open_view(xa, ya, xe, ye, 0, 0);
84   e_std_rahmen(xa, ya, xe, ye, header, 1, 0, 0);
85  }
86  if (sw < 2)
87  {
88   e_pr_str((xe + xa - e_str_len((unsigned char *)text))/2,
89     ya + 2, text, f->nt.fb, 0, 0, 0, 0);
90   e_pr_str((xe + xa - 4)/2, ya + 4, " OK ", f->nz.fb, 1, -1,
91     f->ns.fb, f->nt.fb);
92  }
93  else
94  {
95   e_pr_str((xe + xa - e_str_len((unsigned char *)text))/2,
96     ya + 2, text, 112, 0, 0, 0, 0);
97   e_pr_str((xe + xa - 4)/2, ya + 4, " OK ", 32, 1, -1, 46, 112);
98  }
99  do
100  {
101 #if  MOUSE
102   if ((i = e_toupper(e_getch())) == -1)
103    i = e_er_mouse(xa+3, ya,(xe+xa-4)/2, ya+4);
104 #else
105   i = e_toupper(e_getch());
106 #endif
107  } while (i != WPE_ESC && i != WPE_CR && i != 'O');
108  WpeMouseRestoreShape();
109  if (pic != NULL) e_close_view(pic, 1);
110  else e_cls(0, ' ');
111  fk_cursor(1);
112  if (sw == 1) e_quit(WpeEditor->f[WpeEditor->mxedt]);
113  if (sw > 0) WpeExit(sw);
114  return(sw);
115 }
116 
117 /*   message with selection        */
e_message(int sw,char * str,FENSTER * f)118 int e_message(int sw, char *str, FENSTER *f)
119 {
120  int i, ret, mxlen = 0, anz = 0;
121  char **s;
122  W_OPTSTR *o = e_init_opt_kst(f);
123 
124  if (!o)
125   return(-1);
126 
127  s = StringToStringArray(str, &mxlen, 22, &anz);
128 
129  o->ye = MAXSLNS - 6;
130  o->ya = o->ye - anz - 5;
131  o->xa = (MAXSCOL - mxlen - 6)/2;
132  o->xe = o->xa + mxlen + 6;
133 
134  o->bgsw = 0;
135  o->name = "Message";
136  for (i = 0; i < anz; i++)
137  {
138   e_add_txtstr((o->xe-o->xa-strlen(s[i]))/2, 2+i, s[i], o);
139   FREE(s[i]);
140  }
141  FREE(s);
142  if (!sw)
143  {
144   o->crsw = AltO;
145   e_add_bttstr((o->xe-o->xa-4)/2, o->ye-o->ya-2, 0, AltO, "Ok", NULL, o);
146  }
147  else
148  {
149   o->crsw = AltY;
150   e_add_bttstr(4, o->ye-o->ya-2, 0, AltY, "Yes", NULL, o);
151   e_add_bttstr((o->xe-o->xa-2)/2, o->ye-o->ya-2, 0, AltN, "No", NULL, o);
152   e_add_bttstr(o->xe-o->xa-9, o->ye-o->ya-2, -1, WPE_ESC, "Cancel", NULL, o);
153  }
154  ret = e_opt_kst(o);
155  freeostr(o);
156  return(ret == WPE_ESC ? WPE_ESC : (ret == AltN ? 'N' : 'Y'));
157 }
158 
159 /*         First opening of a window                 */
e_firstl(FENSTER * f,int sw)160 void e_firstl(FENSTER *f, int sw)
161 {
162  f->pic = NULL;
163  f->pic = e_ed_kst(f, f->pic, sw);
164  if (f->pic == NULL)
165   e_error(e_msg[ERR_LOWMEM], 1, f->fb);
166 }
167 
168 /*         Writing of the file type    */
e_pr_filetype(FENSTER * f)169 int e_pr_filetype(FENSTER *f)
170 {
171  int frb = f->fb->es.fb;
172 
173  e_pr_char(f->a.x+2, f->e.y, 'A', frb);
174  if (f->ins == 0 || f->ins == 2)
175   e_pr_char(f->a.x+16, f->e.y, 'O', frb);
176  else if (f->ins == 8)
177   e_pr_char(f->a.x+16, f->e.y, 'R', frb);
178  else
179   e_pr_char(f->a.x+16, f->e.y, 'I', frb);
180  if (f->ins > 1)
181   e_pr_char(f->a.x+17, f->e.y, 'S', frb);
182  else
183   e_pr_char(f->a.x+17, f->e.y, 'L', frb);
184  return(0);
185 }
186 
187 /*   open section of screen and save background  */
e_open_view(int xa,int ya,int xe,int ye,int col,int sw)188 PIC *e_open_view(int xa, int ya, int xe, int ye, int col, int sw)
189 {
190  PIC *pic = MALLOC(sizeof(PIC));
191  int i, j;
192 
193  if (pic == NULL) return(NULL);
194  pic->a.x = xa;
195  pic->a.y = ya;
196 #ifndef NEWSTYLE
197  if(!WpeIsXwin())
198  {
199   pic->e.x = xe;
200   pic->e.y = ye;
201  }
202  else
203  {
204   pic->e.x = xe < MAXSCOL-2 ? xe + 2 : xe < MAXSCOL-1 ? xe + 1 : xe;
205   pic->e.y = ye < MAXSLNS-2 ? ye + 1 : ye;
206  }
207 #else
208  pic->e.x = xe;
209  pic->e.y = ye;
210 #endif
211  if (sw!=0)
212  {
213 #if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
214   pic->p = MALLOC((pic->e.x - pic->a.x + 1) * 3 * (pic->e.y - pic->a.y + 1));
215 #else
216   pic->p = MALLOC((pic->e.x - pic->a.x + 1) * 2 * (pic->e.y - pic->a.y + 1));
217 #endif
218   if (pic->p == NULL) {  FREE(pic);  return(NULL);  }
219   for (j = pic->a.y; j <= pic->e.y; ++j)
220    for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
221     *( pic->p + (j-pic->a.y)*2*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) = e_gt_byte(i, j);
222 #if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
223   e_get_pic_xrect(xa, ya, xe, ye, pic);
224 #endif
225  }
226  else pic->p = (char *)0;
227  if (sw < 2)
228  {
229   for (j = ya; j <= ye; ++j)
230    for (i = xa; i <= xe; ++i)
231     e_pr_char(i, j, ' ', col);
232  }
233 #ifndef NO_XWINDOWS
234  if (WpeIsXwin()) (*e_u_setlastpic)(pic);
235 #endif
236 #ifndef NEWSTYLE
237  if (WpeIsXwin())
238  {
239   if (sw != 0)
240   {
241    if (xe < MAXSCOL-1) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
242     e_pt_col(xe+1, i, SHDCOL);
243    if (xe < MAXSCOL-2) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
244     e_pt_col(xe+2, i, SHDCOL);
245    if (ye < MAXSLNS-2) for(i = xa+2; i <= xe; i++) e_pt_col(i, ye+1, SHDCOL);
246   }
247  }
248 #endif
249  return(pic);
250 }
251 
252 /*   close screen section - refresh background  */
e_close_view(PIC * pic,int sw)253 int e_close_view(PIC *pic, int sw)
254 {
255  int i, j;
256 #ifndef NO_XWINDOWS
257  if (WpeIsXwin()) (*e_u_setlastpic)(NULL);
258 #endif
259  if (pic == NULL) return(-1);
260  if (sw != 0 && pic->p != NULL)
261  {
262   for (j = pic->a.y; j <= pic->e.y; ++j)
263    for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
264     e_pt_byte(i, j, *(pic->p + (j-pic->a.y)*2*(pic->e.x-pic->a.x+1) + (i-2*pic->a.x)));
265 #if defined(NEWSTYLE) && !defined(NO_XWINDOWS)
266   e_put_pic_xrect(pic);
267 #endif
268  }
269  else if (sw != 0)
270  {
271   for (j = pic->a.y; j <= pic->e.y; ++j)
272    for (i = pic->a.x; i <= pic->e.x; ++i)
273     e_pr_char(i, j, ' ', 0);
274  }
275  if (sw < 2)
276  {
277   if (pic->p != NULL) FREE(pic->p);
278   FREE(pic);
279  }
280  e_refresh();
281  return(sw);
282 }
283 
284 /*    Frame for edit window   */
e_ed_rahmen(FENSTER * f,int sw)285 void e_ed_rahmen(FENSTER *f, int sw)
286 {
287  extern char *e_hlp;
288  extern int nblst;
289  extern WOPT *blst;
290  char *header = NULL;
291 
292  if (!DTMD_ISTEXT(f->dtmd))
293  {
294   if (f->datnam[0]) header = f->datnam;
295   if (f->dtmd == DTMD_FILEDROPDOWN)
296    e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->er.fb,
297      f->fb->es.fb);
298   else
299    e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->nr.fb,
300      f->fb->ne.fb);
301   if (f->winnum < 10 && f->winnum >= 0)
302    e_pr_char(f->e.x-6, f->a.y, '0' + f->winnum, f->fb->nr.fb);
303   else if (f->winnum >= 0)
304    e_pr_char(f->e.x-6, f->a.y, 'A' - 10 + f->winnum, f->fb->nr.fb);
305   if (sw > 0 && (f->dtmd == DTMD_FILEMANAGER || f->dtmd == DTMD_DATA))
306   {
307    if (f->zoom == 0)
308     e_pr_char(f->e.x-3, f->a.y, WZN, f->fb->ne.fb);
309    else
310     e_pr_char(f->e.x-3, f->a.y, WZY, f->fb->ne.fb);
311 #ifdef NEWSTYLE
312    if (!WpeIsXwin())
313    {
314 #endif
315     e_pr_char(f->e.x-4, f->a.y, '[', f->fb->nr.fb);
316     e_pr_char(f->e.x-2, f->a.y, ']', f->fb->nr.fb);
317 #ifdef NEWSTYLE
318    }
319    else
320     e_make_xrect(f->e.x-4, f->a.y, f->e.x-2, f->a.y, 0);
321 #endif
322    blst = f->blst;
323    nblst = f->nblst;
324    e_hlp = f->hlp_str;
325    e_pr_uul(f->fb);
326   }
327 #ifdef NEWSTYLE
328   if (WpeIsXwin())
329    e_make_xr_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, sw);
330 #endif
331   return;
332  }
333  if (f->datnam[0])
334  {
335   if (strcmp(f->dirct, f->ed->dirct) == 0 ||
336     f->dtmd == DTMD_HELP || strcmp(f->datnam, BUFFER_NAME) == 0 ||
337     NUM_COLS_ON_SCREEN < 40)
338   {
339    header = (char *)WpeMalloc(strlen(f->datnam) + 1);
340    strcpy(header, f->datnam);
341   }
342   else
343   {
344    header = (char *)WpeMalloc(strlen(f->dirct) + strlen(f->datnam) + 1);
345    strcpy(header, f->dirct);
346    strcat(header, f->datnam);
347   }
348  }
349  e_std_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, header, sw, f->fb->er.fb,
350    f->fb->es.fb);
351  if (header)
352   WpeFree(header);
353  if (sw > 0)
354  {
355   e_mouse_bar(f->e.x, f->a.y+1, NUM_LINES_ON_SCREEN - 1, 0, f->fb->em.fb);
356   e_mouse_bar(f->a.x+19, f->e.y, NUM_COLS_ON_SCREEN - 20, 1, f->fb->em.fb);
357   if (f->zoom == 0)
358    e_pr_char(f->e.x-3, f->a.y, WZN, f->fb->es.fb);
359   else
360    e_pr_char(f->e.x-3, f->a.y, WZY, f->fb->es.fb);
361 #ifdef NEWSTYLE
362   if (!WpeIsXwin())
363   {
364 #endif
365    e_pr_char(f->e.x-4, f->a.y, '[', f->fb->er.fb);
366    e_pr_char(f->e.x-2, f->a.y, ']', f->fb->er.fb);
367 #ifdef NEWSTYLE
368   }
369   else
370    e_make_xrect(f->e.x-4, f->a.y, f->e.x-2, f->a.y, 0);
371 #endif
372   e_pr_filetype(f);
373   if (WpeIsXwin() && NUM_LINES_ON_SCREEN > 8)
374   {
375 #if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
376    e_pr_char(f->a.x, f->a.y + 2, 'F', f->fb->em.fb);
377    e_make_xrect(f->a.x, f->a.y+2, f->a.x, f->a.y+2, 0);
378    e_pr_char(f->a.x, f->a.y + 4, 'R', f->fb->em.fb);
379    e_make_xrect(f->a.x, f->a.y+4, f->a.x, f->a.y+4, 0);
380    e_pr_char(f->a.x, f->a.y + 6, 'A', f->fb->em.fb);
381    e_make_xrect(f->a.x, f->a.y+6, f->a.x, f->a.y+6, 0);
382    if (f->ins != 8)
383    {
384     e_pr_char(f->a.x, f->a.y + 8, 'S', f->fb->em.fb);
385     e_make_xrect(f->a.x, f->a.y+8, f->a.x, f->a.y+8, 0);
386    }
387 #else
388    e_pr_char(f->a.x, f->a.y + 2, 'F', f->fb->em.fb);
389    e_pr_char(f->a.x, f->a.y + 3, MCI, f->fb->em.fb);
390    e_pr_char(f->a.x, f->a.y + 4, 'R', f->fb->em.fb);
391    e_pr_char(f->a.x, f->a.y + 5, MCI, f->fb->em.fb);
392    e_pr_char(f->a.x, f->a.y + 6, 'A', f->fb->em.fb);
393    if (f->ins != 8)
394    {
395     e_pr_char(f->a.x, f->a.y + 7, MCI, f->fb->em.fb);
396     e_pr_char(f->a.x, f->a.y + 8, 'S', f->fb->em.fb);
397    }
398 #endif
399   }
400   e_zlsplt(f);
401   blst = f->blst;
402   nblst = f->nblst;
403   e_hlp = f->hlp_str;
404   e_pr_uul(f->fb);
405  }
406  if (f->winnum < 10 && f->winnum >= 0)
407   e_pr_char(f->e.x-6, f->a.y, '0' + f->winnum, f->fb->er.fb);
408  else if (f->winnum >= 0)
409   e_pr_char(f->e.x-6, f->a.y, 'A' - 10 + f->winnum, f->fb->er.fb);
410 #ifdef NEWSTYLE
411  if (WpeIsXwin())
412   e_make_xr_rahmen(f->a.x, f->a.y, f->e.x, f->e.y, sw);
413 #endif
414 }
415 
416 /*   Output - screen content */
e_schirm(FENSTER * f,int sw)417 int e_schirm(FENSTER *f, int sw)
418 {
419  int j;
420 
421  if (f->dtmd == DTMD_FILEMANAGER)
422   return(WpeDrawFileManager(f));
423  else if (f->dtmd == DTMD_DATA)
424   return(e_data_schirm(f));
425  else if (f->dtmd == DTMD_FILEDROPDOWN)
426   return(e_pr_file_window((FLWND*)f->b, 1, sw, f->fb->er.fb, f->fb->ez.fb,
427     f->fb->frft.fb));
428  if (NUM_LINES_OFF_SCREEN_TOP < 0)
429   NUM_LINES_OFF_SCREEN_TOP = 0;
430 
431 #ifdef PROG
432  if (f->c_sw)
433   for (j = NUM_LINES_OFF_SCREEN_TOP; j < f->b->mxlines && j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
434    e_pr_c_line(j, f);
435  else
436 #endif
437   for (j = NUM_LINES_OFF_SCREEN_TOP; j < f->b->mxlines && j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
438    e_pr_line(j, f);
439  for (; j < LINE_NUM_ON_SCREEN_BOTTOM ; j++ )
440   e_blk((NUM_COLS_ON_SCREEN - 1), f->a.x + 1, j - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, f->fb->et.fb);
441  return(j);
442 }
443 
444 /*   Move and modify window */
e_size_move(FENSTER * f)445 int e_size_move(FENSTER *f)
446 {
447  int xa = f->a.x, ya = f->a.y, xe = f->e.x, ye = f->e.y;
448  int c = 0, xmin = 26, ymin = 3;
449 
450  e_ed_rahmen(f, 0);
451  if (f->dtmd == DTMD_FILEDROPDOWN)
452   xmin = 15;
453  else if (!DTMD_ISTEXT(f->dtmd))
454   ymin = 9;
455  while ((c = e_getch()) != WPE_ESC && c != WPE_CR)
456  {
457   switch (c)
458   {
459    case CLE:
460     if (xa > 0) {  xa--; xe--;  }
461     break;
462    case CRI:
463     if (xe < MAXSCOL-1) {  xa++; xe++;  }
464     break;
465    case CUP:
466     if (ya > 1) {  ya--; ye--;  }
467     break;
468    case CDO:
469     if (ye < MAXSLNS-2) {  ya++; ye++;  }
470     break;
471    case SCLE:
472    case CCLE:
473     if ((xe - xa) > xmin) xe--;
474     break;
475    case SCRI:
476    case CCRI:
477     if (xe < MAXSCOL-1) xe++;
478     break;
479    case SCUP:
480    case BUP:
481     if ((ye - ya) > ymin) ye--;
482     break;
483    case SCDO:
484    case BDO:
485     if (ye < MAXSLNS-2) ye++;
486     break;
487   }
488   if (xa != f->a.x || ya != f->a.y || xe != f->e.x || ye != f->e.y)
489   {
490    f->a.x = xa;
491    f->a.y = ya;
492    f->e.x = xe;
493    f->e.y = ye;
494    f->pic = e_ed_kst(f, f->pic, 0);
495    if (f->pic == NULL)  e_error(e_msg[ERR_LOWMEM], 1, f->fb);
496    if (f->dtmd == DTMD_FILEDROPDOWN)
497    {
498     FLWND *fw = (FLWND*) f->b;
499     fw->xa = f->a.x+1; fw->xe = f->e.x;
500     fw->ya = f->a.y+1; fw->ye = f->e.y;
501    }
502    e_cursor(f, 0);
503    e_schirm(f, 0);
504   }
505  }
506  e_ed_rahmen(f, 1);
507  return(c);
508 }
509 
510 /*       Standard Box                                  */
e_std_kst(int xa,int ya,int xe,int ye,char * name,int sw,int fr,int ft,int fes)511 PIC *e_std_kst(int xa, int ya, int xe, int ye, char *name, int sw, int fr,
512   int ft, int fes)
513 {
514  PIC *pic = e_open_view(xa, ya, xe, ye, ft, 1);
515  if (pic == NULL) return (NULL);
516  e_std_rahmen(xa, ya, xe, ye, name, sw, fr, fes);
517  return(pic);
518 }
519 
e_change_pic(int xa,int ya,int xe,int ye,PIC * pic,int sw,int frb)520 PIC *e_change_pic(int xa, int ya, int xe, int ye, PIC *pic, int sw, int frb)
521 {
522    int i, j;
523    int box = 2, ax, ay, ex, ey;
524    PIC *newpic;
525    if(sw<0) {  sw = -sw; box = 1;  }
526    if (pic == NULL)
527    {  newpic = e_open_view(xa, ya, xe, ye, frb, box);
528       if (newpic == NULL) return (NULL);
529    }
530    else if (xa > pic->e.x || xe < pic->a.x ||
531                                           ya > pic->e.y || ye < pic->a.y)
532    {  e_close_view(pic, box);
533       newpic = e_open_view(xa, ya, xe, ye, frb, box);
534       if (newpic == NULL) return (NULL);
535    }
536    else
537    {
538       newpic = MALLOC(sizeof(PIC));
539       if(newpic == NULL)  return(NULL);
540       newpic->a.x = xa;
541       newpic->a.y = ya;
542 #ifndef NEWSTYLE
543       if(!WpeIsXwin())
544       {  newpic->e.x = xe;
545 	 newpic->e.y = ye;
546       }
547       else
548       {  newpic->e.x = xe < MAXSCOL-2 ? xe + 2 : xe < MAXSCOL-1 ? xe + 1 : xe;
549 	 newpic->e.y = ye < MAXSLNS-2 ? ye + 1 : ye;
550       }
551 #else
552       newpic->e.x = xe;
553       newpic->e.y = ye;
554 #endif
555 #if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
556       newpic->p = MALLOC( (newpic->e.x - newpic->a.x + 1) * 3
557 				* (newpic->e.y - newpic->a.y + 1) );
558 #else
559       newpic->p = MALLOC( (newpic->e.x - newpic->a.x + 1) * 2
560 				* (newpic->e.y - newpic->a.y + 1) );
561 #endif
562       if (newpic->p == NULL) {  FREE(newpic);  return(NULL);  }
563       ax = pic->a.x > newpic->a.x ? pic->a.x : newpic->a.x;
564       ay = pic->a.y > newpic->a.y ? pic->a.y : newpic->a.y;
565       ex = pic->e.x < newpic->e.x ? pic->e.x : newpic->e.x;
566       ey = pic->e.y < newpic->e.y ? pic->e.y : newpic->e.y;
567       for (j = ay; j <= ey; ++j)
568       for (i = 2*ax; i <= 2*ex+1; ++i)
569       {  *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
570 				+ (i-2*newpic->a.x))
571                    = *(pic->p + 2*(pic->e.x-pic->a.x+1)*(j-pic->a.y)
572                                  + (i - 2*pic->a.x) );
573       }
574 
575       for (j = newpic->a.y; j < ay; ++j)
576       for (i = 2*newpic->a.x; i <= 2*newpic->e.x+1; ++i)
577       {  *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
578 		+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
579       }
580 
581       for (j = newpic->e.y; j > ey; --j)
582       for (i = 2*newpic->a.x; i <= 2*newpic->e.x+1; ++i)
583       {  *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
584 		+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
585       }
586 
587       for (j = newpic->a.y; j <= newpic->e.y; ++j)
588       for (i = 2*newpic->a.x; i < 2*ax; ++i)
589       {  *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
590 		+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
591       }
592 
593       for (j = newpic->a.y; j <= newpic->e.y; ++j)
594       for (i = 2*(ex+1); i <= 2*newpic->e.x + 1; ++i)
595       {  *(newpic->p + 2*(newpic->e.x-newpic->a.x+1)*(j-newpic->a.y)
596 		+ (i-2*newpic->a.x)) = e_gt_byte(i, j);
597       }
598       for (j = pic->a.y; j < ya; ++j)
599       for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
600       e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
601                          *(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
602       for (j = pic->a.y; j <= pic->e.y; ++j)
603       for (i = 2*pic->a.x; i < 2*xa; i=i+1)
604       e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
605                        *(pic->e.x-pic->a.x+1) + (i - 2*pic->a.x) ) );
606       for (j = pic->e.y; j > ye; --j)
607       for (i = 2*pic->a.x; i <= 2*pic->e.x+1; ++i)
608       e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
609                        *(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
610       for (j = pic->e.y; j >= pic->a.y; --j)
611       for (i = 2*pic->e.x + 1; i > 2*xe; --i)
612       e_pt_byte(i, j, *( pic->p + (j-pic->a.y)*2
613                        *(pic->e.x-pic->a.x+1) + (i-2*pic->a.x) ) );
614 #if !defined(NO_XWINDOWS) && defined(NEWSTYLE)
615       e_put_pic_xrect(pic);
616       e_get_pic_xrect(xa, ya, xe, ye, newpic);
617 #endif
618 #ifndef NEWSTYLE
619       if (WpeIsXwin())
620       {  if(xe < MAXSCOL-1) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
621 						e_pt_col(xe+1, i, SHDCOL);
622          if(xe < MAXSCOL-2) for(i = ya+1; i <= ye+1 && i < MAXSLNS-1; i++)
623 						e_pt_col(xe+2, i, SHDCOL);
624          if(ye < MAXSLNS-2) for(i = xa+2; i <= xe; i++)
625       						e_pt_col(i, ye+1, SHDCOL);
626       }
627 #endif
628       FREE(pic->p);
629       FREE(pic);
630    }
631 #ifndef NO_XWINDOWS
632    if (WpeIsXwin()) (*e_u_setlastpic)(newpic);
633 #endif
634    return(newpic);
635 }
636 
e_ed_kst(FENSTER * f,PIC * pic,int sw)637 PIC *e_ed_kst(FENSTER *f, PIC *pic, int sw)
638 {
639    PIC *newpic = e_change_pic(f->a.x, f->a.y, f->e.x,
640 				f->e.y, pic, sw, f->fb->er.fb);
641    e_ed_rahmen(f, sw);
642    return(newpic);
643 }
644 
645 /*    delete buffer     */
e_close_buffer(BUFFER * b)646 int e_close_buffer(BUFFER *b)
647 {
648  int i;
649 
650  if (b != NULL)
651  {
652   e_remove_undo(b->ud, b->cn->numundo + 1);
653   if (b->bf != NULL)
654   {
655    for (i = 0; i < b->mxlines; i++)
656    {
657     if (b->bf[i].s != NULL)
658      FREE( b->bf[i].s );
659     b->bf[i].s = NULL;
660    }
661    FREE(b->bf);
662   }
663   FREE(b);
664  }
665  return(0);
666 }
667 
668 /*    close window */
e_close_window(FENSTER * f)669 int e_close_window(FENSTER *f)
670 {
671  ECNT *cn = f->ed;
672  FENSTER *f0 = f->ed->f[0];
673  int c = 0;
674  long maxname;
675  char text[256];
676 
677  f = cn->f[cn->mxedt];
678  if (f->dtmd == DTMD_FILEMANAGER)
679  {
680   FLBFFR *b = (FLBFFR *)f->b;
681 
682   FREE(f->dirct);
683   FREE(b->rdfile);
684   freedf(b->df);  freedf(b->fw->df);
685   freedf(b->dd);  freedf(b->cd);  freedf(b->dw->df);
686   FREE(b->fw);
687   FREE(b->dw);
688   FREE(b);
689   (cn->mxedt)--;
690   cn->curedt = cn->edt[cn->mxedt];
691   e_close_view(f->pic, 1);
692   if (f != f0 && f != NULL)
693   {
694    e_free_find(&f->fd);
695    FREE(f);
696   }
697   if (cn->mxedt > 0)
698   {
699    f = cn->f[cn->mxedt];
700    e_ed_rahmen(f, 1);
701   }
702   return(0);
703  }
704  if (f->dtmd == DTMD_DATA)
705  {
706   FLWND *fw = (FLWND *)f->b;
707   int swt = f->ins;
708 
709 #ifdef PROG
710   if (swt == 4 && f->save)
711    e_p_update_prj_fl(f);
712 #endif
713   if (f->dirct)
714    FREE(f->dirct);
715   if (swt == 7)
716    freedf(fw->df);
717   FREE(fw);
718   (cn->mxedt)--;
719   cn->curedt = cn->edt[cn->mxedt];
720   e_close_view(f->pic, 1);
721   if (f != f0 && f != NULL)
722   {
723    e_free_find(&f->fd);
724    FREE(f);
725   }
726   if (cn->mxedt > 0 && (swt < 5 || swt == 7))
727   {
728    f = cn->f[cn->mxedt];
729    e_ed_rahmen(f, 1);
730   }
731   return(0);
732  }
733  if (f == NULL || f->ed->mxedt <= 0)
734   return(0);
735  if (f != f0)
736  {
737   if (f->save != 0 && f->ins != 8)
738   {
739    sprintf(text, "File %s NOT saved!\nDo you want to save File ?", f->datnam);
740    c = e_message(1, text, f);
741    if (c == WPE_ESC)
742     return(c);
743    else if (c == 'Y')
744     e_save(f);
745   }
746   /* Check if file system could have an autosave or emergency save file
747      >12 check is to eliminate dos file systems */
748   if ((maxname = pathconf(f->dirct, _PC_NAME_MAX) >= strlen(f->datnam) + 4) &&
749     (maxname > 12))
750   {
751    remove(e_make_postf(text, f->datnam, ".ASV"));
752    remove(e_make_postf(text, f->datnam, ".ESV"));
753   }
754   if (strcmp(f->datnam, "Messages") && strcmp(f->datnam, "Watches"))
755    e_close_buffer(f->b);
756   if (f->dtmd == DTMD_HELP && f->ins == 8)
757    e_help_free(f);
758   if (f->datnam != NULL)
759    FREE(f->datnam);
760   if (f->dirct != NULL)
761    FREE(f->dirct);
762   if (f && f->s != NULL)
763    FREE(f->s);
764  }
765  (cn->mxedt)--;
766  cn->curedt = cn->edt[cn->mxedt];
767  e_close_view(f->pic, 1);
768  if (f != f0 && f != NULL)
769  {
770   e_free_find(&f->fd);
771   FREE(f);
772  }
773  if (cn->mxedt > 0)
774  {
775   f = cn->f[cn->mxedt];
776   e_ed_rahmen(f, 1);
777  }
778  return(c);
779 }
780 
781 /*    Toggle among windows  */
e_rep_win_tree(ECNT * cn)782 int e_rep_win_tree(ECNT *cn)
783 {
784  int i;
785 
786  if (cn->mxedt <= 0) return(0);
787  ini_repaint(cn);
788  for ( i = 1; i < cn->mxedt; i++)
789  {
790   e_firstl(cn->f[i], 0);
791   e_schirm(cn->f[i], 0);
792  }
793  e_firstl(cn->f[i], 1);
794  e_schirm(cn->f[i], 1);
795  e_cursor(cn->f[i], 1);
796  end_repaint();
797  return(0);
798 }
799 
e_switch_window(int num,FENSTER * f)800 void e_switch_window(int num, FENSTER *f)
801 {
802  ECNT *cn = f->ed;
803  FENSTER *ft;
804  int n, i, te;
805 
806  for (n = 1; cn->edt[n] != num && n < cn->mxedt; n++)
807   ;
808  if (n >= cn->mxedt) return;
809  for (i = cn->mxedt; i >= 1; i--)
810  {
811   FREE(cn->f[i]->pic->p);
812   FREE(cn->f[i]->pic);
813  }
814  ft = cn->f[n];
815  te = cn->edt[n];
816  for ( i = n; i < cn->mxedt; i++)
817  {
818   cn->edt[i] = cn->edt[i+1];
819   cn->f[i] = cn->f[i+1];
820  }
821  cn->f[i] = ft;
822  cn->edt[i] = te;
823  cn->curedt = num;
824  e_rep_win_tree(cn);
825 }
826 
827 /*    zoom windows   */
e_ed_zoom(FENSTER * f)828 int e_ed_zoom(FENSTER *f)
829 {
830  if (f->ed->mxedt > 0)
831  {
832   if(f->zoom == 0)
833   {
834    f->sa = e_set_pnt(f->a.x, f->a.y);
835    f->se = e_set_pnt(f->e.x, f->e.y);
836    f->a = e_set_pnt(0, 1);
837    f->e = e_set_pnt(MAXSCOL-1, MAXSLNS-2);
838    f->zoom = 1;
839   }
840   else
841   {
842    f->a = e_set_pnt(f->sa.x, f->sa.y);
843    f->e = e_set_pnt(f->se.x, f->se.y);
844    f->zoom = 0;
845   }
846   f->pic = e_ed_kst(f, f->pic, 1);
847   if(f->pic == NULL)  e_error(e_msg[ERR_LOWMEM], 1, f->fb);
848   e_cursor(f, 1);
849   e_schirm(f, 1);
850  }
851  return(WPE_ESC);
852 }
853 
854 /*   cascade windows   */
e_ed_cascade(FENSTER * f)855 int e_ed_cascade(FENSTER *f)
856 {
857  ECNT *cn = f->ed;
858  int i;
859 
860  if (cn->mxedt < 1)
861   return 0; /* no windows open */
862  for (i = cn->mxedt; i >= 1; i--)
863  {
864   FREE(cn->f[i]->pic->p);
865   FREE(cn->f[i]->pic);
866   cn->f[i]->a = e_set_pnt(i-1, i);
867   cn->f[i]->e = e_set_pnt(MAXSCOL-1-cn->mxedt+i, MAXSLNS-2-cn->mxedt+i);
868  }
869  ini_repaint(cn);
870  for ( i = 1; i < cn->mxedt; i++)
871  {
872   e_firstl(cn->f[i], 0);
873   e_schirm(cn->f[i], 0);
874  }
875  e_firstl(cn->f[i], 1);
876  e_schirm(cn->f[i], 1);
877  e_cursor(cn->f[i], 1);
878  end_repaint();
879  return(0);
880 }
881 
882 /*   Tile windows   */
e_ed_tile(FENSTER * f)883 int e_ed_tile(FENSTER *f)
884 {
885  ECNT *cn = f->ed;
886  POINT atmp[MAXEDT+1];
887  POINT etmp[MAXEDT+1];
888  int i, j, ni, nj;
889  int editwin = 0; /* number of editor windows */
890  int editorwin[MAXEDT + 1];
891  int maxlines = MAXSLNS;
892 
893  for (i = cn->mxedt; i >= 1; i--)
894  {
895   if ((!(cn->edopt & ED_OLD_TILE_METHOD)) && (!DTMD_ISTEXT(cn->f[i]->dtmd) ||
896     ((WpeIsProg()) && ((strcmp(cn->f[i]->datnam, "Messages") == 0) ||
897     (strcmp(cn->f[i]->datnam, "Watches") == 0)))))
898   {
899    editorwin[i] = 0;
900   }
901   else
902   {
903    editwin++;
904    editorwin[i] = 1;
905   }
906  }
907  if (editwin < 1)
908   return(0);
909  if ((!(cn->edopt & ED_OLD_TILE_METHOD)) && (WpeIsProg()))
910  {
911   maxlines -= MAXSLNS / 3 - 1;
912  }
913  for (i = cn->mxedt; i >= 1; i--)
914  {
915   FREE(cn->f[i]->pic->p);
916   FREE(cn->f[i]->pic);
917  }
918  for (ni = editwin, nj = 1; ni > 1; ni--)
919  {
920   nj = editwin / ni;
921   if (editwin % ni)
922    nj++;
923   if (nj >= ni)
924    break;
925  }
926  if (nj*ni < editwin)
927   nj++;
928  for (j = 0; j < nj; j++)
929  {
930   for (i = 0; i < ni; i++)
931   {
932    if (j == 0)
933    {
934     if (i == 0)
935     {
936      atmp[j*ni+i].x = i * MAXSCOL / ni;
937      etmp[j*ni+i].x = (i + 1) * MAXSCOL / ni - 1;
938      if (etmp[j*ni+i].x - atmp[j*ni+i].x < 26)
939       etmp[j*ni+i].x = atmp[j*ni+i].x + 26;
940     }
941     else
942     {
943      etmp[j*ni+i].x = (i + 1) * MAXSCOL / ni - 1;
944      atmp[j*ni+i].x = etmp[j*ni+i-1].x + 1;
945      if (etmp[j*ni+i].x - atmp[j*ni+i].x < 26)
946       etmp[j*ni+i].x = atmp[j*ni+i].x + 26;
947      if (etmp[j*ni+i].x >= MAXSCOL)
948      {
949       etmp[j*ni+i].x = MAXSCOL - 1;
950       atmp[j*ni+i].x = etmp[j*ni+i].x - 26;
951      }
952     }
953    }
954    else
955    {
956     atmp[j*ni+i].x = atmp[(j-1)*ni+i].x;
957     etmp[j*ni+i].x = etmp[(j-1)*ni+i].x;
958     /* make the last window full width */
959     if ((j * ni + i) == (editwin - 1))
960      etmp[j * ni + i].x = MAXSCOL - 1;
961    }
962   }
963  }
964  for (i = 0; i < ni; i++)
965  {
966   for (j = 0; j < nj; j++)
967   {
968    if (i == 0)
969    {
970     if (j == 0)
971     {
972      atmp[j*ni+i].y = j * (maxlines-2) / nj + 1;
973      etmp[j*ni+i].y = (j + 1) * (maxlines-2) / nj;
974      if (etmp[j*ni+i].y - atmp[j*ni+i].y < 3)
975       etmp[j*ni+i].y = atmp[j*ni+i].y + 3;
976     }
977     else
978     {
979      etmp[j*ni+i].y = (j + 1) * (maxlines-2) / nj;
980      atmp[j*ni+i].y = etmp[(j-1)*ni+i].y + 1;
981      if (etmp[j*ni+i].y - atmp[j*ni+i].y < 3)
982       etmp[j*ni+i].y = atmp[j*ni+i].y + 3;
983      if (etmp[j*ni+i].y > maxlines - 2)
984      {
985       etmp[j*ni+i].y = maxlines - 2;
986       atmp[j*ni+i].y = etmp[j*ni+i].y - 3;
987      }
988     }
989    }
990    else
991    {
992     atmp[j*ni+i].y = atmp[j*ni+i-1].y;
993     etmp[j*ni+i].y = etmp[j*ni+i-1].y;
994    }
995   }
996  }
997  for (i = 0, j = 1; i < editwin; i++, j++)
998  {
999   while (!editorwin[j]) j++;
1000   cn->f[j]->a = e_set_pnt(atmp[i].x, atmp[i].y);
1001   cn->f[j]->e = e_set_pnt(etmp[i].x, etmp[i].y);
1002   cn->f[j]->zoom = 0; /* Make sure zoom is off */
1003  }
1004  ini_repaint(cn);
1005  for ( i = 1; i < cn->mxedt; i++)
1006  {
1007   e_firstl(cn->f[i], 0);
1008   e_schirm(cn->f[i], 0);
1009  }
1010  e_firstl(cn->f[i], 1);
1011  e_schirm(cn->f[i], 1);
1012  e_cursor(cn->f[i], 1);
1013  end_repaint();
1014  return(0);
1015 }
1016 
1017 /*   call next window   */
e_ed_next(FENSTER * f)1018 int e_ed_next(FENSTER *f)
1019 {
1020  if (f->ed->mxedt > 0) e_switch_window(f->ed->edt[1], f);
1021  return(0);
1022 }
1023 
1024 /*   write a line (screen content)     */
e_pr_line(int y,FENSTER * f)1025 void e_pr_line(int y, FENSTER *f)
1026 {
1027  BUFFER *b = f->b;
1028  SCHIRM *s = f->s;
1029  int i, j, k, frb;
1030 #ifdef DEBUGGER
1031  int fsw = 0;
1032 #endif
1033 
1034  for (i = j = 0; j < NUM_COLS_OFF_SCREEN_LEFT; j++, i++)
1035  {
1036   if (*(b->bf[y].s + i) == WPE_TAB)
1037    j += (f->ed->tabn - j % f->ed->tabn - 1);
1038   else if(((unsigned char) *(b->bf[y].s + i)) > 126)
1039   {
1040    j++;
1041    if (((unsigned char) *(b->bf[y].s + i)) < 128 + ' ')
1042     j++;
1043   }
1044   else if (*(b->bf[y].s + i) < ' ') j++;
1045  }
1046  if (j > NUM_COLS_OFF_SCREEN_LEFT) i--;
1047 #ifdef DEBUGGER
1048  for (j = 1; j <= s->brp[0]; j++)
1049   if (s->brp[j] == y) {  fsw = 1;  break;  }
1050  for (j = NUM_COLS_OFF_SCREEN_LEFT; i < b->bf[y].len && j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1051  {
1052   if (y == s->da.y && i >= s->da.x && i < s->de.x )
1053    frb = s->fb->dy.fb;
1054   else if (fsw) frb = s->fb->db.fb;
1055 /*	else if( (i == s->pt[0].x && y == s->pt[0].y) || (i == s->pt[1].x && y == s->pt[1].y)  */
1056   else if (y == s->fa.y && i >= s->fa.x && i < s->fe.x )
1057    frb = s->fb->ek.fb;
1058 #else
1059  for (j = NUM_COLS_OFF_SCREEN_LEFT; i < b->bf[y].len && j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1060  {
1061   if (y == s->fa.y && i >= s->fa.x && i < s->fe.x )
1062    frb = s->fb->ek.fb;
1063 #endif
1064 /*	if( (i == s->pt[0].x && y == s->pt[0].y) || (i == s->pt[1].x && y == s->pt[1].y)
1065          || (i == s->pt[2].x && y == s->pt[2].y) || (i == s->pt[3].x && y == s->pt[3].y)
1066          || (i == s->pt[4].x && y == s->pt[4].y) || (i == s->pt[5].x && y == s->pt[5].y)
1067          || (i == s->pt[6].x && y == s->pt[6].y) || (i == s->pt[7].x && y == s->pt[7].y)
1068          || (i == s->pt[8].x && y == s->pt[8].y) || (i == s->pt[9].x && y == s->pt[9].y))
1069             frb = s->fb->ek.fb;
1070 */
1071   else if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
1072     (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
1073     (y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
1074     (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
1075    frb = s->fb->ez.fb;
1076   else
1077    frb = s->fb->et.fb;
1078 
1079   if (f->dtmd == DTMD_HELP)
1080   {
1081    if (*(b->bf[y].s + i) == HBG || *(b->bf[y].s + i) == HFB ||
1082      *(b->bf[y].s + i) == HHD || *(b->bf[y].s + i) == HBB)
1083    {
1084     if (*(b->bf[y].s + i) == HHD) frb = s->fb->hh.fb;
1085     else if(*(b->bf[y].s + i) == HBB) frb = s->fb->hm.fb;
1086     else frb = s->fb->hb.fb;
1087 #ifdef NEWSTYLE
1088     if (*(b->bf[y].s + i) != HBB) k = j;
1089     else k = -1;
1090 #endif
1091     for (i++; b->bf[y].s[i] != HED && i < b->bf[y].len &&
1092       j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1093      e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1094        y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), frb);
1095     j--;
1096 #ifdef NEWSTYLE
1097     if (WpeIsXwin() && k >= 0)
1098      e_make_xrect(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + k + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1099        f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, 0);
1100 #endif
1101     continue;
1102    }
1103    else if (*(b->bf[y].s + i) == HFE)
1104    {
1105     for (; j < COL_NUM_ON_SCREEN_RIGHT; j++)
1106      e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1107        ' ', s->fb->hh.fb);
1108     return;
1109    }
1110    else if (*(b->bf[y].s + i) == HNF)
1111    {
1112     for (k = j, i++; b->bf[y].s[i] != ':' && i < b->bf[y].len &&
1113       j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1114      e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1115        y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), s->fb->hb.fb);
1116 #ifdef NEWSTYLE
1117     if (WpeIsXwin())
1118      e_make_xrect(f->a.x-NUM_COLS_OFF_SCREEN_LEFT+k+1, y-NUM_LINES_OFF_SCREEN_TOP+f->a.y+1,
1119        f->a.x-NUM_COLS_OFF_SCREEN_LEFT+j, y-NUM_LINES_OFF_SCREEN_TOP+f->a.y+1, 0);
1120 #endif
1121     for (; b->bf[y].s[i] != HED && i < b->bf[y].len &&
1122       j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1123      e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1124        y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, *(b->bf[y].s + i), frb);
1125     for (i++; b->bf[y].s[i] != HED && i < b->bf[y].len &&
1126       j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1127      e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1128        y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
1129     for (; b->bf[y].s[i] != '.' && i < b->bf[y].len &&
1130       j < COL_NUM_ON_SCREEN_RIGHT; i++, j++)
1131      e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1,
1132        y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1, ' ', frb);
1133     j--;
1134     continue;
1135    }
1136    else if (*(b->bf[y].s + i) == HED) {  j--;  continue;  }
1137   }
1138   if (*(b->bf[y].s + i) == WPE_TAB)
1139    for (k = f->ed->tabn - j % f->ed->tabn; k > 1 &&
1140      j < NUM_COLS_ON_SCREEN + NUM_COLS_OFF_SCREEN_LEFT - 2; k--, j++)
1141     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1142       ' ', frb);
1143   else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126)
1144   {
1145    e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1146      '@', frb);
1147    if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
1148    if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ' &&
1149      j < COL_NUM_ON_SCREEN_RIGHT)
1150    {
1151     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1152       '^', frb);
1153     if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
1154    }
1155   }
1156   else if (*(b->bf[y].s + i) < ' ')
1157   {
1158    e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j +1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1159      '^', frb);
1160    if (++j >= COL_NUM_ON_SCREEN_RIGHT) return;
1161   }
1162   if (*(b->bf[y].s + i) == WPE_TAB)
1163    e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,                  ' ', frb);
1164   else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126 &&
1165     j < COL_NUM_ON_SCREEN_RIGHT)
1166   {
1167    if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ')
1168     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1169       ((unsigned char) *(b->bf[y].s + i)) + 'A' - 129, frb);
1170    else
1171     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1172       ((unsigned char) *(b->bf[y].s + i)) - 128, frb);
1173   }
1174   else if (*(b->bf[y].s + i) < ' ' && j < COL_NUM_ON_SCREEN_RIGHT)
1175    e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1176      *(b->bf[y].s + i) + 'A' - 1, frb);
1177   else
1178    e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1179      *(b->bf[y].s + i), frb);
1180  }
1181 
1182  if ((i == b->bf[y].len) && (f->ed->edopt & ED_SHOW_ENDMARKS) &&
1183    (DTMD_ISMARKABLE(f->dtmd)) && (j < COL_NUM_ON_SCREEN_RIGHT))
1184  {
1185   if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
1186     (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
1187     (y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
1188     (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
1189   {
1190    if (*(b->bf[y].s + i) == WPE_WR)
1191     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1192       PWR, s->fb->ez.fb);
1193    else
1194     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1195       PNL, s->fb->ez.fb);
1196   }
1197   else
1198   {
1199    if (*(b->bf[y].s + i) == WPE_WR)
1200     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1201       PWR, s->fb->et.fb);
1202    else
1203     e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1204       PNL, s->fb->et.fb);
1205   }
1206   j++;
1207  }
1208 
1209  for (; j < COL_NUM_ON_SCREEN_RIGHT; j++)
1210   e_pr_char(f->a.x - NUM_COLS_OFF_SCREEN_LEFT + j + 1, y - NUM_LINES_OFF_SCREEN_TOP + f->a.y + 1,
1211     ' ', s->fb->et.fb);
1212 }
1213 
1214 /*   draw standard-box frame  */
1215 void e_std_rahmen(int xa, int ya, int xe, int ye, char *name, int sw, int frb,
1216   int fes)
1217 {
1218  int i;
1219  char rhm[2][6];
1220  char *short_name;
1221 
1222  rhm[0][0] = RE1; rhm[0][1] = RE2; rhm[0][2] = RE3; rhm[0][3] = RE4;
1223  rhm[0][4] = RE5; rhm[0][5] = RE6; rhm[1][0] = RD1; rhm[1][1] = RD2;
1224  rhm[1][2] = RD3; rhm[1][3] = RD4; rhm[1][4] = RD5; rhm[1][5] = RD6;
1225  for (i = xa + 1; i < xe; i++)
1226  {
1227   e_pr_char(i, ya, rhm[sw][4], frb);
1228   e_pr_char(i, ye, rhm[sw][4], frb);
1229  }
1230  for (i = ya + 1; i < ye; i++)
1231  {
1232   e_pr_char(xa, i, rhm[sw][5], frb);
1233   e_pr_char(xe, i, rhm[sw][5], frb);
1234  }
1235  e_pr_char(xa, ya, rhm[sw][0], frb);
1236  e_pr_char(xa, ye, rhm[sw][2], frb);
1237  e_pr_char(xe, ya, rhm[sw][1], frb);
1238  e_pr_char(xe, ye, rhm[sw][3], frb);
1239 
1240  if (name)
1241  {
1242   if (strlen(name) < xe - xa - 14)
1243    e_pr_str((xa+xe-strlen(name))/2, ya, name, frb, 0, 0, 0, 0);
1244   else
1245   {
1246    short_name = strdup(name);
1247    strcpy(short_name + xe - xa - 17, "...");
1248    e_pr_str(xa + 7, ya, short_name, frb, 0, 0, 0, 0);
1249    free(short_name);
1250   }
1251  }
1252  if (sw != 0)
1253  {
1254   e_pr_char(xa+3, ya, WBT, fes);
1255 #ifdef NEWSTYLE
1256   if (!WpeIsXwin())
1257 #endif
1258   {
1259    e_pr_char(xa+2, ya, '[', frb);
1260    e_pr_char(xa+4, ya, ']', frb);
1261   }
1262 #ifdef NEWSTYLE
1263   else e_make_xrect(xa+2, ya, xa+4, ya, 0);
1264  }
1265  if (WpeIsXwin()) e_make_xr_rahmen(xa, ya, xe, ye, sw);
1266 #else
1267  }
1268 /*
1269    if(xe < MAXSCOL-1) for(i = ya+1; i <= ye; i++) e_pt_col(xe+1, i, SHDCOL);
1270    if(ye < MAXSLNS-2) for(i = xa+1; i <= xe+1 && i < MAXSCOL; i++)
1271 						e_pt_col(i, ye+1, SHDCOL);
1272 */
1273 #endif
1274 }
1275 
e_add_df(char * str,struct dirfile * df)1276 struct dirfile *e_add_df(char *str, struct dirfile *df)
1277 {
1278    int i, n;
1279    char *tmp;
1280 
1281    if (df == NULL)
1282    {  df = MALLOC(sizeof(struct dirfile));
1283       df->anz = 0;
1284       df->name = MALLOC(sizeof(char*));
1285    }
1286    for(n = 0; n < df->anz && *df->name[n] && strcmp(df->name[n], str); n++);
1287    if(n == df->anz)
1288    {  if(df->anz == MAXSVSTR - 1) FREE(df->name[df->anz-1]);
1289       else
1290       {  df->anz++;
1291 	 df->name = REALLOC(df->name, df->anz * sizeof(char*));
1292       }
1293       for(i = df->anz-1; i > 0; i--) df->name[i] = df->name[i-1];
1294       df->name[0] = MALLOC((strlen(str)+1) * sizeof(char));
1295       strcpy(df->name[0], str);
1296    }
1297    else
1298    {  tmp = df->name[n];
1299       for(i = n; i > 0; i--) df->name[i] = df->name[i-1];
1300       if(!tmp[0])
1301       {  FREE(tmp);
1302 	 df->name[0] = MALLOC((strlen(str) + 1) * sizeof(char));
1303 	 strcpy(df->name[0], str);
1304       }
1305       else df->name[0] = tmp;
1306    }
1307    return(df);
1308 }
1309 
e_sv_window(int xa,int ya,int * n,struct dirfile * df,FENSTER * f)1310 int e_sv_window(int xa, int ya, int *n, struct dirfile *df, FENSTER *f)
1311 {
1312  ECNT *cn = f->ed;
1313  int ret, ye = ya + 6;
1314  int xe = xa +21;
1315  FLWND *fw = MALLOC(sizeof(FLWND));
1316 
1317  if ((f = (FENSTER *) MALLOC(sizeof(FENSTER))) == NULL)
1318   e_error(e_msg[ERR_LOWMEM], 1, cn->fb);
1319  if (xe > MAXSCOL-3) {  xe = MAXSCOL - 3;  xa = xe - 21;  }
1320  if (ye > MAXSLNS-3) {  ye = MAXSLNS - 3;  ya = ye - 6;  }
1321  f->fb = cn->fb;
1322  f->a = e_set_pnt(xa, ya);
1323  f->e = e_set_pnt(xe, ye);
1324  f->dtmd = DTMD_FILEDROPDOWN;
1325  f->zoom = 0;
1326  f->ed = cn;
1327  f->c_sw = NULL;
1328  f->c_st = NULL;
1329  f->fd.dirct = NULL;
1330  f->winnum = -1;
1331  f->datnam = "";
1332  if (!(f->pic = e_ed_kst(f, NULL, 1)))
1333  {  e_error(e_msg[ERR_LOWMEM], 0, f->fb);  return(0);  }
1334  f->b = (BUFFER *)fw;
1335  fw->mxa = xa; fw->mxe = xe; fw->mya = ya; fw->mye = ye;
1336  fw->xa = xa+1; fw->xe = xe; fw->ya = ya+1; fw->ye = ye;
1337  fw->df = df; fw->srcha = 0; fw->f = f;
1338  fw->nf = fw->ia = fw->ja = 0;
1339  do
1340  {
1341   ret = e_file_window(0, fw, f->fb->er.fb, f->fb->ez.fb);
1342 #if MOUSE
1343   if (ret < 0) ret = e_rahmen_mouse(f);
1344 #endif
1345   if ((ret == AF2 && !(f->ed->edopt & ED_CUA_STYLE)) ||
1346     (f->ed->edopt & ED_CUA_STYLE && ret == CtrlL))
1347    e_size_move(f);
1348  } while(ret != WPE_CR && ret != WPE_ESC);
1349  *n = fw->nf;
1350  e_close_view(f->pic, 1);
1351  FREE(fw);
1352  FREE(f);
1353  return(ret);
1354 }
1355 
e_schr_lst_wsv(char * str,int xa,int ya,int n,int len,int ft,int fz,struct dirfile ** df,FENSTER * f)1356 int e_schr_lst_wsv(char *str, int xa, int ya, int n, int len, int ft,
1357   int fz, struct dirfile **df, FENSTER *f)
1358 {
1359 #if MOUSE
1360    extern struct mouse e_mouse;
1361 #endif
1362    int ret, num;
1363    do
1364    {  *df = e_add_df(str, *df);
1365 #ifndef NEWSTYLE
1366       ret = e_schreib_leiste(str, xa, ya, n-4, len, ft, fz);
1367 #else
1368       ret = e_schreib_leiste(str, xa, ya, n-3, len, ft, fz);
1369 #endif
1370 #if MOUSE
1371       if(ret < 0 && e_mouse.y == ya && e_mouse.x >= xa+n-3
1372 				&& e_mouse.x <= xa+n-1) ret = CDO;
1373 #endif
1374       if (ret == CDO && e_sv_window(xa+n, ya, &num, *df, f) == WPE_CR)
1375           strcpy(str, (*df)->name[num]);
1376    }  while(ret == CDO);
1377    return(ret);
1378 }
1379 
e_schr_nchar_wsv(char * str,int x,int y,int n,int max,int col,int csw)1380 int e_schr_nchar_wsv(char *str, int x, int y, int n, int max, int col,
1381   int csw)
1382 #ifdef NEWSTYLE
1383 {
1384  e_pr_char(x+max-3, y, ' ', csw);
1385  e_pr_char(x+max-2, y, WSW, csw);
1386  e_pr_char(x+max-1, y, ' ', csw);
1387  e_make_xrect(x+max-3, y, x+max-1, y, 0);
1388  return(e_schr_nchar(str, x, y, n, max-3, col));
1389 }
1390 #else
1391 {
1392 #if !defined(NO_XWINDOWS)
1393  int swcol = (e_gt_col(x+max, y) / 16) * 16;
1394  if (WpeIsXwin())
1395  {
1396   e_pr_char(x+max, y, SCR, swcol);
1397   e_pr_char(x+max, y+1, SCD, swcol);
1398   e_pr_char(x+max-1, y+1, SCD, swcol);
1399   e_pr_char(x+max-2, y+1, SCD, swcol);
1400  }
1401 #endif
1402  e_pr_char(x+max-3, y, ' ', csw);
1403  e_pr_char(x+max-2, y, WSW, csw);
1404  e_pr_char(x+max-1, y, ' ', csw);
1405  return(e_schr_nchar(str, x, y, n, max-4, col));
1406 }
1407 #endif
1408 
e_mess_win(char * header,char * str,PIC ** pic,FENSTER * f)1409 int e_mess_win(char *header, char *str, PIC **pic, FENSTER *f)
1410 {
1411  ECNT *cn = f->ed;
1412  extern int (*e_u_kbhit)(void);
1413 #if MOUSE
1414  extern struct mouse e_mouse;
1415 #endif
1416  int xa, ya, xe, ye, num, anz = 0, mxlen = 0, i, j;
1417  char **s;
1418 
1419  s = StringToStringArray(str, &mxlen, strlen(header) + 8, &anz);
1420 
1421  ya = (MAXSLNS - anz - 6)/2;
1422  ye = ya + anz + 5;
1423  xa = (MAXSCOL - mxlen - 6)/2;
1424  xe = xa + mxlen + 6;
1425  if (ya < 2) ya = 2;
1426  if (ye > MAXSLNS-3) ye = MAXSLNS - 3;
1427  num = anz;
1428  if (num > ye - ya - 5)
1429  {
1430   num = ye - ya - 5;
1431   strcpy(s[num-1], "...");
1432  }
1433 
1434  if (!(*pic) || (*pic)->e.x != xe || (*pic)->a.x != xa || (*pic)->e.x < xe)
1435  {
1436   *pic = e_change_pic(xa, ya, xe, ye, *pic, 1, cn->fb->nt.fb);
1437   for (i = xa + 1; i < xe; i++)
1438   {
1439    e_pr_char(i, ye-2, ' ', f->fb->nt.fb);
1440    e_pr_char(i, ye-1, ' ', f->fb->nt.fb);
1441   }
1442   e_pr_str((xe + xa - 6)/2, ye-2, "Ctrl C", cn->fb->nz.fb, -1, -1,
1443     cn->fb->ns.fb, cn->fb->nt.fb);
1444  }
1445  e_std_rahmen(xa, ya, xe, ye, header, 1, cn->fb->nr.fb, cn->fb->ne.fb);
1446  for (i = xa + 1; i < xe; i++)
1447   e_pr_char(i, ya+1, ' ', cn->fb->nr.fb);
1448  for (j = 0; j < num; j++)
1449  {
1450   e_pr_char(xa+1, ya+2+j, ' ', cn->fb->nt.fb);
1451   e_pr_char(xa+2, ya+2+j, ' ', cn->fb->nt.fb);
1452   e_pr_str(xa+3, ya+2+j, s[j], cn->fb->nt.fb, 0, 0, 0, 0);
1453   for (i = xa+strlen(s[j])+3; i < xe; i++)
1454    e_pr_char(i, ya+2+j, ' ', cn->fb->nt.fb);
1455  }
1456  for (j += ya+2; j < ye-2; j++)
1457   for (i = xa + 1; i < xe; i++)
1458    e_pr_char(i, j, ' ', cn->fb->nt.fb);
1459  for (i = 0; i < anz; i++)
1460   FREE(s[i]);
1461  FREE(s);
1462 #ifndef NO_XWINDOWS
1463  if (WpeIsXwin())
1464  {
1465   while ((i = (*e_u_kbhit)()))
1466   {
1467    if (i == -1 && e_mouse.y == ye-2 && e_mouse.x > (xe + xa - 10)/2 &&
1468      e_mouse.x < (xe + xa + 6)/2 )
1469     i = CtrlC;
1470    if (i == CtrlC) break;
1471   }
1472  }
1473  else
1474 #endif
1475   while ((i = (*e_u_kbhit)()) && i != CtrlC)
1476    ;
1477  return(i == CtrlC ? 1 : 0);
1478 }
1479 
e_opt_sec_box(int xa,int ya,int num,OPTK * opt,FENSTER * f,int sw)1480 int e_opt_sec_box(int xa, int ya, int num, OPTK *opt, FENSTER *f, int sw)
1481 {
1482    PIC *pic;
1483    int n, nold, max = 0, i, c = 0, xe, ye = ya + num + 1;
1484    for(i = 0; i < num; i++)
1485    if((n = strlen(opt[i].t)) > max) max = n;
1486    xe = xa + max + 3;
1487    pic = e_std_kst(xa, ya, xe, ye, NULL, sw, f->fb->nr.fb, f->fb->nt.fb, f->fb->ne.fb);
1488    if(pic == NULL)  {  e_error(e_msg[ERR_LOWMEM], 0, f->fb); return(-2);  }
1489    for (i = 0; i < num; i++)
1490    e_pr_str_wsd(xa+2, ya+i+1, opt[i].t, f->fb->mt.fb, opt[i].x,
1491 		1, f->fb->ms.fb, xa+1, xe-1);
1492 #if  MOUSE
1493    while (e_mshit() != 0);
1494 #endif
1495    n = 0; nold = 1;
1496    while (c != WPE_ESC && c != WPE_CR)
1497    {  if (nold != n)
1498       {  e_pr_str_wsd(xa+2, nold+ya+1, opt[nold].t, f->fb->mt.fb,
1499 				opt[nold].x, 1, f->fb->ms.fb, xa+1, xe-1);
1500 	 e_pr_str_wsd(xa+2, n+ya+1, opt[n].t, f->fb->mz.fb,
1501 				opt[n].x, 1, f->fb->mz.fb, xa+1, xe-1);
1502 	 nold = n;
1503       }
1504 #if  MOUSE
1505       if( (c = e_toupper(e_getch())) == -1)
1506       c = e_m2_mouse(xa, ya, xe, ye, opt);
1507 #else
1508       c = e_toupper(e_getch());
1509 #endif
1510       for (i = 0; i < ye - ya - 1; i++)
1511       if( c == opt[i].o) {  c = WPE_CR;  n = i;  break;  }
1512       if (i > ye - ya) c = WPE_ESC;
1513       else if ( c == CUP || c == CtrlP ) n = n > 0 ? n-1 : ye - ya - 2 ;
1514       else if ( c == CDO || c == CtrlN ) n = n < ye-ya-2 ? n+1 : 0 ;
1515       else if ( c == POS1 || c == CtrlA ) n = 0;
1516       else if ( c == ENDE || c == CtrlE ) n = ye-ya-2;
1517    }
1518    if(sw == 1) e_close_view(pic, 1);
1519    return(c == WPE_ESC ? -1 : n);
1520 }
1521 
e_make_win_list(FENSTER * f)1522 struct dirfile *e_make_win_list(FENSTER *f)
1523 {
1524  int i;
1525  struct dirfile *df;
1526 
1527  if (!(df = MALLOC(sizeof(struct dirfile)))) return(NULL);
1528  df->anz = f->ed->mxedt;
1529  if (!(df->name = MALLOC(df->anz * sizeof(char *))))
1530  {
1531   FREE(df);
1532   return(NULL);
1533  }
1534  for (i = 0; i < df->anz; i++)
1535  {
1536   if (f->ed->f[df->anz-i]->datnam)
1537   {
1538    if (!(df->name[i] =
1539      MALLOC((strlen(f->ed->f[df->anz-i]->datnam)+1) * sizeof(char))))
1540    {
1541     df->anz = i;
1542     freedf(df);
1543     return(NULL);
1544    }
1545    else strcpy(df->name[i], f->ed->f[df->anz-i]->datnam);
1546   }
1547   else
1548   {
1549    if (!(df->name[i] = MALLOC(sizeof(char))))
1550    {
1551     df->anz = i;
1552     freedf(df);
1553     return(NULL);
1554    }
1555    else *df->name[i] = '\0';
1556   }
1557  }
1558  return(df);
1559 }
1560 
e_list_all_win(FENSTER * f)1561 int e_list_all_win(FENSTER *f)
1562 {
1563  int i;
1564 
1565  for (i = f->ed->mxedt; i > 0; i--)
1566   if (f->ed->f[i]->dtmd == DTMD_DATA && f->ed->f[i]->ins == 7)
1567   {
1568    e_switch_window(f->ed->edt[i], f);
1569    return(0);
1570   }
1571  return(e_data_first(7, f->ed, NULL));
1572 }
1573 
1574 #ifdef NEWSTYLE
e_get_pic_xrect(int xa,int ya,int xe,int ye,PIC * pic)1575 int e_get_pic_xrect(int xa, int ya, int xe, int ye, PIC *pic)
1576 {
1577  int i = xa, j, ebbg;
1578 
1579  ebbg = (xe - xa + 1) * 2 * (ye - ya + 1);
1580  for (j = ya; j <= ye; ++j)
1581   for (i = xa; i <= xe; ++i)
1582    *( pic->p + ebbg + (j-ya)*(xe-xa+1) + (i-xa) ) = extbyte[j*MAXSCOL + i];
1583  return(i);
1584 }
1585 
e_put_pic_xrect(PIC * pic)1586 int e_put_pic_xrect(PIC *pic)
1587 {
1588  int i = 0, j;
1589  int ebbg = (pic->e.x - pic->a.x + 1) * 2 * (pic->e.y - pic->a.y + 1);
1590 
1591  for (j = pic->a.y; j <= pic->e.y; ++j)
1592   for (i = pic->a.x; i <= pic->e.x; ++i)
1593    extbyte[j*MAXSCOL+i] =
1594      *(pic->p + ebbg + (j-pic->a.y)*(pic->e.x-pic->a.x+1) + (i-pic->a.x));
1595  return(i);
1596 }
1597 
e_make_xrect_abs(int xa,int ya,int xe,int ye,int sw)1598 int e_make_xrect_abs(int xa, int ya, int xe, int ye, int sw)
1599 {
1600  int j;
1601 
1602  for (j = xa; j <= xe; j++)
1603   *(extbyte+ya*MAXSCOL+j) = *(extbyte+ye*MAXSCOL+j) = 0;
1604  for (j = ya; j <= ye; j++)
1605   *(extbyte+j*MAXSCOL+xa) = *(extbyte+j*MAXSCOL+xe) = 0;
1606  return(e_make_xrect(xa, ya, xe, ye, sw));
1607 }
1608 
e_make_xrect(int xa,int ya,int xe,int ye,int sw)1609 int e_make_xrect(int xa, int ya, int xe, int ye, int sw)
1610 {
1611  int j;
1612 
1613  if (sw & 2)
1614  {
1615   sw = (sw & 1) ? 16 : 0;
1616   for (j = xa+1; j < xe; j++)
1617   {
1618    *(extbyte+ya*MAXSCOL+j) |= (sw | 4);
1619    *(extbyte+ye*MAXSCOL+j) |= (sw | 1);
1620   }
1621   for (j = ya+1; j < ye; j++)
1622   {
1623    *(extbyte+j*MAXSCOL+xa) |= (sw | 2);
1624    *(extbyte+j*MAXSCOL+xe) |= (sw | 8);
1625   }
1626  }
1627  else
1628  {
1629   sw = (sw & 1) ? 16 : 0;
1630   for (j = xa; j <= xe; j++)
1631   {
1632    *(extbyte+ya*MAXSCOL+j) |= (sw | 1);
1633    *(extbyte+ye*MAXSCOL+j) |= (sw | 4);
1634   }
1635   for (j = ya; j <= ye; j++)
1636   {
1637    *(extbyte+j*MAXSCOL+xa) |= (sw | 8);
1638    *(extbyte+j*MAXSCOL+xe) |= (sw | 2);
1639   }
1640  }
1641  return(j);
1642 }
1643 
e_make_xr_rahmen(int xa,int ya,int xe,int ye,int sw)1644 int e_make_xr_rahmen(int xa, int ya, int xe, int ye, int sw)
1645 {
1646  if (!sw)
1647  {
1648   e_make_xrect(xa, ya, xe, ye, 0);
1649   e_make_xrect(xa, ya, xe, ye, 2);
1650  }
1651  else
1652  {
1653   e_make_xrect(xa+1, ya, xe-1, ya, 0);
1654   e_make_xrect(xa+1, ye, xe-1, ye, 0);
1655   e_make_xrect(xa, ya+1, xa, ye-1, 0);
1656   e_make_xrect(xe, ya+1, xe, ye-1, 0);
1657   e_make_xrect(xa, ya, xa, ya, 0);
1658   e_make_xrect(xe, ya, xe, ya, 0);
1659   e_make_xrect(xe, ye, xe, ye, 0);
1660   e_make_xrect(xa, ye, xa, ye, 0);
1661  }
1662  return(sw);
1663 }
1664 #endif
1665 
1666