/* we_block.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 <ctype.h>
extern int e_undo_sw;
/* delete block */
int e_blck_del(FENSTER *f)
{
BUFFER *b;
SCHIRM *s;
int i,y,len;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b; s = f->s;
if ((s->mark_end.y < s->mark_begin.y) ||
((s->mark_begin.y == s->mark_end.y) && (s->mark_end.x <= s->mark_begin.x)))
{
return(0);
}
if (f->ins == 8)
return(WPE_ESC);
if (s->mark_begin.y == s->mark_end.y)
{
e_del_nchar(b, s, s->mark_begin.x, s->mark_begin.y,
s->mark_end.x - s->mark_begin.x);
b->b.x = s->mark_end.x = s->mark_begin.x;
}
else
{
/***********************/
y=s->mark_begin.y;
if(s->mark_begin.x>0) y++;
len=y-s->mark_end.y+1;
/***********************/
e_add_undo('d', b, s->mark_begin.x, s->mark_begin.y, 0);
f->save = b->cn->maxchg + 1;
/***********************/
e_brk_recalc(f,y,len);
/***********************/
}
sc_txt_1(f);
e_cursor(f, 1);
e_schirm(f, 1);
return(0);
}
/* dup selected block BD*/
int e_blck_dup(char *dup, FENSTER *f)
{
BUFFER *b;
SCHIRM *s;
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
if (f->ins == 8)
return(0);
b = f->b; s = f->s;
i=s->mark_end.x - s->mark_begin.x;
/* Brian thinks that 80 characters is enough. For the time being return
nothing if longer than that. */
if ((s->mark_end.y != s->mark_begin.y) || (i <= 0) || (i >= 80))
{
return(0);
}
strncpy(dup, &b->bf[s->mark_begin.y].s[s->mark_begin.x], i);
dup[i]=0;
return(i);
}
int e_blck_clear(BUFFER *b, SCHIRM *s)
{
int i;
int len = (s->mark_end.y-s->mark_begin.y-1);
if (s->mark_end.y == s->mark_begin.y)
{
e_del_nchar(b, s, s->mark_begin.x, s->mark_end.y,
s->mark_end.x - s->mark_begin.x);
b->b.x = s->mark_end.x = s->mark_begin.x;
b->b.y = s->mark_end.y = s->mark_begin.y;
return(0);
}
for (i = s->mark_begin.y + 1; i < s->mark_end.y; i++)
FREE(b->bf[i].s);
for (i = s->mark_begin.y + 1; i <= b->mxlines-len; i++)
b->bf[i] = b->bf[i+len];
(b->mxlines) -= len;
(s->mark_end.y) -= len;
e_del_nchar(b, s, 0, s->mark_end.y, s->mark_end.x);
if (*(b->bf[s->mark_begin.y].s+(len = b->bf[s->mark_begin.y].len)) != '\0')
len++;
e_del_nchar(b, s, s->mark_begin.x, s->mark_begin.y, len - s->mark_begin.x);
b->b.x = s->mark_end.x = s->mark_begin.x;
b->b.y = s->mark_end.y = s->mark_begin.y;
return(0);
}
/* write buffer to screen */
int e_show_clipboard(FENSTER *f)
{
ECNT *cn = f->ed;
FENSTER *fo;
int i, j;
for (j = 1; j <= cn->mxedt; j++)
if (cn->f[j] == cn->f[0])
{
e_switch_window(cn->edt[j], f);
return(0);
}
if (cn->mxedt > MAXEDT)
{
e_error(e_msg[ERR_MAXWINS], 0, cn->fb);
return(0);
}
for (j = 1; j <= MAXEDT; j++)
{
for (i = 1; i <= cn->mxedt && cn->edt[i] != j; i++)
;
if ( i > cn->mxedt) break;
}
cn->curedt=j;
(cn->mxedt)++;
cn->edt[cn->mxedt]=j;
f = cn->f[cn->mxedt] = cn->f[0];
#ifdef PROG
if (WpeIsProg())
{
for (i = cn->mxedt-1; i > 0; i--)
;
if (i < 1)
{
f->a = e_set_pnt(0, 1);
f->e = e_set_pnt(MAXSCOL-1, 2*MAXSLNS/3);
}
else
{
f->a = e_set_pnt(cn->f[i]->a.x+1, cn->f[i]->a.y+1);
f->e = e_set_pnt(cn->f[i]->e.x, cn->f[i]->e.y);
}
}
else
#endif
{
if (cn->mxedt < 2)
{
f->a = e_set_pnt(0, 1);
f->e = e_set_pnt(MAXSCOL-1, MAXSLNS-2);
}
else
{
f->a = e_set_pnt(cn->f[cn->mxedt-1]->a.x+1, cn->f[cn->mxedt-1]->a.y+1);
f->e = e_set_pnt(cn->f[cn->mxedt-1]->e.x, cn->f[cn->mxedt-1]->e.y);
}
}
f->winnum = cn->curedt;
if (cn->mxedt > 1)
{
fo = cn->f[cn->mxedt-1];
e_ed_rahmen(fo, 0);
}
e_firstl(f, 1);
e_zlsplt(f);
e_schirm(f, 1);
e_cursor(f, 1);
return(0);
}
/* move block to buffer */
int e_edt_del(FENSTER *f)
{
e_edt_copy(f);
e_blck_del(f);
return(0);
}
/* copy block to buffer */
int e_edt_copy(FENSTER *f)
{
BUFFER *b;
BUFFER *b0 = f->ed->f[0]->b;
int i, save;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b; save = f->save;
if ((f->s->mark_end.y < f->s->mark_begin.y) ||
((f->s->mark_begin.y == f->s->mark_end.y) &&
(f->s->mark_end.x <= f->s->mark_begin.x)))
{
return(0);
}
for (i = 1; i < b0->mxlines; i++)
FREE(b0->bf[i].s);
b0->mxlines = 1;
*(b0->bf[0].s) = WPE_WR;
*(b0->bf[0].s+1) = '\0';
b0->bf[0].len = 0;
e_copy_block(0, 0, b, b0, f);
f->save = save;
return(0);
}
/* Copy block buffer into window */
int e_edt_einf(FENSTER *f)
{
BUFFER *b;
BUFFER *b0 = f->ed->f[0]->b;
int i,y,len;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
if (f->ins == 8)
return(0);
e_undo_sw = 1;
/**********************/
y=b->b.y;
if(b->b.x>0) y++;
/**********************/
e_copy_block(b->b.x, b->b.y, b0, b, f);
/**********************/
len=b0->f->s->mark_end.y-b0->f->s->mark_begin.y;
e_brk_recalc(f,y,len);
/**********************/
e_undo_sw = 0;
e_add_undo('c', b, b->b.x, b->b.y, 0);
sc_txt_2(f);
f->save = b->cn->maxchg + 1;
return(0);
}
/* move block within window */
int e_blck_move(FENSTER *f)
{
BUFFER *b;
int i;
POINT ka;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
ka.x = f->ed->f[f->ed->mxedt]->s->mark_begin.x;
if (b->b.y > f->ed->f[f->ed->mxedt]->s->mark_begin.y)
ka.y = f->ed->f[f->ed->mxedt]->s->mark_begin.y;
else
{
ka.y = f->ed->f[f->ed->mxedt]->s->mark_end.y;
if (b->b.y == f->ed->f[f->ed->mxedt]->s->mark_begin.y &&
b->b.x < f->ed->f[f->ed->mxedt]->s->mark_begin.x)
ka.x = f->ed->f[f->ed->mxedt]->s->mark_end.x +
f->ed->f[f->ed->mxedt]->s->mark_begin.x - b->b.x;
}
e_undo_sw = 1;
e_move_block(b->b.x, b->b.y, b, b, f);
e_undo_sw = 0;
e_add_undo('v', b, ka.x, ka.y, 0);
f->save = b->cn->maxchg + 1;
return(0);
}
/* move Block */
void e_move_block(int x, int y, BUFFER *bv, BUFFER *bz, FENSTER *f)
{
SCHIRM *s = f->ed->f[f->ed->mxedt]->s;
SCHIRM *sv = bv->f->s;
SCHIRM *sz = bz->f->s;
int sw = (y < s->mark_begin.y) ? 0 : 1, i, n = s->mark_end.y - s->mark_begin.y - 1;
int kax = s->mark_begin.x, kay = s->mark_begin.y, kex = s->mark_end.x, key = s->mark_end.y;
STRING *str, *tmp;
unsigned char *cstr;
if (key < kay || (kay == key && kex <= kax)) return;
if (f->ins == 8)
{
return;
}
if (bv == bz && y >= kay && y <= key && x >= kax && x <= kex)
{
return;
}
if (kay == key)
{
n = kex - kax;
bz->b.x = x; bz->b.y = y;
if ((cstr = MALLOC(f->ed->maxcol * sizeof(char))) == NULL)
{
e_error(e_msg[ERR_LOWMEM], 0, bz->fb);
return;
}
for (i = 0; i < n; i++)
cstr[i] = bv->bf[key].s[kax+i];
e_ins_nchar(bz, sz, cstr, x, y, n);
bv->b.x = kax; bv->b.y = kay+bz->b.y-y;
e_del_nchar(bv, sv, sv->mark_begin.x, sv->mark_begin.y, n);
if (bv == bz && kay == y && x > kex)
x -= n;
sz->mark_begin.x = x; sz->mark_end.x = bz->b.x = x + n;
sz->mark_begin.y = sz->mark_end.y = bz->b.y = y;
e_cursor(f, 1);
e_schirm(f, 1);
FREE(cstr);
return;
}
if (bv == bz && y == kay && x < kax )
{
n = kax - x;
bv->b.x = x; bv->b.y = y;
if ((cstr = MALLOC(f->ed->maxcol * sizeof(char))) == NULL)
{
e_error(e_msg[ERR_LOWMEM], 0, bz->fb);
return;
}
for (i = 0; i < n; i++)
cstr[i] = bv->bf[y].s[x+i];
e_del_nchar(bv, sv, x, y, n);
bz->b.x = kex; bz->b.y = key;
e_ins_nchar(bz, sz, cstr, kex, key, n);
bv->b.x = sv->mark_begin.x = x; bv->b.y = sv->mark_begin.y = y;
sv->mark_end.x = kex; sv->mark_end.y = key;
e_cursor(f, 1);
e_schirm(f, 1);
FREE(cstr);
return;
}
if (bv == bz && y == key && x > kex )
{
n = x - kex;
bv->b.x = kex; bv->b.y = y;
if ((cstr = MALLOC(f->ed->maxcol * sizeof(char))) == NULL)
{
e_error(e_msg[ERR_LOWMEM], 0, bz->fb);
return;
}
for (i = 0; i < n; i++)
cstr[i] = bv->bf[y].s[kex+i];
e_del_nchar(bv, sv, kex, y, n);
bz->b.x = kex; bz->b.y = key;
e_ins_nchar(bz, sz, cstr, kax, kay, n);
bv->b.x = sv->mark_end.x; bv->b.y = sv->mark_end.y;
e_cursor(f, 1);
e_schirm(f, 1);
FREE(cstr);
return;
}
while (bz->mxlines+n > bz->mx.y-2)
{
bz->mx.y += MAXLINES;
if ((tmp = REALLOC(bz->bf, bz->mx.y * sizeof(STRING))) == NULL)
e_error(e_msg[ERR_LOWMEM], 1, bz->fb);
else
bz->bf = tmp;
if (bz->f->c_sw)
bz->f->c_sw = REALLOC(bz->f->c_sw, bz->mx.y * sizeof(int));
}
if ((str = MALLOC((n+2) * sizeof(STRING))) == NULL)
{
e_error(e_msg[ERR_LOWMEM], 0, bz->fb);
return;
}
for (i = kay; i <= key; i++)
str[i-kay] = bv->bf[i];
e_new_line(y+1, bz);
if (*(bz->bf[y].s+bz->bf[y].len) != '\0')
(bz->bf[y].len)++;
for (i = x; i <= bz->bf[y].len; i++)
*(bz->bf[y+1].s+i-x) = *(bz->bf[y].s+i);
*(bz->bf[y].s+x) = '\0';
bz->bf[y].len = bz->bf[y].nrc = x;
bz->bf[y+1].len = e_str_len(bz->bf[y+1].s);
bz->bf[y+1].nrc = e_str_nrc(bz->bf[y+1].s);
for (i = bz->mxlines; i > y; i--)
bz->bf[i+n] = bz->bf[i];
(bz->mxlines) += n;
for (i = 1; i <= n; i++)
bz->bf[y+i] = str[i];
if (bz == bv)
{
if (y < kay)
{ kay += (n+1); key +=(n+1); }
else if (y > kay)
y -= n;
}
for (i = kay + 1; i <= bv->mxlines-n; i++)
bv->bf[i] = bv->bf[i+n];
(bv->mxlines) -= n;
if (*(str[0].s+(n = str[0].len)) != '\0')
n++;
e_ins_nchar(bz, sz, (str[key-kay].s), 0, y+key-kay, kex);
e_ins_nchar(bz, sz, (str[0].s+kax), x, y, n-kax);
e_del_nchar(bv, sv, 0, kay+1, kex);
e_del_nchar(bv, sv, kax, kay, n - kax);
if (bz == bv && sw != 0)
y--;
sv->mark_begin.x = sv->mark_end.x = bv->b.x = kax;
sv->mark_begin.y = sv->mark_end.y = bv->b.y = kay;
sz->mark_begin.x = x;
sz->mark_begin.y = y;
bz->b.x = sz->mark_end.x = kex;
bz->b.y = sz->mark_end.y = key-kay+y;
f->save = f->ed->maxchg + 1;
sc_txt_1(bv->f);
sc_txt_1(bz->f);
e_cursor(f, 1);
e_schirm(f, 1);
FREE(str);
}
/* copy block within window */
int e_blck_copy(FENSTER *f)
{
BUFFER *b;
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
if (f->ins == 8) return(0);
f->save = 1;
e_undo_sw = 1;
e_copy_block(b->b.x, b->b.y, b, b, f);
e_undo_sw = 0;
e_add_undo('c', b, b->b.x, b->b.y, 0);
sc_txt_2(f);
f->save = b->cn->maxchg + 1;
return(0);
}
/* copy block */
void e_copy_block(int x, int y, BUFFER *buffer_src, BUFFER *buffer_dst,
FENSTER *f)
{
BUFFER *b = f->ed->f[f->ed->mxedt]->b;
SCHIRM *s_src = buffer_src->f->s;
SCHIRM *s_dst = buffer_dst->f->s;
int i, j, n = s_src->mark_end.y - s_src->mark_begin.y - 1;
int kax = s_src->mark_begin.x, kay = s_src->mark_begin.y, kex = s_src->mark_end.x, key = s_src->mark_end.y;
int kse = key, ksa = kay;
STRING **str, *tmp;
unsigned char *cstr;
if (key < kay || (kay == key && kex <= kax)) return;
if ((cstr = MALLOC(buffer_src->mx.x + 1)) == NULL)
{
e_error(e_msg[ERR_LOWMEM], 0, buffer_dst->fb);
return;
}
if (kay == key)
{
if (buffer_src == buffer_dst && y == kay && x >= kax && x < kex)
{
FREE(cstr);
return;
}
n = kex - kax;
buffer_dst->b.x = x; buffer_dst->b.y = y;
for (i = 0; i < n; i++)
cstr[i] = buffer_src->bf[key].s[kax+i];
e_ins_nchar(buffer_dst, s_dst, cstr, x, y, n);
s_dst->mark_begin.x = x;
s_dst->mark_end.x = buffer_dst->b.x = x + n;
s_dst->mark_begin.y = s_dst->mark_end.y = buffer_dst->b.y = y;
FREE(cstr);
e_cursor(f, 1);
e_schirm(f, 1);
return;
}
if (buffer_src == buffer_dst && ( (y > kay && y < key) ||
( y == kay && x >= kax ) || ( y == key && x < kex) ))
{
FREE(cstr);
return;
}
while (buffer_dst->mxlines+n > buffer_dst->mx.y-2)
{
buffer_dst->mx.y += MAXLINES;
if ((tmp = REALLOC(buffer_dst->bf, buffer_dst->mx.y * sizeof(STRING))) == NULL)
e_error(e_msg[ERR_LOWMEM], 1, buffer_dst->fb);
else
buffer_dst->bf = tmp;
if (buffer_dst->f->c_sw)
buffer_dst->f->c_sw = REALLOC(buffer_dst->f->c_sw , buffer_dst->mx.y * sizeof(int));
}
if ((str = MALLOC((n+2) * sizeof(STRING *))) == NULL)
{
e_error(e_msg[ERR_LOWMEM], 0, buffer_dst->fb);
FREE(cstr);
return;
}
e_new_line(y+1, buffer_dst);
if (buffer_dst == buffer_src && y < ksa)
{
kse += (n+1);
ksa += (n+1);
}
if (*(buffer_dst->bf[y].s+buffer_dst->bf[y].len) != '\0')
(buffer_dst->bf[y].len)++;
for (i = x; i <= buffer_dst->bf[y].len; i++)
*(buffer_dst->bf[y+1].s+i-x) = *(buffer_dst->bf[y].s+i);
*(buffer_dst->bf[y].s+x) = '\0';
buffer_dst->bf[y].len = buffer_dst->bf[y].nrc = x;
buffer_dst->bf[y+1].len = e_str_len(buffer_dst->bf[y+1].s);
buffer_dst->bf[y+1].nrc = e_str_nrc(buffer_dst->bf[y+1].s);
for (i = buffer_dst->mxlines; i > y; i--)
buffer_dst->bf[i+n] = buffer_dst->bf[i];
(buffer_dst->mxlines) += n;
for (i = ksa; i <= kse; i++)
str[i-ksa] = &(buffer_src->bf[i]);
for (i = 1; i <= n; i++)
buffer_dst->bf[i+y].s = NULL;
for (i = 1; i <= n; i++)
{
if ((buffer_dst->bf[i+y].s = MALLOC(buffer_dst->mx.x+1)) == NULL)
e_error(e_msg[ERR_LOWMEM], 1, b->fb);
for (j = 0; j <= str[i]->len; j++)
*(buffer_dst->bf[i+y].s+j) = *(str[i]->s+j);
if (*(str[i]->s+str[i]->len) != '\0')
*(buffer_dst->bf[i+y].s+j) = '\0';
buffer_dst->bf[i+y].len = str[i]->len;
buffer_dst->bf[i+y].nrc = str[i]->nrc;
}
for (i = 0; i < kex; i++)
cstr[i] = str[key-kay]->s[i];
e_ins_nchar(buffer_dst, s_dst, cstr, 0, y+key-kay, kex);
if (*(str[0]->s+(n = str[0]->len)) != '\0')
n++;
for (i = 0; i < n - kax; i++)
cstr[i] = str[0]->s[i+kax];
cstr[n-kax] = '\0';
e_ins_nchar(buffer_dst, s_dst, cstr, x, y, n-kax);
s_dst->mark_begin.x = x;
s_dst->mark_begin.y = y;
buffer_dst->b.x = s_dst->mark_end.x = kex;
buffer_dst->b.y = s_dst->mark_end.y = key-kay+y;
e_cursor(f, 1);
e_schirm(f, 1);
FREE(cstr);
FREE(str);
}
/* delete block marks */
int e_blck_hide(FENSTER *f)
{
BUFFER *b;
SCHIRM *s;
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
s = f->s;
s->mark_begin = e_set_pnt(0, 0);
s->mark_end = e_set_pnt(0, 0);
e_schirm(f, 1);
return(0);
}
/* mark begin of block */
int e_blck_begin(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0) return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
f->s->mark_begin = f->b->b;
e_schirm(f, 1);
return(0);
}
/* Set end of block */
int e_blck_end(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
f->s->mark_end = f->b->b;
e_schirm(f, 1);
return(0);
}
/* goto begin of block */
int e_blck_gt_beg(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
f->b->b = f->s->mark_begin;
e_schirm(f, 1);
return(0);
}
/* goto end of block */
int e_blck_gt_end(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
f->b->b = f->s->mark_end;
e_schirm(f, 1);
return(0);
}
/* mark text line in block */
int e_blck_mrk_all(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
f->s->mark_begin.x = 0;
f->s->mark_begin.y = 0;
f->s->mark_end.y = f->b->mxlines-1;
f->s->mark_end.x = f->b->bf[f->b->mxlines-1].len;
e_schirm(f, 1);
return(0);
}
/* mark text line in block */
int e_blck_mrk_line(FENSTER *f)
{
int i;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
f->s->mark_begin.x = 0;
f->s->mark_begin.y = f->b->b.y;
if(f->b->b.y < f->b->mxlines-1)
{
f->s->mark_end.x = 0;
f->s->mark_end.y = f->b->b.y+1;
}
else
{
f->s->mark_end.x = f->b->bf[f->b->b.y].len;
f->s->mark_end.y = f->b->b.y;
}
e_schirm(f, 1);
return(0);
}
/* block: up- or downcase
mode=0 every character downcase
mode=1 every character upcase
mode=2 first character in each word upcase
mode=3 first character in each line upcase */
int e_blck_changecase(FENSTER *f, int mode)
{
BUFFER *b;
SCHIRM *screen;
int i,x,y,x_begin,x_end;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0) return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
screen = f->s;
for (y = screen->mark_begin.y; y <= screen->mark_end.y; y++)
{
if (y == screen->mark_begin.y)
x_begin = screen->mark_begin.x;
else x_begin = 0;
if (y == screen->mark_end.y)
x_end = screen->mark_end.x;
else x_end = b->bf[y].len;
for (x = x_begin; x < x_end; x++)
if (mode == 0)
b->bf[y].s[x]=tolower(b->bf[y].s[x]);
else if (mode == 1)
b->bf[y].s[x]=toupper(b->bf[y].s[x]);
else if ((mode == 2) && ((x == 0) || (b->bf[y].s[x-1] == ' ') || (b->bf[y].s[x-1] == '\t')))
b->bf[y].s[x]=toupper(b->bf[y].s[x]);
else if ((mode == 3) && (x == 0))
b->bf[y].s[x]=toupper(b->bf[y].s[x]);
}
f->save++;
e_schirm(f, 1);
return 0;
}
int e_changecase_dialog(FENSTER *f)
{
static int b_sw = 0;
int ret;
W_OPTSTR *o = e_init_opt_kst(f);
if (!o) return(-1);
o->xa = 21;
o->xe = 52;
o->ya = 4;
o->ye = 15;
o->bgsw = AltO;
o->name = "Change Case";
o->crsw = AltO;
e_add_txtstr(4, 2, "Which mode:", o);
e_add_pswstr(1, 5, 3, 0, AltD, 0, "Downcase ", o);
e_add_pswstr(0, 5, 4, 0, AltU, b_sw & 1, "Upcase ", o);
e_add_pswstr(0, 5, 5, 0, AltH, b_sw & 2, "Headline ", o);
e_add_pswstr(0, 5, 6, 0, AltE, b_sw & 3, "First character ", o);
e_add_bttstr(7, 9, 1, AltO, " Ok ", NULL, o);
e_add_bttstr(18, 9, -1, WPE_ESC, "Cancel", NULL, o);
ret = e_opt_kst(o);
if (ret != WPE_ESC)
e_blck_changecase(f,o->pstr[0]->num);
freeostr(o);
return 0;
}
/* unindent block */
int e_blck_to_left(FENSTER *f)
{
BUFFER *b;
SCHIRM *s;
int n = f->ed->tabn/2, i, j, k, l, m, nn;
char *tstr = MALLOC((n+2)*sizeof(char));
for(i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--);
if(i <= 0) return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
s = f->s;
for(i = 0; i <= n; i++) tstr[i] = ' ';
tstr[n] = '\0';
for (i = (!s->mark_begin.x) ? s->mark_begin.y : s->mark_begin.y + 1;
i < s->mark_end.y || (i == s->mark_end.y && s->mark_end.x > 0); i++)
{
for(j = 0; j < b->bf[i].len && isspace(b->bf[i].s[j]); j++);
for(l = j - 1, k = 0; l >= 0 && k < n; l--)
{
if(b->bf[i].s[l] == ' ') k++;
else if(b->bf[i].s[l] == '\t')
{
for(nn = m = 0; m < l; m++)
{
if(b->bf[i].s[m] == ' ') nn++;
else if(b->bf[i].s[m] == '\t')
nn += f->ed->tabn - (nn % f->ed->tabn);
}
k += f->ed->tabn - (nn % f->ed->tabn);
}
}
l = j - l - 1;
if(l > 0)
{
nn = s->mark_begin.x;
e_del_nchar(b, s, j - l, i, l);
if (k > n) e_ins_nchar(b, s, tstr, j-l, i, k-n);
s->mark_begin.x = nn;
}
}
FREE(tstr);
e_schirm(f, 1);
return(0);
}
/* indent block */
int e_blck_to_right(FENSTER *f)
{
BUFFER *b;
SCHIRM *s;
int n = f->ed->tabn/2, i, j;
char *tstr = MALLOC((n+1)*sizeof(char));
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b;
s = f->s;
for (i = 0; i < n; i++)
tstr[i] = ' ';
tstr[n] = '\0';
for (i = (!s->mark_begin.x) ? s->mark_begin.y : s->mark_begin.y + 1;
i < s->mark_end.y || (i == s->mark_end.y && s->mark_end.x > 0); i++)
{
for (j = 0; b->bf[i].len && isspace(b->bf[i].s[j]); j++)
;
e_ins_nchar(b, s, tstr, j, i, n);
if (i == s->mark_begin.y)
s->mark_begin.x = 0;
}
FREE(tstr);
e_schirm(f, 1);
return(0);
}
/* Read block from file */
int e_blck_read(FENSTER *f)
{
if (f->ins == 8)
return(WPE_ESC);
WpeCreateFileManager(1, f->ed, "");
f->save = f->ed->maxchg + 1;
return(0);
}
/* write block to file */
int e_blck_write(FENSTER *f)
{
WpeCreateFileManager(2, f->ed, "");
return(0);
}
/* find again */
int e_rep_search(FENSTER *f)
{
SCHIRM *s;
BUFFER *b;
FIND *fd = &(f->ed->fd);
int i, ret, j, iend, jend, end;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b; s = f->s;
ret = b->b.x;
j = b->b.y;
if ((fd->sw & 8) == 0)
{
jend = (fd->sw & 4) ? 0 : b->mxlines-1;
iend = (fd->sw & 4) ? 0 : b->bf[b->mxlines-1].len;
}
else
{
jend = (fd->sw & 4) ? s->mark_begin.y : s->mark_end.y;
iend = (fd->sw & 4) ? s->mark_begin.x : s->mark_end.x;
}
for (; ; ret = -1)
{
if ((fd->sw & 4) == 0 && j > jend)
break;
else if ((fd->sw & 4) != 0 && j < jend)
break;
do
{
if (j == jend)
end = iend;
else if (!(fd->sw & 4))
end = b->bf[j].len;
else
end = 0;
if (fd->sw & 4 && ret == -1)
ret = b->bf[j].len;
if ((fd->sw & 32) == 0)
{
if ((fd->sw & 128) != 0)
ret = e_strstr(ret, end, b->bf[j].s, fd->search);
else
ret = e_ustrstr(ret, end, b->bf[j].s, fd->search);
}
else
{
if ((fd->sw & 128) != 0)
ret = e_rstrstr(ret, end, b->bf[j].s, fd->search, &(fd->sn));
else
ret = e_urstrstr(ret, end, b->bf[j].s, fd->search, &(fd->sn));
}
if ((fd->sw & 4) == 0 && j == jend && ret > iend)
break;
else if ((fd->sw & 4) != 0 && j == jend && ret < iend)
break;
if (ret >= 0 && ((fd->sw & 64) == 0 ||
(isalnum(*(b->bf[j].s+ret+fd->sn)) == 0 &&
(ret == 0 || isalnum(*(b->bf[j].s+ret-1)) == 0))))
{
s->fa.x = ret;
b->b.y = s->fa.y = s->fe.y = j;
s->fe.x = ret + fd->sn;
b->b.x = ret = !(fd->sw & 4) ? s->fe.x : ret;
if (!(fd->sw & 1))
{
e_cursor(f, 1);
s->fa.y = j;
e_schirm(f, 1);
}
return(1);
}
else if (ret >= 0 && (fd->sw & 64) != 0)
ret++;
} while(ret >= 0);
if ((fd->sw & 4) == 0 && j > jend)
break;
else if ((fd->sw & 4) != 0 && j < jend)
break;
j = ((fd->sw & 4) == 0) ? j+1 : j-1;
}
if (!(fd->sw & 1))
e_message(0, e_msg[ERR_GETSTRING], f);
return(0);
}
/* goto line */
int e_goto_line(FENSTER *f)
{
int i, num;
SCHIRM *s;
BUFFER *b;
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b; s = f->s;
if ((num = e_num_kst("Goto Line Number", b->b.y+1, b->mxlines, f, 0, AltG)) > 0)
b->b.y = num - 1;
else if (num == 0)
b->b.y = num;
e_cursor(f, 1);
return(0);
}
int e_find(FENSTER *f)
{
SCHIRM *s;
BUFFER *b;
FIND *fd = &(f->ed->fd);
int i, ret;
char strTemp[80];
W_OPTSTR *o = e_init_opt_kst(f);
if (!o)
return(-1);
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b; s = f->s;
if (e_blck_dup(strTemp, f))
{
strcpy(fd->search, strTemp);
fd->sn = strlen(fd->search);
}
o->xa = 7; o->ya = 3; o->xe = 63; o->ye = 18;
o->bgsw = 0;
o->crsw = AltO;
o->name = "Find";
e_add_txtstr(32, 4, "Direction:", o);
e_add_txtstr(4, 4, "Options:", o);
e_add_txtstr(4, 9, "Scope:", o);
e_add_txtstr(32, 9, "Begin:", o);
e_add_wrstr(4, 2, 18, 2, 35, 128, 0, AltT, "Text to Find:", fd->search, &f->ed->sdf, o);
e_add_sswstr(5, 5, 0, AltC, fd->sw & 128 ? 1 : 0, "Case sensitive ", o);
e_add_sswstr(5, 6, 0, AltW, fd->sw & 64 ? 1 : 0, "Whole words only ", o);
e_add_sswstr(5, 7, 0, AltR, fd->sw & 32 ? 1 : 0, "Regular expression", o);
e_add_pswstr(0, 33, 5, 6, AltD, 0, "ForwarD ", o);
e_add_pswstr(0, 33, 6, 0, AltB, fd->sw & 4 ? 1 : 0, "Backward ", o);
e_add_pswstr(1, 5, 10, 0, AltG, 0, "Global ", o);
e_add_pswstr(1, 5, 11, 0, AltS, fd->sw & 8 ? 1 : 0, "Selected Text ", o);
e_add_pswstr(2, 33, 10, 0, AltF, 0, "From Cursor ", o);
e_add_pswstr(2, 33, 11, 0, AltE, fd->sw & 2 ? 1 : 0, "Entire Scope ", o);
e_add_bttstr(16, 13, 1, AltO, " Ok ", NULL, o);
e_add_bttstr(34, 13, -1, WPE_ESC, "Cancel", NULL, o);
ret = e_opt_kst(o);
if (ret != WPE_ESC)
{
fd->sw = (o->pstr[0]->num << 2) + (o->pstr[1]->num << 3) +
(o->pstr[2]->num << 1) + (o->sstr[0]->num << 7) + (o->sstr[1]->num << 6) +
(o->sstr[2]->num << 5);
strcpy(fd->search, o->wstr[0]->txt);
fd->sn = strlen(fd->search);
if ((fd->sw & 2) != 0)
{
if ((fd->sw & 4) == 0)
{
b->b.x = (fd->sw & 8) == 0 ? 0 : s->mark_begin.x;
b->b.y = (fd->sw & 8) == 0 ? 0 : s->mark_begin.y;
}
else
{
b->b.x = (fd->sw & 8) == 0 ? b->bf[b->mxlines-1].len : s->mark_end.x;
b->b.y = (fd->sw & 8) == 0 ? b->mxlines-1 : s->mark_end.y;
}
}
}
freeostr(o);
if (ret != WPE_ESC)
e_rep_search(f);
return(0);
}
/* The menu and menuhandling have been rewritten to support only 4 choices
rather than 3 sets of 2 alternatives.
1 Forward from Cursor
2 Back from Cursor
3 Global replace (forward from start of text)
4 Selected Text (from start of selection, and only shown if a block _is_
marked)
The result window is either 'String NOT Found' or the number of
occurrences found and the number actually replaced.
*/
int e_replace(FENSTER *f)
{
SCHIRM *s;
BUFFER *b;
FIND *fd = &(f->ed->fd);
int i, ret, c, ym, rep=0, found=0;
char strTemp[80];
W_OPTSTR *o = e_init_opt_kst(f);
if (!o)
return(-1);
for (i = f->ed->mxedt; i > 0 && !DTMD_ISTEXT(f->ed->f[i]->dtmd); i--)
;
if (i <= 0)
return(0);
e_switch_window(f->ed->edt[i], f);
f = f->ed->f[f->ed->mxedt];
b = f->b; s = f->s;
if (e_blck_dup(strTemp, f))
{
strcpy(fd->search, strTemp);
fd->sn = strlen(fd->search);
}
o->xa = 7; o->ya = 3; o->xe = 67; o->ye = 17;
o->bgsw = 0;
o->name = "Replace";
o->crsw = AltO;
e_add_txtstr(4, 6, "Options:", o);
e_add_txtstr(32, 6, "Scope:", o);
e_add_wrstr(4, 2, 18, 2, 35, 128, 0, AltT, "Text to Find:", fd->search, &f->ed->sdf, o);
e_add_wrstr(4, 4, 18, 4, 35, 128, 0, AltN, "New Text:", fd->replace, &f->ed->rdf, o);
e_add_sswstr(5, 7, 0, AltC, fd->sw & 128 ? 1 : 0, "Case sensitive ", o);
e_add_sswstr(5, 8, 0, AltW, fd->sw & 64 ? 1 : 0, "Whole words only ", o);
e_add_sswstr(5, 9, 0, AltR, fd->sw & 32 ? 1 : 0, "Regular expression", o);
e_add_sswstr(5, 10, 0, AltP, 1, "Prompt on Replace ", o);
e_add_pswstr(0, 33, 7, 0, AltF, 0, "Forward from Cursor", o);
e_add_pswstr(0, 33, 8, 0, AltB, fd->sw & 4 ? 1 : 0, "Back from Cursor ", o);
e_add_pswstr(0, 33, 9, 0, AltG, fd->sw & 2 ? 1 : 0, "Global Replace ", o);
if (s->mark_end.y)
e_add_pswstr(0, 33, 10, 0, AltS, fd->sw & 10 ? 1 : 0, "Selected Text ", o);
e_add_bttstr(10, 12, 1, AltO, " Ok ", NULL, o);
e_add_bttstr(41, 12, -1, WPE_ESC, "Cancel", NULL, o);
e_add_bttstr(22, 12, 7, AltA, "Change All", NULL, o);
ret = e_opt_kst(o);
if (ret != WPE_ESC)
{
strcpy(fd->search, o->wstr[0]->txt);
fd->sn = strlen(fd->search);
strcpy(fd->replace, o->wstr[1]->txt);
fd->rn = strlen(fd->replace);
fd->sw = 1 + (o->sstr[0]->num << 7)+ (o->sstr[1]->num << 6)
+ (o->sstr[2]->num << 5) + (o->sstr[3]->num << 4);
switch (o->pstr[0]->num)
{
case 2:
fd->sw |= 2;
b->b.x = b->b.y = 0;
break;
case 1:
fd->sw |= 4;
b->b.x = b->bf[b->mxlines-1].len;
b->b.y = b->mxlines-1;
break;
case 3:
fd->sw |= 10;
b->b.x = s->mark_begin.x;
b->b.y = s->mark_begin.y;
default:
break;
}
}
freeostr(o);
if (ret != WPE_ESC)
{
while (e_rep_search(f) && ((ret == AltA) || (!found)))
{
found++;
if (f->a.y < 11)
{
s->c.y = b->b.y - 1; ym = 15;
}
else
{
ym = 1;
}
e_schirm(f, 1);
c = 'Y';
if (fd->sw & 16)
c = e_message(1, "String found:\nReplace this occurrence ?",f);
if (c == WPE_ESC)
break;
if (c == 'Y')
{
rep++;
e_add_undo('s', b, s->fa.x, b->b.y, fd->sn);
e_undo_sw = 1;
e_del_nchar(b, s, s->fa.x, b->b.y, fd->sn);
e_ins_nchar(b, s, (unsigned char *)fd->replace, s->fa.x, b->b.y, fd->rn);
e_undo_sw = 0;
s->fe.x = s->fa.x + fd->rn;
b->b.x = !(fd->sw & 4) ? s->fe.x : s->fa.x;
e_schirm(f, 1);
}
}
if (found)
{
sprintf(strTemp, "Found %d\nReplaced %d", found, rep);
e_message(0, strTemp, f);
}
else
e_message(0, e_msg[ERR_GETSTRING], f);
}
return(0);
}
syntax highlighted by Code2HTML, v. 0.9.1