ref: 3362539850d86c68b403202d113c67f2cd858fca
parent: 6094625c3b1e6964bec9314ef07b1eea2dcf47cd
author: qwx <qwx@sciops.net>
date: Thu Dec 30 18:04:12 EST 2021
add page-del: delete selected file from page(1)
--- /dev/null
+++ b/page-del
@@ -1,0 +1,108 @@
+diff 855cf4326f5a07d7142c2d8918f5fa856d912b85 uncommitted
+--- a//sys/src/cmd/page.c
++++ b//sys/src/cmd/page.c
+@@ -74,6 +74,7 @@
+ Czerox,
+ Cwrite,
+ Cext,
++ Cdel,
+ Cdummy2,
+ Cquit,
+ };
+@@ -98,6 +99,7 @@
+ [Czerox] "zerox", 'z', 0, 0,
+ [Cwrite] "write", 'w', 0, 0,
+ [Cext] "ext", 'x', 0, 0,
++ [Cdel] "del", 'd', 0, 0,
+ [Cdummy2] "", 0, 0, 0,
+ [Cquit] "quit", 'q', Kdel, Keof,
+ };
+@@ -134,6 +136,7 @@
+ void showpage(Page *);
+ void drawpage(Page *);
+ Point pagesize(Page *);
++void drawlock(int);
+
+ Page*
+ addpage(Page *up, char *name, int (*popen)(Page *), void *pdata, int fd)
+@@ -986,6 +989,54 @@
+ }
+ }
+
++/* page entries are never freed, there's no point
++ * and would break everything */
++Page*
++delpage(Page *p)
++{
++ Page *t, *q;
++
++ if(p == nil)
++ return nil;
++ /* to remove(2) subpages in documents makes no sense, and just
++ * removing a subentry doesn't seem like a feature worth the bother */
++ if(p->up != root)
++ return p;
++ if(p->fd >= 0)
++ close(p->fd);
++ p->fd = -1;
++ if(remove(p->name) < 0){
++ fprint(2, "remove %s: %r", p->name);
++ return p;
++ }
++ qlock(&pagelock);
++ for(t = p->down; t != nil && t->up != root; t = q){
++ qlock(t);
++ drawlock(0);
++ unloadpage(t);
++ drawlock(1);
++ free(t->name);
++ free(t->data);
++ t->name = t->data = nil;
++ q = nextpage(t);
++ qunlock(t);
++ }
++ drawlock(0);
++ unloadpage(p);
++ drawlock(1);
++ free(p->name);
++ free(p->data);
++ p->name = p->data = nil;
++ if(root->down != p){
++ t = prevpage(p);
++ t->next = p->next;
++ }else
++ root->down = p->next;
++ qunlock(&pagelock);
++ qunlock(p);
++ return p->next != nil ? p->next : t;
++}
++
+ /*
+ * A draw operation that touches only the area contained in bot but not in top.
+ * mp and sp get aligned with bot.min.
+@@ -1461,6 +1512,7 @@
+ char buf[NPATH], *s;
+ Point o;
+ int fd;
++ Page *p;
+
+ switch(i){
+ case Corigsize:
+@@ -1545,6 +1597,17 @@
+ break;
+ case Csnarf:
+ writeaddr(current, "/dev/snarf");
++ break;
++ case Cdel:
++ if(current == nil || !canqlock(current))
++ break;
++ if((p = delpage(current)) == current)
++ break;
++ current = p;
++ if(current == nil)
++ break;
++ forward = 1;
++ showpage(current);
+ break;
+ case Cnext:
+ forward = 1;