Use getopt for argument processing; fixes a bug. - sam - An updated version of the sam text editor.
 (HTM) git clone git://vernunftzentrum.de/sam.git
 (DIR) Log
 (DIR) Files
 (DIR) Refs
 (DIR) LICENSE
       ---
 (DIR) commit faf04a03721d852086ec2c89ff28c0a94d583f01
 (DIR) parent c2604deb4126d67aceda979a48ade345a327606b
 (HTM) Author: Rob King <jking@deadpixi.com>
       Date:   Wed, 18 May 2016 00:26:14 -0500
       
       Use getopt for argument processing; fixes a bug.
       
       Diffstat:
         sam/io.c                            |       4 ++--
         sam/sam.c                           |      97 ++++++++++++++-----------------
       
       2 files changed, 46 insertions(+), 55 deletions(-)
       ---
 (DIR) diff --git a/sam/io.c b/sam/io.c
       @@ -246,12 +246,12 @@ connectto(char *machine)
        }
        
        void
       -startup(char *machine, int Rflag, char **argv, char **end)
       +startup(char *machine, int Rflag, char **arg, char **end)
        {
                if(machine)
                        connectto(machine);
                if(!Rflag)
       -                bootterm(machine, argv, end);
       +                bootterm(machine, arg, end);
                downloaded = 1;
                outTs(Hversion, VERSION);
        }
 (DIR) diff --git a/sam/sam.c b/sam/sam.c
       @@ -1,6 +1,8 @@
        /* Copyright (c) 1998 Lucent Technologies - All rights reserved. */
        #include "sam.h"
        
       +#include <unistd.h>
       +
        Rune        genbuf[BLOCKSIZE];
        int        io;
        int        panicking;
       @@ -35,59 +37,48 @@ void        usage(void);
        
        int main(int argc, char *argv[])
        {
       -        int i;
       +        int i, o;
                String *t;
       -        char **ap, **arg;
       -
       -        arg = argv++;
       -        ap = argv;
       -        while(argc>1 && argv[0] && argv[0][0]=='-'){
       -                switch(argv[0][1]){
       -        case 'e':
       -            *ap++ = *argv++;
       -            --argc;
       -            expandtabs++;
       -            break;
       -
       -                case 'd':
       -                        dflag++;
       -                        break;
       -
       -                case 'r':
       -                        *ap++ = *argv++;
       -                        *ap++ = *argv;
       -                        --argc;
       -                        if(argc == 1)
       -                                usage();
       -                        machine = *argv;
       -
       -                        rsamname = RXSAMNAME;
       -                        break;
       -
       -                case 'R':
       -                        Rflag++;
       -                        break;
       -
       -                case 't':
       -                        --argc, argv++;
       -                        if(argc == 1)
       -                                usage();
       -                        samterm = *argv;
       -                        break;
       +        char *arg[argc + 1], **ap;
       +    int targc = 1;
       +
       +    ap = &arg[argc];
       +    arg[argc] = NULL;
       +    while ((o = getopt(argc, argv, "edRr:t:s:")) != -1){
       +        switch (o){
       +            case 'e':
       +                arg[targc++] = "-e";
       +                break;
       +
       +            case 'd':
       +                dflag = 1;
       +                break;
       +
       +            case 'r':
       +                machine = optarg;
       +                rsamname = RXSAMNAME;
       +                arg[targc++] = "-r";
       +                arg[targc++] = optarg;
       +                break;
       +
       +            case 'R':
       +                Rflag = 1;
       +                break;
       +
       +            case 't':
       +                samterm = optarg;
       +                break;
       +
       +            case 's':
       +                rsamname = optarg;
       +
       +            default:
       +                usage();
       +        }
       +    }
       +    argv += optind;
       +    argc -= optind;
        
       -                case 's':
       -                        --argc, argv++;
       -                        if(argc == 1)
       -                                usage();
       -                        rsamname = *argv;
       -                        break;
       -
       -                default:
       -                        dprint("sam: unknown flag %c\n", argv[0][1]);
       -                        exits("usage");
       -                }
       -                --argc, argv++;
       -        }
                Strinit(&cmdstr);
                Strinit0(&lastpat);
                Strinit0(&lastregexp);
       @@ -103,8 +94,8 @@ int main(int argc, char *argv[])
                        startup(machine, Rflag, arg, ap);
                Fstart();
                notify(notifyf);
       -        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');