From: "adr via 9fans" <9fans@9fans.net>
To: 9fans <9fans@9fans.net>
Subject: Re: [9fans] sam label and rio snarf buffer
Date: Fri, 23 Jul 2021 21:44:14 +0000 (UTC) [thread overview]
Message-ID: <2eabf32-bcd4-2cd8-cd18-dd2c7f708a4e@SDF.ORG> (raw)
In-Reply-To: <e2c38de6-ca8d-9985-6d48-3638f2397096@SDF.ORG>
In case someone was playing with this, last patch was really naive
(and buggy). I tried different approaches while learning more about
how the two parts of the editor interact with each other and after
some back-and-forths it's working now.
I enabled again the <rio> menu item when samriosnarf is defined,
so the internal buffer can be used as a temporal storage.
I've to think about the plumber and the the named pipe to be able
to plumb a file and bring to the front a sam instance if it has
the file open, moving the file's window to the front with dot set at
the address, if one is given.
If you don't set samriosnarf you wont notice anything, this
patch doesn't change the normal behavior of sam.
I've to revise the code and test it more, but I don't like the idea
of a buggy patch floting on the list, even if no one is using it.
Regards,
adr.
--- sys/src/cmd/samterm/main.c Sat Jun 26 21:12:44 2021
+++ /sys/src/cmd/samterm/main.c Fri Jul 23 21:49:09 2021
@@ -1,5 +1,6 @@
#include <u.h>
#include <libc.h>
+#include <bio.h>
#include <draw.h>
#include <thread.h>
#include <cursor.h>
@@ -24,6 +25,7 @@
long modified = 0; /* strange lookahead for menus */
char hostlock = 1;
char hasunlocked = 0;
+char riosnarf = 0;
int maxtab = 8;
int autoindent;
@@ -35,6 +37,8 @@
Rectangle r;
Flayer *nwhich;
+ if(getenv("samriosnarf"))
+ riosnarf = 1;
getscreen(argc, argv);
iconinit();
initio();
@@ -250,10 +254,27 @@
snarf(Text *t, int w)
{
Flayer *l = &t->l[w];
+ int fd;
+ int n;
+ long p;
if(l->p1>l->p0){
snarflen = l->p1-l->p0;
- outTsll(Tsnarf, t->tag, l->p0, l->p1);
+ if(riosnarf){
+ if((fd=open("/dev/snarf", OWRITE)) < 0){
+ fprint(2, "samterm:snarf: can't open /dev/snarf for writing");
+ return;
+ }
+ t = l->user1;
+ for(p=l->p0; p<l->p1; p+=n){
+ n = l->p1-p>BLOCKSIZE? BLOCKSIZE : l->p1-p;
+ rload(&t->rasp, p, p+n, nil);
+ if(fprint(fd, "%.*S", n, scratch) < 0)
+ break;
+ }
+ close(fd);
+ }else
+ outTsll(Tsnarf, t->tag, l->p0, l->p1);
}
}
@@ -280,14 +301,75 @@
hcheck(t->tag);
}
+#define HSIZE 3
+#define MAXCSTR (DATASIZE-HSIZE-sizeof(int)-2*sizeof(long)) /* Max cstring allowed by outTsllS */
void
paste(Text *t, int w)
{
- if(snarflen){
- cut(t, w, 0, 0);
- t->lock++;
- outTsl(Tpaste, t->tag, t->l[w].p0);
+ Rune *rstr, *rp;
+ Biobuf *bp;
+ int rstrsize;
+ int len; /* size in bytes of current rstr converted to UTF */
+ int m, n; /* n: number of runes already on rstr */
+ long offset, last;
+
+ if(!riosnarf){
+ if(snarflen){
+ cut(t, w, 0, 0);
+ t->lock++;
+ outTsllS(Tpaste, t->tag, 0, t->l[w].p0, L"");
+ }
+ return;
+ }
+ rstrsize = MAXCSTR;
+ if((bp=Bopen("/dev/snarf", OREAD)) == 0){
+ fprint(2, "samterm:paste: can't open /dev/snarf");
+ return;
+ }
+ offset = t->l[w].p0;
+ rp = rstr = alloc(rstrsize);
+ len = n = 0;
+ if((last=Bgetrune(bp)) <= 0)
+ return;
+ cut(t, w, 0, 0);
+ while((long)(*rp=last?last:Bgetrune(bp)) > 0){
+ last = 0;
+ if((len+=runelen(*rp)) > MAXCSTR){
+ Bungetrune(bp);
+ --n;
+ last = *(rp-1); /* can't Bungetrune again... */
+ *(rp-1) = 0;
+ if(t->lock == 0)
+ t->lock = 1;
+ if(Bgetrune(bp) <= 0){ /* Last chunk */
+ outTsllS(Tpaste, t->tag, t->l[w].p0, offset, rstr);
+ break;
+ }
+ Bungetrune(bp);
+ outTsllS(Tpaste, t->tag, -1, offset, rstr);
+ offset += n;
+ rp = rstr;
+ n = len = 0;
+ continue;
+ }
+ if(RUNESIZE*(rp-rstr+2) > rstrsize){
+ m = rp - rstr;
+ rstr = realloc(rstr, rstrsize+=MAXCSTR);
+ if(!rstr)
+ panic("realloc");
+ rp = rstr + m;
+ }
+ ++rp;
+ ++n;
+ }
+ *rp = 0;
+ if(*rstr){
+ if(t->lock == 0)
+ t->lock = 1;
+ outTsllS(Tpaste, t->tag, t->l[w].p0, offset, rstr);
}
+ free(rstr);
+ Bterm(bp);
}
void
--- sys/src/cmd/samterm/mesg.c Thu Mar 29 19:35:49 2012
+++ /sys/src/cmd/samterm/mesg.c Fri Jul 23 19:23:28 2021
@@ -97,6 +97,7 @@
int i, m;
long l;
Flayer *lp;
+ char *str, c;
m = inshort(0);
l = inlong(2);
@@ -107,6 +108,18 @@
fprint(2, "type %d\n", type);
panic("rcv unknown");
+ case Hlabel:
+ str = (char *)indata;
+ if((m = open("/dev/label", OWRITE)) < 0){
+ fprint(2, "samterm:label: can't open /dev/label for writing");
+ break;
+ }
+ while((c=*str)==' ' || c=='\t')
+ str++;
+ fprint(m, "%s", str);
+ close(m);
+ break;
+
case Hversion:
hversion = m;
break;
@@ -432,6 +445,24 @@
outstart(type);
outshort(s1);
outlong(l1);
+ c = buf;
+ while(*s)
+ c += runetochar(c, s++);
+ *c++ = 0;
+ outcopy(c-buf, (uchar *)buf);
+ outsend();
+}
+
+void
+outTsllS(Tmesg type, int s1, long l1, long l2, Rune *s)
+{
+ char buf[DATASIZE*3+1];
+ char *c;
+
+ outstart(type);
+ outshort(s1);
+ outlong(l1);
+ outlong(l2);
c = buf;
while(*s)
c += runetochar(c, s++);
--- sys/src/cmd/samterm/samterm.h Sat Jun 26 21:13:32 2021
+++ /sys/src/cmd/samterm/samterm.h Fri Jul 23 11:59:07 2021
@@ -1,5 +1,6 @@
#define SAMTERM
+#define BLOCKSIZE 2048
#define RUNESIZE sizeof(Rune)
#define MAXFILES 256
#define READBUFSIZE (16*1024)
@@ -72,6 +73,7 @@
extern long nscralloc;
extern char hostlock;
extern char hasunlocked;
+extern char riosnarf;
extern long snarflen;
extern Mousectl* mousectl;
extern Keyboardctl* keyboardctl;
@@ -167,6 +169,7 @@
void outT0(Tmesg);
void outTl(Tmesg, long);
void outTslS(Tmesg, int, long, Rune*);
+void outTsllS(Tmesg, int, long, long, Rune*);
void outTsll(Tmesg, int, long, long);
void outTsl(Tmesg, int, long);
void outTsv(Tmesg, int, vlong);
--- sys/src/cmd/sam/cmd.c Wed Apr 24 00:06:05 2013
+++ /sys/src/cmd/sam/cmd.c Sun Jul 18 18:23:06 2021
@@ -17,6 +17,7 @@
'g', 0, 1, 0, 'p', aDot, 0, 0, g_cmd,
'i', 1, 0, 0, 0, aDot, 0, 0, i_cmd,
'k', 0, 0, 0, 0, aDot, 0, 0, k_cmd,
+ 'l', 0, 0, 0, 0, aNo, 0, linex, l_cmd,
'm', 0, 0, 1, 0, aDot, 0, 0, m_cmd,
'n', 0, 0, 0, 0, aNo, 0, 0, n_cmd,
'p', 0, 0, 0, 0, aDot, 0, 0, p_cmd,
--- sys/src/cmd/sam/disk.c Thu Feb 28 21:08:58 2002
+++ /sys/src/cmd/sam/disk.c Fri Jul 23 19:34:38 2021
@@ -48,7 +48,7 @@
/* last bucket holds blocks of exactly Maxblock */
if(ip)
*ip = size/Blockincr;
- return size * sizeof(Rune);
+ return size * RUNESIZE;
}
Block*
@@ -101,7 +101,7 @@
b = disknewblock(d, n);
*bp = b;
}
- if(pwrite(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
+ if(pwrite(d->fd, r, n*RUNESIZE, b->addr) != n*RUNESIZE)
panic("write error to temp file");
b->n = n;
}
@@ -113,6 +113,6 @@
panic("internal error: diskread");
ntosize(b->n, nil); /* called only for sanity check on Maxblock */
- if(pread(d->fd, r, n*sizeof(Rune), b->addr) != n*sizeof(Rune))
+ if(pread(d->fd, r, n*RUNESIZE, b->addr) != n*RUNESIZE)
panic("read error from temp file");
}
--- sys/src/cmd/sam/file.c Fri Jul 30 18:29:06 2010
+++ /sys/src/cmd/sam/file.c Fri Jul 23 19:35:49 2021
@@ -35,7 +35,7 @@
enum
{
Maxmerge = 50,
- Undosize = sizeof(Undo)/sizeof(Rune),
+ Undosize = sizeof(Undo)/RUNESIZE,
};
static Merge merge;
--- sys/src/cmd/sam/mesg.c Fri Jan 12 17:02:55 2007
+++ /sys/src/cmd/sam/mesg.c Fri Jul 23 19:50:39 2021
@@ -1,4 +1,5 @@
#include "sam.h"
+#include <bio.h>
Header h;
uchar indata[DATASIZE];
@@ -347,7 +348,28 @@
case Tpaste:
f = whichfile(inshort());
p0 = inlong();
+ p = inlong();
journaln(0, p0);
+
+ if(*(char*)inp != 0){
+ str = tmpcstr((char*)inp);
+ m = str->n;
+ loginsert(f, p, str->s, m);
+ freetmpstr(str);
+ if(fileupdate(f, FALSE, TRUE))
+ seq++;
+ /* there's another chunk? */
+ if(p0 < 0){
+ rcv();
+ break;
+ }
+ f->dot.r.p1 = p0;
+ f->dot.r.p2 = p+m;
+ f->tdot.p1 = -1; /* force telldot to tell (arguably a BUG) */
+ telldot(f);
+ outTs(Hunlockfile, f->tag);
+ break;
+ }
for(l=0; l<snarfbuf.nc; l+=m){
m = snarfbuf.nc-l;
if(m>BLOCKSIZE)
@@ -359,7 +381,7 @@
seq++;
f->dot.r.p1 = p0;
f->dot.r.p2 = p0+snarfbuf.nc;
- f->tdot.p1 = -1; /* force telldot to tell (arguably a BUG) */
+ f->tdot.p1 = -1;
telldot(f);
outTs(Hunlockfile, f->tag);
break;
@@ -477,7 +499,7 @@
m = SNARFSIZE;
dprint("?warning: snarf buffer truncated\n");
}
- rp = malloc(m*sizeof(Rune));
+ rp = malloc(m*RUNESIZE);
if(rp){
bufread(&snarfbuf, 0, rp, m);
c = Strtoc(tmprstr(rp, m));
--- sys/src/cmd/sam/mesg.h Fri Mar 18 22:33:33 2005
+++ /sys/src/cmd/sam/mesg.h Wed Jul 21 22:46:19 2021
@@ -67,6 +67,7 @@
Hack, /* request acknowledgement */
Hexit,
Hplumb, /* return plumb message to terminal - version 1 */
+ Hlabel, /* set /dev/label on terminal */
HMAX,
}Hmesg;
typedef struct Header{
--- sys/src/cmd/sam/parse.h Thu Oct 27 15:36:34 2005
+++ /sys/src/cmd/sam/parse.h Sat Jul 17 19:55:51 2021
@@ -55,13 +55,12 @@
int nl_cmd(File*, Cmd*), a_cmd(File*, Cmd*), b_cmd(File*, Cmd*);
int c_cmd(File*, Cmd*), cd_cmd(File*, Cmd*), d_cmd(File*, Cmd*);
-int D_cmd(File*, Cmd*), e_cmd(File*, Cmd*);
-int f_cmd(File*, Cmd*), g_cmd(File*, Cmd*), i_cmd(File*, Cmd*);
-int k_cmd(File*, Cmd*), m_cmd(File*, Cmd*), n_cmd(File*, Cmd*);
-int p_cmd(File*, Cmd*), q_cmd(File*, Cmd*);
-int s_cmd(File*, Cmd*), u_cmd(File*, Cmd*), w_cmd(File*, Cmd*);
-int x_cmd(File*, Cmd*), X_cmd(File*, Cmd*), plan9_cmd(File*, Cmd*);
-int eq_cmd(File*, Cmd*);
+int D_cmd(File*, Cmd*), e_cmd(File*, Cmd*), f_cmd(File*, Cmd*);
+int g_cmd(File*, Cmd*), i_cmd(File*, Cmd*), k_cmd(File*, Cmd*);
+int l_cmd(File*, Cmd*), m_cmd(File*, Cmd*), n_cmd(File*, Cmd*);
+int p_cmd(File*, Cmd*), q_cmd(File*, Cmd*), s_cmd(File*, Cmd*);
+int u_cmd(File*, Cmd*), w_cmd(File*, Cmd*), x_cmd(File*, Cmd*);
+int X_cmd(File*, Cmd*), plan9_cmd(File*, Cmd*), eq_cmd(File*, Cmd*);
String *getregexp(int);
--- sys/src/cmd/sam/sam.c Tue Dec 6 17:05:45 2005
+++ /sys/src/cmd/sam/sam.c Tue Jul 20 12:23:28 2021
@@ -25,6 +25,7 @@
int termlocked;
char *samterm = SAMTERM;
char *rsamname = RSAM;
+char *samtermlabel = nil;
File *lastfile;
Disk *disk;
long seq;
@@ -57,6 +58,9 @@
case 's':
rsamname = EARGF(usage());
break;
+ case 'l':
+ samtermlabel = EARGF(usage());
+ break;
default:
dprint("sam: unknown flag %c\n", ARGC());
usage();
@@ -82,6 +86,11 @@
startup(machine, Rflag, termargs, argv);
notify(notifyf);
getcurwd();
+ if(samtermlabel){
+ t=tmpcstr(samtermlabel);
+ outTS(Hlabel, t);
+ freetmpstr(t);
+ }
if(argc>0){
for(i=0; i<argc; i++){
if(!setjmp(mainloop)){
@@ -107,7 +116,7 @@
void
usage(void)
{
- dprint("usage: sam [-d] [-t samterm] [-s sam name] -r machine\n");
+ dprint("usage: sam [-d] [-t samterm] [-s sam name] -r machine -l label\n");
exits("usage");
}
--- sys/src/cmd/sam/sam.h Sat Jun 26 21:13:32 2021
+++ /sys/src/cmd/sam/sam.h Fri Jul 23 19:38:48 2021
@@ -90,7 +90,7 @@
Maxblock = 16*1024,
BUFSIZE = Maxblock, /* size from fbufalloc() */
- RBUFSIZE = BUFSIZE/sizeof(Rune),
+ RBUFSIZE = BUFSIZE/RUNESIZE,
};
@@ -220,9 +220,9 @@
uint min(uint, uint);
void cvttorunes(char*, int, Rune*, int*, int*, int*);
-#define runemalloc(a) (Rune*)emalloc((a)*sizeof(Rune))
-#define runerealloc(a, b) (Rune*)realloc((a), (b)*sizeof(Rune))
-#define runemove(a, b, c) memmove((a), (b), (c)*sizeof(Rune))
+#define runemalloc(a) (Rune*)emalloc((a)*RUNESIZE)
+#define runerealloc(a, b) (Rune*)realloc((a), (b)*RUNESIZE)
+#define runemove(a, b, c) memmove((a), (b), (c)*RUNESIZE)
int alnum(int);
int Read(int, void*, int);
--- sys/src/cmd/sam/xec.c Tue Jun 6 02:55:54 2000
+++ /sys/src/cmd/sam/xec.c Tue Jul 20 12:34:09 2021
@@ -26,7 +26,7 @@
if(f && f->unread)
load(f);
if(f==0 && (cp->addr==0 || cp->addr->type!='"') &&
- !utfrune("bBnqUXY!", cp->cmdc) &&
+ !utfrune("bBnqUXY!l", cp->cmdc) &&
cp->cmdc!=('c'|0x100) && !(cp->cmdc=='D' && cp->ctext))
error(Enofile);
i = lookup(cp->cmdc);
@@ -150,6 +150,14 @@
{
USED(cp);
f->mark = addr.r;
+ return TRUE;
+}
+
+int
+l_cmd(File *f, Cmd *cp)
+{
+ USED(f);
+ outTS(Hlabel, cp->ctext);
return TRUE;
}
------------------------------------------
9fans: 9fans
Permalink: https://9fans.topicbox.com/groups/9fans/Tc809ad6007ccd2bd-M27ffc8edbf9c9fa1390479dd
Delivery options: https://9fans.topicbox.com/groups/9fans/subscription
next prev parent reply other threads:[~2021-07-23 21:44 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-07-20 12:35 adr via 9fans
2021-07-20 18:01 ` Skip Tavakkolian
2021-07-20 19:21 ` adr via 9fans
2021-07-20 20:23 ` Skip Tavakkolian
2021-07-20 20:49 ` adr via 9fans
2021-07-20 21:27 ` Stuart Morrow
2021-07-20 21:36 ` Peter Mikkelsen
2021-07-20 22:35 ` Stuart Morrow
2021-07-20 22:12 ` Ethan Gardener
2021-07-20 23:01 ` ori
2021-07-20 23:39 ` adr via 9fans
2021-07-21 3:32 ` Lucio De Re
2021-07-21 8:00 ` hiro
2021-07-23 21:44 ` adr via 9fans [this message]
2021-07-23 22:25 ` umbraticus
2021-07-20 21:27 ` adr via 9fans
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=2eabf32-bcd4-2cd8-cd18-dd2c7f708a4e@SDF.ORG \
--to=9fans@9fans.net \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).