editor/page.c
2021-12-21 21:15:08 +10:00

111 lines
2.1 KiB
C

#include "page.h"
void init_page(PAGE *p, char *filename, int size)
{
p->text = (LINE *)malloc(size * sizeof(LINE));
int i;
for(i = 0; i < size; i++)
{
init_line(p->text + i);
}
strcpy(p->filename, filename);
p->numlines = 0;
p->size = size;
p->x = 0;
p->y = 0;
p->saved = 1;
} // init_page
void dest_page(PAGE *p)
{
int i;
for(i = 0; i < p->numlines; i++)
{
free(p->text[i].line); // maybe replace with dest_line()
}
free(p->text);
} // dest_page
// WARNING: Expansion function implemented but not tested
void insert_line(PAGE *p, int index)
{
if( p->numlines >= p->size ) expand_page(p);
LINE newline;
init_line(&newline);
newline.line[0] = '\0';
int i;
for(i = p->numlines - 1; i >= index; i--)
p->text[i + 1] = p->text[i];
p->text[index] = newline;
(p->numlines)++;
} // insert_line
void remove_line(PAGE *p, int index)
{
if( p->numlines > 1 )
{
free(p->text[index].line);
int i;
for(i = index; i < p->numlines - 1; i++)
{
p->text[i] = p->text[i + 1];
}
(p->numlines)--;
}
} // remove_line
void expand_page(PAGE *p)
{
int newsize = p->size * 2;
LINE *newline = malloc(newsize * sizeof(LINE));
int i;
for(i = 0; i < p->size; i++) // copy old lines
newline[i] = p->text[i];
for(i = p->size; i < newsize; i++) // init new lines
init_line(newline + i);
p->text = newline;
p->size = newsize;
} // expand_page
// NOTE: This moves the cursor to the end of the displayed text
void print_page(WINDOW *win, WINDOW *lnos, const PAGE *p, int start)
{
int i, line;
for(i = start, line = 0; i < p->numlines && line < EDITOR_SIZE; i++)
{
for (int j=0;j < p->text[i].lines_in_screen; j++) {
wmove(lnos, line, 0);
wclrtoeol(lnos);
if (j == 0) {
wprintw(lnos, "%5d", i + 1);
}
wmove(win, line++, 0);
wprintw(win, "%.*s", strlen(&p->text[i].line[j * 75]) < 75 ? strlen(&p->text[i].line[j * 75]) : 75, &p->text[i].line[j * 75]);
wclrtoeol(win);
}
}
for (int j=line; j < EDITOR_SIZE; j++) {
wmove(lnos, j, 0);
wclrtoeol(lnos);
wmove(win, j, 0);
wclrtoeol(win);
}
wrefresh(lnos);
//refresh();
} // print_page