1 /* we_progn.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 #include "WeExpArr.h"
10 
11 #undef TESTSDEF
12 
13 #ifdef PROG
14 #include "makro.h"
15 
16 extern struct dirfile *e_p_get_var(char *string);
17 extern char *e_p_msg[];
18 
19 #define FRB1 s->fb->cr.fb  /*  key words etc  */
20 #define FRB2 s->fb->ck.fb  /*  constants           */
21 #define FRB3 s->fb->cp.fb  /*  pre-processor A.     */
22 #define FRB4 s->fb->cc.fb  /*  comments           */
23 #define FRB5 s->fb->ct.fb  /*  text                 */
24 
25 #define iscase(s) ( (!strncmp(s, "case", 4) && !isalnum1(*(s+4)))	      \
26 		 || (!strncmp(s, "default", 7) && !isalnum1(*(s+7))) )
27 #define isstatus(s) ( !strncmp(s, "private:", 8) || !strncmp(s, "public:", 7) \
28                  || !strncmp(s, "protected:", 10) )
29 #define ispif(s) ( !strncmp(s, "#if", 3) || !strncmp(s, "#ifdef", 6)  \
30 			|| !strncmp(s, "#ifndef", 7) )
31 #define ispelse(s) ( !strncmp(s, "#else", 5) || !strncmp(s, "#elif", 5) )
32 #define ispendif(s) ( !strncmp(s, "#endif", 6) )
33 #define iscop(c) ( c == '<' || c == '>' || c == '+' || c == '-' ||    \
34 		   c == '/' || c == '*' || c == '%' || c == '=' ||    \
35 		   c == '|' || c == '&' || c == '!' || c == ':' ||    \
36 		   c == '?' || c == '.' )
37 
38 #define e_mk_col(str, l, n, frb, cs, n_nd, n_bg)			\
39 {									\
40  if (n < l)								\
41  {	 								\
42   if (n == cs->special_column) 						\
43   {	 								\
44    int ii;								\
45    for (ii = 0; cs->special_comment[ii] &&				\
46      cs->special_comment[ii] != toupper(str[n]); ii++)			\
47     ;	  								\
48    if (cs->special_comment[ii])						\
49     mcsw = 7;								\
50   }									\
51   if (mcsw == 6 && (isalnum(str[n]) || str[n] == '_'))			\
52    frb = FRB1;								\
53   else if(mcsw == 7) frb = FRB4;					\
54   else if(mcsw == 3 && (isalnum(str[n]) || str[n] == '.')) frb = FRB2;	\
55   else if(mcsw == 5)							\
56   {	 								\
57    if (str[n] == cs->begin_comment[0])					\
58    {	 								\
59     int jj;								\
60     for (jj = 1; cs->begin_comment[jj] &&				\
61       str[n+jj] == cs->begin_comment[jj]; jj++)				\
62      ;									\
63     if (!cs->begin_comment[jj]) 					\
64     {  mcsw = 4;  n_bg = n+jj-1;  frb = FRB4;  }			\
65    }									\
66    if (mcsw == 5 && str[n] == cs->line_comment[0])			\
67    {	 								\
68     int jj;								\
69     for (jj = 1; cs->line_comment[jj] &&				\
70       str[n+jj] == cs->line_comment[jj]; jj++);				\
71     if (!cs->line_comment[jj]) {  mcsw = 7;  frb = FRB4;  }		\
72    }									\
73    if (mcsw == 5) frb = FRB3;						\
74   }									\
75   else if (mcsw == 1)							\
76   {	 								\
77    if (str[n] == cs->string_constant && !bssw) mcsw = 0;		\
78    frb = FRB2;								\
79   }									\
80   else if (mcsw == 2)							\
81   {	 								\
82    if (str[n] == cs->char_constant && !bssw) mcsw = 0;			\
83    frb = FRB2;								\
84   }									\
85   else if (mcsw == 4)							\
86   {	 								\
87    if (n_nd < n-n_bg && str[n] == cs->end_comment[n_nd])		\
88    {	 								\
89     int jj;								\
90     for (jj = 1; jj <= n_nd && n-jj >= 0 &&				\
91       str[n-jj] == cs->end_comment[n_nd-jj]; jj++);			\
92     if (jj > n_nd) mcsw = svmsw;					\
93    }									\
94    frb = FRB4;								\
95   }									\
96   else									\
97   {									\
98    if (n >= cs->comment_column) {  mcsw = 7;  frb = FRB4;  }		\
99    else if (isdigit(str[n]))						\
100    {	 								\
101     if (n == 0 || (!isalnum(str[n-1]) && str[n-1] != '_'))		\
102     {  mcsw = 3;  frb = FRB2;  }					\
103     else frb = FRB5;							\
104    }									\
105    else if (isalpha(str[n]))						\
106    {	 								\
107     if(cs->insensitive && (n == 0 || (!isalnum(str[n-1]) &&		\
108       str[n-1] != '_')))						\
109     {	   								\
110      int ii, jj;							\
111      int kk = strlen(cs->line_comment);					\
112      if ((WpeStrnccmp(cs->line_comment, str + n, kk) == 0) &&		\
113        (!isalnum(str[n +kk])) && (str[n + kk] != '_'))			\
114      {			    						\
115       mcsw = 7;								\
116       frb = FRB4;							\
117      }		 							\
118      else								\
119      {									\
120       for (ii = 0; cs->reserved_word[ii] &&				\
121         cs->reserved_word[ii][0] < toupper(str[n]);  			\
122         ii++); 								\
123       for ( ; cs->reserved_word[ii] &&					\
124         cs->reserved_word[ii][0] == toupper(str[n]); 			\
125         ii++)								\
126       {									\
127        for (jj = 0; cs->reserved_word[ii][jj] &&			\
128          cs->reserved_word[ii][jj] == toupper(str[n+jj]);		\
129          jj++);								\
130        if (!cs->reserved_word[ii][jj] && !isalnum(str[n+jj]) &&		\
131          str[n+jj] != '_')						\
132        {  mcsw = 6;  frb = FRB1;  break;  }				\
133       }			    						\
134      }									\
135     }									\
136     else if (!cs->insensitive && (n == 0 || (!isalnum(str[n-1]) &&	\
137       str[n-1] != '_')))						\
138     {	   								\
139      int ii, jj;							\
140      int kk = strlen(cs->line_comment);					\
141      if ((strncmp(cs->line_comment, str + n, kk) == 0) &&		\
142        (!isalnum(str[n +kk])) && (str[n + kk] != '_'))			\
143      {			    						\
144       mcsw = 7;								\
145       frb = FRB4;							\
146      }		 							\
147      else								\
148      {									\
149       for (ii = 0; cs->reserved_word[ii] &&				\
150         cs->reserved_word[ii][0] < str[n]; ii++);			\
151       for( ; cs->reserved_word[ii] &&					\
152         cs->reserved_word[ii][0] == str[n]; ii++)			\
153       {	   								\
154        for (jj = 0; cs->reserved_word[ii][jj] &&			\
155          cs->reserved_word[ii][jj] == str[n+jj]; jj++);			\
156        if (!cs->reserved_word[ii][jj] && !isalnum(str[n+jj]) &&		\
157          str[n+jj] != '_')						\
158        {  mcsw = 6;  frb = FRB1;  break;  }				\
159       }			    						\
160      }									\
161     }									\
162     if (!mcsw) frb = FRB5;						\
163    }									\
164    else if (isspace(str[n]))						\
165    {  mcsw = 0;  frb = FRB5;  }						\
166    else 								\
167    {	 								\
168     if (str[n] == cs->string_constant)					\
169     {  mcsw = 1;  frb = FRB2;  }					\
170     else if (str[n] == cs->char_constant)				\
171     {  mcsw = 2;  frb = FRB2;  }					\
172     else if (str[n] == cs->preproc_cmd)					\
173     {  svmsw = mcsw = 5;  frb = FRB3;  }				\
174     else								\
175     {	 								\
176      mcsw = 0;								\
177      if (str[n] == cs->begin_comment[0])				\
178      {	 								\
179       int jj;								\
180       for(jj = 1; cs->begin_comment[jj] &&				\
181         str[n+jj] == cs->begin_comment[jj]; jj++);			\
182       if (!cs->begin_comment[jj]) 					\
183       {  mcsw = 4;  n_bg = n+jj-1;  frb = FRB4;  }			\
184      }									\
185      if (!mcsw && str[n] == cs->line_comment[0])			\
186      {	 								\
187       int jj;								\
188       for (jj = 1; cs->line_comment[jj] &&				\
189         str[n+jj] == cs->line_comment[jj]; jj++);			\
190       if (!cs->line_comment[jj]) {  mcsw = 7;  frb = FRB4; }		\
191      }									\
192      if (cs->long_operator && !mcsw)					\
193      {									\
194       if(cs->insensitive)						\
195       {									\
196        int ii, jj;							\
197        for (ii = 0; cs->long_operator[ii] &&				\
198          cs->long_operator[ii][0] < str[n]; ii++);			\
199        for ( ; cs->long_operator[ii] &&					\
200          cs->long_operator[ii][0] == str[n]; ii++)			\
201        {								\
202         for (jj = 0; cs->long_operator[ii][jj] &&			\
203           cs->long_operator[ii][jj] == toupper(str[n+jj]); jj++);	\
204         if (!cs->long_operator[ii][jj])		 			\
205         {  mcsw = 6;  frb = FRB1;  break;  }				\
206        }								\
207       }									\
208       else								\
209       {	 								\
210        int ii, jj;							\
211        for (ii = 0; cs->long_operator[ii] &&				\
212          cs->long_operator[ii][0] < str[n]; ii++);			\
213        for ( ; cs->long_operator[ii] &&					\
214          cs->long_operator[ii][0] == str[n]; ii++)			\
215        {								\
216         for (jj = 0; cs->long_operator[ii][jj] &&			\
217           cs->long_operator[ii][jj] == str[n+jj]; jj++);		\
218         if (!cs->long_operator[ii][jj])		 			\
219         {  mcsw = 6;  frb = FRB1;  break;  }				\
220        }								\
221       }									\
222      }									\
223      if (!mcsw)								\
224      {	 								\
225       int jj;								\
226       for (jj = 0; cs->single_operator[jj] &&				\
227         str[n] != cs->single_operator[jj]; jj++);			\
228       if (!cs->single_operator[jj]) frb = FRB5;				\
229       else frb = FRB1;							\
230      }									\
231     }									\
232    }									\
233   }									\
234   if (str[n] == cs->quoting_char) bssw = !bssw;				\
235   else bssw = 0;							\
236  }									\
237  else									\
238  {	 								\
239   if ((mcsw == 7) || (mcsw == 4)) frb = FRB4;				\
240   else if ((mcsw == 1) || (mcsw == 2)) frb = FRB2;			\
241   else if (mcsw == 5) frb = FRB3;					\
242   else									\
243    frb = FRB5;								\
244  }	   								\
245 }
246 
e_scfbol(int n,int mcsw,unsigned char * str,WpeSyntaxRule * cs)247 int e_scfbol(int n, int mcsw, unsigned char *str, WpeSyntaxRule *cs)
248 {
249  int bssw = 0, svmsw = 0, nla = 0, i, j;
250 
251  for (i = 0; i < n && isspace(str[i]); i++)
252   ;
253  if (mcsw == 5)
254   svmsw = 5;
255  else if (mcsw == 0 && str[i] == cs->preproc_cmd)
256  {
257   svmsw = mcsw = 5;
258   i++;
259  }
260  for (; i < n; i++)
261  {
262   if (i == cs->special_column)
263    return(0);
264   else if (mcsw == 4)
265   {
266    if (str[i] == cs->end_comment[0])
267    {
268     for (j = 1; cs->end_comment[j] && str[i+j] == cs->end_comment[j]; j++)
269      ;
270     if (!cs->end_comment[j])
271     {
272      i += (j-1);
273      mcsw = svmsw;
274     }
275    }
276   }
277   else if (mcsw == 1)
278   {
279    if (str[i] == cs->string_constant && !bssw)
280     mcsw = svmsw;
281   }
282   else if (str[i] == cs->string_constant && !bssw)
283    mcsw = 1;
284   else
285   {
286    if (str[i] == cs->line_comment[0])
287    {
288     for (j = 1; cs->line_comment[j] && str[i+j] == cs->line_comment[j]; j++)
289      ;
290     if (!cs->line_comment[j])
291      return(0);
292    }
293    if (str[i] == cs->begin_comment[0])
294    {
295     for (j = 1; cs->begin_comment[j] && str[i+j] == cs->begin_comment[j]; j++)
296      ;
297     if (!cs->begin_comment[j])
298      mcsw = 4;
299     i += (j-1);
300    }
301   }
302   if (str[i] == cs->quoting_char)
303    bssw = !bssw;
304   else
305    bssw = 0;
306  }
307  return ((mcsw == 4 || (bssw && n > 0 && str[n-1] == cs->continue_char) ||
308    nla ||  cs->continue_column >= 0 ) ? mcsw : 0);
309 }
310 
e_sc_all(FENSTER * f,int sw)311 int e_sc_all(FENSTER *f, int sw)
312 {
313  int i;
314 
315  if (!WpeIsProg() || !WpeIsXwin())
316   return(0);
317  if (!sw)
318  {
319   for (i = 0; i <= f->ed->mxedt; i++)
320   if (f->ed->f[i]->c_sw)
321   {
322    FREE(f->ed->f[i]->c_sw);
323    f->ed->f[i]->c_sw = NULL;
324   }
325  }
326  else
327  {
328   for (i = 0; i <= f->ed->mxedt; i++)
329   {
330    if (f->ed->f[i]->c_sw)
331     FREE(f->ed->f[i]->c_sw);
332    e_add_synt_tl(f->ed->f[i]->datnam, f->ed->f[i]);
333    if (f->ed->f[i]->c_st)
334    {
335     if (f->ed->f[i]->c_sw)
336      FREE(f->ed->f[i]->c_sw);
337     f->ed->f[i]->c_sw = e_sc_txt(NULL, f->ed->f[i]->b);
338    }
339   }
340  }
341  e_rep_win_tree(f->ed);
342  return(0);
343 }
344 
e_program_opt(FENSTER * f)345 int e_program_opt(FENSTER *f)
346 {
347  int ret, sw = f->ed->edopt & ED_SYNTAX_HIGHLIGHT ? 1 : 0;
348  W_OPTSTR *o = e_init_opt_kst(f);
349 
350  if (!o) return(-1);
351  o->xa = 17;  o->ya = 4;  o->xe = 59;  o->ye = 18;
352  o->bgsw = AltO;
353  o->name = "Programming-Options";
354  o->crsw = AltO;
355  e_add_txtstr(21, 2, "Screen:", o);
356  e_add_txtstr(4, 2, "Stop at", o);
357  e_add_sswstr(5, 3, 0, AltE, f->ed->edopt & ED_ERRORS_STOP_AT ? 1 : 0,
358    "Errors  ", o);
359  e_add_sswstr(5, 4, 0, AltM, f->ed->edopt & ED_MESSAGES_STOP_AT ? 1 : 0,
360    "Messages", o);
361  e_add_sswstr(22, 3, 0, AltD, f->ed->edopt & ED_SYNTAX_HIGHLIGHT ? 1 : 0,
362    "Diff. Colors", o);
363  e_add_wrstr(4, 6, 4, 7, 35, 128, 1, AltX, "EXecution-Directory:",
364    e_prog.exedir, NULL, o);
365  e_add_wrstr(4, 9, 4, 10, 35, 128, 0, AltS, "System-Include-Path:",
366    e_prog.sys_include, NULL, o);
367  e_add_bttstr(10, 12, 1, AltO, " Ok ", NULL, o);
368  e_add_bttstr(26, 12, -1, WPE_ESC, "Cancel", NULL, o);
369  ret = e_opt_kst(o);
370  if (ret != WPE_ESC)
371  {
372   if (e_prog.exedir)
373    FREE(e_prog.exedir);
374   e_prog.exedir = WpeStrdup(o->wstr[0]->txt);
375   if (e_prog.sys_include)
376    FREE(e_prog.sys_include);
377   e_prog.sys_include = WpeStrdup(o->wstr[1]->txt);
378   f->ed->edopt = (f->ed->edopt & ~ED_PROGRAMMING_OPTIONS) +
379     (o->sstr[0]->num ? ED_ERRORS_STOP_AT : 0) +
380     (o->sstr[1]->num ? ED_MESSAGES_STOP_AT : 0) +
381     (o->sstr[2]->num ? ED_SYNTAX_HIGHLIGHT : 0);
382   if (sw != o->sstr[2]->num)
383    e_sc_all(f, o->sstr[2]->num);
384  }
385  freeostr(o);
386  return(0);
387 }
388 
e_sc_nw_txt(int y,BUFFER * b,int sw)389 int e_sc_nw_txt(int y, BUFFER *b, int sw)
390 {
391  int i, out;
392 
393  if (sw < 0)
394  {
395   out = b->f->c_sw[y+1];
396   for (i = y+1; i < b->mxlines; i++)
397    b->f->c_sw[i] = b->f->c_sw[i+1];
398   if (out == b->f->c_sw[y])
399    return(0);
400  }
401  else if (sw > 0)
402   for (i = b->mxlines-1; i > y; i--)
403    b->f->c_sw[i] = b->f->c_sw[i-1];
404 
405  if (b->f->c_st->continue_column < 0)
406  {
407   for (i = y; i < b->mxlines-1; i++)
408   {
409    if ((out = e_scfbol(b->bf[i].len, b->f->c_sw[i], b->bf[i].s, b->f->c_st)) == b->f->c_sw[i+1])
410     break;
411    else
412     b->f->c_sw[i+1] = out;
413   }
414  }
415  else
416  {
417   if (y != 0) /* Quick fix to continue line check - Dennis */
418   {
419    b->f->c_sw[y] = isspace(b->bf[y].s[b->f->c_st->continue_column]) ? 0 :
420      e_scfbol(b->bf[y-1].len, b->f->c_sw[y-1], b->bf[y-1].s, b->f->c_st);
421    for (i = y; i < b->mxlines-1; i++)
422    {
423     out = isspace(b->bf[i+1].s[b->f->c_st->continue_column]) ? 0 :
424       e_scfbol(b->bf[i].len, b->f->c_sw[i], b->bf[i].s, b->f->c_st);
425     if (out == b->f->c_sw[i+1])
426      break;
427     else
428      b->f->c_sw[i+1] = out;
429    }
430   }
431  }
432  return(0);
433 }
434 
e_sc_txt(int * c_sw,BUFFER * b)435 int *e_sc_txt(int *c_sw, BUFFER *b)
436 {
437  int i;
438 
439  if (!c_sw)
440   c_sw = MALLOC(b->mx.y * sizeof(int));
441  c_sw[0] = 0;
442  if (b->f->c_st->continue_column < 0)
443  {
444   for (i = 0; i < b->mxlines-1; i++)
445    c_sw[i+1] = e_scfbol(b->bf[i].len, c_sw[i], b->bf[i].s, b->f->c_st);
446  }
447  else
448  {
449   for (i = 0; i < b->mxlines-1; i++)
450   {
451    c_sw[i+1] = isspace(b->bf[i+1].s[b->f->c_st->continue_column]) ? 0 :
452      e_scfbol(b->bf[i].len, c_sw[i], b->bf[i].s, b->f->c_st);
453   }
454  }
455  return(c_sw);
456 }
457 
458 /*       Writing of a line (content of a screen)      */
e_pr_c_line(int y,FENSTER * f)459 void e_pr_c_line(int y, FENSTER *f)
460 {
461  BUFFER *b = f->b;
462  SCHIRM *s = f->s;
463  int i, j, k, frb = 0;
464  int mcsw = f->c_sw[y], svmsw = f->c_sw[y] == 5 ? 5 : 0, bssw = 0;
465  int n_bg = -1, n_nd = strlen(f->c_st->end_comment)-1;
466 #ifdef DEBUGGER
467  int fsw = 0;
468 #endif
469 
470  for (i = j = 0; j < s->c.x; j++, i++)
471  {
472   if (*(b->bf[y].s + i) == WPE_TAB)
473    j += (f->ed->tabn - j % f->ed->tabn - 1);
474 #ifdef UNIX
475   else if (((unsigned char) *(b->bf[y].s + i)) > 126)
476   {
477    j++;
478    if (((unsigned char) *(b->bf[y].s + i)) < 128 + ' ')
479     j++;
480   }
481   else if (*(b->bf[y].s + i) < ' ')
482    j++;
483 #endif
484  }
485  if (j > s->c.x)
486   i--;
487  for (k = 0; k < i; k++)
488   e_mk_col(b->bf[y].s, b->bf[y].len, k, frb, f->c_st, n_nd, n_bg);
489 #ifdef DEBUGGER
490  for (j = 1; j <= s->brp[0]; j++)
491   if (s->brp[j] == y)
492   {
493    fsw = 1;
494    break;
495   }
496  for (j = s->c.x; i < b->bf[y].len && j < NUM_COLS_ON_SCREEN_SAFE + s->c.x - 1; i++, j++)
497  {
498   e_mk_col(b->bf[y].s, b->bf[y].len, i, frb, f->c_st, n_nd, n_bg);
499   if ( y == s->da.y && i >= s->da.x && i < s->de.x )
500    frb = s->fb->dy.fb;
501   else if (fsw)
502    frb = s->fb->db.fb;
503   else if ( y == s->fa.y && i >= s->fa.x && i < s->fe.x )
504    frb = s->fb->ek.fb;
505 #else
506  for (j = s->c.x; i < b->bf[y].len && j < NUM_COLS_ON_SCREEN_SAFE + s->c.x - 1; i++, j++)
507  {
508   e_mk_col(b->bf[y].s, b->bf[y].len, i, frb, f->c_st, n_nd, n_bg);
509   if ( y == s->fa.y && i >= s->fa.x && i < s->fe.x )
510    frb = s->fb->ek.fb;
511 #endif
512   else if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
513            (y == s->mark_begin.y && i >= s->mark_begin.x))) ||
514            (y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
515            (y == s->mark_begin.y && i >= s->mark_begin.x))))
516    frb = s->fb->ez.fb;
517   if (*(b->bf[y].s + i) == WPE_TAB)
518    for (k = f->ed->tabn - j % f->ed->tabn;
519      k > 1 && j < NUM_COLS_ON_SCREEN + s->c.x - 2; k--, j++)
520     e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1, ' ', frb);
521 #ifdef UNIX
522   else if (!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126)
523   {
524    e_pr_char(f->a.x - s->c.x + j +1, y - s->c.y + f->a.y + 1, '@', frb);
525    if (++j >= NUM_COLS_ON_SCREEN + s->c.x - 1)
526     return;
527    if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ' && j < NUM_COLS_ON_SCREEN + s->c.x - 1)
528    {
529     e_pr_char(f->a.x - s->c.x + j +1, y - s->c.y + f->a.y + 1, '^', frb);
530     if (++j >= NUM_COLS_ON_SCREEN + s->c.x - 1)
531      return;
532    }
533   }
534   else if (*(b->bf[y].s + i) < ' ')
535   {
536    e_pr_char(f->a.x - s->c.x + j +1, y - s->c.y + f->a.y + 1, '^', frb);
537    if (++j >= NUM_COLS_ON_SCREEN + s->c.x - 1)
538     return;
539   }
540 #endif
541   if (*(b->bf[y].s + i) == WPE_TAB)
542    e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,                  ' ', frb);
543 #ifdef UNIX
544   else if(!WpeIsXwin() && ((unsigned char)*(b->bf[y].s + i)) > 126 &&
545     j < NUM_COLS_ON_SCREEN + s->c.x - 1)
546   {
547    if (((unsigned char)*(b->bf[y].s + i)) < 128 + ' ')
548     e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
549       ((unsigned char) *(b->bf[y].s + i)) + 'A' - 129, frb);
550    else
551     e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
552       ((unsigned char) *(b->bf[y].s + i)) - 128, frb);
553   }
554   else if (*(b->bf[y].s + i) < ' ' && j < NUM_COLS_ON_SCREEN + s->c.x - 1)
555    e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
556      *(b->bf[y].s + i) + 'A' - 1, frb);
557 #endif
558   else
559    e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
560      *(b->bf[y].s + i), frb);
561  }
562 
563  e_mk_col(b->bf[y].s, b->bf[y].len, i, frb, f->c_st, n_nd, n_bg);
564 
565  if ((i == b->bf[y].len) && (f->ed->edopt & ED_SHOW_ENDMARKS) &&
566    (DTMD_ISMARKABLE(f->dtmd)) && (j < NUM_COLS_ON_SCREEN_SAFE + s->c.x - 1))
567  {
568   if ((y < s->mark_end.y && ( y > s->mark_begin.y ||
569     (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) ||
570     (y == s->mark_end.y && i < s->mark_end.x && ( y > s->mark_begin.y ||
571     (y == s->mark_begin.y && i >= s->mark_begin.x) ) ) )
572   {
573    if (*(b->bf[y].s + i) == WPE_WR)
574     e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
575       PWR, s->fb->ez.fb);
576    else
577     e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
578       PNL, s->fb->ez.fb);
579   }
580   else
581   {
582    if (*(b->bf[y].s + i) == WPE_WR)
583      e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
584        PWR, frb);
585    else
586     e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1,
587       PNL, frb);
588   }
589   j++;
590  }
591  for (; j < NUM_COLS_ON_SCREEN + s->c.x - 1; j++)
592   e_pr_char(f->a.x - s->c.x + j + 1, y - s->c.y + f->a.y + 1, ' ', frb);
593 }
594 
595 int e_add_synt_tl(char *filename, FENSTER *f)
596 {
597  int i, k;
598 
599  f->c_st = NULL;
600  f->c_sw = NULL;
601  if (!WpeSyntaxDef || !filename) return 0;
602  filename = strrchr(filename, '.');
603  if (!filename) return 0;
604  for(i = 0; i < WpeExpArrayGetSize(WpeSyntaxDef); i++)
605  {
606   for (k = 0; k < WpeExpArrayGetSize(WpeSyntaxDef[i]->extension); k++)
607   {
608    if (!strcmp(filename, WpeSyntaxDef[i]->extension[k]))
609    {
610     f->c_st = WpeSyntaxDef[i]->syntax_rule;
611     if (f->ed->edopt & ED_SYNTAX_HIGHLIGHT)
612      f->c_sw = MALLOC(f->b->mx.y*sizeof(int));
613    }
614   }
615  }
616  return(0);
617 }
618 
619 /*  Browser   */
620 E_AFILE *e_aopen(char *name, char *path, int mode)
621 {
622  ECNT *cn = WpeEditor;
623  E_AFILE *ep = MALLOC(sizeof(E_AFILE));
624  char str[256];
625  int i, j;
626 
627  ep->b = NULL;
628  ep->fp = NULL;
629  if (mode & 1)
630  {
631   for (i = 1; i <= cn->mxedt && strcmp(cn->f[i]->datnam, name); i++)
632    ;
633   if (i <= cn->mxedt)
634   {
635    ep->b = cn->f[i]->b;
636    ep->p.x = ep->p.y = 0;
637   }
638  }
639  if ((mode & 2) && !ep->b && !access(name, R_OK))
640   ep->fp = fopen(name, "r");
641  if ((mode & 4) && !ep->b && !ep->fp)
642  {
643   for (i = 0; path[i] && !ep->fp; i++)
644   {
645    for (j = 0; (str[j] = path[i]) && path[i] != ':'; j++, i++)
646     ;
647    if (!path[i]) i--;
648    str[j] = '/';
649    str[j+1] = '\0';
650    strcat(str, name);
651    if (!access(str, R_OK))
652     ep->fp = fopen(str, "r");
653    if (ep->fp)
654     strcpy(name, str);
655   }
656  }
657  if (!ep->b && !ep->fp)
658  {
659   FREE(ep);
660   return NULL;
661  }
662  return(ep);
663 }
664 
665 int e_aclose(E_AFILE *ep)
666 {
667  int ret = 0;
668 
669  if (ep->fp)
670   ret = fclose(ep->fp);
671  FREE(ep);
672  return(ret);
673 }
674 
675 char *e_agets(char *str, int n, E_AFILE *ep)
676 {
677  int i, j;
678 
679  if (ep->fp)
680   return(fgets(str, n, ep->fp));
681  if (ep->p.y >= ep->b->mxlines ||
682    (ep->p.y == ep->b->mxlines-1 && ep->p.x > ep->b->bf[ep->p.y].len))
683   return(NULL);
684  for (i = 0; ep->p.y < ep->b->mxlines; (ep->p.y)++)
685  {
686   for (j = ep->p.x; i < n-1 && j <= ep->b->bf[ep->p.y].len; i++, j++)
687    str[i] = ep->b->bf[ep->p.y].s[j];
688 
689   if (str[i-1] == '\n')
690   {
691    ep->p.x = 0;
692    (ep->p.y)++;
693    break;
694   }
695   else if (i == n-1)
696   {
697    ep->p.x = j;
698    break;
699   }
700   else
701   {
702    ep->p.x = 0;
703    (ep->p.y)++;
704   }
705  }
706  str[i] = '\0';
707  return(str);
708 }
709 
710 char *e_sh_spl1(char *sp, char *str, E_AFILE *fp, int *n)
711 {
712  while (1)
713  {
714   while (isspace(*++sp))
715    ;
716   if (sp[0] == '\\')
717   {
718    (*n)++;
719    if (!e_agets((sp = str), 256, fp))
720     return(NULL);
721    --sp;
722   }
723   else if (sp[0] == '/' && sp[1] == '*')
724   {
725    while (!(sp = strstr(sp, "*/")))
726    {
727     (*n)++;
728     if (!e_agets((sp = str), 256, fp))
729      return(NULL);
730    }
731    sp++;
732   }
733   else
734    break;
735  }
736  return(sp);
737 }
738 
739 char *e_sh_spl2(char *sp, char *str, E_AFILE *fp, int *n)
740 {
741  while (1)
742  {
743   while (isspace(*++sp))
744    ;
745   if (!sp[0] || sp[0] == '\n' || sp[0] == '\\')
746   {
747    (*n)++;
748    if (!e_agets((sp = str), 256, fp))
749     return(NULL);
750    --sp;
751   }
752   else if (sp[0] == '/' && sp[1] == '*')
753   {
754    while (!(sp = strstr(sp, "*/")))
755    {
756     (*n)++;
757     if (!e_agets((sp = str), 256, fp))
758      return(NULL);
759    }
760    sp++;
761   }
762   else
763    break;
764  }
765  return(sp);
766 }
767 
768 char *e_sh_spl3(sp, str, fp, n)
769      char *sp;
770      char *str;
771      E_AFILE *fp;
772      int *n;
773 {
774     int brk = 1;
775     while(*++sp != '}' || brk > 1)
776     { if(!sp[0] || sp[0] == '\n')
777       { (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);
778 	if(isspace(*sp)) while(isspace(*++sp));
779 	if(sp[0] == '#' && ispelse(sp))
780 	{ do
781 	  {  (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);
782 	     if(isspace(*sp)) while(isspace(*++sp));
783 	  } while(sp[0] != '#' || !ispendif(sp));
784 	}
785 	sp--;
786       }
787       else if(sp[0] == '/' && sp[1] == '*')
788       { while(!(sp = strstr(sp, "*/")))
789         { (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);  }
790 	sp++;
791       }
792       else if(sp[0] == '{') brk++;
793       else if(sp[0] == '}') brk--;
794       else if(sp[0] == '\'')
795       { int bsl = 0;
796 	while(*++sp && (sp[0] != '\'' || bsl))
797 	{  bsl = *sp == '\\' ? !bsl : 0;  }
798 	if(!*sp) sp--;
799       }
800       else if(sp[0] == '\"')
801       { int bsl = 0;
802 	while(*++sp && ( *sp != '\"' || bsl))
803 	{  bsl = *sp == '\\' ? !bsl : 0;  }
804 	if(!*sp) sp--;
805       }
806     }
807     return(sp);
808 }
809 
810 char *e_sh_spl5(sp, str, fp, n)
811      char *sp;
812      char *str;
813      E_AFILE *fp;
814      int *n;
815 {
816     int brk = 1;
817     while(*++sp != ')' || brk > 1)
818     { if(!sp[0] || sp[0] == '\n')
819       { (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);
820 	if(isspace(*sp)) while(isspace(*++sp));
821 	if(sp[0] == '#' && ispelse(sp))
822 	{ do
823 	  {  (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);
824 	     if(isspace(*sp)) while(isspace(*++sp));
825 	  } while(sp[0] != '#' || !ispendif(sp));
826 	}
827 	sp--;
828       }
829       else if(sp[0] == '/' && sp[1] == '*')
830       { while(!(sp = strstr(sp, "*/")))
831         { (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);  }
832 	sp++;
833       }
834       else if(sp[0] == '(') brk++;
835       else if(sp[0] == ')') brk--;
836       else if(sp[0] == '\'')
837       { int bsl = 0;
838 	while(*++sp && (sp[0] != '\'' || bsl))
839 	{  bsl = *sp == '\\' ? !bsl : 0;  }
840 	if(!*sp) sp--;
841       }
842       else if(sp[0] == '\"')
843       { int bsl = 0;
844 	while(*++sp && (*sp != '\"' || bsl))
845 	{  bsl = *sp == '\\' ? !bsl : 0;  }
846 	if(!*sp) sp--;
847       }
848     }
849     return(sp);
850 }
851 
852 char *e_sh_spl4(sp, str, fp, n)
853      char *sp;
854      char *str;
855      E_AFILE *fp;
856      int *n;
857 {
858     int brk = 0;
859     while((*++sp != ',' && *sp != ';' && *sp != '(') || brk)
860     { if(!sp[0] || sp[0] == '\n')
861       {  (*n)++;  if(!e_agets((sp = str), 256, fp)) return(NULL);
862 	 --sp;
863       }
864       else if(sp[0] == '/' && sp[1] == '*')
865       { while(!(sp = strstr(sp, "*/")))
866         { (*n)++; if(!e_agets((sp = str), 256, fp)) return(NULL);  }
867 	sp++;
868       }
869       else if(sp[0] == '\"')
870       { int bsl = 0;
871 	while(*++sp && (sp[0] != '\"' || bsl))
872 	{  bsl = *sp == '\\' ? !bsl : 0;  }
873 	if(!*sp) sp--;
874       }
875       else if(sp[0] == '\'')
876       { int bsl = 0;
877 	while(*++sp && (sp[0] != '\'' || bsl))
878 	{  bsl = *sp == '\\' ? !bsl : 0;  }
879 	if(!*sp) sp--;
880       }
881       else if(sp[0] == '{') brk++;
882       else if(sp[0] == '}') brk--;
883     }
884     return(sp);
885 }
886 
887 struct dirfile *e_c_add_df(char *str, struct dirfile *df)
888 {
889  if (df == NULL)
890  {
891   df = MALLOC(sizeof(struct dirfile));
892   df->anz = 0;
893   df->name = MALLOC(sizeof(char*));
894  }
895  df->anz++;
896  df->name = REALLOC(df->name, df->anz * sizeof(char*));
897  df->name[df->anz-1] = MALLOC((strlen(str)+1) * sizeof(char));
898  strcpy(df->name[df->anz-1], str);
899  return(df);
900 }
901 
902 int e_find_def(name, startfile, mode, file, num, xn, nold, oldfile, df, first)
903      char *name;
904      char *startfile;
905      int mode;
906      char *file;
907      int *num;
908      int *xn;
909      int nold;
910      char *oldfile;
911      struct dirfile **df;
912      int *first;
913 {
914    E_AFILE *fp = NULL;
915    char *sp = NULL, str[256], *w, word[256];
916    int i, n, com = 0, ret = 1;
917    int len = strlen(name);
918    if(*df)
919    {  for(i = 0; i < (*df)->anz; i++)
920       if(!strcmp((*df)->name[i], startfile)) return(-2);
921    }
922    *df = e_c_add_df(startfile, *df);
923    if(!fp) fp = e_aopen(startfile, e_prog.sys_include, mode);
924    if(!fp) return(-1);
925    for(n = 0; com == 2 || e_agets((sp = str), 256, fp); n++)
926    {  if(com)
927       {  if(com == 1 && !(sp = strstr(sp, "*/"))) continue;
928 	 else com = 0;
929       }
930       if(isspace(*sp) && !(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
931       if(sp[0] == '/' && sp[1] == '*')
932       {  if(!(sp = strstr(sp, "*/"))) com = 1;
933 	 else {  n--;  com = 2;  sp += 2;  }
934 	 continue;
935       }
936       else if(*sp == '#')
937       {  if(!(sp = e_sh_spl1(sp, str, fp, &n))) goto b_end;
938 	 if(!strncmp(sp, "define", 6))
939 	 {  while(isalpha(*++sp));
940 	    if(isspace(*sp) && !(sp = e_sh_spl1(sp, str, fp, &n))) goto b_end;
941 	    if(!strncmp(sp, name, len) && !isalnum1(sp[len]))
942 	    {  if(*first)
943 	       {  e_aclose(fp);  strcpy(file, startfile);
944 		  *num = n;  *xn = ((int)(sp - str)) + len;  return(0);
945 	       }
946 	       else if(n == nold && !strcmp(startfile, oldfile)) *first = 1;
947 	    }
948 	 }
949 #ifndef TESTSDEF
950 	 else if(!strncmp(sp, "include", 7))
951 	 {  while(isalpha(*++sp));
952 	    if(isspace(*sp) && !(sp = e_sh_spl1(sp, str, fp, &n))) goto b_end;
953 	    for(i = 1; (word[i-1] = sp[i])
954 			&& sp[i] != '\"' && sp[i] != '>'; i++);
955 	    word[i-1] = '\0';
956 	    if(!e_find_def(name, word, sp[i] == '>' ? 4 : 7,
957 				file, num, xn, nold, oldfile, df, first))
958 	    {  e_aclose(fp);  return(0);  }
959 	 }
960 #endif
961 	 while(sp[i = (strlen(sp) - 1)] != '\n' || sp[i-1] == '\\')
962 	 {  n++; if(!e_agets((sp = str), 256, fp)) goto b_end;  }
963       }
964       else if(*sp == '{')
965       {  if(!(sp = e_sh_spl3(sp, str, fp, &n))) goto b_end;
966 	 sp++;  com = 2;  n--;
967       }
968       else if(!strncmp(sp, "extern", 6)) continue;
969       else if(!strncmp(sp, "typedef", 7))
970       {  while(!isspace(*++sp));
971 	 if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
972 	 if(!strncmp(sp, "struct", 6) || !strncmp(sp, "class", 5) ||
973 		!strncmp(sp, "union", 5))
974 	 {  while(!isspace(*++sp));
975 	    if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
976 	    if(*sp == ';') {  sp++;  com = 2;  n--;  continue;  }
977 	    if(!strncmp(sp, name, len) && !isalnum1(sp[len]))
978 	    {  while(!isspace(*++sp));
979 	       if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
980 	       if(*sp == '{')
981 	       {  if(*first)
982 		  {  e_aclose(fp);  strcpy(file, startfile);
983 		     *num = n;  *xn = (int)(sp - str);  return(0);
984 		  }
985 		  else if(n == nold && !strcmp(startfile, oldfile)) *first = 1;
986 	       }
987 	    }
988 	 }
989 	 while(1)
990 	 {  if(isalpha1(*sp))
991 	    {  for(w = word; isalnum1(*w = *sp); w++, sp++);
992 	       *w = '\0';
993 	       if(isspace(*sp) && !(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
994 	       if(*sp == ';')
995 	       {  if(!strncmp(word, name, len))
996 		  {  if(*first)
997 		     {  e_aclose(fp);  strcpy(file, startfile);
998 			*num = n;  *xn = (int)(sp - str);  return(0);
999 		     }
1000 		     else if(n == nold && !strcmp(startfile, oldfile)) *first = 1;
1001 		  }
1002 		  sp++;  com = 2;  n--;  break;
1003 	       }
1004 	    }
1005 	    else if(*sp == '{')
1006 	    {  if(!(sp = e_sh_spl3(sp, str, fp, &n))) goto b_end;
1007 	       if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1008 	       if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1009 	    }
1010 	    else if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1011 	 }
1012       }
1013       else if(!strncmp(sp, "struct", 6) || !strncmp(sp, "class", 5) ||
1014 		!strncmp(sp, "union", 5))
1015       {  while(!isspace(*++sp));
1016 	 if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1017 	 if(*sp == ';') {  sp++;  com = 2;  n--;  continue;  }
1018 	 if(!strncmp(sp, name, len) && !isalnum1(sp[len]))
1019 	 {  while(!isspace(*++sp));
1020 	    if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1021 	    if(*sp == '{')
1022 	    {  if(*first)
1023 	       {  e_aclose(fp);  strcpy(file, startfile);
1024 		  *num = n;  *xn = (int)(sp - str);  return(0);
1025 	       }
1026 	       else if(n == nold && !strcmp(startfile, oldfile)) *first = 1;
1027 	    }
1028 	 }
1029 	 else if(*sp != '{')
1030 	 {  while(!isspace(*++sp));
1031 	    if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1032 	 }
1033 	 if(*sp == ';') {  sp++;  com = 2;  n--;  continue;  }
1034 	 if(*sp == '{')
1035 	 {  if(!(sp = e_sh_spl3(sp, str, fp, &n))) goto b_end;
1036 	    if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1037 	    if(*sp == ';') {  sp++;  com = 2;  n--;  continue;  }
1038 	 }
1039 	 while(1)
1040 	 {  while (*sp == '*') sp++;
1041 	    if(isspace(*sp) && !(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1042 	    if(!strncmp(sp, name, len) && !isalnum1(sp[len]))
1043 	    {  while(isalnum1(*sp)) sp++;
1044 	       if(isspace(*sp) && !(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1045 	       if((*sp == ';' || *sp == ',' || *sp == '='
1046 					 || *sp == '[' || *sp == ')'))
1047 	       {  if(*first)
1048 		  {  e_aclose(fp);  strcpy(file, startfile);
1049 		     *num = n;  *xn = (int)(sp - str);  return(0);
1050 		  }
1051 		  else if(n == nold && !strcmp(startfile, oldfile))
1052 		  {  *first = 1;
1053 		     if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1054 		  }
1055 	       }
1056 	       else if(*sp == '(')
1057 	       {  if(!(sp = e_sh_spl5(sp, str, fp, &n))) goto b_end;
1058 		  if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1059 		  if(*sp == '{')
1060 		  {  if(*first)
1061 		     {  e_aclose(fp);  strcpy(file, startfile);
1062 			*num = n;  *xn = (int)(sp - str);  return(0);
1063 		     }
1064 		     else if(n == nold && !strcmp(startfile, oldfile))
1065 		     {  *first = 1;  break;  }
1066 		  }
1067 		  else break;
1068 	       }
1069 	    }
1070 	    else if(*sp == '(') sp++;
1071 	    else if(*sp == '*') {  while (*sp == '*') sp++;  continue;  }
1072 	    else if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1073 	    else if(*sp == '{')
1074 	    {  if(!(sp = e_sh_spl3(sp, str, fp, &n))) goto b_end;
1075 	       sp++;  com = 2;  n--;
1076 	       break;
1077 	    }
1078 	    else
1079 	    {  if(!(sp = e_sh_spl4(sp, str, fp, &n))) goto b_end;
1080 	       if(*sp == '(') break;
1081 	       else if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1082 	       if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1083 	    }
1084 	    if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1085 	 }
1086       }
1087       else if(isalnum1(*sp))
1088       {  while(isalnum1(*sp)) sp++;
1089 	 while(1)
1090 	 {  while (*sp == '*') sp++;
1091 	    if(isspace(*sp) && !(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1092 	    if(!strncmp(sp, name, len) && !isalnum1(sp[len]))
1093 	    {  while(isalnum1(*sp)) sp++;
1094 	       if(isspace(*sp) && !(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1095 	       if(*sp == ';' || *sp == ',' || *sp == '='
1096 					 || *sp == '[' || *sp == ')')
1097 	       {  if(*first)
1098 		  {  e_aclose(fp);  strcpy(file, startfile);
1099 		     *num = n;  *xn = (int)(sp - str);  return(0);
1100 		  }
1101 		  else if(n == nold && !strcmp(startfile, oldfile))
1102 		  {  *first = 1;  break;  }
1103 	       }
1104 	       else if(*sp == '(')
1105 	       {  if(!(sp = e_sh_spl5(sp, str, fp, &n))) goto b_end;
1106 		  if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1107 		  if(*sp == '{')
1108 		  {  if(*first)
1109 		     {  e_aclose(fp);  strcpy(file, startfile);
1110 			*num = n;  *xn = (int)(sp - str);  return(0);
1111 		     }
1112 		     else if(n == nold && !strcmp(startfile, oldfile))
1113 		     {  *first = 1;  break;  }
1114 		  }
1115 		  else break;
1116 	       }
1117 	    }
1118 	    else if(*sp == '(') sp++;
1119 	    else if(*sp == '*')
1120             {  while (*sp == '*') sp++;  continue;  }
1121 	    else if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1122 	    else if(*sp == '{')
1123 	    {  if(!(sp = e_sh_spl3(sp, str, fp, &n))) goto b_end;
1124 	       sp++;  com = 2;  n--;
1125 	       break;
1126 	    }
1127 	    else
1128 	    {  if(!(sp = e_sh_spl4(sp, str, fp, &n))) goto b_end;
1129 	       if(*sp == '(')
1130 	       {  if(!(sp = e_sh_spl5(sp, str, fp, &n))) goto b_end;
1131 		  if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1132 		  if(*sp == '{' && !(sp = e_sh_spl3(sp, str, fp, &n))) goto b_end;
1133 		  sp++;  com = 2;  n--;  break;
1134 	       }
1135 	       else if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1136 	       if(!(sp = e_sh_spl2(sp, str, fp, &n))) goto b_end;
1137 	    }
1138 	    if(*sp == ';') {  sp++;  com = 2;  n--;  break;  }
1139 	 }
1140       }
1141    }
1142    b_end:
1143     e_aclose(fp);
1144    return(ret);
1145 }
1146 
1147 int e_show_nm_f(char *name, FENSTER *f, int oldn, char **oldname)
1148 {
1149  int i, j, len, ret, num, x, first = oldn < 0 ? 1 : 0;
1150  char str[128], file[128], *filename;
1151  struct dirfile *df, *fdf = NULL;
1152 
1153 #ifndef TESTSDEF
1154  if (!access(e_prog.project, 0))
1155  {
1156   WpeMouseChangeShape(WpeWorkingShape);
1157   if (e_read_var(f)) ret = -1;
1158   else
1159   {
1160    df = e_p_get_var("FILES");
1161    if (!df)
1162    {
1163     e_error(e_p_msg[ERR_NOTHING], 0, f->fb);
1164     WpeMouseRestoreShape();
1165     return(-1);
1166    }
1167    for (i = 0, ret = 1; i < df->anz && ret; i++)
1168    {
1169     strcpy(str, df->name[i]);
1170     ret = e_find_def(name, str, 7, file, &num, &x, oldn,
1171       *oldname, &fdf, &first);
1172    }
1173    freedf(df);
1174   }
1175  }
1176  else
1177 #endif
1178  {
1179   if (!DTMD_ISTEXT(f->dtmd)) return(-1);
1180   WpeMouseChangeShape(WpeWorkingShape);
1181   strcpy(str, f->datnam);
1182   ret = e_find_def(name, str, 7, file, &num, &x, oldn,
1183     *oldname, &fdf, &first);
1184  }
1185  freedf(fdf);
1186  if (ret)
1187  {
1188   sprintf(str, "%s not found!", name);
1189   e_error(str, 0, f->fb);
1190   WpeMouseRestoreShape();
1191   return(-1);
1192  }
1193  if (*oldname) FREE(*oldname);
1194  *oldname = MALLOC((strlen(file)+1) * sizeof(char));
1195  strcpy(*oldname, file);
1196  for (i = strlen(file)-1; i >= 0 && file[i] != '/'; i--)
1197   ;
1198  for (j = f->ed->mxedt; j > 0; j--)
1199  {
1200   if (i < 0) filename = f->ed->f[j]->datnam;
1201   else filename = e_mkfilename(f->ed->f[j]->dirct, f->ed->f[j]->datnam);
1202   if (!strcmp(filename, file)) break;
1203  }
1204  if (j > 0) e_switch_window(f->ed->edt[j], f->ed->f[f->ed->mxedt]);
1205  else e_edit(f->ed, file);
1206  f = f->ed->f[f->ed->mxedt];
1207  for (i = num, j = x+1-(len = strlen(name)); i >= 0; )
1208  {
1209   for (len = strlen(name); j >= 0 && strncmp(name, f->b->bf[i].s+j, len);
1210     j--)
1211    ;
1212   if (j < 0 && i >= 0)
1213   {  i--;  j = f->b->bf[i].len-len+1;  }
1214   else break;
1215  }
1216  if (i >= 0)
1217  {  num = i;  x = j;  }
1218  else len = 0;
1219  f->s->fa.y = f->s->fe.y = f->b->b.y = num;
1220  f->s->fe.x = f->b->b.x = x + len;
1221  f->s->fa.x = x;
1222  e_cursor(f, 1);
1223  f->s->fa.y = num;
1224  e_schirm(f, 1);
1225  WpeMouseRestoreShape();
1226  return(num);
1227 }
1228 
1229 struct {
1230  int num;
1231  char *str, *file;
1232 }  sh_df = {  -1, NULL  };
1233 
1234 int e_sh_def(FENSTER *f)
1235 {
1236  char str[80];
1237 
1238  if (f->ed->shdf && f->ed->shdf->anz > 0)
1239   strcpy(str, f->ed->shdf->name[0]);
1240  else
1241   str[0] = '\0';
1242  if (e_add_arguments(str, "Show Definition", f, 0 , AltB, &f->ed->shdf))
1243  {
1244   if (sh_df.str)
1245    FREE(sh_df.str);
1246   sh_df.str = MALLOC((strlen(str)+1)*sizeof(char));
1247   strcpy(sh_df.str, str);
1248   if (sh_df.file)
1249   {
1250    FREE(sh_df.file);
1251    sh_df.file = NULL;
1252   }
1253   f->ed->shdf = e_add_df(str, f->ed->shdf);
1254   sh_df.num = e_show_nm_f(str, f, -1, &sh_df.file);
1255  }
1256  return(0);
1257 }
1258 
1259 int e_sh_nxt_def(FENSTER *f)
1260 {
1261  if (sh_df.num >= 0 && sh_df.str && sh_df.file)
1262  {
1263   sh_df.num = e_show_nm_f(sh_df.str, f, sh_df.num, &sh_df.file);
1264  }
1265  return(0);
1266 }
1267 
1268 int e_nxt_brk(FENSTER *f)
1269 {
1270  int c = f->b->bf[f->b->b.y].s[f->b->b.x];
1271  int i, j, ob, cb, bsp, brk, nif;
1272 
1273  if (c == '{' || c == '(' || c == '[')
1274  {
1275   if (c == '{')
1276   {
1277    ob = '{';  cb = '}';
1278   }
1279   else if (c == '(')
1280   {
1281    ob = '(';  cb = ')';
1282   }
1283   else
1284   {
1285    ob = '[';  cb = ']';
1286   }
1287   for (brk = 1, i = f->b->b.y; i < f->b->mxlines; i++)
1288    for (j = i == f->b->b.y ? f->b->b.x+1 : 0; j < f->b->bf[i].len; j++)
1289    {
1290     if (f->b->bf[i].s[j] == '\"')
1291     {
1292      for (bsp = 0, j++;
1293        j < f->b->bf[i].len && (f->b->bf[i].s[j] != '\"' || bsp); j++)
1294      {
1295       if (f->b->bf[i].s[j] == '\\')
1296        bsp = !bsp;
1297       else
1298        bsp = 0;
1299       if (j == f->b->bf[i].len - 1 && bsp && i < f->b->mxlines-1)
1300       {
1301        i++;
1302        j = -1;
1303        bsp = 0;
1304       }
1305      }
1306     }
1307     else if (f->b->bf[i].s[j] == '\'')
1308     {
1309      for (bsp = 0, j++;
1310        j < f->b->bf[i].len && (f->b->bf[i].s[j] != '\'' || bsp); j++)
1311      {
1312       if (f->b->bf[i].s[j] == '\\')
1313        bsp = !bsp;
1314       else
1315        bsp = 0;
1316       if (j == f->b->bf[i].len - 1 && bsp && i < f->b->mxlines-1)
1317       {
1318        i++;
1319        j = -1;
1320        bsp = 0;
1321       }
1322      }
1323     }
1324     else if (f->b->bf[i].s[j] == '/' && f->b->bf[i].s[j+1] == '*')
1325     {
1326      for (j += 2; f->b->bf[i].s[j] != '*' || f->b->bf[i].s[j+1] != '/'; j++)
1327      {
1328       if (j >= f->b->bf[i].len - 1)
1329       {
1330        if (i < f->b->mxlines-1)
1331        {
1332         i++;
1333         j = -1;
1334        }
1335        else
1336         break;
1337       }
1338      }
1339     }
1340     else if (f->b->bf[i].s[j] == '/' && f->b->bf[i].s[j+1] == '/')
1341      break;
1342     else if (f->b->bf[i].s[j] == '#' && ispelse(f->b->bf[i].s))
1343     {
1344      for (nif = 1, i++; i < f->b->mxlines-1; i++)
1345      {
1346       for (j = 0; isspace(f->b->bf[i].s[j]); j++)
1347        ;
1348       if (ispendif(f->b->bf[i].s+j))
1349        nif--;
1350       else if(ispif(f->b->bf[i].s+j))
1351        nif++;
1352       if (!nif)
1353        break;
1354      }
1355      continue;
1356     }
1357     else if (f->b->bf[i].s[j] == ob)
1358      brk++;
1359     else if (f->b->bf[i].s[j] == cb)
1360     {
1361      brk--;
1362      if (!brk)
1363      {
1364       f->b->b.y = i;  f->b->b.x = j;  return(0);
1365      }
1366     }
1367    }
1368  }
1369  else
1370  {
1371   if (c == '}')
1372   {
1373    ob = '{';  cb = '}';
1374   }
1375   else if (c == ')')
1376   {
1377    ob = '(';  cb = ')';
1378   }
1379   else if (c == ']')
1380   {
1381    ob = '[';  cb = ']';
1382   }
1383   else
1384   {
1385    ob = 0;  cb = 0;
1386   }
1387   for (brk = -1, i = f->b->b.y; i >= 0; i--)
1388   {
1389    if (i == f->b->b.y)
1390     for (j = 0;
1391       j < f->b->b.x && (f->b->bf[i].s[j] != '/' || f->b->bf[i].s[j+1] != '/');
1392       j++)
1393      ;
1394    else
1395     for (j = 0;
1396       j < f->b->bf[i].len && (f->b->bf[i].s[j] != '/' || f->b->bf[i].s[j+1] != '/');
1397       j++)
1398      ;
1399    for (j--; j >= 0; j--)
1400    {
1401     if (f->b->bf[i].s[j] == '\"')
1402     {
1403      for (j--; j >= 0; j--)
1404      {
1405       if (f->b->bf[i].s[j] == '\"')
1406       {
1407        for (bsp = 0, j--; j >= 0 && f->b->bf[i].s[j] == '\\'; j--)
1408         bsp = !bsp;
1409        j++;
1410        if (!bsp)
1411         break;
1412       }
1413       if (j == 0 && i > 0 && f->b->bf[i-1].s[f->b->bf[i-1].len] == '\\')
1414       {
1415        i--;
1416        j = f->b->bf[i].len;
1417       }
1418      }
1419     }
1420     else if (f->b->bf[i].s[j] == '\'')
1421     {
1422      for (j--; j >= 0; j--)
1423      {
1424       if (f->b->bf[i].s[j] == '\'')
1425       {
1426        for (bsp = 0, j--; j >= 0 && f->b->bf[i].s[j] == '\\'; j--)
1427         bsp = !bsp;
1428        j++;
1429        if (!bsp)
1430         break;
1431       }
1432       if (j == 0 && i > 0 && f->b->bf[i-1].s[f->b->bf[i-1].len] == '\\')
1433       {
1434        i--;
1435        j = f->b->bf[i].len;
1436       }
1437      }
1438     }
1439     else if (f->b->bf[i].s[j] == '/' && f->b->bf[i].s[j-1] == '*')
1440     {
1441      for (j -= 2; f->b->bf[i].s[j] != '*' || f->b->bf[i].s[j-1] != '/'; j--)
1442      {
1443       if (j <= 0)
1444       {
1445        if (i > 0)
1446        {
1447         i--;
1448         j = f->b->bf[i].len;
1449        }
1450        else
1451         break;
1452       }
1453      }
1454     }
1455     else if (f->b->bf[i].s[j] == '#' && ispelse(f->b->bf[i].s))
1456     {
1457      for (nif = 1, i--; i > 0; i--)
1458      {
1459       for (j = 0; isspace(f->b->bf[i].s[j]); j++)
1460        ;
1461       if (ispendif(f->b->bf[i].s+j))
1462        nif++;
1463       else if (ispif(f->b->bf[i].s+j))
1464        nif--;
1465       if (!nif)
1466        break;
1467      }
1468      continue;
1469     }
1470     else if (!ob)
1471     {
1472      if (f->b->bf[i].s[j] == '{' || f->b->bf[i].s[j] == '(' || f->b->bf[i].s[j] == '[')
1473      {
1474       brk++;
1475       if (!brk)
1476       {
1477        f->b->b.y = i;
1478        f->b->b.x = j;
1479        return(0);
1480       }
1481      }
1482      else if (f->b->bf[i].s[j] == '}' || f->b->bf[i].s[j] == ')' || f->b->bf[i].s[j] == ']')
1483       brk--;
1484      else if (i == 0 && j == 0)
1485      {
1486       f->b->b.y = i;
1487       f->b->b.x = j;
1488       return(0);
1489      }
1490     }
1491     else
1492     {
1493      if (f->b->bf[i].s[j] == ob)
1494      {
1495       brk++;
1496       if (!brk)
1497       {
1498        f->b->b.y = i;
1499        f->b->b.x = j;
1500        return(0);
1501       }
1502      }
1503      else if (f->b->bf[i].s[j] == cb)
1504       brk--;
1505     }
1506    }
1507   }
1508  }
1509  return(e_error("No Matching Bracket!", 0, f->ed->fb));
1510 }
1511 
1512 char *e_mbt_mk_sp(char *str, int n, int sw, int *m)
1513 {
1514  int k;
1515 
1516  if (!sw) *m = n;
1517  else *m = n / sw + n % sw;
1518  str = REALLOC(str, (*m+1)*sizeof(char));
1519  if (!sw) k = 0;
1520  else for (k = 0; k < n / sw; k++) str[k] = '\t';
1521  for (; k < *m; k++) str[k] = ' ';
1522  str[*m] = '\0';
1523  return(str);
1524 }
1525 
1526 int e_mbt_str(BUFFER *b, int *ii, int *jj, unsigned char c, int n, int sw,
1527   int *cmnd)
1528 {
1529  int i = *ii, j = *jj + 1, bsp;
1530 
1531  if (*cmnd != 2)
1532   *cmnd = 0;
1533  for (bsp = 0; j < b->bf[i].len && (b->bf[i].s[j] != c || bsp); j++)
1534  {
1535   if (b->bf[i].s[j] == '\\')
1536    bsp = !bsp;
1537   else
1538    bsp = 0;
1539   if (j == b->bf[i].len - 1 && bsp && i < b->mxlines-1)
1540   {
1541    char *str = MALLOC(1);
1542    int m;
1543 
1544    i++;
1545    bsp = 0;
1546    for (j = 0, m = b->bf[i].len; j < m && isspace(b->bf[i].s[j]); j++)
1547     ;
1548    if (j > 0)
1549     e_del_nchar(b, b->f->s, 0, i, j);
1550    if (j < m)
1551    {
1552     str = e_mbt_mk_sp(str, n+b->cn->autoindent, sw, &m);
1553     e_ins_nchar(b, b->f->s, str, 0, i, m);
1554    }
1555    j = -1;
1556    FREE(str);
1557   }
1558  }
1559  *ii = i;
1560  *jj = j;
1561  return(0);
1562 }
1563 
1564 int e_mbt_cnd(BUFFER *b, int *ii, int *jj, int n, int sw, int *cmnd)
1565 {
1566  int i = *ii, j = *jj + 2;
1567 
1568  for (; b->bf[i].s[j] != '*' || b->bf[i].s[j+1] != '/'; j++)
1569  {
1570   if (j >= b->bf[i].len - 1)
1571   {
1572    if (i < b->mxlines-1)
1573    {
1574     char *str = MALLOC(1);
1575     int m;
1576 
1577     i++;
1578     for (j = 0, m = b->bf[i].len; j < m && isspace(b->bf[i].s[j]); j++)
1579      ;
1580     if (j > 0)
1581      e_del_nchar(b, b->f->s, 0, i, j);
1582     if (j < m && (b->bf[i].s[0] != '*' || b->bf[i].s[1] != '/'))
1583     {
1584      str = e_mbt_mk_sp(str, n+b->cn->autoindent, sw, &m);
1585      e_ins_nchar(b, b->f->s, str, 0, i, m);
1586     }
1587     j = -1;
1588     FREE(str);
1589     if (*cmnd == 2)
1590      *cmnd = 1;
1591    }
1592    else
1593     break;
1594   }
1595  }
1596  *ii = i;
1597  *jj = j+1;
1598  return(0);
1599 }
1600 
1601 int e_mk_beauty(int sw, int ndif, FENSTER *f)
1602 {
1603  BUFFER *b;
1604  SCHIRM *s;
1605  int bg, nd, m, n, i, j, k, brk, cbrk = 0, nif = 0, nic = 0;
1606  int nstrct = 0, cmnd, cm_sv;
1607  char *tstr = MALLOC(sizeof(char));
1608  char *bstr = MALLOC((ndif+1)*sizeof(char));
1609  int *nvek = MALLOC(sizeof(int));
1610  int *ifvekb = MALLOC(sizeof(int));
1611  int *ifvekr = MALLOC(sizeof(int));
1612  int *vkcs = MALLOC(sizeof(int));
1613  int *vkcb = MALLOC(sizeof(int));
1614  POINT sa, se, sb;
1615 
1616  for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
1617   ;
1618  if (i <= 0)
1619  {
1620   FREE(tstr);  FREE(bstr);  FREE(nvek);  FREE(ifvekb);
1621   FREE(ifvekr);  FREE(vkcs);  FREE(vkcb);
1622   return(0);
1623  }
1624  *ifvekb = 0;
1625  *ifvekr = 0;
1626  *vkcs = 0;
1627  *vkcb = 0;
1628  e_switch_window(f->ed->edt[i], f);
1629  WpeMouseChangeShape(WpeWorkingShape);
1630  f = f->ed->f[f->ed->mxedt];
1631  b = f->b;
1632  s = f->s;
1633  sa = s->mark_begin;  se = s->mark_end;  sb = b->b;
1634  if (sw & 1)
1635  {
1636   if (sw & 2)  bg = i = b->b.x == 0 ? b->b.y : b->b.y + 1;
1637   else  bg = i = s->mark_begin.x == 0 ? s->mark_begin.y : s->mark_begin.y + 1;
1638   nd = s->mark_end.x == 0 ? s->mark_end.y : s->mark_end.y + 1;
1639   if (nd > b->mxlines) nd = b->mxlines;
1640  }
1641  else
1642  {
1643   if (sw & 2)  bg = i = b->b.x == 0 ? b->b.y : b->b.y + 1;
1644   else  bg = i = 0;
1645   nd = b->mxlines;
1646  }
1647  if (s->mark_begin.y < 0 || (s->mark_begin.y == 0 && s->mark_begin.x <= 0))
1648   n = 0;
1649  else
1650  {
1651   for (n = j = 0; j < b->bf[i].len && isspace(b->bf[i].s[j]); j++)
1652   {
1653    if (b->bf[i].s[j] == ' ') n++;
1654    else if (b->bf[i].s[j] == '\t')
1655     n += f->ed->tabn - (n % f->ed->tabn);
1656   }
1657  }
1658  tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1659  for (k = 0; k < ndif; k++)
1660   bstr[k] = ' ';
1661  bstr[ndif] = '\0';
1662  nvek[0] = n;
1663  for (cm_sv = 1, cmnd = 1, brk = 0; i < nd; i++)
1664  {
1665   for (j = 0; j < b->bf[i].len && isspace(b->bf[i].s[j]); j++)
1666    ;
1667   if (i > bg)
1668   {
1669    for (k = b->bf[i-1].len-1; k >= 0 && isspace(b->bf[i-1].s[k]); k--);
1670    if (k >= 0) e_del_nchar(b, s, k + 1, i-1, b->bf[i-1].len-1-k);
1671    e_del_nchar(b, s, 0, i, j);
1672    if (b->bf[i].len > 0 && b->bf[i].s[0] != '#' &&
1673      (b->bf[i].s[0] != '/' || b->bf[i].s[1] != '*'))
1674    {
1675     if ((cmnd == 0 && (!cm_sv || b->bf[i].s[0] != '{')) ||
1676       (cmnd == 2 && b->bf[i-1].s[k] == '\\'))
1677     {
1678      tstr = e_mbt_mk_sp(tstr, !cmnd ? n+b->cn->autoindent : b->cn->autoindent,
1679        (sw & 4) ? 0 : f->ed->tabn, &m);
1680      e_ins_nchar(b, s, tstr, 0, i, m);
1681      j = m;
1682      tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1683     }
1684     else
1685     {
1686      e_ins_nchar(b, s, tstr, 0, i, m);
1687      j = m;
1688      if (cmnd == 0) cmnd = 1;
1689     }
1690    }
1691   }
1692   if (cmnd == 0) cm_sv = cbrk ? 1 : 0;
1693   else cm_sv = cmnd;
1694   for (cmnd = 1; j < b->bf[i].len; j++)
1695   {
1696    if (b->bf[i].s[j] == '\"')
1697     e_mbt_str(b, &i, &j, '\"', n, (sw & 4) ? 0 : f->ed->tabn, &cmnd);
1698    else if (f->b->bf[i].s[j] == '\'')
1699     e_mbt_str(b, &i, &j, '\'', n, (sw & 4) ? 0 : f->ed->tabn, &cmnd);
1700    else if (b->bf[i].s[j] == '/' && b->bf[i].s[j+1] == '*')
1701     e_mbt_cnd(b, &i, &j, n, (sw & 4) ? 0 : f->ed->tabn, &cmnd);
1702    else if (b->bf[i].s[j] == '/' && b->bf[i].s[j+1] == '/') break;
1703    else if (b->bf[i].s[j] == ';') {  cmnd = cbrk ? 0 : 1;  nstrct = 0;  }
1704    else if (b->bf[i].s[j] == '#' && ispif(b->bf[i].s))
1705    {
1706     nif++;
1707     ifvekb = REALLOC(ifvekb, (nif+1)*sizeof(int));
1708     ifvekr = REALLOC(ifvekr, (nif+1)*sizeof(int));
1709     ifvekb[nif] = brk;
1710     ifvekr[nif] = cbrk;
1711     cmnd = 2;
1712    }
1713    else if (b->bf[i].s[j] == '#' && nif > 0 && ispelse(b->bf[i].s))
1714    {
1715     brk = ifvekb[nif];
1716     cbrk = ifvekr[nif];
1717     n = nvek[brk];
1718     tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1719     cmnd = 2;
1720    }
1721    else if (b->bf[i].s[j] == '#' && ispendif(b->bf[i].s))
1722    {  nif--;  cmnd = 2;  }
1723    else if (b->bf[i].s[j] == '#')
1724    {
1725     cmnd = 2;
1726     for (j++; j < b->bf[i].len; j++)
1727     {
1728      if (j == b->bf[i].len - 1 && i < b->mxlines-1 && b->bf[i].s[j] == '\\')
1729      {  i++;  j = 0;  }
1730      else if (b->bf[i].s[j] == '\"')
1731       e_mbt_str(b, &i, &j, '\"', n, (sw & 4) ? 0 : f->ed->tabn, &cmnd);
1732      else if (f->b->bf[i].s[j] == '\'')
1733       e_mbt_str(b, &i, &j, '\'', n, (sw & 4) ? 0 : f->ed->tabn, &cmnd);
1734      else if (b->bf[i].s[j] == '/' && b->bf[i].s[j+1] == '*')
1735       e_mbt_cnd(b, &i, &j, n, (sw & 4) ? 0 : f->ed->tabn, &cmnd);
1736      else if (b->bf[i].s[j] == '/' && b->bf[i].s[j+1] == '/') break;
1737     }
1738     if (b->bf[i].s[j] == '/' && b->bf[i].s[j+1] == '/') break;
1739    }
1740    else if (b->bf[i].s[j] == '(') {  nstrct = 0;  cmnd = 0;  cbrk++;  }
1741    else if (b->bf[i].s[j] == ')') {  nstrct = 0;  cmnd = 0;  cbrk--;  }
1742    else if (b->bf[i].s[j] == '{')
1743    {
1744     brk++;
1745     cmnd = 1;
1746     for (k = j + 1; k < b->bf[i].len && isspace(b->bf[i].s[k]); k++);
1747     if (k < b->bf[i].len && (b->bf[i].s[k] != '/' ||
1748       (b->bf[i].s[k+1] != '*' && b->bf[i].s[k+1] != '/')))
1749     {
1750      e_del_nchar(b, s, j+1, i, k-j-1);
1751      e_ins_nchar(b, s, bstr, j+1, i, ndif-1);
1752     }
1753     if (nstrct == 1)
1754     {
1755      if (k >= b->bf[i].len) n = nvek[brk-1];
1756      else
1757      {
1758       for (k = j - 1; k >= 0 && isspace(b->bf[i].s[k]); k--);
1759       if (k >= 0) nstrct++;
1760      }
1761      nstrct++;
1762      nic++;
1763      vkcb = REALLOC(vkcb, (nic+1)*sizeof(int));
1764      vkcs = REALLOC(vkcs, (nic+1)*sizeof(int));
1765      vkcs[nic] = 0;
1766      vkcb[nic] = brk-1;
1767     }
1768     else
1769     {
1770      for(n = k = 0; k < j; k++)
1771      {
1772       if (b->bf[i].s[k] == '\t')
1773        n += f->ed->tabn - (n % f->ed->tabn);
1774       else n++;
1775      }
1776     }
1777     n += ndif;
1778     tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1779     nvek = REALLOC(nvek, (brk+1)*sizeof(int));
1780     nvek[brk] = n;
1781    }
1782    else if (f->b->bf[i].s[j] == '}')
1783    {
1784     brk--;
1785     cmnd = 1;
1786     nstrct = 0;
1787     if (nic > 0 && vkcb[nic] == brk - 1)
1788     {  n = nvek[brk];  nic--;  brk--;  }
1789     if (brk < 0)
1790     {
1791      FREE(tstr);  FREE(bstr);  FREE(nvek);
1792      FREE(ifvekb);  FREE(ifvekr);
1793      FREE(vkcs);  FREE(vkcb);
1794      b->b = sb;  s->mark_begin = sa;  s->mark_end = se;
1795      e_schirm(f, 1);
1796      WpeMouseRestoreShape();
1797      return(0);
1798     }
1799     n -= ndif;
1800     tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1801     for (k = j - 1; k >= 0 && isspace(b->bf[i].s[k]); k--);
1802     e_del_nchar(b, s, k+1, i, j-1-k);
1803     if (k > 0)
1804     {  e_ins_nchar(b, s, bstr, k+1, i, ndif-1);  j = k+ndif+1;  }
1805     else
1806     {  e_ins_nchar(b, s, tstr, k+1, i, m);  j = k+m+2;  }
1807     n = nvek[brk];
1808     tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1809    }
1810    else if (((j == 0 || !isalnum1(b->bf[i].s[j-1])) &&
1811      (iscase(b->bf[i].s+j) || isstatus(b->bf[i].s+j))) ||
1812      (nstrct > 1 && isalnum1(b->bf[i].s[j])))
1813    {
1814     if (vkcs[nic])
1815     {
1816      n = nvek[vkcb[nic]+1];
1817      tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1818      for (k = j - 1; k >= 0 && isspace(b->bf[i].s[k]); k--);
1819      e_del_nchar(b, s, k+1, i, j-1-k);
1820      if (k > 0)
1821      {  e_ins_nchar(b, s, bstr, k+1, i, ndif-1);  j = k+ndif+1;  }
1822      else
1823      {  e_ins_nchar(b, s, tstr, k+1, i, m);  j = k+m+2;  }
1824     }
1825     else
1826     {  brk++;  vkcs[nic] = 1;  }
1827     if (nstrct < 2 || isstatus(b->bf[i].s+j))
1828     {
1829      for (j++; j < b->bf[i].len && b->bf[i].s[j] != ':'; j++);
1830      for (k = j + 1; k < b->bf[i].len && isspace(b->bf[i].s[k]); k++);
1831      if (k < b->bf[i].len && (b->bf[i].s[k] != '/' ||
1832        (b->bf[i].s[k+1] != '*' && b->bf[i].s[k+1] != '/')))
1833      {
1834       e_del_nchar(b, s, j+1, i, k-j-1);
1835       e_ins_nchar(b, s, bstr, j+1, i, ndif-1);
1836       for (n = k = 0; k < j; k++)
1837       {
1838        if (b->bf[i].s[k] == '\t')
1839         n += f->ed->tabn - (n % f->ed->tabn);
1840        else
1841         n++;
1842       }
1843      }
1844     }
1845     else if (nstrct == 2)
1846      e_ins_nchar(b, s, bstr, j, i, ndif);
1847     else
1848      j--;
1849     n += ndif;
1850     tstr = e_mbt_mk_sp(tstr, n, (sw & 4) ? 0 : f->ed->tabn, &m);
1851     nvek = REALLOC(nvek, (brk+1)*sizeof(int));
1852     nvek[brk] = n;
1853     cmnd = 3;
1854     nstrct = 0;
1855    }
1856    else if ((j == 0 || !isalnum1(b->bf[i].s[j-1])) &&
1857      (!strncmp(b->bf[i].s+j, "switch", 6) && !isalnum1(b->bf[i].s[j+6])))
1858    {
1859     nic++;
1860     vkcb = REALLOC(vkcb, (nic+1)*sizeof(int));
1861     vkcs = REALLOC(vkcs, (nic+1)*sizeof(int));
1862     vkcs[nic] = 0;
1863     vkcb[nic] = brk;
1864    }
1865    else if ((j == 0 || !isalnum1(b->bf[i].s[j-1])) &&
1866      ((!strncmp(b->bf[i].s+j, "class", 5) && !isalnum1(b->bf[i].s[j+5])) ||
1867      (!strncmp(b->bf[i].s+j, "struct", 6) && !isalnum1(b->bf[i].s[j+6]))))
1868     nstrct = 1;
1869    else if (cmnd == 1 && !isspace(f->b->bf[i].s[j]))
1870     cmnd = 0;
1871    else if (cmnd == 3 && f->b->bf[i].s[j] == ':') cmnd = 1;
1872   }
1873  }
1874  FREE(nvek);  FREE(tstr);  FREE(bstr);
1875  FREE(ifvekb);  FREE(ifvekr);
1876  FREE(vkcs);  FREE(vkcb);
1877  s->mark_begin = sa;  s->mark_end = se;
1878  b->b = sb;
1879  e_schirm(f, 1);
1880  WpeMouseRestoreShape();
1881  return(0);
1882 }
1883 
1884 int e_p_beautify(FENSTER *f)
1885 {
1886  static int b_sw = 0;
1887  int ret;
1888  W_OPTSTR *o = e_init_opt_kst(f);
1889 
1890  if (!o) return(-1);
1891  o->xa = 21;  o->ya = 3;  o->xe = 52;  o->ye = 19;
1892  o->bgsw = AltO;
1893  o->name = "Beautify";
1894  o->crsw = AltO;
1895  e_add_txtstr(4, 2, "Begin:", o);
1896  e_add_txtstr(4, 6, "Scope:", o);
1897  e_add_numstr(4, 12, 26, 12, 2, 100, 0, AltN, "Number of Columns:", f->ed->autoindent, o);
1898  e_add_sswstr(5, 10, 3, AltT, (b_sw & 4) ? 1 : 0, "No Tabulators     ", o);
1899  e_add_pswstr(0, 5, 3, 0, AltG, 0, "Global            ", o);
1900  e_add_pswstr(0, 5, 4, 0, AltS, b_sw & 1, "Selected Text     ", o);
1901  e_add_pswstr(1, 5, 7, 0, AltE, 0, "Entire Scope      ", o);
1902  e_add_pswstr(1, 5, 8, 0, AltF, (b_sw & 2) ? 1 : 0, "From Cursor       ", o);
1903  e_add_bttstr(7, 14, 1, AltO, " Ok ", NULL, o);
1904  e_add_bttstr(18, 14, -1, WPE_ESC, "Cancel", NULL, o);
1905  ret = e_opt_kst(o);
1906  if (ret != WPE_ESC)
1907  {
1908   b_sw = o->pstr[0]->num + (o->pstr[1]->num << 1) + (o->sstr[0]->num << 2);
1909   f->ed->autoindent = o->nstr[0]->num;
1910   e_mk_beauty(b_sw, f->ed->autoindent, f);
1911  }
1912  freeostr(o);
1913  return(0);
1914 }
1915 
1916 #endif
1917 
1918