Upload as 1.01b-17
[pkg/mmv.git] / mmv.c
diff --git a/mmv.c b/mmv.c
index 200392c05f913d3e48a41a59dedbe6c148e08b4e..2e72a731e426c3378d5887c355abda40d337e3e7 100644 (file)
--- a/mmv.c
+++ b/mmv.c
@@ -62,8 +62,7 @@ static char USAGE[] =
 %s [-m|x%s|c|o|a|z] [-h] [-d|p] [-g|t] [-v|n] [from to]\n\
 \n\
 Use #N in the ``to'' pattern to get the string matched\n\
-by the N'th ``from'' pattern wildcard.\n\
-Use -- as the end of options.\n";
+by the N'th ``from'' pattern wildcard.\n";
 
 #define OTHEROPT (_osmajor < 3 ? "" : "|r")
 
@@ -76,9 +75,7 @@ Use #[l|u]N in the ``to'' pattern to get the [lowercase|uppercase of the]\n\
 string matched by the N'th ``from'' pattern wildcard.\n\
 \n\
 A ``from'' pattern containing wildcards should be quoted when given\n\
-on the command line. Also you may need to quote ``to'' pattern.\n\
-\n\
-Use -- as the end of options.\n";
+on the command line.\n";
 
 #ifdef IS_SYSV
 #define OTHEROPT ""
@@ -88,7 +85,6 @@ Use -- as the end of options.\n";
 
 #endif
 
-#include <unistd.h>
 #include <stdio.h>
 #include <ctype.h>
 
@@ -124,11 +120,14 @@ extern unsigned _stklen = 10000;
 #else
 /* for various flavors of UN*X */
 
-#include <stdlib.h>
 #include <sys/types.h>
 #include <sys/stat.h>
 #include <sys/file.h>
 
+extern char *getenv();
+extern long lseek();
+extern char *malloc();
+
 #ifdef HAS_DIRENT
 #include <dirent.h>
 typedef struct dirent DIRENTRY;
@@ -391,7 +390,7 @@ static int movealias(/* REP *first, REP *p, int *pprintaliased */);
 static int snap(/* REP *first, REP *p */);
 static void showdone(/* REP *fin */);
 static void breakout(/*  */);
-static void breakrep(int);
+static int breakrep(/* */);
 static void breakstat(/* */);
 static void quit(/*  */);
 static int copymove(/* REP *p */);
@@ -437,11 +436,9 @@ static CHUNK *freechunks = NULL;
 static SLICER slicer[2] = {{NULL, NULL, 0}, {NULL, NULL, 0}};
 
 static int badreps = 0, paterr = 0, direrr, failed = 0, gotsig = 0, repbad;
-static FILE *outfile;
+static FILE *outfile = stdout;
 
-#ifdef IS_MSDOS
 static char IDF[] = "$$mmvdid.";
-#endif
 static char TEMP[] = "$$mmvtmp.";
 static char TOOLONG[] = "(too long)";
 static char EMPTY[] = "(empty)";
@@ -459,12 +456,12 @@ char pathbuf[MAXPATH];
 char fullrep[MAXPATH + 1];
 static char *(start[MAXWILD]);
 static int len[MAXWILD];
+static char hasdot[MAXWILD];
 static REP mistake;
 #define MISTAKE (&mistake)
 
 #ifdef IS_MSDOS
 
