|
|
|
@ -23,9 +23,6 @@ struct term { |
|
|
|
|
int off_y; |
|
|
|
|
int r_x; |
|
|
|
|
int r_y; |
|
|
|
|
//int d_x;
|
|
|
|
|
//int xx;
|
|
|
|
|
//int yy;
|
|
|
|
|
} cur; |
|
|
|
|
|
|
|
|
|
struct { |
|
|
|
@ -65,7 +62,6 @@ static void curUpdateRender (void); |
|
|
|
|
static void cursorMove(int a); |
|
|
|
|
static int decimalSize (int n); |
|
|
|
|
static inline void lnMove (int y, int x); |
|
|
|
|
//static int curRealToRender (row *rw, int c_x);
|
|
|
|
|
|
|
|
|
|
/* Row operations */ |
|
|
|
|
static inline void rowInit (void); |
|
|
|
@ -143,20 +139,15 @@ int main (int argc, char *argv[]) |
|
|
|
|
case (KEY_ENTER): |
|
|
|
|
case (10): |
|
|
|
|
case ('\r'): |
|
|
|
|
//rowAddRow(t.cur.yy);
|
|
|
|
|
|
|
|
|
|
//t.cur.off_x = 0;
|
|
|
|
|
rowAddRow(t.cur.y); |
|
|
|
|
t.cur.y++; |
|
|
|
|
t.cur.x = 0; |
|
|
|
|
break; |
|
|
|
|
case (KEY_END): |
|
|
|
|
t.cur.y = rows.rownum - 1; |
|
|
|
|
//t.cur.off_y = 0;
|
|
|
|
|
break; |
|
|
|
|
case (KEY_HOME): |
|
|
|
|
t.cur.y = 0; |
|
|
|
|
//t.cur.off_y = 0;
|
|
|
|
|
break; |
|
|
|
|
default: |
|
|
|
|
if (c == KEY_STAB) c = '\t'; |
|
|
|
@ -375,7 +366,7 @@ void fileOpen (char *filename) |
|
|
|
|
void rowAddLast (char *s, int len) |
|
|
|
|
{ |
|
|
|
|
/* Extend the block of memory containing the lines */ |
|
|
|
|
row *newr = reallocarray(rows.rw, rows.rownum + 1, sizeof(row)); |
|
|
|
|
row *newr = realloc(rows.rw, (rows.rownum + 1) * sizeof(row)); |
|
|
|
|
if (newr == NULL) termDie("realloc in rowAddLast"); |
|
|
|
|
else rows.rw = newr; |
|
|
|
|
|
|
|
|
@ -558,102 +549,82 @@ void rowDeleteRow (int pos) |
|
|
|
|
/* ----------------------------- row operations --------------------------- */ |
|
|
|
|
|
|
|
|
|
/* take care of the cursor movement */ |
|
|
|
|
/*void cursorMove (int a)
|
|
|
|
|
void cursorMove (int a) |
|
|
|
|
{ |
|
|
|
|
switch (a) { |
|
|
|
|
case (KEY_LEFT): |
|
|
|
|
//if (t.cur.x <= 0 && !t.cur.off_x) {
|
|
|
|
|
if (t.cur.x <= 0) { |
|
|
|
|
if (t.cur.yy) { |
|
|
|
|
if (t.cur.y) { |
|
|
|
|
t.cur.y--; |
|
|
|
|
t.cur.yy--; |
|
|
|
|
t.cur.x = rows.rw[t.cur.yy].size; |
|
|
|
|
t.cur.x = rows.rw[t.cur.y].size; |
|
|
|
|
} |
|
|
|
|
} else t.cur.x--; |
|
|
|
|
} else |
|
|
|
|
t.cur.x--; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case (KEY_RIGHT): |
|
|
|
|
if (t.cur.x >= rows.rw[t.cur.yy].size) { |
|
|
|
|
if (t.cur.yy < rows.rownum - 1) { |
|
|
|
|
t.cur.y++; |
|
|
|
|
t.cur.yy++; |
|
|
|
|
//if (t.cur.off_x) t.cur.off_x = 0;
|
|
|
|
|
//t.cur.x = rows.rw[t.cur.yy].size;
|
|
|
|
|
t.cur.x = 0; |
|
|
|
|
} |
|
|
|
|
} else t.cur.x++; |
|
|
|
|
if (t.cur.x >= rows.rw[t.cur.y].size) { |
|
|
|
|
if (t.cur.y < rows.rownum - 1) { |
|
|
|
|
t.cur.y++; |
|
|
|
|
t.cur.x = 0; |
|
|
|
|
} |
|
|
|
|
} else
|
|
|
|
|
t.cur.x++; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case (KEY_UP): |
|
|
|
|
if (t.cur.yy > 0) { |
|
|
|
|
if (t.cur.y) { |
|
|
|
|
t.cur.y--; |
|
|
|
|
t.cur.yy--; |
|
|
|
|
if (t.cur.x > rows.rw[t.cur.yy].size) { |
|
|
|
|
//if (t.cur.off_x) t.cur.off_x = 0;
|
|
|
|
|
t.cur.x = rows.rw[t.cur.yy].size; |
|
|
|
|
} |
|
|
|
|
if (t.cur.y) { |
|
|
|
|
t.cur.y--; |
|
|
|
|
if (t.cur.x > rows.rw[t.cur.y].size) |
|
|
|
|
t.cur.x = rows.rw[t.cur.y].size; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case (KEY_DOWN): |
|
|
|
|
if (t.cur.yy < rows.rownum - 1) { |
|
|
|
|
if (t.cur.y < rows.rownum - 1) { |
|
|
|
|
t.cur.y++; |
|
|
|
|
t.cur.yy++; |
|
|
|
|
if (t.cur.x > rows.rw[t.cur.yy].size) { |
|
|
|
|
//if (t.cur.off_x) t.cur.off_x = 0;
|
|
|
|
|
t.cur.x = rows.rw[t.cur.yy].size; |
|
|
|
|
} |
|
|
|
|
if (t.cur.x > rows.rw[t.cur.y].size) |
|
|
|
|
t.cur.x = rows.rw[t.cur.y].size; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
}*/ |
|
|
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*void curUpdateRender (void)
|
|
|
|
|
void curUpdateRender () |
|
|
|
|
{ |
|
|
|
|
//Set y offset
|
|
|
|
|
if (t.cur.y >= t.dim.y) { |
|
|
|
|
if (t.cur.y == t.dim.y) t.cur.off_y++; |
|
|
|
|
else t.cur.off_y += t.cur.y - t.dim.y; |
|
|
|
|
|
|
|
|
|
t.cur.y = t.dim.y - 1; |
|
|
|
|
|
|
|
|
|
} else if (t.cur.y <= 0 && t.cur.off_y > 0) { |
|
|
|
|
t.cur.off_y--; |
|
|
|
|
t.cur.y = 0; |
|
|
|
|
} |
|
|
|
|
// y
|
|
|
|
|
if (t.cur.y >= t.cur.off_y && t.cur.y < t.cur.off_y + t.dim.y) { |
|
|
|
|
t.cur.r_y = t.cur.y - t.cur.off_y; |
|
|
|
|
|
|
|
|
|
//Old curRealToRender()
|
|
|
|
|
t.cur.r_x = curRealToRender(&rows.rw[t.cur.yy], t.cur.x); |
|
|
|
|
} else if (t.cur.y >= t.cur.off_y + t.dim.y) { |
|
|
|
|
if (t.cur.y == t.cur.off_y + t.dim.y) t.cur.off_y++; |
|
|
|
|
else t.cur.off_y += t.cur.y - (t.cur.off_y + t.dim.y); |
|
|
|
|
t.cur.r_y = t.dim.y - 1; |
|
|
|
|
|
|
|
|
|
} else if (t.cur.y < t.cur.off_y) { |
|
|
|
|
t.cur.off_y -= t.cur.off_y - t.cur.y; |
|
|
|
|
t.cur.r_y = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// x
|
|
|
|
|
static int i; |
|
|
|
|
for (i = 0, t.cur.r_x = 0; i < t.cur.x; i++) { |
|
|
|
|
if (rows.rw[t.cur.y].chars[i] == '\t') t.cur.r_x += (TABSIZE - 1) - (t.cur.r_x % TABSIZE); |
|
|
|
|
t.cur.r_x++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (t.cur.r_x >= t.dim.x) { |
|
|
|
|
t.cur.off_x += (t.cur.r_x > t.dim.x ) ? (t.cur.r_x - t.dim.x) : 1; |
|
|
|
|
t.cur.r_x = t.dim.x - 1; |
|
|
|
|
} else if (t.cur.r_x <= 0) { |
|
|
|
|
t.cur.off_x -= (t.cur.off_x > 0) ? 0 : t.cur.off_x; |
|
|
|
|
if (t.cur.r_x >= t.cur.off_x && t.cur.r_x < t.dim.x) { |
|
|
|
|
//ok
|
|
|
|
|
} else if (t.cur.r_x < t.cur.off_x) { |
|
|
|
|
t.cur.off_x -= t.cur.off_x - t.cur.r_x; |
|
|
|
|
t.cur.r_x = 0; |
|
|
|
|
|
|
|
|
|
} else if (t.cur.r_x > t.cur.off_x + t.dim.x) { |
|
|
|
|
if (t.cur.r_x == t.cur.off_x + t.dim.x) t.cur.off_x++; |
|
|
|
|
else t.cur.off_x += t.cur.r_x - t.cur.off_x - t.dim.x; |
|
|
|
|
t.cur.r_x = t.dim.x; |
|
|
|
|
} |
|
|
|
|
//convert the cursor from real to render
|
|
|
|
|
// and update other cursor info
|
|
|
|
|
t.cur.yy = t.cur.y + t.cur.off_y; |
|
|
|
|
//t.cur.xx = t.cur.x + t.cur.off_x;
|
|
|
|
|
//t.cur.d_x = t.cur.r_x - t.cur.x;
|
|
|
|
|
} */ |
|
|
|
|
|
|
|
|
|
/* convert the cursor matchoing the memory to the drawn one */ |
|
|
|
|
/*
|
|
|
|
|
int curRealToRender (row *rw, int c_x) |
|
|
|
|
{ |
|
|
|
|
static int r_x = 0, i; |
|
|
|
|
for (i = 0, r_x = 0; i < c_x; i++) { |
|
|
|
|
if (rw->chars[i] == '\t') r_x += (TABSIZE - 1) - (r_x % TABSIZE); |
|
|
|
|
r_x++; |
|
|
|
|
} |
|
|
|
|
return r_x; |
|
|
|
|
}*/ |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*---------------------------------- scroll ------------------------------------*/ |
|
|
|
|
|
|
|
|
@ -699,8 +670,6 @@ void handleDel (int select) |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/*--------------------------------- garbage ------------------------------------*/ |
|
|
|
|
|
|
|
|
|
void updateInfo (void) |
|
|
|
|
{ |
|
|
|
|
getmaxyx(stdscr, t.dim.y, t.dim.x); |
|
|
|
@ -709,81 +678,4 @@ void updateInfo (void) |
|
|
|
|
t.dim.x -= t.pad + 1; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* take care of the cursor movement */ |
|
|
|
|
void cursorMove (int a) |
|
|
|
|
{ |
|
|
|
|
switch (a) { |
|
|
|
|
case (KEY_LEFT): |
|
|
|
|
if (t.cur.x <= 0) { |
|
|
|
|
if (t.cur.y) { |
|
|
|
|
t.cur.y--; |
|
|
|
|
t.cur.x = rows.rw[t.cur.y].size; |
|
|
|
|
} |
|
|
|
|
} else |
|
|
|
|
t.cur.x--; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case (KEY_RIGHT): |
|
|
|
|
if (t.cur.x >= rows.rw[t.cur.y].size) { |
|
|
|
|
if (t.cur.y < rows.rownum - 1) { |
|
|
|
|
t.cur.y++; |
|
|
|
|
t.cur.x = 0; |
|
|
|
|
} |
|
|
|
|
} else
|
|
|
|
|
t.cur.x++; |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case (KEY_UP): |
|
|
|
|
if (t.cur.y) { |
|
|
|
|
t.cur.y--; |
|
|
|
|
if (t.cur.x > rows.rw[t.cur.y].size) |
|
|
|
|
t.cur.x = rows.rw[t.cur.y].size; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
case (KEY_DOWN): |
|
|
|
|
if (t.cur.y < rows.rownum - 1) { |
|
|
|
|
t.cur.y++; |
|
|
|
|
if (t.cur.x > rows.rw[t.cur.y].size) |
|
|
|
|
t.cur.x = rows.rw[t.cur.y].size; |
|
|
|
|
} |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void curUpdateRender () |
|
|
|
|
{ |
|
|
|
|
// y
|
|
|
|
|
if (t.cur.y >= t.cur.off_y && t.cur.y < t.cur.off_y + t.dim.y) { |
|
|
|
|
t.cur.r_y = t.cur.y - t.cur.off_y; |
|
|
|
|
|
|
|
|
|
} else if (t.cur.y >= t.cur.off_y + t.dim.y) { |
|
|
|
|
if (t.cur.y == t.cur.off_y + t.dim.y) t.cur.off_y++; |
|
|
|
|
else t.cur.off_y += t.cur.y - (t.cur.off_y + t.dim.y); |
|
|
|
|
t.cur.r_y = t.dim.y - 1; |
|
|
|
|
|
|
|
|
|
} else if (t.cur.y < t.cur.off_y) { |
|
|
|
|
t.cur.off_y -= t.cur.off_y - t.cur.y; |
|
|
|
|
t.cur.r_y = 0; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
// x
|
|
|
|
|
static int i; |
|
|
|
|
for (i = 0, t.cur.r_x = 0; i < t.cur.x; i++) { |
|
|
|
|
if (rows.rw[t.cur.y].chars[i] == '\t') t.cur.r_x += (TABSIZE - 1) - (t.cur.r_x % TABSIZE); |
|
|
|
|
t.cur.r_x++; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (t.cur.r_x >= t.cur.off_x && t.cur.r_x < t.dim.x) { |
|
|
|
|
//ok
|
|
|
|
|
} else if (t.cur.r_x < t.cur.off_x) { |
|
|
|
|
t.cur.off_x -= t.cur.off_x - t.cur.r_x; |
|
|
|
|
t.cur.r_x = 0; |
|
|
|
|
|
|
|
|
|
} else if (t.cur.r_x > t.cur.off_x + t.dim.x) { |
|
|
|
|
if (t.cur.r_x == t.cur.off_x + t.dim.x) t.cur.off_x++; |
|
|
|
|
else t.cur.off_x += t.cur.r_x - t.cur.off_x - t.dim.x; |
|
|
|
|
t.cur.r_x = t.dim.x; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
/*--------------------------------- testing ------------------------------------*/ |
|
|
|
|