tadd autoindent (-a) and chording. clean up argument parsing. - plan9port - [fork] Plan 9 from user space
 (HTM) git clone git://src.adamsgaard.dk/plan9port
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) README
 (DIR) LICENSE
       ---
 (DIR) commit 17ab31aac6639e210613691669163b0c2874d1ce
 (DIR) parent 4ac5f249ad40f3452fc87dc9a3f4b9d9546c83b0
 (HTM) Author: rsc <devnull@localhost>
       Date:   Thu, 27 Jan 2005 06:10:35 +0000
       
       add autoindent (-a) and chording.
       clean up argument parsing.
       
       Diffstat:
         M src/cmd/sam/io.c                    |       8 +++-----
         M src/cmd/sam/mesg.h                  |       2 +-
         M src/cmd/sam/sam.c                   |      91 +++++++++++++------------------
         M src/cmd/sam/sam.h                   |       2 +-
         M src/cmd/samterm/flayer.c            |       3 ++-
         M src/cmd/samterm/main.c              |      57 +++++++++++++++++++++++++++----
         M src/cmd/samterm/plan9.c             |      23 +++++++++++++++++------
         M src/cmd/samterm/samterm.h           |       1 +
       
       8 files changed, 113 insertions(+), 74 deletions(-)
       ---
 (DIR) diff --git a/src/cmd/sam/io.c b/src/cmd/sam/io.c
       t@@ -176,7 +176,7 @@ int        remotefd0 = 0;
        int        remotefd1 = 1;
        
        void
       -bootterm(char *machine, char **argv, char **end)
       +bootterm(char *machine, char **argv)
        {
                int ph2t[2], pt2h[2];
        
       t@@ -186,7 +186,6 @@ bootterm(char *machine, char **argv, char **end)
                        close(remotefd0);
                        close(remotefd1);
                        argv[0] = "samterm";
       -                *end = 0;
                        execvp(samterm, argv);
                        fprint(2, "can't exec %s: %r\n", samterm);
                        _exits("damn");
       t@@ -202,7 +201,6 @@ bootterm(char *machine, char **argv, char **end)
                        close(pt2h[0]);
                        close(pt2h[1]);
                        argv[0] = "samterm";
       -                *end = 0;
                        execvp(samterm, argv);
                        fprint(2, "can't exec: ");
                        perror(samterm);
       t@@ -269,12 +267,12 @@ connectto(char *machine, char **argv)
        }
        
        void
       -startup(char *machine, int Rflag, char **argv, char **end, char **files)
       +startup(char *machine, int Rflag, char **argv, char **files)
        {
                if(machine)
                        connectto(machine, files);
                if(!Rflag)
       -                bootterm(machine, argv, end);
       +                bootterm(machine, argv);
                downloaded = 1;
                outTs(Hversion, VERSION);
        }
 (DIR) diff --git a/src/cmd/sam/mesg.h b/src/cmd/sam/mesg.h
       t@@ -66,7 +66,7 @@ typedef enum Hmesg
                Hsnarflen,        /* report length of implicit snarf */
                Hack,                /* request acknowledgement */
                Hexit,
       -        Hplumb,                /* return plumb message to terminal */
       +        Hplumb,                /* return plumb message to terminal - version 1 */
                HMAX,
        }Hmesg;
        typedef struct Header{
 (DIR) diff --git a/src/cmd/sam/sam.c b/src/cmd/sam/sam.c
       t@@ -42,58 +42,40 @@ main(int volatile argc, char **volatile argv)
        {
                int volatile i;
                String *t;
       -        char **ap, **arg;
       -
       -        arg = argv++;
       -        ap = argv;
       -        while(argc>1 && argv[0] && argv[0][0]=='-'){
       -                switch(argv[0][1]){
       -                case 'd':
       -                        dflag++;
       -                        break;
       -
       -                case 'r':
       -                        --argc, argv++;
       -                        if(argc == 1)
       -                                usage();
       -                        machine = *argv;
       -                        break;
       -
       -                case 'R':
       -                        Rflag++;
       -                        break;
       -
       -                case 't':
       -                        --argc, argv++;
       -                        if(argc == 1)
       -                                usage();
       -                        samterm = *argv;
       -                        break;
       +        char *termargs[10], **ap;
       +        
       +        ap = termargs;
       +        *ap++ = "samterm";
       +        ARGBEGIN{
       +        case 'd':
       +                dflag++;
       +                break;
       +        case 'r':
       +                machine = EARGF(usage());
       +                break;
       +        case 'R':
       +                Rflag++;
       +                break;
       +        case 't':
       +                samterm = EARGF(usage());
       +                break;
       +        case 's':
       +                rsamname = EARGF(usage());
       +                break;
       +        default:
       +                dprint("sam: unknown flag %c\n", ARGC());
       +                usage();
       +        /* options for samterm */
       +        case 'a':
       +                *ap++ = "-a";
       +                break;
       +        case 'W':
       +                *ap++ = "-W";
       +                *ap++ = EARGF(usage());
       +                break;
       +        }ARGEND
       +        *ap = nil;
        
       -                case 's':
       -                        --argc, argv++;
       -                        if(argc == 1)
       -                                usage();
       -                        rsamname = *argv;
       -                        break;
       -
       -                case 'x':       /* x11 option - strip the x */
       -                        strcpy(*argv+1, *argv+2);
       -                        *ap++ = *argv++;
       -                        *ap++ = *argv;
       -                        argc--;
       -                        break;
       -
       -                case 'W':
       -                        --argc, argv++;
       -                        break;
       -
       -                default:
       -                        dprint("sam: unknown flag %c\n", argv[0][1]);
       -                        exits("usage");
       -                }
       -                --argc, argv++;
       -        }
                Strinit(&cmdstr);
                Strinit0(&lastpat);
                Strinit0(&lastregexp);
       t@@ -106,12 +88,13 @@ main(int volatile argc, char **volatile argv)
                disk = diskinit();
                if(home == 0)
                        home = "/";
       +fprint(2, "argc %d argv %s\n", argc, *argv);
                if(!dflag)
       -                startup(machine, Rflag, arg, ap, argv);
       +                startup(machine, Rflag, termargs, argv);
                notify(notifyf);
                getcurwd();
       -        if(argc>1){
       -                for(i=0; i<argc-1; i++){
       +        if(argc>0){
       +                for(i=0; i<argc; i++){
                                if(!setjmp(mainloop)){
                                        t = tmpcstr(argv[i]);
                                        Straddc(t, '\0');
 (DIR) diff --git a/src/cmd/sam/sam.h b/src/cmd/sam/sam.h
       t@@ -295,7 +295,7 @@ void        settempfile(void);
        int        skipbl(void);
        void        snarf(File*, Posn, Posn, Buffer*, int);
        void        sortname(File*);
       -void        startup(char*, int, char**, char**, char**);
       +void        startup(char*, int, char**, char**);
        void        state(File*, int);
        int        statfd(int, ulong*, uvlong*, long*, long*, long*);
        int        statfile(char*, ulong*, uvlong*, long*, long*, long*);
 (DIR) diff --git a/src/cmd/samterm/flayer.c b/src/cmd/samterm/flayer.c
       t@@ -253,10 +253,11 @@ fldelete(Flayer *l, long p0, long p1)
        int
        flselect(Flayer *l)
        {
       -        int ret = 0;
       +        int ret;
                if(l->visible!=All)
                        flupfront(l);
                frselect(&l->f, mousectl);
       +        ret = 0;
                if(l->f.p0==l->f.p1){
                        if(mousep->msec-l->click<Clicktime && l->f.p0+l->origin==l->p0){
                                ret = 1;
 (DIR) diff --git a/src/cmd/samterm/main.c b/src/cmd/samterm/main.c
       t@@ -23,11 +23,13 @@ long        modified = 0;                /* strange lookahead for menus */
        char        hostlock = 1;
        char        hasunlocked = 0;
        int        maxtab = 8;
       +int        chord;
       +int        autoindent;
        
        void
        threadmain(int argc, char *argv[])
        {
       -        int i, got, scr;
       +        int i, got, scr, w;
                Text *t;
                Rectangle r;
                Flayer *nwhich;
       t@@ -98,7 +100,11 @@ dup(2, 1);
                                scr = which && ptinrect(mousep->xy, which->scroll);
                                if(mousep->buttons)
                                        flushtyping(1);
       -                        if(mousep->buttons&1){
       +                        if(chord==1 && !mousep->buttons)
       +                                chord = 0;
       +                        if(chord)
       +                                chord |= mousep->buttons;
       +                        else if(mousep->buttons&1){
                                        if(nwhich){
                                                if(nwhich!=which)
                                                        current(nwhich);
       t@@ -111,6 +117,8 @@ dup(2, 1);
                                                                t->lock++;
                                                        }else if(t!=&cmd)
                                                                outcmd();
       +                                                if(mousep->buttons&1)
       +                                                        chord = mousep->buttons;
                                                }
                                        }
                                }else if((mousep->buttons&2) && which){
       t@@ -126,10 +134,22 @@ dup(2, 1);
                                }
                                mouseunblock();
                        }
       +                if(chord){
       +                        t = (Text*)which->user1;
       +                        if(!t->lock && !hostlock){
       +                                w = which-t->l;
       +                                if(chord&2){
       +                                        cut(t, w, 1, 1);
       +                                        chord &= ~2;
       +                                }else if(chord&4){
       +                                        paste(t, w);
       +                                        chord &= ~4;
       +                                }
       +                        }
       +                }
                }
        }
        
       -
        void
        resize(void)
        {
       t@@ -394,7 +414,7 @@ center(Flayer *l, long a)
        }
        
        int
       -onethird(Flayer *l, long a)
       +thirds(Flayer *l, long a, int n)
        {
                Text *t;
                Rectangle s;
       t@@ -405,7 +425,7 @@ onethird(Flayer *l, long a)
                        if(a > t->rasp.nrunes)
                                a = t->rasp.nrunes;
                        s = insetrect(l->scroll, 1);
       -                lines = ((s.max.y-s.min.y)/l->f.font->height+1)/3;
       +                lines = (n*(s.max.y-s.min.y)/l->f.font->height+1)/3;
                        if (lines < 2)
                                lines = 2;
                        outTsll(Torigin, t->tag, a, lines);
       t@@ -414,6 +434,18 @@ onethird(Flayer *l, long a)
                return 0;
        }
        
       +int
       +onethird(Flayer *l, long a)
       +{
       +        return thirds(l, a, 1);
       +}
       +
       +int
       +twothirds(Flayer *l, long a)
       +{
       +        return thirds(l, a, 2);
       +}
       +
        void
        flushtyping(int clearesc)
        {
       t@@ -495,7 +527,20 @@ type(Flayer *l, int res)        /* what a bloody mess this is */
                                }
                        }
                        *p++ = c;
       -                if(c == '\n' || p >= buf+sizeof(buf)/sizeof(buf[0]))
       +                if(autoindent)
       +                if(c == '\n'){
       +                        /* autoindent */
       +                        int cursor, ch;
       +                        cursor = ctlu(&t->rasp, 0, a+(p-buf)-1);
       +                        while(p < buf+nelem(buf)){
       +                                ch = raspc(&t->rasp, cursor++);
       +                                if(ch == ' ' || ch == '\t')
       +                                        *p++ = ch;
       +                                else
       +                                        break;
       +                        }
       +                }
       +                if(c == '\n' || p >= buf+nelem(buf))
                                break;
                }
                if(p > buf){
 (DIR) diff --git a/src/cmd/samterm/plan9.c b/src/cmd/samterm/plan9.c
       t@@ -26,16 +26,27 @@ static char *exname;
        #define STACK 16384
        
        void
       +usage(void)
       +{
       +        fprint(2, "usage: samterm -a -W winsize\n");
       +        threadexitsall("usage");
       +}
       +
       +void
        getscreen(int argc, char **argv)
        {
       -        int i;
                char *t;
        
       -        /* not exactly right */
       -        for(i=0; i<argc-1; i++){
       -                if(strcmp(argv[i], "-W") == 0)
       -                        winsize = argv[i+1];
       -        }
       +        ARGBEGIN{
       +        case 'a':
       +                autoindent = 1;
       +                break;
       +        case 'W':
       +                winsize = EARGF(usage());
       +                break;
       +        default:
       +                usage();
       +        }ARGEND
        
                if(initdraw(panic1, nil, "sam") < 0){
                        fprint(2, "samterm: initdraw: %r\n");
 (DIR) diff --git a/src/cmd/samterm/samterm.h b/src/cmd/samterm/samterm.h
       t@@ -88,6 +88,7 @@ extern int        hversion;
        extern int        plumbfd;
        extern int        hostfd[2];
        extern int        exiting;
       +extern int autoindent;
        
        #define gettext sam_gettext        /* stupid gcc built-in functions */
        Rune        *gettext(Flayer*, long, ulong*);