version 1.74, 2017/05/16 12:57:26 |
version 1.75, 2017/08/30 18:13:47 |
|
|
return (memcmp(gca->data.data, gcb->data.data, gca->data.size) == 0); |
return (memcmp(gca->data.data, gcb->data.data, gca->data.size) == 0); |
} |
} |
|
|
|
/* Free one line. */ |
|
static void |
|
grid_free_line(struct grid *gd, u_int py) |
|
{ |
|
free(gd->linedata[py].celldata); |
|
gd->linedata[py].celldata = NULL; |
|
free(gd->linedata[py].extddata); |
|
gd->linedata[py].extddata = NULL; |
|
} |
|
|
|
/* Free several lines. */ |
|
static void |
|
grid_free_lines(struct grid *gd, u_int py, u_int ny) |
|
{ |
|
u_int yy; |
|
|
|
for (yy = py; yy < py + ny; yy++) |
|
grid_free_line(gd, yy); |
|
} |
|
|
/* Create a new grid. */ |
/* Create a new grid. */ |
struct grid * |
struct grid * |
grid_create(u_int sx, u_int sy, u_int hlimit) |
grid_create(u_int sx, u_int sy, u_int hlimit) |
|
|
void |
void |
grid_destroy(struct grid *gd) |
grid_destroy(struct grid *gd) |
{ |
{ |
struct grid_line *gl; |
grid_free_lines(gd, 0, gd->hsize + gd->sy); |
u_int yy; |
|
|
|
for (yy = 0; yy < gd->hsize + gd->sy; yy++) { |
|
gl = &gd->linedata[yy]; |
|
free(gl->celldata); |
|
free(gl->extddata); |
|
} |
|
|
|
free(gd->linedata); |
free(gd->linedata); |
|
|
free(gd); |
free(gd); |
|
|
* and shift up. |
* and shift up. |
*/ |
*/ |
void |
void |
grid_collect_history(struct grid *gd, u_int bg) |
grid_collect_history(struct grid *gd) |
{ |
{ |
u_int yy; |
u_int ny; |
|
|
if (gd->hsize < gd->hlimit) |
if (gd->hsize < gd->hlimit) |
return; |
return; |
|
|
yy = gd->hlimit / 10; |
ny = gd->hlimit / 10; |
if (yy < 1) |
if (ny < 1) |
yy = 1; |
ny = 1; |
|
|
grid_move_lines(gd, 0, yy, gd->hsize + gd->sy - yy, bg); |
/* |
gd->hsize -= yy; |
* Free the lines from 0 to ny then move the remaining lines over |
|
* them. |
|
*/ |
|
grid_free_lines(gd, 0, ny); |
|
memmove(&gd->linedata[0], &gd->linedata[ny], |
|
(gd->hsize + gd->sy - ny) * (sizeof *gd->linedata)); |
|
|
|
gd->hsize -= ny; |
if (gd->hscrolled > gd->hsize) |
if (gd->hscrolled > gd->hsize) |
gd->hscrolled = gd->hsize; |
gd->hscrolled = gd->hsize; |
} |
} |
|
|
void |
void |
grid_clear_history(struct grid *gd) |
grid_clear_history(struct grid *gd) |
{ |
{ |
grid_clear_lines(gd, 0, gd->hsize, 8); |
grid_free_lines(gd, 0, gd->hsize); |
grid_move_lines(gd, 0, gd->hsize, gd->sy, 8); |
memmove(&gd->linedata[0], &gd->linedata[gd->hsize], |
|
gd->sy * (sizeof *gd->linedata)); |
|
|
gd->hscrolled = 0; |
gd->hscrolled = 0; |
gd->hsize = 0; |
gd->hsize = 0; |
|
|
void |
void |
grid_clear_lines(struct grid *gd, u_int py, u_int ny, u_int bg) |
grid_clear_lines(struct grid *gd, u_int py, u_int ny, u_int bg) |
{ |
{ |
struct grid_line *gl; |
u_int yy; |
u_int yy; |
|
|
|
if (ny == 0) |
if (ny == 0) |
return; |
return; |
|
|
return; |
return; |
|
|
for (yy = py; yy < py + ny; yy++) { |
for (yy = py; yy < py + ny; yy++) { |
gl = &gd->linedata[yy]; |
grid_free_line(gd, yy); |
free(gl->celldata); |
|
free(gl->extddata); |
|
grid_empty_line(gd, yy, bg); |
grid_empty_line(gd, yy, bg); |
} |
} |
} |
} |
|
|
for (yy = dy; yy < dy + ny; yy++) { |
for (yy = dy; yy < dy + ny; yy++) { |
if (yy >= py && yy < py + ny) |
if (yy >= py && yy < py + ny) |
continue; |
continue; |
grid_clear_lines(gd, yy, 1, bg); |
grid_free_line(gd, yy); |
} |
} |
|
|
memmove(&gd->linedata[dy], &gd->linedata[py], |
memmove(&gd->linedata[dy], &gd->linedata[py], |
ny * (sizeof *gd->linedata)); |
ny * (sizeof *gd->linedata)); |
|
|
/* Wipe any lines that have been moved (without freeing them). */ |
/* |
|
* Wipe any lines that have been moved (without freeing them - they are |
|
* still present). |
|
*/ |
for (yy = py; yy < py + ny; yy++) { |
for (yy = py; yy < py + ny; yy++) { |
if (yy < dy || yy >= dy + ny) |
if (yy < dy || yy >= dy + ny) |
grid_empty_line(gd, yy, bg); |
grid_empty_line(gd, yy, bg); |
|
|
} |
} |
|
|
/* |
/* |
* Duplicate a set of lines between two grids. If there aren't enough lines in |
* Duplicate a set of lines between two grids. Both source and destination |
* either source or destination, the number of lines is limited to the number |
* should be big enough. |
* available. |
|
*/ |
*/ |
void |
void |
grid_duplicate_lines(struct grid *dst, u_int dy, struct grid *src, u_int sy, |
grid_duplicate_lines(struct grid *dst, u_int dy, struct grid *src, u_int sy, |
|
|
ny = dst->hsize + dst->sy - dy; |
ny = dst->hsize + dst->sy - dy; |
if (sy + ny > src->hsize + src->sy) |
if (sy + ny > src->hsize + src->sy) |
ny = src->hsize + src->sy - sy; |
ny = src->hsize + src->sy - sy; |
grid_clear_lines(dst, dy, ny, 8); |
grid_free_lines(dst, dy, ny); |
|
|
for (yy = 0; yy < ny; yy++) { |
for (yy = 0; yy < ny; yy++) { |
srcl = &src->linedata[sy]; |
srcl = &src->linedata[sy]; |