#include <sys/types.h>
#include "utility.h"
#define SizePrev(f, v) ((v) - Buf(f))
#define SizeNext(f, v) (BufSize(f) - SizePrev(f, v))
#define OffscreenRows(c) ((c)->drows - (c)->rows)
#define OffscreenCols(c) ((c)->dcols - (c)->cols)
int
_next_char(FORM *f)
{
if (++X(f) == Xmax(f)) {
if (++Y(f) == Ymax(f)) {
--X(f);
--Y(f);
return (E_REQUEST_DENIED);
}
X(f) = 0;
}
return (E_OK);
}
int
_prev_char(FORM *f)
{
if (--X(f) < 0) {
if (--Y(f) < 0) {
++X(f);
++Y(f);
return (E_REQUEST_DENIED);
}
X(f) = Xmax(f) - 1;
}
return (E_OK);
}
int
_next_line(FORM *f)
{
if (++Y(f) == Ymax(f)) {
--Y(f);
return (E_REQUEST_DENIED);
}
X(f) = 0;
return (E_OK);
}
int
_prev_line(FORM *f)
{
if (--Y(f) < 0) {
++Y(f);
return (E_REQUEST_DENIED);
}
X(f) = 0;
return (E_OK);
}
int
_next_word(FORM *f)
{
FIELD * c = C(f);
char * v = LineBuf(c, Y(f)) + X(f);
char * t;
_sync_buffer(f);
t = _whsp_beg(v, (int) SizeNext(c, v));
v = _data_beg(t, (int) SizeNext(c, t));
if (v == t)
return (E_REQUEST_DENIED);
if (OneRow(c) && c->dcols != c->cols) {
t = v;
while (*t != ' ' && *t != '\0')
t++;
if (t - (Buf(c) + B(f)) > c->cols) {
if (t - v > c->cols) {
B(f) = (int) (v - Buf(c));
} else {
B(f) = (int) (t - (Buf(c) + c->cols));
}
X(f) = (int) (v - Buf(c));
return (E_OK);
}
}
_adjust_cursor(f, v);
return (E_OK);
}
int
_prev_word(FORM *f)
{
FIELD * c = C(f);
char * v = LineBuf(c, Y(f)) + X(f);
char * t;
_sync_buffer(f);
t = _data_end(Buf(c), (int) SizePrev(c, v));
v = _whsp_end(Buf(c), (int) SizePrev(c, t));
if (v == t)
return (E_REQUEST_DENIED);
_adjust_cursor(f, v);
return (E_OK);
}
int
_beg_field(FORM *f)
{
FIELD * c = C(f);
_sync_buffer(f);
_adjust_cursor(f, _data_beg(Buf(c), BufSize(c)));
return (E_OK);
}
int
_end_field(FORM *f)
{
FIELD * c = C(f);
char * end;
_sync_buffer(f);
end = _data_end(Buf(c), BufSize(c));
if (end == Buf(c) + BufSize(c))
end--;
_adjust_cursor(f, end);
return (E_OK);
}
int
_beg_line(FORM *f)
{
FIELD *c = C(f);
_sync_buffer(f);
_adjust_cursor(f, _data_beg(LineBuf(c, Y(f)), Xmax(f)));
return (E_OK);
}
int
_end_line(FORM *f)
{
FIELD *c = C(f);
char *end;
_sync_buffer(f);
end = _data_end(LineBuf(c, Y(f)), Xmax(f));
if (end == LineBuf(c, Y(f)) + Xmax(f))
end--;
_adjust_cursor(f, end);
return (E_OK);
}
int
_left_char(FORM *f)
{
if (--X(f) < 0) {
++X(f);
return (E_REQUEST_DENIED);
}
return (E_OK);
}
int
_right_char(FORM *f)
{
if (++X(f) == Xmax(f)) {
--X(f);
return (E_REQUEST_DENIED);
}
return (E_OK);
}
int
_up_char(FORM *f)
{
if (--Y(f) < 0) {
++Y(f);
return (E_REQUEST_DENIED);
}
return (E_OK);
}
int
_down_char(FORM *f)
{
if (++Y(f) == Ymax(f)) {
--Y(f);
return (E_REQUEST_DENIED);
}
return (E_OK);
}
int
_scr_fline(FORM *f)
{
FIELD *c = C(f);
if (++T(f) > OffscreenRows(c)) {
--T(f);
return (E_REQUEST_DENIED);
}
++Y(f);
Set(c, TOP_CHG);
return (E_OK);
}
int
_scr_bline(FORM *f)
{
FIELD *c = C(f);
if (--T(f) < 0) {
++T(f);
return (E_REQUEST_DENIED);
}
--Y(f);
Set(c, TOP_CHG);
return (E_OK);
}
int
_scr_fpage(FORM *f)
{
FIELD * c = C(f);
int m = OffscreenRows(c) - T(f);
int n = c -> rows < m ? c -> rows : m;
if (n) {
Y(f) += n;
T(f) += n;
Set(c, TOP_CHG);
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_bpage(FORM *f)
{
FIELD * c = C(f);
int m = T(f);
int n = c -> rows < m ? c -> rows : m;
if (n) {
Y(f) -= n;
T(f) -= n;
Set(c, TOP_CHG);
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_fhpage(FORM *f)
{
FIELD * c = C(f);
int m = OffscreenRows(c) - T(f);
int h = (c->rows + 1)/2;
int n = h < m ? h : m;
if (n) {
Y(f) += n;
T(f) += n;
Set(c, TOP_CHG);
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_bhpage(FORM *f)
{
FIELD * c = C(f);
int m = T(f);
int h = (c->rows + 1)/2;
int n = h < m ? h : m;
if (n) {
Y(f) -= n;
T(f) -= n;
Set(c, TOP_CHG);
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_fchar(FORM *f)
{
FIELD *c = C(f);
if (++B(f) > OffscreenCols(c)) {
--B(f);
return (E_REQUEST_DENIED);
}
++X(f);
return (E_OK);
}
int
_scr_bchar(FORM *f)
{
if (--B(f) < 0) {
++B(f);
return (E_REQUEST_DENIED);
}
--X(f);
return (E_OK);
}
int
_scr_hfline(FORM *f)
{
FIELD *c = C(f);
int m = OffscreenCols(c) - B(f);
int n = c -> cols < m ? c -> cols : m;
if (n) {
X(f) += n;
B(f) += n;
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_hbline(FORM *f)
{
FIELD *c = C(f);
int m = B(f);
int n = c -> cols < m ? c -> cols : m;
if (n) {
X(f) -= n;
B(f) -= n;
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_hfhalf(FORM *f)
{
FIELD *c = C(f);
int m = OffscreenCols(c) - B(f);
int h = (c->cols + 1)/2;
int n = h < m ? h : m;
if (n) {
X(f) += n;
B(f) += n;
return (E_OK);
}
return (E_REQUEST_DENIED);
}
int
_scr_hbhalf(FORM *f)
{
FIELD *c = C(f);
int m = B(f);
int h = (c->cols + 1)/2;
int n = h < m ? h : m;
if (n) {
X(f) -= n;
B(f) -= n;
return (E_OK);
}
return (E_REQUEST_DENIED);
}