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

unix.superglobalmegacorp.com

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