|
|
1.1 root 1: /*% cc -c -O %
2: */
3: #include "vars.h"
4: move(copyflag)
5: {
6: register int *adt, *ad1, *ad2;
7: int fb, tb;
8: int todot;
9: int tonewdot;
10: int totmved;
11: int temp;
12: int getcopy();
13:
14: setdot();
15: nonzero();
16: fb = curbuf - buffer;
17: temp = getchar();
18: tb = posn(temp, bname);
19: if(tb >= 0)
20: chngbuf(tb);
21: else{
22: ungetchar(temp);
23: tb = fb;
24: }
25: if ((adt = address())==0){
26: chngbuf(fb);
27: error('x');
28: }
29: todot = adt - buffer[tb].zero; /* syncbuf not needed! */
30: chngbuf(fb);
31: ad1 = addr1;
32: ad2 = addr2;
33: totmved = ad2 - ad1 + 1;
34: lock++;
35: if (copyflag) {
36: tonewdot = addr2 - buffer[fb].zero;
37: /*
38: * NOTE: in the copy command
39: * copies of the lines are created using append
40: * and then moved to the target position.
41: * They are appended at the dollar of their
42: * original buffer. (guarenteed to be higher address)
43: * They are NOT appended at the target position
44: * since, if the target position was lower than their
45: * source position, getcopy would have to account
46: * for the shift of the addresses due to the insert
47: * of the copies.
48: */
49: ad1 = dol;
50: temp = cflag;
51: append(getcopy, ad1++);
52: cflag = temp;
53: ad2 = dol;
54: } else
55: tonewdot = addr1 - buffer[fb].zero - 1;
56: ad2++;
57: adt = buffer[tb].zero + todot;
58: chngbuf(tb);
59: if (adt<ad1) {
60: if ((++adt)!=ad1){
61: reverse(adt, ad1);
62: reverse(ad1, ad2);
63: reverse(adt, ad2);
64: }
65: } else {
66: if (adt++ >= ad2) {
67: reverse(ad1, ad2);
68: reverse(ad2, adt);
69: reverse(ad1, adt);
70: } else {
71: if(ad2 != zero + 1){
72: error('m');
73: }
74: }
75: }
76: fixup(fb, tb, totmved);
77: buffer[fb].dot = buffer[fb].zero + tonewdot;
78: if(copyflag == 0 && fb == tb && todot >= tonewdot){
79: todot -= totmved;
80: }
81: if(!copyflag)
82: buffer[fb].cflag = TRUE;
83: modified();
84: dot = buffer[tb].dot = buffer[tb].zero + todot + totmved;
85: zero = buffer[tb].zero;
86: dol = buffer[tb].dol;
87: unlock();
88: }
89: fixup(from,to,tot) int from, to, tot;
90: {
91: register int b;
92: register int n;
93: register int lo;
94: int hi;
95: if(to == from){
96: return;
97: }
98: if(to < from){
99: n = tot;
100: lo = to;
101: hi = from;
102: } else {
103: n = -tot;
104: lo = from;
105: hi = to;
106: }
107: buffer[lo].dol += n;
108: for(b = lo;++b < hi;){
109: buffer[b].zero += n;
110: buffer[b].dot += n;
111: buffer[b].dol += n;
112: }
113: buffer[hi].zero += n;
114: }
115: reverse(a1, a2)
116: register int *a1, *a2;
117: {
118: register t;
119: for (;;) {
120: t = *--a2;
121: if (a2 <= a1)
122: return;
123: *a2 = *a1;
124: *a1++ = t;
125: }
126: }
127: getcopy()
128: {
129: if (addr1 > addr2)
130: return(EOF);
131: getline(*addr1++, linebuf);
132: return(0);
133: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.