version 1.21, 2004/07/09 13:50:40 |
version 1.22, 2005/04/03 02:09:28 |
|
|
#endif |
#endif |
|
|
#ifndef NBLOCK |
#ifndef NBLOCK |
#define NBLOCK 16 /* Line block chunk size */ |
#define NBLOCK 16 /* Line block chunk size. */ |
#endif |
#endif |
|
|
#ifndef KBLOCK |
#ifndef KBLOCK |
|
|
{ |
{ |
LINE *lp; |
LINE *lp; |
|
|
if ((lp = malloc(sizeof *lp)) == NULL) |
if ((lp = malloc(sizeof(*lp))) == NULL) |
return NULL; |
return (NULL); |
lp->l_text = NULL; |
lp->l_text = NULL; |
lp->l_size = 0; |
lp->l_size = 0; |
lp->l_used = used; /* XXX */ |
lp->l_used = used; /* XXX */ |
if (lrealloc(lp, used) == FALSE) { |
if (lrealloc(lp, used) == FALSE) { |
free(lp); |
free(lp); |
return NULL; |
return (NULL); |
} |
} |
return lp; |
return (lp); |
} |
} |
|
|
int |
int |
|
|
|
|
if (lp->l_size < newsize) { |
if (lp->l_size < newsize) { |
if ((tmp = realloc(lp->l_text, newsize)) == NULL) |
if ((tmp = realloc(lp->l_text, newsize)) == NULL) |
return FALSE; |
return (FALSE); |
lp->l_text = tmp; |
lp->l_text = tmp; |
lp->l_size = newsize; |
lp->l_size = newsize; |
} |
} |
|
return (TRUE); |
return TRUE; |
|
} |
} |
|
|
/* |
/* |
|
|
int |
int |
linsert_str(const char *s, int n) |
linsert_str(const char *s, int n) |
{ |
{ |
LINE *lp1; |
LINE *lp1; |
MGWIN *wp; |
MGWIN *wp; |
RSIZE i; |
RSIZE i; |
int doto; |
int doto; |
|
|
if (curbp->b_flag & BFREADONLY) { |
if (curbp->b_flag & BFREADONLY) { |
ewprintf("Buffer is read only"); |
ewprintf("Buffer is read only"); |
return FALSE; |
return (FALSE); |
} |
} |
|
|
if (!n) |
if (!n) |
|
|
panic("bug: linsert_str"); |
panic("bug: linsert_str"); |
/* allocate a new line */ |
/* allocate a new line */ |
if ((lp2 = lalloc(n)) == NULL) |
if ((lp2 = lalloc(n)) == NULL) |
return FALSE; |
return (FALSE); |
/* previous line */ |
/* previous line */ |
lp3 = lp1->l_bp; |
lp3 = lp1->l_bp; |
/* link in */ |
/* link in */ |
|
|
} |
} |
undo_add_insert(lp2, 0, n); |
undo_add_insert(lp2, 0, n); |
curwp->w_doto = n; |
curwp->w_doto = n; |
return TRUE; |
return (TRUE); |
} |
} |
/* save for later */ |
/* save for later */ |
doto = curwp->w_doto; |
doto = curwp->w_doto; |
|
|
if ((lp1->l_used + n) > lp1->l_size) { |
if ((lp1->l_used + n) > lp1->l_size) { |
if (lrealloc(lp1, lp1->l_used + n) == FALSE) |
if (lrealloc(lp1, lp1->l_used + n) == FALSE) |
return FALSE; |
return (FALSE); |
} |
} |
lp1->l_used += n; |
lp1->l_used += n; |
if (lp1->l_used != n) |
if (lp1->l_used != n) |
|
|
} |
} |
} |
} |
undo_add_insert(curwp->w_dotp, doto, n); |
undo_add_insert(curwp->w_dotp, doto, n); |
return TRUE; |
return (TRUE); |
} |
} |
|
|
/* |
/* |
|
|
int |
int |
linsert(int n, int c) |
linsert(int n, int c) |
{ |
{ |
LINE *lp1; |
LINE *lp1; |
MGWIN *wp; |
MGWIN *wp; |
RSIZE i; |
RSIZE i; |
int doto; |
int doto; |
|
|
|
|
if (curbp->b_flag & BFREADONLY) { |
if (curbp->b_flag & BFREADONLY) { |
ewprintf("Buffer is read only"); |
ewprintf("Buffer is read only"); |
return FALSE; |
return (FALSE); |
} |
} |
|
|
lchange(WFEDIT); |
lchange(WFEDIT); |
|
|
/* now should only happen in empty buffer */ |
/* now should only happen in empty buffer */ |
if (curwp->w_doto != 0) { |
if (curwp->w_doto != 0) { |
ewprintf("bug: linsert"); |
ewprintf("bug: linsert"); |
return FALSE; |
return (FALSE); |
} |
} |
/* allocate a new line */ |
/* allocate a new line */ |
if ((lp2 = lalloc(n)) == NULL) |
if ((lp2 = lalloc(n)) == NULL) |
return FALSE; |
return (FALSE); |
/* previous line */ |
/* previous line */ |
lp3 = lp1->l_bp; |
lp3 = lp1->l_bp; |
/* link in */ |
/* link in */ |
|
|
} |
} |
undo_add_insert(lp2, 0, n); |
undo_add_insert(lp2, 0, n); |
curwp->w_doto = n; |
curwp->w_doto = n; |
return TRUE; |
return (TRUE); |
} |
} |
/* save for later */ |
/* save for later */ |
doto = curwp->w_doto; |
doto = curwp->w_doto; |
|
|
|
|
if ((lp1->l_used + n) > lp1->l_size) { |
if ((lp1->l_used + n) > lp1->l_size) { |
if (lrealloc(lp1, lp1->l_used + n) == FALSE) |
if (lrealloc(lp1, lp1->l_used + n) == FALSE) |
return FALSE; |
return (FALSE); |
} |
} |
lp1->l_used += n; |
lp1->l_used += n; |
if (lp1->l_used != n) |
if (lp1->l_used != n) |
|
|
} |
} |
} |
} |
undo_add_insert(curwp->w_dotp, doto, n); |
undo_add_insert(curwp->w_dotp, doto, n); |
return TRUE; |
return (TRUE); |
} |
} |
|
|
int |
int |
|
|
if (doto == 0) { |
if (doto == 0) { |
/* new first part */ |
/* new first part */ |
if ((lp2 = lalloc(0)) == NULL) |
if ((lp2 = lalloc(0)) == NULL) |
return FALSE; |
return (FALSE); |
lp2->l_bp = lp1->l_bp; |
lp2->l_bp = lp1->l_bp; |
lp1->l_bp->l_fp = lp2; |
lp1->l_bp->l_fp = lp2; |
lp2->l_fp = lp1; |
lp2->l_fp = lp1; |
|
|
for (wp = wheadp; wp != NULL; wp = wp->w_wndp) |
for (wp = wheadp; wp != NULL; wp = wp->w_wndp) |
if (wp->w_linep == lp1) |
if (wp->w_linep == lp1) |
wp->w_linep = lp2; |
wp->w_linep = lp2; |
return TRUE; |
return (TRUE); |
} |
} |
|
|
/* length of new part */ |
/* length of new part */ |
|
|
|
|
/* new second half line */ |
/* new second half line */ |
if ((lp2 = lalloc(nlen)) == NULL) |
if ((lp2 = lalloc(nlen)) == NULL) |
return FALSE; |
return (FALSE); |
if (nlen != 0) |
if (nlen != 0) |
bcopy(&lp1->l_text[doto], &lp2->l_text[0], nlen); |
bcopy(&lp1->l_text[doto], &lp2->l_text[0], nlen); |
lp1->l_used = doto; |
lp1->l_used = doto; |
|
|
wp->w_marko -= doto; |
wp->w_marko -= doto; |
} |
} |
} |
} |
return TRUE; |
return (TRUE); |
} |
} |
|
|
/* |
/* |
|
|
{ |
{ |
if (curbp->b_flag & BFREADONLY) { |
if (curbp->b_flag & BFREADONLY) { |
ewprintf("Buffer is read only"); |
ewprintf("Buffer is read only"); |
return FALSE; |
return (FALSE); |
} |
} |
return lnewline_at(curwp->w_dotp, curwp->w_doto); |
return (lnewline_at(curwp->w_dotp, curwp->w_doto)); |
} |
} |
|
|
/* |
/* |
|
|
|
|
if (curbp->b_flag & BFREADONLY) { |
if (curbp->b_flag & BFREADONLY) { |
ewprintf("Buffer is read only"); |
ewprintf("Buffer is read only"); |
return FALSE; |
return (FALSE); |
} |
} |
|
|
undo_add_delete(curwp->w_dotp, curwp->w_doto, n); |
undo_add_delete(curwp->w_dotp, curwp->w_doto, n); |
|
|
doto = curwp->w_doto; |
doto = curwp->w_doto; |
/* Hit the end of the buffer */ |
/* Hit the end of the buffer */ |
if (dotp == curbp->b_linep) |
if (dotp == curbp->b_linep) |
return FALSE; |
return (FALSE); |
/* Size of the chunk */ |
/* Size of the chunk */ |
chunk = dotp->l_used - doto; |
chunk = dotp->l_used - doto; |
|
|
|
|
if (chunk == 0) { |
if (chunk == 0) { |
if (dotp == lback(curbp->b_linep)) |
if (dotp == lback(curbp->b_linep)) |
/* End of buffer */ |
/* End of buffer */ |
return FALSE; |
return (FALSE); |
lchange(WFHARD); |
lchange(WFHARD); |
if (ldelnewline() == FALSE || |
if (ldelnewline() == FALSE || |
(kflag != KNONE && kinsert('\n', kflag) == FALSE)) |
(kflag != KNONE && kinsert('\n', kflag) == FALSE)) |
return FALSE; |
return (FALSE); |
--n; |
--n; |
continue; |
continue; |
} |
} |
|
|
if (kflag == KFORW) { |
if (kflag == KFORW) { |
while (ksize - kused < chunk) |
while (ksize - kused < chunk) |
if (kgrow(FALSE) == FALSE) |
if (kgrow(FALSE) == FALSE) |
return FALSE; |
return (FALSE); |
bcopy(cp1, &(kbufp[kused]), (int)chunk); |
bcopy(cp1, &(kbufp[kused]), (int)chunk); |
kused += chunk; |
kused += chunk; |
} else if (kflag == KBACK) { |
} else if (kflag == KBACK) { |
while (kstart < chunk) |
while (kstart < chunk) |
if (kgrow(TRUE) == FALSE) |
if (kgrow(TRUE) == FALSE) |
return FALSE; |
return (FALSE); |
bcopy(cp1, &(kbufp[kstart - chunk]), (int)chunk); |
bcopy(cp1, &(kbufp[kstart - chunk]), (int)chunk); |
kstart -= chunk; |
kstart -= chunk; |
} else if (kflag != KNONE) |
} else if (kflag != KNONE) |
|
|
} |
} |
n -= chunk; |
n -= chunk; |
} |
} |
return TRUE; |
return (TRUE); |
} |
} |
|
|
/* |
/* |
|
|
|
|
if (curbp->b_flag & BFREADONLY) { |
if (curbp->b_flag & BFREADONLY) { |
ewprintf("Buffer is read only"); |
ewprintf("Buffer is read only"); |
return FALSE; |
return (FALSE); |
} |
} |
|
|
lp1 = curwp->w_dotp; |
lp1 = curwp->w_dotp; |
lp2 = lp1->l_fp; |
lp2 = lp1->l_fp; |
/* at the end of the buffer */ |
/* at the end of the buffer */ |
if (lp2 == curbp->b_linep) |
if (lp2 == curbp->b_linep) |
return TRUE; |
return (TRUE); |
if (lp2->l_used <= lp1->l_size - lp1->l_used) { |
if (lp2->l_used <= lp1->l_size - lp1->l_used) { |
bcopy(&lp2->l_text[0], &lp1->l_text[lp1->l_used], lp2->l_used); |
bcopy(&lp2->l_text[0], &lp1->l_text[lp1->l_used], lp2->l_used); |
for (wp = wheadp; wp != NULL; wp = wp->w_wndp) { |
for (wp = wheadp; wp != NULL; wp = wp->w_wndp) { |
|
|
lp1->l_fp = lp2->l_fp; |
lp1->l_fp = lp2->l_fp; |
lp2->l_fp->l_bp = lp1; |
lp2->l_fp->l_bp = lp1; |
free((char *)lp2); |
free((char *)lp2); |
return TRUE; |
return (TRUE); |
} |
} |
if ((lp3 = lalloc(lp1->l_used + lp2->l_used)) == NULL) |
if ((lp3 = lalloc(lp1->l_used + lp2->l_used)) == NULL) |
return FALSE; |
return (FALSE); |
bcopy(&lp1->l_text[0], &lp3->l_text[0], lp1->l_used); |
bcopy(&lp1->l_text[0], &lp3->l_text[0], lp1->l_used); |
bcopy(&lp2->l_text[0], &lp3->l_text[lp1->l_used], lp2->l_used); |
bcopy(&lp2->l_text[0], &lp3->l_text[lp1->l_used], lp2->l_used); |
lp1->l_bp->l_fp = lp3; |
lp1->l_bp->l_fp = lp3; |
|
|
} |
} |
free((char *)lp1); |
free((char *)lp1); |
free((char *)lp2); |
free((char *)lp2); |
return TRUE; |
return (TRUE); |
} |
} |
|
|
|
|
/* |
/* |
* Replace plen characters before dot with argument string. Control-J |
* Replace plen characters before dot with argument string. Control-J |
* characters in st are interpreted as newlines. There is a casehack |
* characters in st are interpreted as newlines. There is a casehack |
|
|
|
|
if (curbp->b_flag & BFREADONLY) { |
if (curbp->b_flag & BFREADONLY) { |
ewprintf("Buffer is read only"); |
ewprintf("Buffer is read only"); |
return FALSE; |
return (FALSE); |
} |
} |
|
|
undo_add_change(curwp->w_dotp, curwp->w_doto, plen); |
undo_add_change(curwp->w_dotp, curwp->w_doto, plen); |
|
|
(void)ldelete((RSIZE) (plen - rlen), KNONE); |
(void)ldelete((RSIZE) (plen - rlen), KNONE); |
else if (plen < rlen) { |
else if (plen < rlen) { |
if (linsert((int)(rlen - plen), ' ') == FALSE) |
if (linsert((int)(rlen - plen), ' ') == FALSE) |
return FALSE; |
return (FALSE); |
} |
} |
curwp->w_doto = doto; |
curwp->w_doto = doto; |
|
|
|
|
return (TRUE); |
return (TRUE); |
} |
} |
|
|
|
|
/* |
/* |
* Delete all of the text saved in the kill buffer. Called by commands when |
* Delete all of the text saved in the kill buffer. Called by commands when |
* a new kill context is created. The kill buffer array is released, just in |
* a new kill context is created. The kill buffer array is released, just in |
|
|
kinsert(int c, int dir) |
kinsert(int c, int dir) |
{ |
{ |
if (kused == ksize && dir == KFORW && kgrow(FALSE) == FALSE) |
if (kused == ksize && dir == KFORW && kgrow(FALSE) == FALSE) |
return FALSE; |
return (FALSE); |
if (kstart == 0 && dir == KBACK && kgrow(TRUE) == FALSE) |
if (kstart == 0 && dir == KBACK && kgrow(TRUE) == FALSE) |
return FALSE; |
return (FALSE); |
if (dir == KFORW) |
if (dir == KFORW) |
kbufp[kused++] = c; |
kbufp[kused++] = c; |
else if (dir == KBACK) |
else if (dir == KBACK) |
|
|
if ((unsigned)(ksize + KBLOCK) <= (unsigned)ksize) { |
if ((unsigned)(ksize + KBLOCK) <= (unsigned)ksize) { |
/* probably 16 bit unsigned */ |
/* probably 16 bit unsigned */ |
ewprintf("Kill buffer size at maximum"); |
ewprintf("Kill buffer size at maximum"); |
return FALSE; |
return (FALSE); |
} |
} |
if ((nbufp = malloc((unsigned)(ksize + KBLOCK))) == NULL) { |
if ((nbufp = malloc((unsigned)(ksize + KBLOCK))) == NULL) { |
ewprintf("Can't get %ld bytes", (long)(ksize + KBLOCK)); |
ewprintf("Can't get %ld bytes", (long)(ksize + KBLOCK)); |
return FALSE; |
return (FALSE); |
} |
} |
nstart = (back == TRUE) ? (kstart + KBLOCK) : (KBLOCK / 4); |
nstart = (back == TRUE) ? (kstart + KBLOCK) : (KBLOCK / 4); |
bcopy(&(kbufp[kstart]), &(nbufp[nstart]), (int)(kused - kstart)); |
bcopy(&(kbufp[kstart]), &(nbufp[nstart]), (int)(kused - kstart)); |
|
|
ksize += KBLOCK; |
ksize += KBLOCK; |
kused = kused - kstart + nstart; |
kused = kused - kstart + nstart; |
kstart = nstart; |
kstart = nstart; |
return TRUE; |
return (TRUE); |
} |
} |
|
|
/* |
/* |
|
|
kremove(int n) |
kremove(int n) |
{ |
{ |
if (n < 0 || n + kstart >= kused) |
if (n < 0 || n + kstart >= kused) |
return -1; |
return (-1); |
return CHARMASK(kbufp[n + kstart]); |
return (CHARMASK(kbufp[n + kstart])); |
} |
} |