static char sccsid
[] = "@(#)wwwrite.c 3.24 %G%";
* Copyright (c) 1983 Regents of the University of California,
* All rights reserved. Redistribution permitted subject to
* the terms of the Berkeley Software License Agreement.
* To support control character expansion, we save the old
* p and q values in r and s, and point p at the beginning
* of the expanded string, and q at some safe place beyond it
* (p + 10). At strategic points in the loops, we check
* for (r && !*p) and restore the saved values back into
* p and q. Essentially, we implement a stack of depth 2,
* to avoid recursion, which might be a better idea.
s
= 0; /* define it before possible use */
if (hascursor
= w
->ww_hascursor
)
while (p
< q
&& !w
->ww_stopped
&& (!wwinterrupt() || w
->ww_nointr
)) {
if (w
->ww_wstate
== 0 && (isprt(*p
)
|| w
->ww_unctrl
&& isunctrl(*p
))) {
register union ww_char
*bp
;
if (w
->ww_insert
) { /* this is very slow */
(w
->ww_cur
.c
- w
->ww_w
.l
& 7);
wwinschar(w
, w
->ww_cur
.r
, w
->ww_cur
.c
,
*p
++ | w
->ww_modes
<< WWC_MSHIFT
);
bp
= &w
->ww_buf
[w
->ww_cur
.r
][w
->ww_cur
.c
];
while (i
< w
->ww_w
.r
&& p
< q
)
register tmp
= 8 - (i
- w
->ww_w
.l
& 7);
| w
->ww_modes
<< WWC_MSHIFT
;
} else if (w
->ww_unctrl
&& isunctrl(*p
)) {
col
= MAX(w
->ww_cur
.c
, w
->ww_i
.l
);
col1
= MIN(i
, w
->ww_i
.r
);
if (w
->ww_cur
.r
>= w
->ww_i
.t
&& w
->ww_cur
.r
< w
->ww_i
.b
) {
register union ww_char
*ns
= wwns
[w
->ww_cur
.r
];
register char *smap
= &wwsmap
[w
->ww_cur
.r
][col
];
register char *win
= w
->ww_win
[w
->ww_cur
.r
];
bp
= w
->ww_buf
[w
->ww_cur
.r
];
for (i
= col
; i
< col1
; i
++)
if (*smap
++ == w
->ww_index
) {
wwtouched
[w
->ww_cur
.r
] |= WWU_TOUCHED
;
if (w
->ww_cur
.c
>= w
->ww_w
.r
)
} else switch (w
->ww_wstate
) {
if (!w
->ww_noupdate
&& wwtouched
[w
->ww_cur
.r
])
wwupdate1(w
->ww_cur
.r
, w
->ww_cur
.r
+ 1);
if (++w
->ww_cur
.r
>= w
->ww_w
.b
) {
w
->ww_cur
.r
= w
->ww_w
.b
- 1;
if (w
->ww_w
.b
< w
->ww_b
.b
) {
(void) wwscroll1(w
, w
->ww_i
.t
,
if (--w
->ww_cur
.c
< w
->ww_w
.l
) {
w
->ww_cur
.c
= w
->ww_w
.r
- 1;
if (!w
->ww_noupdate
&& wwtouched
[w
->ww_cur
.r
])
wwupdate1(w
->ww_cur
.r
, w
->ww_cur
.r
+ 1);
if (--w
->ww_cur
.r
< w
->ww_w
.t
) {
if (w
->ww_w
.t
> w
->ww_b
.t
) {
(void) wwscroll1(w
, w
->ww_i
.t
,
w
->ww_buf
-= w
->ww_w
.t
- w
->ww_b
.t
;
w
->ww_b
.b
= w
->ww_b
.t
+ w
->ww_b
.nr
;
wwclreos(w
, w
->ww_w
.t
, w
->ww_w
.l
);
if (!w
->ww_noupdate
&& wwtouched
[w
->ww_cur
.r
])
wwupdate1(w
->ww_cur
.r
, w
->ww_cur
.r
+ 1);
wwclreos(w
, w
->ww_cur
.r
, w
->ww_cur
.c
);
wwclreol(w
, w
->ww_cur
.r
, w
->ww_cur
.c
);
if (!w
->ww_noupdate
&& wwtouched
[w
->ww_cur
.r
])
wwupdate1(w
->ww_cur
.r
, w
->ww_cur
.r
+ 1);
wwinsline(w
, w
->ww_cur
.r
);
wwdelline(w
, w
->ww_cur
.r
);
wwdelchar(w
, w
->ww_cur
.r
, w
->ww_cur
.c
);
if (!w
->ww_noupdate
&& wwtouched
[w
->ww_cur
.r
])
wwupdate1(w
->ww_cur
.r
, w
->ww_cur
.r
+ 1);
w
->ww_cur
.r
= w
->ww_w
.t
+
(unsigned)(*p
++ - ' ') % w
->ww_w
.nr
;
w
->ww_cur
.c
= w
->ww_w
.l
+
(unsigned)(*p
++ - ' ') % w
->ww_w
.nc
;
w
->ww_modes
|= *p
++ & wwavailmodes
;