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