/* we_opt.c */
/* Copyright (C) 1993 Fred Kruse */
/* This is free software; you can redistribute it and/or */
/* modify it under the terms of the */
/* GNU General Public License, see the file COPYING. */
#include "messages.h"
#include "edit.h"
#include "WeExpArr.h"
#include <ctype.h>
#include <sys/types.h>
#include <sys/stat.h>
int WpeReadGeneral(ECNT *cn, char *section, char *option, char *value);
int WpeWriteGeneral(ECNT *cn, char *section, FILE *opt_file);
int WpeReadColor(ECNT *cn, char *section, char *option, char *value);
int WpeWriteColor(ECNT *cn, char *section, FILE *opt_file);
int WpeReadProgramming(ECNT *cn, char *section, char *option, char *value);
int WpeWriteProgramming(ECNT *cn, char *section, FILE *opt_file);
int WpeReadLanguage(ECNT *cn, char *section, char *option, char *value);
int WpeWriteLanguage(ECNT *cn, char *section, FILE *opt_file);
#define E_HLP_NUM 26
char *e_hlp_str[E_HLP_NUM];
extern char *info_file;
#ifdef DEBUGGER
extern int e_deb_type;
#endif
extern FARBE *u_fb, *x_fb;
#define OPTION_SECTIONS 4
#define OPT_SECTION_GENERAL "General"
#define OPT_SECTION_COLOR "Color"
#define OPT_SECTION_PROGRAMMING "Programming"
#define OPT_SECTION_LANGUAGE "Language"
WpeOptionSection WpeSectionRead[] = {
{OPT_SECTION_GENERAL, WpeReadGeneral},
{OPT_SECTION_COLOR, WpeReadColor},
{OPT_SECTION_PROGRAMMING, WpeReadProgramming},
{OPT_SECTION_LANGUAGE, WpeReadLanguage}
};
/* About WE */
int e_about_WE(FENSTER *f)
{
PIC *pic = NULL;
int xa = 10, ya = 4, xe = xa + 50, ye = ya + 13;
char tmp[40];
fk_cursor(0);
pic = e_std_kst(xa, ya, xe, ye, NULL, 1, f->fb->nr.fb, f->fb->nt.fb, f->fb->ne.fb);
if (pic == NULL)
{
e_error(e_msg[ERR_LOWMEM], 1, f->fb);
return(WPE_ESC);
}
sprintf(tmp, " Version %s ", VERSION);
#ifdef UNIX
if (WpeIsXwin() && WpeIsProg())
{
e_pr_str(xa+7, ya+3, " XWindow Programming Environment ", f->fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+7, ya+4, " ( XWPE ) ", f->fb->et.fb, 0, 0, 0, 0);
}
else if (WpeIsProg())
{
e_pr_str(xa+7, ya+3, " Window Programming Environment ", f->fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+7, ya+4, " ( WPE ) ", f->fb->et.fb, 0, 0, 0, 0);
}
else if (WpeIsXwin())
{
e_pr_str(xa+7, ya+3, " XWindow Editor ", f->fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+7, ya+4, " ( XWE ) ", f->fb->et.fb, 0, 0, 0, 0);
}
else
#endif
{
e_pr_str(xa+7, ya+3, " Window Editor ", f->fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+7, ya+4, " ( WE ) ", f->fb->et.fb, 0, 0, 0, 0);
}
e_pr_str(xa+7, ya+5, tmp, f->fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+2, ya+8, "Copyright (C) 1993 Fred Kruse", f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+2, ya+9, "This Sofware comes with ABSOLUTELY NO WARRANTY;", f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+2, ya+10, "This is free software, and you are welcome to", f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+2, ya+11, "redistribute it under certain conditions;", f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+2, ya+12, "See \'Help\\Editor\\GNU Pub...\' for details.", f->fb->nt.fb, 0, 0, 0, 0);
#if MOUSE
while (e_mshit() != 0)
;
e_getch();
while (e_mshit() != 0)
;
#else
e_getch();
#endif
e_close_view(pic, 1);
return(0);
}
/* delete everything */
int e_clear_desk(FENSTER *f)
{
int i;
ECNT *cn = f->ed;
#if MOUSE
int g[4]; /* = { 2, 0, 0, 0, }; */
g[0] = 2;
#endif
fk_cursor(0);
for (i = cn->mxedt; i > 0; i--)
{
f = cn->f[cn->mxedt];
if( e_close_window(f) == WPE_ESC )
return(WPE_ESC);
}
cn->mxedt = 0;
#if MOUSE
fk_mouse(g);
#endif
e_ini_desk(cn);
#if MOUSE
g[0] = 1;
fk_mouse(g);
#endif
return(0);
}
/* redraw everything */
int e_repaint_desk(FENSTER *f)
{
/* int j; */
ECNT *cn = f->ed;
int i, g[4];
#ifndef NO_XWINDOWS
extern PIC *e_X_l_pic;
PIC *sv_pic = NULL, *nw_pic = NULL;
if (WpeIsXwin())
{
if (e_X_l_pic && e_X_l_pic != cn->f[cn->mxedt]->pic)
{
sv_pic = e_X_l_pic;
nw_pic = e_open_view(e_X_l_pic->a.x, e_X_l_pic->a.y,
e_X_l_pic->e.x, e_X_l_pic->e.y, 0, 2);
}
(*e_u_ini_size)();
}
#endif
if (cn->mxedt < 1)
{
e_cls(f->fb->df.fb, f->fb->dc);
e_ini_desk(f->ed);
#ifndef NO_XWINDOWS
if ((WpeIsXwin()) && nw_pic)
{
e_close_view(nw_pic, 1);
e_X_l_pic = sv_pic;
}
#endif
return(0);
}
cn->curedt = cn->mxedt;
ini_repaint(cn);
e_abs_refr();
for (i = 1; i < cn->mxedt; i++)
{
e_firstl(cn->f[i], 0);
e_schirm(cn->f[i], 0);
}
e_firstl(cn->f[i], 1);
e_schirm(cn->f[i], 1);
#ifndef NO_XWINDOWS
if (WpeIsXwin() && nw_pic)
{
e_close_view(nw_pic, 1);
e_X_l_pic = sv_pic;
}
#endif
#if MOUSE
g[0] = 2; fk_mouse(g);
#endif
end_repaint();
e_cursor(cn->f[i], 1);
#if MOUSE
g[0] = 0; fk_mouse(g);
g[0] = 1; fk_mouse(g);
#endif
return(0);
}
/* write system information */
int e_sys_info(FENSTER *f)
{
PIC *pic = NULL;
char tmp[80];
int xa = 10, ya = 5, xe = xa + 60, ye = ya + 8;
fk_cursor(0);
pic = e_std_kst(xa, ya, xe, ye, " Information ", 1, f->fb->nr.fb, f->fb->nt.fb, f->fb->ne.fb);
if (pic == NULL) { e_error(e_msg[ERR_LOWMEM], 1, f->fb); return(WPE_ESC); }
e_pr_str(xa+3, ya+2, " Current File: ", f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+3, ya+4, " Current Directory: ", f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+3, ya+6, " Number of Files: ", f->fb->nt.fb, 0, 0, 0, 0);
if(strcmp(f->datnam, "Clipboard") != 0)
if(strcmp(f->dirct, f->ed->dirct) == 0)
e_pr_str(xa+23, ya+2, f->datnam, f->fb->nt.fb, 0, 0, 0, 0);
else
{
strcpy(tmp, f->dirct);
strcat(tmp, DIRS);
strcat(tmp, f->datnam);
e_pr_str(xa+23, ya+2, tmp, f->fb->nt.fb, 0, 0, 0, 0);
}
e_pr_str(xa+23, ya+4, f->ed->dirct, f->fb->nt.fb, 0, 0, 0, 0);
e_pr_str(xa+23, ya+6,
WpeNumberToString(f->ed->mxedt, WpeNumberOfPlaces(f->ed->mxedt), tmp),
f->fb->nt.fb, 0, 0, 0, 0);
#if MOUSE
while(e_mshit() != 0);
e_getch();
while(e_mshit() != 0);
#else
e_getch();
#endif
e_close_view(pic, 1);
return(0);
}
/* color adjustments */
int e_ad_colors(FENSTER *f)
{
int n, xa = 48, ya = 2, num = 4;
OPTK *opt = MALLOC(num * sizeof(OPTK));
opt[0].t = "Editor Colors"; opt[0].x = 0; opt[0].o = 'E';
opt[1].t = "Desk Colors"; opt[1].x = 0; opt[1].o = 'D';
opt[2].t = "Option Colors"; opt[2].x = 0; opt[2].o = 'O';
opt[3].t = "Progr. Colors"; opt[3].x = 0; opt[3].o = 'P';
n = e_opt_sec_box(xa, ya, num, opt, f, 1);
FREE(opt);
if (n < 0)
return(WPE_ESC);
return(e_ad_colors_md(f, n));
}
int e_ad_colors_md(FENSTER *f, int md)
{
int sw = 0, xa = 0, ya = 1, xe = xa + 79, ye = ya + 22;
PIC *pic;
pic = e_std_kst(xa, ya, xe, ye, "Adjust Colors", 1, f->fb->er.fb,
f->fb->et.fb, f->fb->es.fb);
if (pic == NULL)
{
e_error(e_msg[ERR_LOWMEM], 1, f->fb);
return(WPE_ESC);
}
sw = e_dif_colors(sw, xe-13, ya+1, f, md);
e_close_view(pic, 1);
e_repaint_desk(f);
return(sw);
}
/* install/execute color adjustments */
int e_dif_colors(int sw, int xa, int ya, FENSTER *f, int md)
{
COLOR *frb = &(f->fb->er);
int c = 0, bg, num;
if (md == 1)
{
bg = 11;
num = 5;
}
else if (md == 2)
{
bg = 16;
num = 15;
}
else if (md == 3)
{
bg = 32;
num = 5;
}
else
{
bg = 0;
num = 11;
}
while (c != WPE_ESC && c > -2)
{
e_pr_dif_colors(sw, xa, ya, f, 1, md);
e_pr_col_kasten(xa-28, ya+1, frb[sw+bg].f, frb[sw+bg].b , f, 0);
e_pr_ed_beispiel(1, 2, f, sw, md);
#if MOUSE
if ((c = e_getch()) == -1)
c = e_opt_cw_mouse(xa, ya, md);
#else
c = e_getch();
#endif
if (c >= 375 && c <= 393)
sw = c-375;
else if (c == 326)
sw = 0;
else if (c == 334)
sw = num-1;
else if (c == 327)
sw = (sw == 0) ? num-1 : sw-1;
else if (c == 335)
sw = (sw == num-1) ? 0 : sw+1;
else if (c == WPE_CR || c == 285 || c == 330)
{
e_pr_dif_colors(sw, xa, ya, f, 0, md);
*(frb+sw+bg) = e_n_clr(e_frb_menue(sw, xa-28, ya+1, f, md));
}
}
return(c);
}
char *text[] = { "Border", "Bord. Bt.", "Text", "Txt Mrk.1", "Txt Mrk.2",
"Scrollbar", "Help Hdr.", "Help Btt.", "Help Mrk.",
"Breakpnt.", "Stop Brk.",
"Border", "Bord. Bt.", "Text", "Txt Mrk.", "Backgrnd.",
"Border", "Bord. Bt.", "Text", "Text Sw.",
"Write", "Wrt. Mrk.", "Data", "Data M.A", "Data M.P",
"Switch", "Swtch. S.", "Swtch. A.", "Button",
"Bttn. Sw.", "Bttn. Ak.",
"Text", "Res. Wrd.", "Constants", "Pre-Proc.", "Comments"
};
/* draw color box */
void e_pr_dif_colors(int sw, int xa, int ya, FENSTER *f, int sw2, int md)
{
int i, rfrb, cfrb, xe = xa + 12, ye, bg;
char *header;
if (md == 1)
{
ye = ya + 6;
bg = 11;
header = "Desk";
}
else if (md == 2)
{
ye = ya + 16;
bg = 16;
header = "Options";
}
else if (md == 3)
{
ye = ya + 6;
bg = 31;
header = "C-Prog.";
}
else
{
ye = ya + 12;
bg = 0;
header = "Editor";
}
rfrb = sw2 == 0 ? f->fb->nt.fb : f->fb->fs.fb;
e_std_rahmen(xa, ya, xe, ye, header, 0, rfrb, 0);
for (i = 0; i < ye-ya-1; i++)
{
cfrb = i == sw ? f->fb->fz.fb : f->fb->ft.fb;
e_pr_str_wsd(xa+2, ya+1+i, text[i+bg], cfrb, 0, 0, 0, xa+1, xe-1);
}
}
/* color menu */
int e_frb_x_menue(int sw, int xa, int ya, FENSTER *f, int md)
{
COLOR *frb = &(f->fb->er);
int c = 1, fsv = frb[sw].fb, x, y;
if (md == 1) sw += 11;
else if (md == 2) sw += 16;
else if (md == 3) sw += 32;
y = frb[sw].b;
x = frb[sw].f;
do
{
if (c == CRI && y < 7) y++;
else if (c == CLE && y > 0) y--;
else if (c == CUP && x > 0) x--;
else if (c == CDO && x < 15) x++;
else if (c >= 1000 && c < 1256)
{
x = (c-1000)/16;
y = (c-1000)%16;
}
e_pr_x_col_kasten(xa, ya, x, y, f, 1);
frb[sw] = e_s_clr(x, y);
e_pr_ed_beispiel(1, 2, f, sw, md);
#if MOUSE
if ((c=e_getch()) == -1) c = e_opt_ck_mouse(xa, ya, md);
#else
c = e_getch();
#endif
} while (c != WPE_ESC && c != WPE_CR && c > -2);
if (c == WPE_ESC || c < -1)
frb[sw] = e_n_clr(fsv);
return(frb[sw].fb);
}
/* draw color box */
void e_pr_x_col_kasten(int xa, int ya, int x, int y, FENSTER *f, int sw)
{
int i, j, rfrb, ffrb, xe = xa + 25, ye = ya + 18;
rfrb = sw == 0 ? f->fb->nt.fb : f->fb->fs.fb;
ffrb = rfrb % 16;
e_std_rahmen(xa-2, ya-1, xe, ye, "Colors", 0, rfrb, 0);
/* e_pr_str((xa+xe-8)/2, ya-1, "Colors", rfrb, 0, 1,
f->fb->ms.f+16*(rfrb/16), 0);
*/
for (j = 0; j < 8; j++)
for (i = 0; i < 16; i++)
{
e_pr_char(3*j+xa, i+ya+1, ' ', 16*j+i);
e_pr_char(3*j+xa+1, i+ya+1, 'x', 16*j+i);
e_pr_char(3*j+xa+2, i+ya+1, ' ', 16*j+i);
}
for (i = 0; i < 18; i++)
{
e_pr_char(xa-1, i+ya, ' ', rfrb);
e_pr_char(xe-1, i+ya, ' ', rfrb);
}
for (j = 0; j < 25; j++)
{
e_pr_char(j+xa-1, ya, ' ', rfrb);
e_pr_char(j+xa-1, ye-1, ' ', rfrb);
}
#ifdef NEWSTYLE
if (!WpeIsXwin())
{
#endif
for (i = 0; i < 3; i++)
{
e_pr_char(3*y+xa+i, x+ya, RE5, x>0 ? 16*y+ffrb : rfrb );
e_pr_char(3*y+xa+i, x+ya+2, RE5, x<15 ? 16*y+ffrb : rfrb );
}
e_pr_char(3*y+xa-1, x+ya+1, RE6, y<1 ? rfrb : 16*(y-1)+ffrb);
e_pr_char(3*y+xa+3, x+ya+1, RE6, y>6 ? rfrb : 16*(y+1)+ffrb);
e_pr_char(3*y+xa-1, x+ya, RE1, (y<1 || x<1) ? rfrb : 16*(y-1)+ffrb);
e_pr_char(3*y+xa+3, x+ya, RE2, (y>6 || x<1) ? rfrb : 16*(y+1)+ffrb);
e_pr_char(3*y+xa-1, x+ya+2, RE3, (y<1 || x>14) ? rfrb : 16*(y-1)+ffrb);
e_pr_char(3*y+xa+3, x+ya+2, RE4, (y>6 || x>14) ? rfrb : 16*(y+1)+ffrb);
#ifdef NEWSTYLE
}
else e_make_xrect(3*y+xa, x+ya+1, 3*y+xa+2, x+ya+1, 1);
#endif
}
/* draw color example */
void e_pr_ed_beispiel(int xa, int ya, FENSTER *f, int sw, int md)
{
COLOR *frb = &(f->fb->er);
FARBE *fb = f->fb;
int i, j, xe = xa+31, ye = ya+19;
frb[sw] = e_s_clr(frb[sw].f, frb[sw].b);
if (md == 1)
{
e_blk(xe-xa+1, xa+1, ya, fb->mt.fb);
e_pr_str_wsd(xa+5, ya, "Edit", fb->mt.fb, 0, 1, f->fb->ms.fb,
xa+3, xa+11);
e_pr_str_wsd(xa+18, ya, "Options", fb->mz.fb, 0, 0, f->fb->ms.fb,
xa+16, xa+27);
for (i = ya+1; i < ye; i++)
for (j = xa+1; j <= xe+1; j++)
{
e_pr_char(j, i, fb->dc, fb->df.fb);
e_pr_char(j, i, fb->dc, fb->df.fb);
}
e_std_rahmen(xa+17, ya+1, xa+26, ya+3, NULL, 0, fb->mr.fb, 0);
e_pr_str(xa+19, ya+2, "Colors", fb->mt.fb, 0, 1, fb->ms.fb, 0);
e_blk(xe-xa+1, xa+1, ye, fb->mt.fb);
e_pr_str_wsd(xa+4, ye, "Alt-F3 Close Window",
fb->mt.fb, 0, 6, fb->ms.fb, xa+2, xa+25);
}
else if (md == 2)
{
e_std_rahmen(xa, ya, xe, ye, "Message", 1, fb->nr.fb, f->fb->ne.fb);
for(i = ya+1; i < ye; i++) e_blk(xe-xa-1, xa+1, i, fb->nt.fb)
;
e_pr_str(xa+4, ya+2, "Name:", f->fb->nt.fb, 0, 1,
f->fb->nsnt.fb, f->fb->nt.fb);
e_pr_str(xa+5, ya+3, "Active Write-Line ", fb->fa.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+5, "Name:", f->fb->nt.fb, 0, 1,
f->fb->nsnt.fb, f->fb->nt.fb);
e_pr_str(xa+5, ya+6, "Passive Write-Line", fb->fr.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+8, "Data:", f->fb->nt.fb, 0, 1,
f->fb->nsnt.fb, f->fb->nt.fb);
e_pr_str(xa+5, ya+9, "Active Marked ", f->fb->fz.fb, 0, 0, 0, 0);
e_pr_str(xa+5, ya+10, "Passive Marked", f->fb->frft.fb, 0, 0, 0, 0);
e_pr_str(xa+5, ya+11, "Data Text ", f->fb->ft.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+13, "Switches:", f->fb->nt.fb, 0, 1,
f->fb->nsnt.fb, f->fb->nt.fb);
e_pr_str(xa+5, ya+14, "[X] Active Switch ", f->fb->fsm.fb, 0, 0, 0, 0);
e_pr_str(xa+5, ya+15, "[ ] Passive Switch", f->fb->fs.fb, 4, 1,
f->fb->nsft.fb, f->fb->fs.fb);
e_pr_str(xa+6 , ye-2, "Button", f->fb->nz.fb, 0, -1,
f->fb->ns.fb, f->fb->nt.fb);
e_pr_str(xe-12 , ye-2, "Active", f->fb->nm.fb, 0, -1,
f->fb->nm.fb, f->fb->nt.fb);
#ifdef NEWSTYLE
if (WpeIsXwin())
{
e_make_xrect(xa+4, ya+3, xa+23, ya+3, 1);
e_make_xrect(xa+4, ya+6, xa+23, ya+6, 1);
e_make_xrect(xa+4, ya+9, xa+19, ya+11, 1);
e_make_xrect_abs(xa+4, ya+9, xa+19, ya+9, 0);
e_make_xrect(xa+4, ya+14, xa+23, ya+15, 1);
e_make_xrect_abs(xa+4, ya+14, xa+23, ya+14, 0);
}
#endif
}
else
{
e_std_rahmen(xa, ya, xe, ye, "Filename", 1, fb->er.fb, fb->es.fb);
e_mouse_bar(xe, ya+1, ye-ya-1, 0, fb->em.fb);
e_mouse_bar(xa+20, ye, 11, 1, fb->em.fb);
e_pr_char(xe-3, ya, WZN, fb->es.fb);
#ifdef NEWSTYLE
if (!WpeIsXwin())
{
#endif
e_pr_char(xe-4, ya, '[', fb->er.fb);
e_pr_char(xe-2, ya, ']', fb->er.fb);
#ifdef NEWSTYLE
}
else e_make_xrect(xe-4, ya, xe-2, ya, 0);
#endif
for (i = ya+1; i < ye; i++) e_blk(xe-xa-1, xa+1, i, fb->et.fb);
if (md == 3)
{
e_pr_str(xa+4, ya+3, "#Preprozessor Comands", fb->cp.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+5, "This are C-Text Colors", fb->ct.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+7, "int char {} [] ; ,", fb->cr.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+9, "\"Constants\" 12 0x13", fb->ck.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+11, "/* Comments */", fb->cc.fb, 0, 0, 0, 0);
}
else
{
e_pr_str(xa+4, ya+3, "This are the Editor Colors", fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+4, "And this is a marked Line", fb->ez.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+5, "This is a found word", fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+14, ya+5, "found", fb->ek.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+8, "Help Header", fb->hh.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+9, "This is a marked Word", fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+14, ya+9, "marked", fb->hm.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+10, "in the Help File", fb->et.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+11, "Help Button", fb->hb.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+14, "This is a Breakpoint", fb->db.fb, 0, 0, 0, 0);
e_pr_str(xa+4, ya+15, "Stop at Breakpoint", fb->dy.fb, 0, 0, 0, 0);
}
}
frb[sw] = e_s_clr(frb[sw].f, frb[sw].b);
}
/* Save - Options - Menu */
int e_opt_save(FENSTER *f)
{
int ret;
char tmp[256];
strcpy(tmp, f->ed->optfile);
ret = e_add_arguments(tmp, "Save Option File", f, 0, AltS, NULL);
if (ret)
{
f->ed->optfile = REALLOC(f->ed->optfile, (strlen(tmp)+1)*sizeof(char));
strcpy(f->ed->optfile, tmp);
e_save_opt(f);
}
return(ret);
}
char *WpeStringToValue(const char *str)
{
char *answer, *cur_ans;
const char *cur_str;
int i, len;
len = strlen(str);
answer = WpeMalloc((len * 2) * sizeof(char));
for (i = strlen(str), cur_ans = answer, cur_str = str; i; i--, cur_str++)
{
if ((*cur_str == '\n') || (*cur_str == '\\'))
{
len++;
cur_ans[0] = '\\';
cur_ans[1] = ((*cur_str == '\n') ? 'n' : '\\');
cur_ans++;
}
else
*cur_ans = *cur_str;
cur_ans++;
}
*cur_ans = 0;
return answer;
}
char *WpeValueToString(const char *value)
{
char *answer, *cur_ans;
const char *cur_val;
int i;
answer = WpeMalloc((strlen(value) + 1) * sizeof(char));
for (i = strlen(value), cur_ans = answer, cur_val = value; i; i--, cur_ans++)
{
if (*cur_val == '\\')
{
cur_val++;
*cur_ans = ((*cur_val == 'n') ? '\n' : '\\');
}
else
*cur_ans = *cur_val;
cur_val++;
}
*cur_ans = 0;
return answer;
}
int WpeReadGeneral(ECNT *cn, char *section, char *option, char *value)
{
if (WpeStrccmp("Data", option) == 0)
cn->dtmd = atoi(value);
else if (WpeStrccmp("Autosave", option) == 0)
cn->autosv = atoi(value);
else if (WpeStrccmp("MaxColumn", option) == 0)
cn->maxcol = atoi(value);
else if (WpeStrccmp("Tab", option) == 0)
cn->tabn = atoi(value);
else if (WpeStrccmp("MaxChanges", option) == 0)
cn->maxchg = atoi(value);
else if (WpeStrccmp("NumUndo", option) == 0)
cn->numundo = atoi(value);
else if (WpeStrccmp("Options1", option) == 0)
cn->flopt = atoi(value);
else if (WpeStrccmp("Options2", option) == 0)
cn->edopt = atoi(value);
else if (WpeStrccmp("InfoDir", option) == 0)
info_file = WpeStrdup(value);
else if (WpeStrccmp("AutoIndent", option) == 0)
cn->autoindent = atoi(value);
else if (WpeStrccmp("PrintCmd", option) == 0)
cn->print_cmd = WpeStrdup(value);
else if (WpeStrccmp("Version", option) == 0)
{
sscanf(value, "%d.%d.%d", &cn->major, &cn->minor, &cn->patch);
}
return 0;
}
int WpeWriteGeneral(ECNT *cn, char *section, FILE *opt_file)
{
fprintf(opt_file, "Version : %s\n", VERSION);
fprintf(opt_file, "Data : %d\n", cn->dtmd);
fprintf(opt_file, "Autosave : %d\n", cn->autosv);
fprintf(opt_file, "MaxColumn : %d\n", cn->maxcol);
fprintf(opt_file, "Tab : %d\n", cn->tabn);
fprintf(opt_file, "MaxChanges : %d\n", cn->maxchg);
fprintf(opt_file, "NumUndo : %d\n", cn->numundo);
fprintf(opt_file, "Options1 : %d\n", cn->flopt);
fprintf(opt_file, "Options2 : %d\n", cn->edopt);
fprintf(opt_file, "InfoDir : %s\n", info_file);
fprintf(opt_file, "AutoIndent : %d\n", cn->autoindent);
fprintf(opt_file, "PrintCmd : %s\n", cn->print_cmd);
return 0;
}
int WpeReadColor(ECNT *cn, char *section, char *option, char *value)
{
FARBE *fb = NULL;
COLOR *c = NULL;
int convert = 0; /* Convert old X11 colors to new colors */
if (WpeStrccmp("Term", section + strlen(OPT_SECTION_COLOR) + 1) == 0)
{
if (!u_fb)
{
u_fb = WpeMalloc(sizeof(FARBE));
FARBE_Init(u_fb);
}
fb = u_fb;
}
if (WpeStrccmp("X11", section + strlen(OPT_SECTION_COLOR) + 1) == 0)
{
if (!x_fb)
{
x_fb = WpeMalloc(sizeof(FARBE));
FARBE_Init(x_fb);
}
fb = x_fb;
if ((cn->major <= 1) && (cn->minor <= 5) && (cn->patch <= 27))
convert = 1;
}
if (WpeStrccmp("er", option) == 0)
c = &fb->er;
else if (WpeStrccmp("es", option) == 0)
c = &fb->es;
else if (WpeStrccmp("et", option) == 0)
c = &fb->et;
else if (WpeStrccmp("ez", option) == 0)
c = &fb->ez;
else if (WpeStrccmp("ek", option) == 0)
c = &fb->ek;
else if (WpeStrccmp("em", option) == 0)
c = &fb->em;
else if (WpeStrccmp("hh", option) == 0)
c = &fb->hh;
else if (WpeStrccmp("hb", option) == 0)
c = &fb->hb;
else if (WpeStrccmp("hm", option) == 0)
c = &fb->hm;
else if (WpeStrccmp("db", option) == 0)
c = &fb->db;
else if (WpeStrccmp("dy", option) == 0)
c = &fb->dy;
else if (WpeStrccmp("mr", option) == 0)
c = &fb->mr;
else if (WpeStrccmp("ms", option) == 0)
c = &fb->ms;
else if (WpeStrccmp("mt", option) == 0)
c = &fb->mt;
else if (WpeStrccmp("mz", option) == 0)
c = &fb->mz;
else if (WpeStrccmp("df", option) == 0)
c = &fb->df;
else if (WpeStrccmp("nr", option) == 0)
c = &fb->nr;
else if (WpeStrccmp("ne", option) == 0)
c = &fb->ne;
else if (WpeStrccmp("nt", option) == 0)
c = &fb->nt;
else if (WpeStrccmp("nsnt", option) == 0)
c = &fb->nsnt;
else if (WpeStrccmp("fr", option) == 0)
c = &fb->fr;
else if (WpeStrccmp("fa", option) == 0)
c = &fb->fa;
else if (WpeStrccmp("ft", option) == 0)
c = &fb->ft;
else if (WpeStrccmp("fz", option) == 0)
c = &fb->fz;
else if (WpeStrccmp("frft", option) == 0)
c = &fb->frft;
else if (WpeStrccmp("fs", option) == 0)
c = &fb->fs;
else if (WpeStrccmp("nsft", option) == 0)
c = &fb->nsft;
else if (WpeStrccmp("fsm", option) == 0)
c = &fb->fsm;
else if (WpeStrccmp("nz", option) == 0)
c = &fb->nz;
else if (WpeStrccmp("ns", option) == 0)
c = &fb->ns;
else if (WpeStrccmp("nm", option) == 0)
c = &fb->nm;
else if (WpeStrccmp("of", option) == 0)
c = &fb->of;
else if (WpeStrccmp("ct", option) == 0)
c = &fb->ct;
else if (WpeStrccmp("cr", option) == 0)
c = &fb->cr;
else if (WpeStrccmp("ck", option) == 0)
c = &fb->ck;
else if (WpeStrccmp("cp", option) == 0)
c = &fb->cp;
else if (WpeStrccmp("cc", option) == 0)
c = &fb->cc;
else if (WpeStrccmp("dc", option) == 0)
fb->dc = atoi(value);
else if (WpeStrccmp("ws", option) == 0)
fb->ws = atoi(value);
if (c != NULL)
{
sscanf(value, "%d%d", &c->f, &c->b);
if (convert)
{
switch (c->f)
{
case 1: c->f = 4; break;
case 3: c->f = 6; break;
case 4: c->f = 1; break;
case 6: c->f = 3; break;
case 9: c->f = 12; break;
case 11: c->f = 14; break;
case 12: c->f = 9; break;
case 14: c->f = 11; break;
default: break;
}
switch (c->b)
{
case 1: c->b = 4; break;
case 3: c->b = 6; break;
case 4: c->b = 1; break;
case 6: c->b = 3; break;
case 9: c->b = 12; break;
case 11: c->b = 14; break;
case 12: c->b = 9; break;
case 14: c->b = 11; break;
default: break;
}
}
*c = e_s_clr(c->f, c->b);
}
return 0;
}
int WpeWriteColor(ECNT *cn, char *section, FILE *opt_file)
{
FARBE *fb;
if (WpeStrccmp("Term", section + strlen(OPT_SECTION_COLOR) + 1) == 0)
fb = u_fb;
if (WpeStrccmp("X11", section + strlen(OPT_SECTION_COLOR) + 1) == 0)
fb = x_fb;
fprintf(opt_file, "er : %d %d\n", fb->er.f, fb->er.b);
fprintf(opt_file, "es : %d %d\n", fb->es.f, fb->es.b);
fprintf(opt_file, "et : %d %d\n", fb->et.f, fb->et.b);
fprintf(opt_file, "ez : %d %d\n", fb->ez.f, fb->ez.b);
fprintf(opt_file, "ek : %d %d\n", fb->ek.f, fb->ek.b);
fprintf(opt_file, "em : %d %d\n", fb->em.f, fb->em.b);
fprintf(opt_file, "hh : %d %d\n", fb->hh.f, fb->hh.b);
fprintf(opt_file, "hb : %d %d\n", fb->hb.f, fb->hb.b);
fprintf(opt_file, "hm : %d %d\n", fb->hm.f, fb->hm.b);
fprintf(opt_file, "db : %d %d\n", fb->db.f, fb->db.b);
fprintf(opt_file, "dy : %d %d\n", fb->dy.f, fb->dy.b);
fprintf(opt_file, "mr : %d %d\n", fb->mr.f, fb->mr.b);
fprintf(opt_file, "ms : %d %d\n", fb->ms.f, fb->ms.b);
fprintf(opt_file, "mt : %d %d\n", fb->mt.f, fb->mt.b);
fprintf(opt_file, "mz : %d %d\n", fb->mz.f, fb->mz.b);
fprintf(opt_file, "df : %d %d\n", fb->df.f, fb->df.b);
fprintf(opt_file, "nr : %d %d\n", fb->nr.f, fb->nr.b);
fprintf(opt_file, "ne : %d %d\n", fb->ne.f, fb->ne.b);
fprintf(opt_file, "nt : %d %d\n", fb->nt.f, fb->nt.b);
fprintf(opt_file, "nsnt : %d %d\n", fb->nsnt.f, fb->nsnt.b);
fprintf(opt_file, "fr : %d %d\n", fb->fr.f, fb->fr.b);
fprintf(opt_file, "fa : %d %d\n", fb->fa.f, fb->fa.b);
fprintf(opt_file, "ft : %d %d\n", fb->ft.f, fb->ft.b);
fprintf(opt_file, "fz : %d %d\n", fb->fz.f, fb->fz.b);
fprintf(opt_file, "frft : %d %d\n", fb->frft.f, fb->frft.b);
fprintf(opt_file, "fs : %d %d\n", fb->fs.f, fb->fs.b);
fprintf(opt_file, "nsft : %d %d\n", fb->nsft.f, fb->nsft.b);
fprintf(opt_file, "fsm : %d %d\n", fb->fsm.f, fb->fsm.b);
fprintf(opt_file, "nz : %d %d\n", fb->nz.f, fb->nz.b);
fprintf(opt_file, "ns : %d %d\n", fb->ns.f, fb->ns.b);
fprintf(opt_file, "nm : %d %d\n", fb->nm.f, fb->nm.b);
fprintf(opt_file, "of : %d %d\n", fb->of.f, fb->of.b);
fprintf(opt_file, "ct : %d %d\n", fb->ct.f, fb->ct.b);
fprintf(opt_file, "cr : %d %d\n", fb->cr.f, fb->cr.b);
fprintf(opt_file, "ck : %d %d\n", fb->ck.f, fb->ck.b);
fprintf(opt_file, "cp : %d %d\n", fb->cp.f, fb->cp.b);
fprintf(opt_file, "cc : %d %d\n", fb->cc.f, fb->cc.b);
fprintf(opt_file, "dc : %d\n", fb->dc);
fprintf(opt_file, "ws : %d\n", fb->ws);
return 0;
}
int WpeReadProgramming(ECNT *cn, char *section, char *option, char *value)
{
if (WpeStrccmp("Arguments", option) == 0)
e_prog.arguments = WpeStrdup(value);
else if (WpeStrccmp("Project", option) == 0)
e_prog.project = WpeStrdup(value);
else if (WpeStrccmp("Exedir", option) == 0)
e_prog.exedir = WpeStrdup(value);
else if (WpeStrccmp("IncludePath", option) == 0)
e_prog.sys_include = WpeStrdup(value);
else if (WpeStrccmp("Debugger", option) == 0)
e_deb_type = atoi(value);
return 0;
}
int WpeWriteProgramming(ECNT *cn, char *section, FILE *opt_file)
{
fprintf(opt_file, "Arguments : %s\n", e_prog.arguments);
fprintf(opt_file, "Project : %s\n", e_prog.project);
fprintf(opt_file, "Exedir : %s\n", e_prog.exedir);
fprintf(opt_file, "IncludePath : %s\n", e_prog.sys_include);
fprintf(opt_file, "Debugger : %d\n", e_deb_type);
return 0;
}
int WpeReadLanguage(ECNT *cn, char *section, char *option, char *value)
{
int i, j;
char *strtmp;
for (i = 0;
(i < e_prog.num) && (WpeStrccmp(e_prog.comp[i]->language, section + strlen(OPT_SECTION_LANGUAGE) + 1) != 0);
i++)
;
if (i == e_prog.num)
{
e_prog.num++;
e_prog.comp = REALLOC(e_prog.comp, e_prog.num * sizeof(struct e_s_prog *));
e_prog.comp[i] = MALLOC(sizeof(struct e_s_prog));
e_prog.comp[i]->language = WpeStrdup(section + strlen(OPT_SECTION_LANGUAGE) + 1);
e_prog.comp[i]->compiler = WpeStrdup("");
e_prog.comp[i]->comp_str = WpeStrdup("");
e_prog.comp[i]->libraries = WpeStrdup("");
e_prog.comp[i]->exe_name = WpeStrdup("");
e_prog.comp[i]->filepostfix = (char **)WpeExpArrayCreate(0, sizeof(char *), 1);
e_prog.comp[i]->intstr = WpeStrdup("");
e_prog.comp[i]->key = '\0';
e_prog.comp[i]->comp_sw = 0;
e_prog.comp[i]->x = 0;
}
if (WpeStrccmp("Compiler", option) == 0)
{
if (e_prog.comp[i]->compiler)
FREE(e_prog.comp[i]->compiler);
e_prog.comp[i]->compiler = WpeStrdup(value);
}
else if (WpeStrccmp("CompilerOptions", option) == 0)
{
if (e_prog.comp[i]->comp_str)
FREE(e_prog.comp[i]->comp_str);
e_prog.comp[i]->comp_str = WpeStrdup(value);
}
else if (WpeStrccmp("Libraries", option) == 0)
{
if (e_prog.comp[i]->libraries)
FREE(e_prog.comp[i]->libraries);
e_prog.comp[i]->libraries = WpeStrdup(value);
}
else if (WpeStrccmp("Executable", option) == 0)
{
if (e_prog.comp[i]->exe_name)
FREE(e_prog.comp[i]->exe_name);
e_prog.comp[i]->exe_name = WpeStrdup(value);
}
else if (WpeStrccmp("FileExtension", option) == 0)
{
for (j = WpeExpArrayGetSize(e_prog.comp[i]->filepostfix); j; j--)
if (strcmp(e_prog.comp[i]->filepostfix[j - 1], value) == 0)
break;
if (j == 0)
{
strtmp = WpeStrdup(value);
WpeExpArrayAdd((void **)&e_prog.comp[i]->filepostfix, &strtmp);
}
}
else if (WpeStrccmp("MessageString", option) == 0)
{
if (e_prog.comp[i]->intstr)
FREE(e_prog.comp[i]->intstr);
e_prog.comp[i]->intstr = WpeValueToString(value);
}
else if (WpeStrccmp("Key", option) == 0)
e_prog.comp[i]->key = value[0];
else if (WpeStrccmp("CompilerSwitch", option) == 0)
e_prog.comp[i]->comp_sw = atoi(value);
else if (WpeStrccmp("X", option) == 0)
e_prog.comp[i]->x = atoi(value);
return 0;
}
int WpeWriteLanguage(ECNT *cn, char *section, FILE *opt_file)
{
int i, j;
char *str_tmp;
for (i = 0;
(i < e_prog.num) && (WpeStrccmp(e_prog.comp[i]->language, section + strlen(OPT_SECTION_LANGUAGE) + 1) != 0);
i++)
;
if (i < e_prog.num)
{
fprintf(opt_file, "Compiler : %s\n", e_prog.comp[i]->compiler);
fprintf(opt_file, "CompilerOptions : %s\n", e_prog.comp[i]->comp_str);
fprintf(opt_file, "Libraries : %s\n", e_prog.comp[i]->libraries);
fprintf(opt_file, "Executable : %s\n", e_prog.comp[i]->exe_name);
for (j = WpeExpArrayGetSize(e_prog.comp[i]->filepostfix); j; j--)
fprintf(opt_file, "FileExtension : %s\n", e_prog.comp[i]->filepostfix[j - 1]);
str_tmp = WpeStringToValue(e_prog.comp[i]->intstr);
fprintf(opt_file, "MessageString : %s\n", str_tmp);
WpeFree(str_tmp);
fprintf(opt_file, "CompilerSwitch : %d\n", e_prog.comp[i]->comp_sw);
fprintf(opt_file, "Key : %c\n", e_prog.comp[i]->key);
fprintf(opt_file, "X : %d\n", e_prog.comp[i]->x);
}
return 0;
}
/* save options */
int e_save_opt(FENSTER *f)
{
ECNT *cn = f->ed;
FILE *fp;
int i;
char *str_line;
str_line = MALLOC((strlen(cn->optfile)+1)*sizeof(char));
strcpy(str_line, cn->optfile);
for (i = strlen(str_line); i > 0 && str_line[i] != DIRC; i--);
str_line[i] = '\0';
if (access(str_line, 0)) mkdir(str_line, 0700);
FREE(str_line);
fp = fopen(cn->optfile, "w");
if (fp == NULL)
{
e_error(e_msg[ERR_OPEN_OPF], 0, f->fb);
return(-1);
}
str_line = OPT_SECTION_GENERAL;
fprintf(fp, "[%s]\n", str_line);
WpeWriteGeneral(cn, str_line, fp);
str_line = MALLOC(strlen(OPT_SECTION_COLOR) + 10);
strcpy(str_line, OPT_SECTION_COLOR);
if (u_fb)
{
strcat(str_line, "/Term");
fprintf(fp, "[%s]\n", str_line);
WpeWriteColor(cn, str_line, fp);
}
if (x_fb)
{
strcpy(str_line + strlen(OPT_SECTION_COLOR), "/X11");
fprintf(fp, "[%s]\n", str_line);
WpeWriteColor(cn, str_line, fp);
}
FREE(str_line);
str_line = OPT_SECTION_PROGRAMMING;
fprintf(fp, "[%s]\n", str_line);
WpeWriteProgramming(cn, str_line, fp);
str_line = MALLOC(strlen(OPT_SECTION_LANGUAGE) + 2);
strcpy(str_line, OPT_SECTION_LANGUAGE);
strcat(str_line, "/");
for (i = 0; i < e_prog.num; i++)
{
str_line = REALLOC(str_line, strlen(OPT_SECTION_LANGUAGE) + strlen(e_prog.comp[i]->language) + 2);
strcpy(str_line + strlen(OPT_SECTION_LANGUAGE) + 1, e_prog.comp[i]->language);
fprintf(fp, "[%s]\n", str_line);
WpeWriteLanguage(cn, str_line, fp);
}
FREE(str_line);
fclose(fp);
return 0;
}
int e_opt_read(ECNT *cn)
{
FILE *fp;
char *str_line;
char *section;
char *option;
char *value;
char *str_tmp;
int sz;
int i;
fp = fopen(cn->optfile, "r");
if (fp == NULL)
{
char *file = e_mkfilename(LIBRARY_DIR, OPTION_FILE);
fp = fopen(file, "r");
FREE(file);
}
if (fp == NULL) return(0);
sz = 256;
str_line = (char *)WpeMalloc(256 * sizeof(char));
section = NULL;
while (!feof(fp))
{
if (sz != 256)
{
sz = 256;
str_line = (char *)WpeRealloc(str_line, sz * sizeof(char));
}
str_line[0] = 0;
fgets(str_line, sz, fp);
while ((!feof(fp)) &&
((str_line[0] == 0) || (str_line[strlen(str_line) - 1] != '\n')))
{
sz += 255;
str_line = (char *)WpeRealloc(str_line, sz * sizeof(char));
fgets(str_line + sz - 256, 256, fp);
}
i = strlen(str_line);
if (i && (str_line[i - 1] == '\n'))
str_line[i - 1] = 0;
for (option = str_line; isspace(*option); option++)
;
if ((*option) && (*option != '#'))
{
if (*option == '[')
{
if (section)
WpeFree(section);
for (value = option + 1; (*value) && (*value != ']'); value++)
;
if (*value != ']')
{
WpeFree(str_line);
return ERR_READ_OPF;
}
*value = 0;
section = WpeStrdup(option + 1);
}
else
{
value = strchr(option, ':');
if ((value == NULL) || (value == option))
{
WpeFree(str_line);
return ERR_READ_OPF;
}
for (str_tmp = value - 1; isspace(*str_tmp); str_tmp--)
;
for (value++; isspace(*value); value++)
;
str_tmp++;
*str_tmp = 0;
for (i = 0;
(i < OPTION_SECTIONS) &&
(strncmp(WpeSectionRead[i].section, section, strlen(WpeSectionRead[i].section)) != 0);
i++)
;
if (i < OPTION_SECTIONS)
(*WpeSectionRead[i].function)(cn, section, option, value);
else
return ERR_READ_OPF;
}
}
}
fclose(fp);
return 0;
}
/* window for entering a text line */
int e_add_arguments(char *str, char *head, FENSTER *f, int n, int sw,
struct dirfile **df)
{
int ret;
char *tmp = MALLOC((strlen(head)+2) * sizeof(char));
W_OPTSTR *o = e_init_opt_kst(f);
if (!o || !tmp)
return(-1);
o->xa = 20; o->ya = 4; o->xe = 57; o->ye = 11;
o->bgsw = 0;
o->name = head;
o->crsw = AltO;
sprintf(tmp, "%s:", head);
e_add_wrstr(4, 2, 4, 3, 30, 128, n, sw, tmp, str, df, o);
e_add_bttstr(7, 5, 1, AltO, " Ok ", NULL, o);
e_add_bttstr(24, 5, -1, WPE_ESC, "Cancel", NULL, o);
FREE(tmp);
ret = e_opt_kst(o);
if (ret != WPE_ESC)
strcpy(str, o->wstr[0]->txt);
freeostr(o);
return(ret == WPE_ESC ? 0 : 1);
}
W_O_TXTSTR **e_add_txtstr(int x, int y, char *txt, W_OPTSTR *o)
{
if (o->tn == 0)
o->tstr = MALLOC(1);
(o->tn)++;
if (!(o->tstr = REALLOC(o->tstr, o->tn * sizeof(W_O_TXTSTR *))))
return(NULL);
if (!(o->tstr[o->tn-1] = MALLOC(sizeof(W_O_TXTSTR))))
return(NULL);
if (!(o->tstr[o->tn-1]->txt = MALLOC((strlen(txt)+1) * sizeof(char))))
return(NULL);
o->tstr[o->tn-1]->x = x;
o->tstr[o->tn-1]->y = y;
strcpy(o->tstr[o->tn-1]->txt, txt);
return(o->tstr);
}
W_O_WRSTR **e_add_wrstr(int xt, int yt, int xw, int yw, int nw, int wmx,
int nc, int sw, char *header, char *txt, struct dirfile **df, W_OPTSTR *o)
{
if (o->wn == 0)
o->wstr = MALLOC(1);
(o->wn)++;
if (!(o->wstr = REALLOC(o->wstr, o->wn * sizeof(W_O_WRSTR *))))
return(NULL);
if (!(o->wstr[o->wn-1] = MALLOC(sizeof(W_O_WRSTR))))
return(NULL);
if (!(o->wstr[o->wn-1]->txt = MALLOC((wmx+1) * sizeof(char))))
return(NULL);
if (!(o->wstr[o->wn-1]->header = MALLOC((strlen(header)+1) * sizeof(char))))
return(NULL);
o->wstr[o->wn-1]->xt = xt;
o->wstr[o->wn-1]->yt = yt;
o->wstr[o->wn-1]->xw = xw;
o->wstr[o->wn-1]->yw = yw;
o->wstr[o->wn-1]->nw = nw;
o->wstr[o->wn-1]->wmx = wmx;
o->wstr[o->wn-1]->nc = nc;
o->wstr[o->wn-1]->sw = sw;
o->wstr[o->wn-1]->df = df;
strcpy(o->wstr[o->wn-1]->header, header);
strcpy(o->wstr[o->wn-1]->txt, txt);
return(o->wstr);
}
W_O_NUMSTR **e_add_numstr(int xt, int yt, int xw, int yw, int nw, int wmx,
int nc, int sw, char *header, int num, W_OPTSTR *o)
{
if (o->nn == 0)
o->nstr = MALLOC(1);
(o->nn)++;
if (!(o->nstr = REALLOC(o->nstr, o->nn * sizeof(W_O_NUMSTR *))))
return(NULL);
if (!(o->nstr[o->nn-1] = MALLOC(sizeof(W_O_NUMSTR))))
return(NULL);
if (!(o->nstr[o->nn-1]->header = MALLOC((strlen(header)+1) * sizeof(char))))
return(NULL);
o->nstr[o->nn-1]->xt = xt;
o->nstr[o->nn-1]->yt = yt;
o->nstr[o->nn-1]->xw = xw;
o->nstr[o->nn-1]->yw = yw;
o->nstr[o->nn-1]->nw = nw;
o->nstr[o->nn-1]->wmx = wmx;
o->nstr[o->nn-1]->nc = nc;
o->nstr[o->nn-1]->sw = sw;
o->nstr[o->nn-1]->num = num;
strcpy(o->nstr[o->nn-1]->header, header);
return(o->nstr);
}
W_O_SSWSTR **e_add_sswstr(int x, int y, int nc, int sw, int num,
char *header, W_OPTSTR *o)
{
if (o->sn == 0)
o->sstr = MALLOC(1);
(o->sn)++;
if (!(o->sstr = REALLOC(o->sstr, o->sn * sizeof(W_O_SSWSTR *))))
return(NULL);
if (!(o->sstr[o->sn-1] = MALLOC(sizeof(W_O_SSWSTR))))
return(NULL);
if (!(o->sstr[o->sn-1]->header = MALLOC((strlen(header)+1) * sizeof(char))))
return(NULL);
o->sstr[o->sn-1]->x = x;
o->sstr[o->sn-1]->y = y;
o->sstr[o->sn-1]->nc = nc;
o->sstr[o->sn-1]->sw = sw;
o->sstr[o->sn-1]->num = num;
strcpy(o->sstr[o->sn-1]->header, header);
return(o->sstr);
}
W_O_SPSWSTR **e_add_spswstr(int n, int x, int y, int nc, int sw,
char *header, W_OPTSTR *o)
{
if (n >= o->pn)
return(NULL);
if (n < 0)
n = 0;
if (o->pstr[n]->np == 0)
o->pstr[n]->ps = MALLOC(1);
(o->pstr[n]->np)++;
if (!(o->pstr[n]->ps = REALLOC(o->pstr[n]->ps, o->pstr[n]->np * sizeof(W_O_SPSWSTR *))))
return(NULL);
if (!(o->pstr[n]->ps[o->pstr[n]->np-1] = MALLOC(sizeof(W_O_SPSWSTR))))
return(NULL);
if (!(o->pstr[n]->ps[o->pstr[n]->np-1]->header = MALLOC((strlen(header)+1) * sizeof(char))))
return(NULL);
o->pstr[n]->ps[o->pstr[n]->np-1]->x = x;
o->pstr[n]->ps[o->pstr[n]->np-1]->y = y;
o->pstr[n]->ps[o->pstr[n]->np-1]->nc = nc;
o->pstr[n]->ps[o->pstr[n]->np-1]->sw = sw;
strcpy(o->pstr[n]->ps[o->pstr[n]->np-1]->header, header);
return(o->pstr[n]->ps);
}
W_O_PSWSTR **e_add_pswstr(int n, int x, int y, int nc, int sw, int num,
char *header, W_OPTSTR *o)
{
if (o->pn == 0)
o->pstr = MALLOC(1);
if (n >= o->pn)
{
n = o->pn;
(o->pn)++;
if (!(o->pstr = REALLOC(o->pstr, o->pn * sizeof(W_O_PSWSTR *))))
return(NULL);
if (!(o->pstr[o->pn-1] = MALLOC(sizeof(W_O_PSWSTR))))
return(NULL);
o->pstr[o->pn-1]->np = 0;
}
if (!e_add_spswstr(n, x, y, nc, sw, header, o))
return(NULL);
o->pstr[o->pn-1]->num = num;
return(o->pstr);
}
W_O_BTTSTR **e_add_bttstr(int x, int y, int nc, int sw, char *header,
int (*fkt)(FENSTER *f), W_OPTSTR *o)
{
if (o->bn == 0)
o->bstr = MALLOC(1);
(o->bn)++;
if (!(o->bstr = REALLOC(o->bstr, o->bn * sizeof(W_O_BTTSTR *))))
return(NULL);
if (!(o->bstr[o->bn-1] = MALLOC(sizeof(W_O_BTTSTR))))
return(NULL);
if (!(o->bstr[o->bn-1]->header = MALLOC((strlen(header)+1) * sizeof(char))))
return(NULL);
o->bstr[o->bn-1]->x = x;
o->bstr[o->bn-1]->y = y;
o->bstr[o->bn-1]->nc = nc;
o->bstr[o->bn-1]->sw = sw;
o->bstr[o->bn-1]->fkt = fkt;
strcpy(o->bstr[o->bn-1]->header, header);
return(o->bstr);
}
int freeostr(W_OPTSTR *o)
{
int i, j;
if (!o)
return(0);
for (i = 0; i < o->tn; i++)
{
FREE(o->tstr[i]->txt);
FREE(o->tstr[i]);
}
if (o->tn)
FREE(o->tstr);
for (i = 0; i < o->wn; i++)
{
FREE(o->wstr[i]->txt);
FREE(o->wstr[i]->header);
FREE(o->wstr[i]);
}
if (o->wn)
FREE(o->wstr);
for (i = 0; i < o->nn; i++)
{
FREE(o->nstr[i]->header);
FREE(o->nstr[i]);
}
if (o->nn)
FREE(o->nstr);
for (i = 0; i < o->pn; i++)
{
for (j = 0; j < o->pstr[i]->np; j++)
{
FREE(o->pstr[i]->ps[j]->header);
FREE(o->pstr[i]->ps[j]);
}
if (o->pstr[i]->np)
FREE(o->pstr[i]->ps);
FREE(o->pstr[i]);
}
if (o->pn)
FREE(o->pstr);
for (i = 0; i < o->bn; i++)
{
FREE(o->bstr[i]->header);
FREE(o->bstr[i]);
}
if (o->bn)
FREE(o->bstr);
FREE(o);
return(0);
}
W_OPTSTR *e_init_opt_kst(FENSTER *f)
{
W_OPTSTR *o = MALLOC(sizeof(W_OPTSTR));
if (!o)
return(NULL);
o->frt = f->fb->nr.fb;
o->frs = f->fb->ne.fb;
o->ftt = f->fb->nt.fb;
o->fts = f->fb->nsnt.fb;
o->fst = f->fb->fs.fb;
o->fss = f->fb->nsft.fb;
o->fsa = f->fb->fsm.fb;
o->fwt = f->fb->fr.fb;
o->fws = f->fb->fa.fb;
o->fbt = f->fb->nz.fb;
o->fbs = f->fb->ns.fb;
o->fbz = f->fb->nm.fb;
o->tn = o->sn = o->pn = o->bn = o->wn = o->nn = 0;
o->f = f;
o->pic = NULL;
return(o);
}
int e_opt_move(W_OPTSTR *o)
{
int xa = o->xa, ya = o->ya, xe = o->xe, ye = o->ye;
int c = 0;
PIC *pic;
e_std_rahmen(o->xa, o->ya, o->xe, o->ye, o->name, 0, o->frt, o->frs);
#ifndef NEWSTYLE
if (!WpeIsXwin())
pic = e_open_view(o->xa, o->ya, o->xe, o->ye, 0, 2);
else
{
pic = e_open_view(o->xa, o->ya, o->xe-2, o->ye-1, 0, 2);
e_close_view(pic, 2);
}
#else
pic = e_open_view(o->xa, o->ya, o->xe, o->ye, 0, 2);
#endif
while ((c = e_getch()) != WPE_ESC && c != WPE_CR)
{
switch(c)
{
case CLE:
if (xa > 0) { xa--; xe--; }
break;
case CRI:
if (xe < MAXSCOL-1) { xa++; xe++; }
break;
case CUP:
if (ya > 1) { ya--; ye--; }
break;
case CDO:
if (ye < MAXSLNS-2) { ya++; ye++; }
break;
}
if ( xa != o->xa || ya != o->ya || xe != o->xe || ye != o->ye)
{
o->xa = xa;
o->ya = ya;
o->xe = xe;
o->ye = ye;
o->pic = e_change_pic(o->xa, o->ya, o->xe, o->ye, o->pic, 1, o->frt);
if (o->pic == NULL)
e_error(e_msg[ERR_LOWMEM], 1, o->f->fb);
pic->a.x = o->xa; pic->a.y = o->ya;
pic->e.x = o->xe; pic->e.y = o->ye;
e_close_view(pic, 2);
}
}
pic->a.x = o->xa; pic->a.y = o->ya;
pic->e.x = o->xe; pic->e.y = o->ye;
e_close_view(pic, 1);
e_std_rahmen(o->xa, o->ya, o->xe, o->ye, o->name, 1, o->frt, o->frs);
return(c);
}
int e_get_sw_cmp(int xin, int yin, int x, int y, int xmin, int ymin, int c)
{
return
(
( c == 0 && yin == y && (xin-1 <= x && xin+xmin >= x)) ||
((c == CDO || c == BDO || c == WPE_TAB) && yin > y && (yin < ymin ||
(yin == ymin && xin <= x && xin > xmin)) ) ||
((c == CUP || c == BUP || c == WPE_BTAB) && yin < y && (yin > ymin ||
(yin == ymin && xin <=x && xin > xmin)) ) ||
((c == CLE || c == CCLE) && yin == y && xin < x && xin > xmin) ||
((c == CRI || c == CCRI) && yin == y && xin > x && xin < xmin) );
}
int e_get_opt_sw(int c, int x, int y, W_OPTSTR *o)
{
int i, j, xmin, ymin, ret = 0;
if( c != 0 && c != CUP && c != CDO && c != CLE && c != CRI && c != BUP &&
c != BDO && c != CCLE && c != CCRI && c != WPE_TAB && c != WPE_BTAB )
return(c);
xmin = (c == CRI || c == CCRI) ? o->xe : o->xa;
ymin = (c == CUP || c == BUP || c == WPE_BTAB) ? o->ya : o->ye;
x -= o->xa; xmin -= o->xa;
y -= o->ya; ymin -= o->ya;
for(i = 0; i < o->wn; i++)
{ if(e_get_sw_cmp(o->wstr[i]->xw, o->wstr[i]->yw, x, y,
c ? xmin : o->wstr[i]->nw, ymin, c))
{ xmin = o->wstr[i]->xw; ymin = o->wstr[i]->yw;
ret = o->wstr[i]->sw;
}
}
for(i = 0; i < o->nn; i++)
{ if(e_get_sw_cmp(o->nstr[i]->xw, o->nstr[i]->yw, x, y,
c ? xmin : o->nstr[i]->nw, ymin, c))
{ xmin = o->nstr[i]->xw; ymin = o->nstr[i]->yw;
ret = o->nstr[i]->sw;
}
}
for(i = 0; i < o->sn; i++)
{ if(e_get_sw_cmp(o->sstr[i]->x, o->sstr[i]->y, x, y,
c ? xmin : 2, ymin, c))
{ xmin = o->sstr[i]->x; ymin = o->sstr[i]->y;
ret = o->sstr[i]->sw;
}
}
for(i = 0; i < o->pn; i++)
for(j = 0; j < o->pstr[i]->np; j++)
{ if(e_get_sw_cmp(o->pstr[i]->ps[j]->x, o->pstr[i]->ps[j]->y, x, y,
c ? xmin : 2, ymin, c))
{ xmin = o->pstr[i]->ps[j]->x; ymin = o->pstr[i]->ps[j]->y;
ret = o->pstr[i]->ps[j]->sw;
}
}
for(i = 0; i < o->bn; i++)
{ if(e_get_sw_cmp(o->bstr[i]->x, o->bstr[i]->y, x, y,
c ? xmin : strlen(o->bstr[i]->header), ymin, c))
{ xmin = o->bstr[i]->x; ymin = o->bstr[i]->y;
ret = o->bstr[i]->sw;
}
}
return(!ret ? c : ret);
}
int e_opt_kst(W_OPTSTR *o)
{
int ret = 0, csv, sw = 1, i, j, num, cold, c = o->bgsw;
char *tmp;
fk_cursor(0);
o->pic = e_std_kst(o->xa, o->ya, o->xe, o->ye, o->name, 1, o->frt, o->ftt, o->frs);
if(o->pic == NULL) { e_error(e_msg[ERR_LOWMEM], 0, o->f->fb); return(-1); }
if(!c) c = e_get_opt_sw(CDO, 0, 0, o);
for(i = 0; i < o->tn; i++)
e_pr_str(o->xa+o->tstr[i]->x, o->ya+o->tstr[i]->y, o->tstr[i]->txt,
o->ftt, -1, 0, 0, 0);
for(i = 0; i < o->wn; i++)
{ e_pr_str(o->xa+o->wstr[i]->xt, o->ya+o->wstr[i]->yt, o->wstr[i]->header,
o->ftt, o->wstr[i]->nc, 1, o->fts, 0);
if(!o->wstr[i]->df)
e_schr_nchar(o->wstr[i]->txt, o->xa+o->wstr[i]->xw,
o->ya+o->wstr[i]->yw, 0, o->wstr[i]->nw, o->fwt);
else
e_schr_nchar_wsv(o->wstr[i]->txt, o->xa+o->wstr[i]->xw,
o->ya+o->wstr[i]->yw, 0, o->wstr[i]->nw, o->fwt, o->fws);
}
for(i = 0; i < o->nn; i++)
{ e_pr_str(o->xa+o->nstr[i]->xt, o->ya+o->nstr[i]->yt, o->nstr[i]->header,
o->ftt, o->nstr[i]->nc, 1, o->fts, 0);
e_schr_nzif(o->nstr[i]->num, o->xa+o->nstr[i]->xw, o->ya+o->nstr[i]->yw,
o->nstr[i]->nw, o->fwt);
}
for(i = 0; i < o->sn; i++)
{ e_pr_str(o->xa+o->sstr[i]->x+4, o->ya+o->sstr[i]->y, o->sstr[i]->header,
o->fst, o->sstr[i]->nc, 1, o->fss, 0);
#ifdef NEWSTYLE
if (WpeIsXwin())
e_pr_str(o->xa+o->sstr[i]->x, o->ya+o->sstr[i]->y, " ",
o->fst, -1, 1, 0, 0);
else
#endif
e_pr_str(o->xa+o->sstr[i]->x, o->ya+o->sstr[i]->y, "[ ]", o->fst, -1, 1, 0, 0);
}
for(i = 0; i < o->pn; i++)
{ for(j = 0; j < o->pstr[i]->np; j++)
{ e_pr_str(o->xa+o->pstr[i]->ps[j]->x, o->ya+o->pstr[i]->ps[j]->y, "[ ] ",
o->fst, -1, 1, 0, 0);
e_pr_str(o->xa+o->pstr[i]->ps[j]->x+4, o->ya+o->pstr[i]->ps[j]->y,
o->pstr[i]->ps[j]->header, o->fst, o->pstr[i]->ps[j]->nc,
1, o->fss, 0);
#ifdef NEWSTYLE
if (WpeIsXwin())
e_pr_str(o->xa+o->pstr[i]->ps[j]->x,
o->ya+o->pstr[i]->ps[j]->y, " ", o->fst, -1, 1, 0, 0);
else
#endif
e_pr_str(o->xa+o->pstr[i]->ps[j]->x, o->ya+o->pstr[i]->ps[j]->y, "[ ]", o->fst, -1, 1, 0, 0);
}
}
for(i = 0; i < o->bn; i++)
{ e_pr_str(o->xa+o->bstr[i]->x, o->ya+o->bstr[i]->y, o->bstr[i]->header,
o->fbt, o->bstr[i]->nc, -1, o->fbs, o->ftt);
}
cold = c;
while (c != WPE_ESC || sw)
{
#ifdef NEWSTYLE
if (WpeIsXwin())
{ for(i = 0; i < o->sn; i++)
{ if(o->sstr[i]->num)
e_make_xrect_abs(o->xa+o->sstr[i]->x, o->ya+o->sstr[i]->y,
o->xa+o->sstr[i]->x + 2, o->ya+o->sstr[i]->y, 1);
else
e_make_xrect_abs(o->xa+o->sstr[i]->x, o->ya+o->sstr[i]->y,
o->xa+o->sstr[i]->x + 2, o->ya+o->sstr[i]->y, 0);
}
for(i = 0; i < o->pn; i++)
for(j = 0; j < o->pstr[i]->np; j++)
{ if(o->pstr[i]->num == j)
e_make_xrect_abs(o->xa+o->pstr[i]->ps[j]->x, o->ya+o->pstr[i]->ps[j]->y,
o->xa+o->pstr[i]->ps[j]->x + 2, o->ya+o->pstr[i]->ps[j]->y, 1);
else
e_make_xrect_abs(o->xa+o->pstr[i]->ps[j]->x, o->ya+o->pstr[i]->ps[j]->y,
o->xa+o->pstr[i]->ps[j]->x+2, o->ya+o->pstr[i]->ps[j]->y, 0);
}
}
else
#endif
{ for(i = 0; i < o->sn; i++)
{ if(o->sstr[i]->num)
e_pr_char(o->xa+o->sstr[i]->x+1, o->ya+o->sstr[i]->y, 'X', o->fst);
else
e_pr_char(o->xa+o->sstr[i]->x+1, o->ya+o->sstr[i]->y, ' ', o->fst);
}
for(i = 0; i < o->pn; i++)
for(j = 0; j < o->pstr[i]->np; j++)
{ if(o->pstr[i]->num == j)
e_pr_char(o->xa+o->pstr[i]->ps[j]->x+1, o->ya+o->pstr[i]->ps[j]->y, SWSYM, o->fst);
else
e_pr_char(o->xa+o->pstr[i]->ps[j]->x+1, o->ya+o->pstr[i]->ps[j]->y, ' ', o->fst);
}
}
if((c == AF2 && !(o->f->ed->edopt & ED_CUA_STYLE))
|| (o->f->ed->edopt & ED_CUA_STYLE && c == CtrlL))
{ e_opt_move(o); c = cold; continue; }
for(i = 0; i < o->wn; i++)
if(o->wstr[i]->sw == c || (o->wstr[i]->nc >= 0 &&
toupper(c) == o->wstr[i]->header[o->wstr[i]->nc]))
{ cold = c;
tmp = MALLOC((o->wstr[i]->wmx + 1) * sizeof(char));
strcpy(tmp, o->wstr[i]->txt);
#if MOUSE
if(!o->wstr[i]->df && (c = e_schreib_leiste(tmp,
o->xa+o->wstr[i]->xw, o->ya+o->wstr[i]->yw,
o->wstr[i]->nw, o->wstr[i]->wmx, o->fwt, o->fws)) < 0)
c = e_opt_mouse(o);
else if(o->wstr[i]->df && (c = e_schr_lst_wsv(tmp,
o->xa+o->wstr[i]->xw, o->ya+o->wstr[i]->yw,
o->wstr[i]->nw, o->wstr[i]->wmx, o->fwt, o->fws,
o->wstr[i]->df, o->f)) < 0)
c = e_opt_mouse(o);
#else
if(!o->wstr[i]->df)
c = e_schreib_leiste(tmp,
o->xa+o->wstr[i]->xw, o->ya+o->wstr[i]->yw,
o->wstr[i]->nw, o->wstr[i]->wmx, o->fwt, o->fws);
else if(o->wstr[i]->df)
c = e_schr_lst_wsv(tmp,
o->xa+o->wstr[i]->xw, o->ya+o->wstr[i]->yw,
o->wstr[i]->nw, o->wstr[i]->wmx, o->fwt, o->fws,
o->wstr[i]->df, o->f);
#endif
if(c != WPE_ESC) strcpy(o->wstr[i]->txt, tmp);
csv = c;
if(!o->wstr[i]->df)
e_schr_nchar(o->wstr[i]->txt, o->xa+o->wstr[i]->xw,
o->ya+o->wstr[i]->yw, 0, o->wstr[i]->nw, o->fwt);
else
e_schr_nchar_wsv(o->wstr[i]->txt, o->xa+o->wstr[i]->xw,
o->ya+o->wstr[i]->yw, 0, o->wstr[i]->nw, o->fwt, o->fws);
if((c = e_get_opt_sw(c, o->xa+o->wstr[i]->xw,
o->ya+o->wstr[i]->yw, o)) != csv) sw = 1;
else sw = 0;
if(c == WPE_CR) c = o->crsw;
else if(c == WPE_ESC) ret = WPE_ESC;
free(tmp);
fk_cursor(0);
break;
}
if(i < o->wn) continue;
for(i = 0; i < o->nn; i++)
if(o->nstr[i]->sw == c || (o->nstr[i]->nc >= 0 &&
toupper(c) == o->nstr[i]->header[o->nstr[i]->nc]))
{ cold = c;
num = o->nstr[i]->num;
#if MOUSE
if((c = e_schreib_zif(&num, o->xa+o->nstr[i]->xw, o->ya+o->nstr[i]->yw,
o->nstr[i]->nw, o->fwt, o->fws)) < 0)
c = e_opt_mouse(o);
#else
c = e_schreib_zif(&num, o->xa+o->nstr[i]->xw, o->ya+o->nstr[i]->yw,
o->nstr[i]->nw, o->fwt, o->fws);
#endif
if(c != WPE_ESC) o->nstr[i]->num = num;
csv = c;
if((c = e_get_opt_sw(c, o->xa+o->nstr[i]->xw,
o->ya+o->nstr[i]->yw, o)) != csv) sw = 1;
else sw = 0;
if(c != cold) e_schr_nzif(o->nstr[i]->num, o->xa+o->nstr[i]->xw,
o->ya+o->nstr[i]->yw, o->nstr[i]->nw, o->fwt);
if(c == WPE_CR) c = o->crsw;
else if(c == WPE_ESC) ret = WPE_ESC;
fk_cursor(0);
break;
}
if(i < o->nn) continue;
for(i = 0; i < o->sn; i++)
if(o->sstr[i]->sw == c || (o->sstr[i]->nc >= 0 &&
toupper(c) == o->sstr[i]->header[o->sstr[i]->nc]))
{ if(!sw)
{ o->sstr[i]->num = !o->sstr[i]->num;
sw = 1;
c = cold;
break;
}
cold = c;
e_pr_str(o->xa+o->sstr[i]->x+4, o->ya+o->sstr[i]->y, o->sstr[i]->header,
o->fsa, o->sstr[i]->nc, 1, o->fsa, 0);
#if MOUSE
if((c = e_getch()) < 0) c = e_opt_mouse(o);
#else
c = e_getch();
#endif
if(c == WPE_CR) { sw = 0; c = cold; break; }
else if(c == WPE_ESC) sw = 1;
else
{ csv = c;
if((c = e_get_opt_sw(c, o->xa+o->sstr[i]->x,
o->ya+o->sstr[i]->y, o)) != csv) sw = 1;
else sw = 0;
}
if(c != cold)
e_pr_str(o->xa+o->sstr[i]->x+4, o->ya+o->sstr[i]->y, o->sstr[i]->header,
o->fst, o->sstr[i]->nc, 1, o->fss, 0);
break;
}
if(i < o->sn) continue;
for(i = 0; i < o->pn; i++)
{ for(j = 0; j < o->pstr[i]->np; j++)
if(o->pstr[i]->ps[j]->sw == c || (o->pstr[i]->ps[j]->nc >= 0 &&
toupper(c) == o->pstr[i]->ps[j]->header[o->pstr[i]->ps[j]->nc]))
{ if(!sw)
{ o->pstr[i]->num = j;
sw = 1;
c = cold;
break;
}
cold = c;
e_pr_str(o->xa+o->pstr[i]->ps[j]->x+4, o->ya+o->pstr[i]->ps[j]->y, o->pstr[i]->ps[j]->header,
o->fsa, o->pstr[i]->ps[j]->nc, 1, o->fsa, 0);
#if MOUSE
if((c = e_getch()) < 0) c = e_opt_mouse(o);
#else
c = e_getch();
#endif
if(c == WPE_CR) { sw = 0; c = cold; break; }
else if(c == WPE_ESC) sw = 1;
{ csv = c;
if((c = e_get_opt_sw(c, o->xa+o->pstr[i]->ps[j]->x,
o->ya+o->pstr[i]->ps[j]->y, o)) != csv) sw = 1;
else sw = 0;
}
if(c != cold)
e_pr_str(o->xa+o->pstr[i]->ps[j]->x+4, o->ya+o->pstr[i]->ps[j]->y, o->pstr[i]->ps[j]->header,
o->fst, o->pstr[i]->ps[j]->nc, 1, o->fss, 0);
break;
}
if(j < o->pstr[i]->np) break;
}
if(i < o->pn) continue;
for(i = 0; i < o->bn; i++)
if(o->bstr[i]->sw == c || (o->bstr[i]->nc >= 0 &&
toupper(c) == o->bstr[i]->header[o->bstr[i]->nc]))
{ e_pr_str(o->xa+o->bstr[i]->x, o->ya+o->bstr[i]->y, o->bstr[i]->header,
o->fbz, o->bstr[i]->nc, -1, o->fbz, o->ftt);
if(!sw)
{ if(o->bstr[i]->fkt != NULL)
{ if((ret = o->bstr[i]->fkt(o->f)) > 0) c = WPE_ESC;
else
{ c = cold;
e_pr_str(o->xa+o->bstr[i]->x, o->ya+o->bstr[i]->y, o->bstr[i]->header,
o->fbt, o->bstr[i]->nc, -1, o->fbs, o->ftt);
}
}
else { ret = o->bstr[i]->sw; c = WPE_ESC; }
break;
}
cold = c;
#if MOUSE
if((c = e_getch()) < 0) c = e_opt_mouse(o);
#else
c = e_getch();
#endif
if(c == WPE_CR) { ret = c = o->bstr[i]->sw; sw = 0; break; }
else if(c == WPE_ESC) { sw = 0; ret = WPE_ESC; break; }
csv = c;
if((c = e_get_opt_sw(c, o->xa+o->bstr[i]->x,
o->ya+o->bstr[i]->y, o)) != csv) sw = 1;
else sw = 0;
if(c != cold)
e_pr_str(o->xa+o->bstr[i]->x, o->ya+o->bstr[i]->y, o->bstr[i]->header,
o->fbt, o->bstr[i]->nc, -1, o->fbs, o->ftt);
break;
}
if(i < o->bn) continue;
c = cold;
sw = 1;
}
e_close_view(o->pic, 1);
return(ret);
}
int e_edt_options(FENSTER *f)
{
int i, ret, edopt = f->ed->edopt;
W_OPTSTR *o = e_init_opt_kst(f);
if (!o) return(-1);
o->xa = 15; o->ya = 3; o->xe = 64; o->ye = 22;
o->bgsw = AltO;
o->name = "Editor-Options";
o->crsw = AltO;
e_add_txtstr(3, 2, "Display:", o);
e_add_txtstr(25, 2, "Autosave:", o);
e_add_txtstr(25, 6, "Keys:", o);
e_add_txtstr(25, 10, "Auto-Indent:", o);
e_add_txtstr(3, 5, "Tile:", o);
e_add_numstr(3, 8, 19, 8, 3, 100, 0, AltM, "Max. Columns:", f->ed->maxcol, o);
e_add_numstr(3, 9, 20, 9, 2, 100, 0, AltT, "Tabstops:", f->ed->tabn, o);
e_add_numstr(3, 10, 19, 10, 3, 1000, 2, AltX, "MaX. Changes:", f->ed->maxchg, o);
e_add_numstr(3, 11, 20, 11, 2, 100, 0, AltN, "Num. Undo:", f->ed->numundo, o);
e_add_numstr(3, 12, 20, 12, 2, 100, 5, AltI, "Auto Ind. Col.:", f->ed->autoindent, o);
e_add_sswstr(4, 3, 0, AltS, f->ed->edopt & ED_SHOW_ENDMARKS ? 1 : 0, "Show Endmark ", o);
e_add_sswstr(26, 3, 1, AltP, f->ed->autosv & 1, "OPtions ", o);
e_add_sswstr(26, 4, 1, AltH, f->ed->autosv & 2 ? 1 : 0, "CHanges ", o);
e_add_sswstr(4, 6, 2, AltD, f->ed->edopt & ED_OLD_TILE_METHOD ? 1 : 0, "OlD Style ", o);
e_add_pswstr(0, 26, 7, 1, AltL, 0, "OLd-Style ", o);
e_add_pswstr(0, 26, 8, 0, AltC, f->ed->edopt & ED_CUA_STYLE, "CUA-Style ", o);
e_add_pswstr(1, 26, 11, 3, AltY, 0, "OnlY Source-Text", o);
e_add_pswstr(1, 26, 12, 2, AltW, 0, "AlWays ", o);
e_add_pswstr(1, 26, 13, 2, AltV,
(f->ed->edopt & ED_ALWAYS_AUTO_INDENT ? 1 : f->ed->edopt & ED_SOURCE_AUTO_INDENT ? 0 : 2),
"NeVer ", o);
e_add_wrstr(3, 14, 3, 15, 44, 128, 1, AltR, "PRint Command:",
f->ed->print_cmd, NULL, o);
e_add_bttstr(12, 17, 1, AltO, " Ok ", NULL, o);
e_add_bttstr(31, 17, -1, WPE_ESC, "Cancel", NULL, o);
ret = e_opt_kst(o);
if (ret != WPE_ESC)
{
f->ed->autosv = o->sstr[1]->num + (o->sstr[2]->num << 1);
f->ed->maxcol = o->nstr[0]->num;
f->ed->tabn = o->nstr[1]->num;
f->ed->maxchg = o->nstr[2]->num;
f->ed->numundo = o->nstr[3]->num;
f->ed->autoindent = o->nstr[4]->num;
f->ed->edopt = ((f->ed->edopt & ~ED_EDITOR_OPTIONS) + o->pstr[0]->num) +
(o->pstr[1]->num == 0 ? ED_SOURCE_AUTO_INDENT : 0) +
(o->pstr[1]->num == 1 ? ED_ALWAYS_AUTO_INDENT : 0) +
(o->sstr[3]->num ? ED_OLD_TILE_METHOD : 0) +
(o->sstr[0]->num ? ED_SHOW_ENDMARKS : 0);
if (f->ed->print_cmd)
WpeFree(f->ed->print_cmd);
f->ed->print_cmd = WpeStrdup(o->wstr[0]->txt);
if (edopt != f->ed->edopt)
{
e_switch_blst(f->ed);
for (i = 0; i <= f->ed->mxedt; i++)
if ((f->ed->edopt & ED_ALWAYS_AUTO_INDENT) ||
((f->ed->edopt & ED_SOURCE_AUTO_INDENT) && f->ed->f[i]->c_st))
f->ed->f[i]->flg = 1;
else
f->ed->f[i]->flg = 0;
e_repaint_desk(f);
}
}
freeostr(o);
return(0);
}
int e_read_help_str()
{
FILE *fp;
char str[128];
int i, len;
sprintf(str, "%s/help.key", LIBRARY_DIR);
for (i = 0; i < E_HLP_NUM; i++)
{
e_hlp_str[i] = MALLOC(sizeof(char));
*e_hlp_str[i] = '\0';
}
if (!(fp = fopen(str, "rb")))
return(-1);
for (i = 0; i < E_HLP_NUM && fgets(str, 128, fp); i++)
{
len = strlen(str);
if (str[len-1] == '\n')
str[--len] = '\0';
e_hlp_str[i] = REALLOC(e_hlp_str[i], (len+1)*sizeof(char));
strcpy(e_hlp_str[i], str);
}
fclose(fp);
return(i == E_HLP_NUM ? 0 : -2);
}
syntax highlighted by Code2HTML, v. 0.9.1