-static char hasdot[MAXWILD];
 static int olddevflag, curdisk, maxdisk;
 static struct {
        char ph_banner[30];
@@ -500,8 +497,6 @@ int main(argc, argv)
 {
        char *frompat, *topat;
 
-       outfile = stdout;
-
        init();
        procargs(argc, argv, &frompat, &topat);
        domatch(frompat, topat);
@@ -580,11 +575,6 @@ static void procargs(argc, argv, pfrompat, ptopat)
        for (argc--, argv++; argc > 0 && **argv == '-'; argc--, argv++)
                for (p = *argv + 1; *p != '\0'; p++) {
                        c = mylower(*p);
-                       if (c == '-') {
-                               argc--;
-                               argv++;
-                               goto endargs;
-                       }
                        if (c == 'v' && !noex)
                                verbose = 1;
                        else if (c == 'n' && !verbose)
@@ -628,8 +618,7 @@ static void procargs(argc, argv, pfrompat, ptopat)
                        }
                }
 
-endargs:
-       if (op == DFLT) {
+       if (op == DFLT)
                if (strcmp(cmdname, MOVENAME) == 0)
                        op = XMOVE;
                else if (strcmp(cmdname, COPYNAME) == 0)
@@ -640,8 +629,6 @@ endargs:
                        op = HARDLINK;
                else
                        op = DFLTOP;
-       }
-       
        if (
                op & DIRMOVE &&
 #ifdef IS_MSDOS
@@ -788,7 +775,7 @@ static void matchpat()
 static int parsepat()
 {
        char *p, *lastname, c;
-       int totwilds, instage, x;
+       int totwilds, instage, x, havedot;
        static char TRAILESC[] = "%s -> %s : trailing %c is superfluous.\n";
 
        lastname = from;
@@ -1012,16 +999,20 @@ static int parsepat()
                                printf(TRAILESC, from, to, ESC);
                                return(-1);
                        }
-#ifdef IS_MSDOS
                default:
                        if (
+#ifdef IS_MSDOS
                                c <= ' ' || c >= 127 ||
                                strchr(":/\\*?[]=+;,\"|<>", c) != NULL
+#else
+                               c & 0x80
+#endif
                        ) {
                                printf("%s -> %s : illegal character '%c' (0x%02X).\n",
                                        from, to, c, c);
                                return(-1);
                        }
+#ifdef IS_MSDOS
                        if (isupper(c))
                                *p = c + ('a' - 'A');
 #endif
@@ -1051,7 +1042,7 @@ static int dostage(lastend, pathend, start1, len1, stage, anylev)
        DIRINFO *di;
        HANDLE *h, *hto;
        int prelen, litlen, nfils, i, k, flags, try;
-       FILEINFO **pf, *fdel = NULL;
+       FILEINFO **pf, *fdel;
        char *nto, *firstesc;
        REP *p;
        int wantdirs, ret = 1, laststage = (stage + 1 == nstages);
@@ -1181,12 +1172,11 @@ static int trymatch(ffrom, pat)
        if (*p == '.' || (!matchall && ffrom->fi_attrib & (FA_HIDDEN | FA_SYSTEM)))
                return(strcmp(pat, p) == 0);
 #else
-       if (*p == '.') {
+       if (*p == '.')
                if (p[1] == '\0' || (p[1] == '.' && p[2] == '\0'))
                        return(strcmp(pat, p) == 0);
                else if (!matchall && *pat != '.')
                        return(0);
-       }
 #endif
        return(-1);
 }
@@ -1322,7 +1312,7 @@ static int checkto(hfrom, f, phto, pnto, pfdel)
 {
        char tpath[MAXPATH + 1];
        char *pathend;
-       FILEINFO *fdel = NULL;
+       FILEINFO *fdel;
        int hlen, tlen;
 
        if (op & DIRMOVE) {
@@ -1415,9 +1405,7 @@ static char *getpath(tpath)
 static int badname(s)
        char *s;
 {
-#ifdef IS_MSDOS
        char *ext;
-#endif
 
        return (
 #ifdef IS_MSDOS
@@ -1727,19 +1715,20 @@ static HANDLE *checkdir(p, pathend, which)
        struct stat dstat;
        DIRID d;
        DEVID v;
-       DIRINFO *di = NULL;
+       DIRINFO **newdirs, *di;
+       int nfils;
+       FILEINFO **fils;
        char *myp, *lastslash = NULL;
        int sticky;
        HANDLE *h;
 
-       if (hsearch(p, which, &h)) {
+       if (hsearch(p, which, &h))
                if (h->h_di == NULL) {
                        direrr = h->h_err;
                        return(NULL);
                }
                else
                        return(h);
-       }
 
        if (*p == '\0')
                myp = ".";
@@ -1910,10 +1899,7 @@ static int match(pat, s, start1, len1)
        char *pat, *s, **start1;
        int *len1;
 {
-       char c;
-#ifdef IS_MSDOS
-       char *olds;
-#endif
+       char c, *olds;
 
        *start1 = 0;
        for(;;)
@@ -2390,9 +2376,9 @@ static void goonordie()
 static void doreps()
 {
        char *fstart;
-       int k, printaliased = 0, alias = 0;
+       int k, printaliased = 0, alias;
        REP *first, *p;
-       long aliaslen = 0l;
+       long aliaslen;
 
 #ifdef IS_MSDOS
        ctrlbrk(breakrep);
@@ -2410,12 +2396,11 @@ static void doreps()
                        }
                        strcpy(fullrep, p->r_hto->h_name);
                        strcat(fullrep, p->r_nto);
-                       if (!noex && (p->r_flags & R_ISCYCLE)) {
+                       if (!noex && (p->r_flags & R_ISCYCLE))
                                if (op & APPEND)
                                        aliaslen = appendalias(first, p, &printaliased);
                                else
                                        alias = movealias(first, p, &printaliased);
-                       }
                        strcpy(pathbuf, p->r_hfrom->h_name);
                        fstart = pathbuf + strlen(pathbuf);
                        if ((p->r_flags & R_ISALIASED) && !(op & APPEND))
@@ -2474,7 +2459,7 @@ static long appendalias(first, p, pprintaliased)
        REP *first, *p;
        int *pprintaliased;
 {
-       long ret = 0l;
+       long ret;
 
 #ifdef IS_MSDOS
        int fd;
@@ -2593,10 +2578,10 @@ static void breakout()
 }
 
 
-static void breakrep(int signum)
+static int breakrep()
 {
        gotsig = 1;
-       return;
+       return(1);
 }
 
 
@@ -2639,12 +2624,11 @@ static int copymove(p)
 
 static int copy(ff, len)
        FILEINFO *ff;
-       off_t len;
+       long len;
 {
-       char buf[BUFSIZE];
+       char buf[BUFSIZE], c;
        int f, t, k, mode, perm;
 #ifdef IS_MSDOS
-        char c;
        struct ftime tim;
 #else
 #ifdef IS_SYSV
@@ -2688,7 +2672,7 @@ static int copy(ff, len)
                return(-1);
        }
        if (op & APPEND)
-               lseek(t, (off_t)0, SEEK_END);
+               lseek(t, 0L, 2);
 #ifdef IS_MSDOS
        if (op & ZAPPEND && filelength(t) != 0) {
                if (lseek(t, -1L, 1) == -1L || read(t, &c, 1) != 1) {
@@ -2700,10 +2684,10 @@ static int copy(ff, len)
                        lseek(t, -1L, 1);
        }
 #endif
-       if ((op & APPEND) && len != (off_t)-1) {
+       if ((op & APPEND) && len != -1L) {
                while (
                        len != 0 &&
-                       (k = read(f, buf, (len > BUFSIZE) ? BUFSIZE : (size_t)len)) > 0 &&
+                       (k = read(f, buf, len > BUFSIZE ? BUFSIZE : (unsigned)len)) > 0 &&
                        write(t, buf, k) == k
                )
                        len -= k;