ref: bb85d99a02ba60bebcd8509fb1bfec8476ef0047
dir: /9legacy/sam_label_command_riosnarf.diff/
--- 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, t->l[w].p0, 0, 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;
}