Annotation of 43BSDReno/contrib/jove/delete.c, revision 1.1.1.1

1.1       root        1: /***************************************************************************
                      2:  * This program is Copyright (C) 1986, 1987, 1988 by Jonathan Payne.  JOVE *
                      3:  * is provided to you without charge, and with no warranty.  You may give  *
                      4:  * away copies of JOVE, including sources, provided that this notice is    *
                      5:  * included in all the files.                                              *
                      6:  ***************************************************************************/
                      7: 
                      8: /* Routines to perform all kinds of deletion.  */
                      9: 
                     10: #include "jove.h"
                     11: #include "disp.h"
                     12: 
                     13: /* Assumes that either line1 or line2 is actual the current line, so it can
                     14:    put its result into linebuf. */
                     15: 
                     16: private void
                     17: patchup(line1, char1, line2, char2)
                     18: Line   *line1,
                     19:        *line2;
                     20: register int   char1,
                     21:                char2;
                     22: {
                     23:        if (line1 != line2)
                     24:                ChkWindows(line1, line2);
                     25:        DotTo(line1, char1);
                     26:        modify();
                     27:        linecopy(linebuf, curchar, lcontents(line2) + char2);
                     28: 
                     29:        /* The following is a redisplay optimization. */
                     30:        if (line1 != line2 && (char1 == 0 && char2 == 0))
                     31:                line1->l_dline = line2->l_dline;
                     32: 
                     33:        DFixMarks(line1, char1, line2, char2);
                     34:        makedirty(curline);
                     35: }
                     36: 
                     37: /* Deletes the region by unlinking the lines in the middle,
                     38:    and patching things up.  The unlinked lines are still in
                     39:    order.  */
                     40: 
                     41: Line *
                     42: reg_delete(line1, char1, line2, char2)
                     43: Line   *line1,
                     44:        *line2;
                     45: int    char1,
                     46:        char2;
                     47: {
                     48:        register Line   *retline;
                     49: 
                     50:        if ((line1 == line2 && char1 == char2) || line2 == 0)
                     51:                complain((char *) 0);
                     52:        (void) fixorder(&line1, &char1, &line2, &char2);
                     53: 
                     54:        retline = nbufline();   /* New buffer line */
                     55: 
                     56:        (void) ltobuf(line1, genbuf);
                     57:        if (line1 == line2)
                     58:                genbuf[char2] = '\0';
                     59: 
                     60:        retline->l_prev = 0;
                     61:        retline->l_dline = putline(&genbuf[char1]);
                     62:        patchup(line1, char1, line2, char2);
                     63: 
                     64:        if (line1 == line2)
                     65:                retline->l_next = 0;
                     66:        else {
                     67:                retline->l_next = line1->l_next;
                     68:                (void) ltobuf(line2, genbuf);
                     69:                genbuf[char2] = '\0';
                     70:                line2->l_dline = putline(genbuf);
                     71:                /* Shorten this line */
                     72:        }
                     73: 
                     74:        if (line1 != line2) {
                     75:                line1->l_next = line2->l_next;
                     76:                if (line1->l_next)
                     77:                        line1->l_next->l_prev = line1;
                     78:                else
                     79:                        curbuf->b_last = line1;
                     80:                line2->l_next = 0;
                     81:        }
                     82: 
                     83:        return retline;
                     84: }
                     85: 
                     86: void
                     87: lremove(line1, line2)
                     88: register Line  *line1,
                     89:                *line2;
                     90: {
                     91:        Line    *next = line1->l_next;
                     92: 
                     93:        if (line1 == line2)
                     94:                return;
                     95:        line1->l_next = line2->l_next;
                     96:        if (line1->l_next)
                     97:                line1->l_next->l_prev = line1;
                     98:        else
                     99:                curbuf->b_last = line1;
                    100:        lfreereg(next, line2);  /* Put region at end of free line list. */
                    101: }
                    102: 
                    103: /* delete character forward */
                    104: 
                    105: void
                    106: DelNChar()
                    107: {
                    108:        del_char(FORWARD, arg_value(), YES);
                    109: }
                    110: 
                    111: /* Delete character backward */
                    112: 
                    113: void
                    114: DelPChar()
                    115: {
                    116:        if (MinorMode(OverWrite)) {
                    117:                int     count = min(arg_value(), curchar);
                    118: 
                    119:                b_char(count);
                    120: 
                    121:                /* overwrite with spaces */
                    122:                set_arg_value(count);
                    123:                LastKeyStruck = ' ';
                    124:                SelfInsert();
                    125: 
                    126:                b_char(count);
                    127:        } else
                    128:                del_char(BACKWARD, arg_value(), YES);
                    129: }
                    130: 
                    131: /* Delete some characters.  If deleting forward then call for_char
                    132:    to the final position otherwise call back_char.  Then delete the
                    133:    region between the two with patchup(). */
                    134: 
                    135: void
                    136: del_char(dir, num, OK_kill)
                    137: int    dir,
                    138:        num,
                    139:        OK_kill;
                    140: {
                    141:        Bufpos  before,
                    142:                after;
                    143:        int     killp = (OK_kill && (abs(num) > 1));
                    144: 
                    145:        DOTsave(&before);
                    146:        if (dir == FORWARD)
                    147:                f_char(num);
                    148:        else
                    149:                b_char(num);
                    150:        if (before.p_line == curline && before.p_char == curchar)
                    151:                complain((char *) 0);
                    152:        if (killp)
                    153:                reg_kill(before.p_line, before.p_char, 1);
                    154:        else {
                    155:                DOTsave(&after);
                    156:                (void) fixorder(&before.p_line, &before.p_char, &after.p_line, &after.p_char);
                    157:                patchup(before.p_line, before.p_char, after.p_line, after.p_char);
                    158:                lremove(before.p_line, after.p_line);
                    159:        }
                    160: }
                    161: 
                    162: /* This kills a region between point, and line1/char1 and puts it on
                    163:    the kill-ring.  If the last command was one of the kill commands,
                    164:    the region is appended (prepended if backwards) to the last entry.  */
                    165: 
                    166: int    killptr = 0;
                    167: Line   *killbuf[NUMKILLS];
                    168: 
                    169: void
                    170: reg_kill(line2, char2, dot_moved)
                    171: Line   *line2;
                    172: int    char2,
                    173:        dot_moved;
                    174: {
                    175:        Line    *nl,
                    176:                *line1 = curline;
                    177:        int     char1 = curchar;
                    178:        int     backwards;
                    179: 
                    180:        backwards = !fixorder(&line1, &char1, &line2, &char2);
                    181:        /* This is a kludge!  But it possible for commands that don't
                    182:           know which direction they are deleting in (e.g., delete
                    183:           previous word could have been called with a negative argument
                    184:           in which case, it wouldn't know that it really deleted
                    185:           forward. */
                    186: 
                    187:        if (!dot_moved)
                    188:                backwards = !backwards;
                    189: 
                    190:        DotTo(line1, char1);
                    191: 
                    192:        nl = reg_delete(line1, char1, line2, char2);
                    193: 
                    194:        if (last_cmd != KILLCMD) {
                    195:                killptr = ((killptr + 1) % NUMKILLS);
                    196:                lfreelist(killbuf[killptr]);
                    197:                killbuf[killptr] = nl;
                    198:        } else {
                    199:                Line    *lastln = lastline(nl);
                    200: 
                    201:                if (backwards)
                    202:                        (void) DoYank(nl, 0, lastln, length(lastln), killbuf[killptr], 0, (Buffer *) 0);
                    203:                else {
                    204:                        Line    *olastln = lastline(killbuf[killptr]);
                    205: 
                    206:                        (void) DoYank(nl, 0, lastln, length(lastln), olastln, length(olastln), (Buffer *) 0);
                    207:                }
                    208:        }
                    209:        this_cmd = KILLCMD;
                    210: }
                    211: 
                    212: void
                    213: DelReg()
                    214: {
                    215:        register Mark   *mp = CurMark();
                    216: 
                    217:        reg_kill(mp->m_line, mp->m_char, 0);
                    218: }
                    219: 
                    220: /* Save a region.  A pretend kill. */
                    221: 
                    222: void
                    223: CopyRegion()
                    224: {
                    225:        register Line   *nl;
                    226:        register Mark   *mp;
                    227:        register int    status;
                    228: 
                    229:        mp = CurMark();
                    230:        if (mp->m_line == curline && mp->m_char == curchar)
                    231:                complain((char *) 0);
                    232: 
                    233:        killptr = ((killptr + 1) % NUMKILLS);
                    234:        if (killbuf[killptr])
                    235:                lfreelist(killbuf[killptr]);
                    236:        nl = killbuf[killptr] = nbufline();
                    237:        SavLine(nl, NullStr);
                    238:        nl->l_next = nl->l_prev = 0;
                    239: 
                    240:        status = inorder(mp->m_line, mp->m_char, curline, curchar);
                    241:        if (status == -1)
                    242:                return;
                    243: 
                    244:        if (status)
                    245:                (void) DoYank(mp->m_line, mp->m_char, curline, curchar,
                    246:                                nl, 0, (Buffer *) 0);
                    247:        else
                    248:                (void) DoYank(curline, curchar, mp->m_line, mp->m_char,
                    249:                                nl, 0, (Buffer *) 0);
                    250: }
                    251: 
                    252: void
                    253: DelWtSpace()
                    254: {
                    255:        register char   *ep = &linebuf[curchar],
                    256:                        *sp = &linebuf[curchar];
                    257: 
                    258:        while (*ep == ' ' || *ep == '\t')
                    259:                ep += 1;
                    260:        while (sp > linebuf && (sp[-1] == ' ' || sp[-1] == '\t'))
                    261:                sp -= 1;
                    262:        if (sp != ep) {
                    263:                curchar = sp - linebuf;
                    264:                DFixMarks(curline, curchar, curline, curchar + (ep - sp));
                    265:                strcpy(sp, ep);
                    266:                makedirty(curline);
                    267:                modify();
                    268:        }
                    269: }
                    270: 
                    271: void
                    272: DelBlnkLines()
                    273: {
                    274:        register Mark   *dot;
                    275:        int     all;
                    276: 
                    277:        if (!blnkp(&linebuf[curchar]))
                    278:                return;
                    279:        dot = MakeMark(curline, curchar, M_FLOATER);
                    280:        all = !blnkp(linebuf);
                    281:        while (blnkp(linebuf) && curline->l_prev)
                    282:                SetLine(curline->l_prev);
                    283:        all |= (firstp(curline));
                    284:        Eol();
                    285:        DelWtSpace();
                    286:        line_move(FORWARD, 1, NO);
                    287:        while (blnkp(linebuf) && !eobp()) {
                    288:                DelWtSpace();
                    289:                del_char(FORWARD, 1, NO);
                    290:        }
                    291:        if (!all && !eobp())
                    292:                open_lines(1);
                    293:        ToMark(dot);
                    294:        DelMark(dot);
                    295: }
                    296: 
                    297: private void
                    298: dword(forward)
                    299: int    forward;
                    300: {
                    301:        Bufpos  savedot;
                    302: 
                    303:        DOTsave(&savedot);
                    304:        if (forward)
                    305:                ForWord();
                    306:        else
                    307:                BackWord();
                    308:        reg_kill(savedot.p_line, savedot.p_char, 1);
                    309: }
                    310: 
                    311: void
                    312: DelNWord()
                    313: {
                    314:        dword(1);
                    315: }
                    316: 
                    317: void
                    318: DelPWord()
                    319: {
                    320:        dword(0);
                    321: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.