-
Notifications
You must be signed in to change notification settings - Fork 0
/
v_delete.c
58 lines (54 loc) · 924 Bytes
/
v_delete.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include "vstr.h"
#include <string.h>
IMPORT void linkout();
ROUTINE int v_delete(v, cnt)
register p_vstr v;
register int cnt;
{
register p_unit temp;
register int actual = 0, n;
entry(v_delete)
if (!cnt)
ret(0)
while (cnt) {
temp = v->cur.here;
n = temp->len - v->cur.u_pos;
if (!n) {
if (!temp->next)
ret(actual)
else {
v->cur.here = temp->next;
v->cur.u_pos = 0;
}
continue;
}
if (n <= cnt) {
if (!v->cur.u_pos) {
cnt -= temp->len;
actual += temp->len;
linkout(v, temp);
if (v->cur.here == temp->prev)
cnt = 0;
}
else {
temp->len -= n;
cnt -= n;
actual += n;
if (temp->next) {
v->cur.here = temp->next;
v->cur.u_pos = 0;
}
else
cnt = 0;
}
}
else {
strncpy(temp->data + v->cur.u_pos,
temp->data + v->cur.u_pos + cnt, n);
temp->len -= cnt;
actual += cnt;
cnt = 0;
}
}
ret(actual)
}