rowFree rowCpy rowAdd rowAddlast
This commit is contained in:
parent
b2af13cdff
commit
8dc16195d5
145
ste.c
145
ste.c
@ -68,6 +68,7 @@ static int curRealToRender (row *rw, int c_x);
|
||||
static inline void rowInit (void);
|
||||
static void rowAddChar (row *rw, char c);
|
||||
static void rowDeleteChar (row *rw, int m);
|
||||
static void rowCpy (row *to, row *from);
|
||||
|
||||
/* Terminal operations */
|
||||
static void termInit (void);
|
||||
@ -79,14 +80,16 @@ static void fileOpen (char *filename);
|
||||
void fileSave (char *filename);
|
||||
|
||||
/* buffer operations */
|
||||
static void rowAdd (char *s, int len);
|
||||
static void rowAddLast (char *s, int len);
|
||||
|
||||
/* garbage */
|
||||
//inline void bufferFree (void);
|
||||
static int whatsThat (void);
|
||||
|
||||
/* testing */
|
||||
void updateInfo (void);
|
||||
static void updateInfo (void);
|
||||
static void rowAddRow (int pos);
|
||||
static int whatsThat (void);
|
||||
static void rowFree (row *rw);
|
||||
|
||||
|
||||
/* --------------------------------- main ------------------------------------ */
|
||||
int main (int argc, char *argv[])
|
||||
@ -130,6 +133,14 @@ int main (int argc, char *argv[])
|
||||
case (KEY_DC):
|
||||
rowDeleteChar(&rows.rw[t.cur.y + t.cur.off_y], 1);
|
||||
break;
|
||||
case (KEY_ENTER):
|
||||
case (10):
|
||||
case ('\r'):
|
||||
rowAddRow(t.cur.y + t.cur.off_y);
|
||||
break;
|
||||
case (KEY_END):
|
||||
t.cur.y = rows.rownum;
|
||||
break;
|
||||
default:
|
||||
if (c == KEY_STAB) c = '\t';
|
||||
rowAddChar(&rows.rw[t.cur.y + t.cur.off_y], c);
|
||||
@ -167,16 +178,13 @@ void termInit (void)
|
||||
/* Start color mode */
|
||||
start_color();
|
||||
init_pair(2, COLOR_BLACK, COLOR_CYAN);
|
||||
init_pair(1, COLOR_BLACK, COLOR_WHITE);
|
||||
init_pair(1, COLOR_RED, COLOR_BLACK);
|
||||
|
||||
/* Set default color */
|
||||
//bkgd(COLOR_PAIR(1));
|
||||
|
||||
/* Populate the main data structure */
|
||||
getmaxyx(stdscr, t.dim.y, t.dim.x);
|
||||
t.dim.y -= 1;
|
||||
t.pad = getLineNumberSize();
|
||||
t.dim.x -= t.pad + 1;
|
||||
updateInfo();
|
||||
|
||||
/* Initialize the data staructure */
|
||||
t.cur.x = t.cur.off_x = 0;
|
||||
@ -194,7 +202,6 @@ int getLineNumberSize (void)
|
||||
|
||||
void termExit (void)
|
||||
{
|
||||
// bufferFree();
|
||||
erase();
|
||||
refresh();
|
||||
endwin();
|
||||
@ -240,9 +247,9 @@ void drawLines (void)
|
||||
ln = i + t.cur.off_y;
|
||||
|
||||
/* Draw the line number */
|
||||
attron(COLOR_PAIR(2));
|
||||
attron(COLOR_PAIR(1));
|
||||
mvprintw(i, 0, "%d", ln + 1);
|
||||
attroff(COLOR_PAIR(2));
|
||||
attroff(COLOR_PAIR(1));
|
||||
lnMove(i, 0);
|
||||
|
||||
//if (ln == t.cur.y + t.cur.off_y) attron(COLOR_PAIR(2));
|
||||
@ -279,8 +286,8 @@ void drawBar (char *s)
|
||||
for (int i = len; i <= t.dim.x + t.pad; i++)
|
||||
mvaddch(t.dim.y, i, ' ');
|
||||
|
||||
char m[10];
|
||||
sprintf(m, "%d Zoom: %c", t.cur.x + t.cur.off_x, whatsThat());
|
||||
char m[40];
|
||||
sprintf(m, "x: %d y: %d Zoom: %c", t.cur.x + t.cur.off_x, t.cur.y + t.cur.off_y, whatsThat());
|
||||
mvaddstr(t.dim.y, t.dim.x + t.pad - strlen(m), m);
|
||||
|
||||
/* Return to normal contrast mode */
|
||||
@ -317,7 +324,7 @@ void fileOpen (char *filename)
|
||||
while ((linelen = getline(&line, &linecap, fp)) != -1) {
|
||||
while (linelen > 0 && (line[linelen - 1] == '\n' || line[linelen - 1] == '\r'))
|
||||
linelen--;
|
||||
rowAdd(line, linelen);
|
||||
rowAddLast(line, linelen);
|
||||
}
|
||||
/* free the line buffer */
|
||||
free(line);
|
||||
@ -326,7 +333,7 @@ void fileOpen (char *filename)
|
||||
}
|
||||
|
||||
/* Add a row to the file buffer */
|
||||
void rowAdd (char *s, int len)
|
||||
void rowAddLast (char *s, int len)
|
||||
{
|
||||
/* Extend the block of memory containing the lines */
|
||||
rows.rw = realloc(rows.rw, sizeof(row) * (rows.rownum + 1));
|
||||
@ -526,17 +533,6 @@ void updateScroll (void)
|
||||
|
||||
/*---------------------------------- scroll ------------------------------------*/
|
||||
|
||||
/*
|
||||
void bufferFree (void)
|
||||
{
|
||||
for (int i = 0; i < rows.rownum; i++) {
|
||||
free(&rows.rw[i].chars);
|
||||
free(&rows.rw[i].render);
|
||||
}
|
||||
free(rows.rw);
|
||||
}
|
||||
*/
|
||||
|
||||
/* See whats under the cursor (memory) */
|
||||
int whatsThat (void) {
|
||||
int ln = t.cur.y + t.cur.off_y;
|
||||
@ -558,12 +554,107 @@ int whatsThat (void) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* void rowAddRow (void) //VERY WIP
|
||||
{
|
||||
int cur_x = t.cur.x + t.cur.off_x;
|
||||
int cur_y = t.cur.y + t.cur.off_y;
|
||||
char *s = NULL;
|
||||
|
||||
// Last line case
|
||||
if (cur_y == rows.rownum - 1) {
|
||||
if (rows.rw[cur_y].chars[cur_x] != '\0') {
|
||||
//copy the previous string
|
||||
s = malloc(rows.rw[cur_y].size + 1);
|
||||
memcpy (s, &rows.rw[cur_y].chars, rows.rw[cur_y].size + 1);
|
||||
}
|
||||
cur_y++;
|
||||
rows.rownum++;
|
||||
rows.rw = realloc(rows.rw, sizeof(row) * rows.rownum);
|
||||
if (s == NULL) {
|
||||
rows.rw[cur_y].chars = malloc(1);
|
||||
rows.rw[cur_y].chars[0] = '\0';
|
||||
} else {
|
||||
rows.rw[cur_y].chars = malloc(strlen(s) + 1);
|
||||
memcpy(rows.rw[cur_y].chars, s, strlen(s));
|
||||
rows.rw[cur_y].chars[strlen(s) + 1] = '\0';
|
||||
}
|
||||
free(s);
|
||||
updateRender(&rows.rw[cur_y]);
|
||||
t.cur.y++;
|
||||
}
|
||||
} */
|
||||
|
||||
void rowAddRow (int pos) // WIP; TO DOCUMENT
|
||||
{
|
||||
int cur_x = t.cur.x + t.cur.off_x;
|
||||
char *s = NULL;
|
||||
// Move away other lines
|
||||
//copy old last line to new space
|
||||
rowAddLast(rows.rw[rows.rownum].chars, rows.rw[rows.rownum].size);
|
||||
|
||||
for (int last = rows.rownum - 1; last > pos; last--) {
|
||||
rowCpy(&rows.rw[last], &rows.rw[last - 1]);
|
||||
}
|
||||
|
||||
//if (!cur_x) cur_x = rows.rw[pos].size;
|
||||
//if (rows.rw[pos].chars[cur_x] == '\0') {
|
||||
// cur_x = 0;
|
||||
// t.cur.x = 0;
|
||||
//}
|
||||
|
||||
//copy previous row
|
||||
int l = rows.rw[pos].size - cur_x;
|
||||
s = malloc(l + 1);
|
||||
memcpy(s, &rows.rw[pos].chars[cur_x], l);
|
||||
s[l] = '\0';
|
||||
// Delete prev row until cursor
|
||||
char *p = malloc(cur_x + 1);
|
||||
memcpy(p, rows.rw[pos].chars, cur_x);
|
||||
p[cur_x] = '\0';
|
||||
rowFree(&rows.rw[pos]);
|
||||
rows.rw[pos].chars = malloc(cur_x + 1);
|
||||
memcpy(rows.rw[pos].chars, p, cur_x + 1);
|
||||
free(p);
|
||||
rows.rw[pos].size = cur_x;
|
||||
updateRender(&rows.rw[pos]);
|
||||
|
||||
if (pos != rows.rownum - 1) {
|
||||
rowFree(&rows.rw[pos + 1]);
|
||||
rows.rw[pos + 1].chars = malloc(strlen(s) + 1);
|
||||
memcpy(rows.rw[pos + 1].chars, s, strlen(s) + 1);
|
||||
rows.rw[pos + 1].size = strlen(s);
|
||||
updateRender(&rows.rw[pos + 1]);
|
||||
} else rowAddLast(s, l);
|
||||
|
||||
free(s);
|
||||
t.cur.y++;
|
||||
t.cur.x = 0;
|
||||
}
|
||||
|
||||
void rowFree (row *rw) // WIP
|
||||
{
|
||||
free(rw->render);
|
||||
free(rw->chars);
|
||||
rw->size = 0;
|
||||
rw->r_size = 0;
|
||||
}
|
||||
|
||||
void rowCpy (row *to, row *from) // WIP
|
||||
{
|
||||
rowFree(to);
|
||||
to->chars = malloc(strlen(from->chars) + 1);
|
||||
to->size = from->size;
|
||||
memcpy(to->chars, from->chars, to->size);
|
||||
updateRender(to);
|
||||
}
|
||||
|
||||
/*--------------------------------- garbage ------------------------------------*/
|
||||
|
||||
void updateInfo (void)
|
||||
{
|
||||
getmaxyx(stdscr, t.dim.y, t.dim.x);
|
||||
t.dim.y -= 1;
|
||||
t.pad = getLineNumberSize();
|
||||
t.dim.x -= t.pad + 1;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user