9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
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

  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).