%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";
+by the N'th ``from'' pattern wildcard.\n\
+Use -- as the end of options.\n";
#define OTHEROPT (_osmajor < 3 ? "" : "|r")
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.\n";
+on the command line. Also you may need to quote ``to'' pattern.\n\
+\n\
+Use -- as the end of options.\n";
#ifdef IS_SYSV
#define OTHEROPT ""
#endif
+#include <unistd.h>
#include <stdio.h>
#include <ctype.h>
#else
/* for various flavors of UN*X */
+#include <libgen.h>
+#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;
static int snap(/* REP *first, REP *p */);
static void showdone(/* REP *fin */);
static void breakout(/* */);
-static int breakrep(/* */);
+static void breakrep(int);
static void breakstat(/* */);
static void quit(/* */);
static int copymove(/* REP *p */);
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 = stdout;
+static FILE *outfile;
+#ifdef IS_MSDOS
static char IDF[] = "$$mmvdid.";
+#endif
static char TEMP[] = "$$mmvtmp.";
static char TOOLONG[] = "(too long)";
static char EMPTY[] = "(empty)";
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];
{
char *frompat, *topat;
+ outfile = stdout;
+
init();
procargs(argc, argv, &frompat, &topat);
domatch(frompat, topat);
char **pfrompat, **ptopat;
{
char *p, c;
- char *cmdname = argv[0];
+ char *cmdname = basename(argv[0]);
#ifdef IS_MSDOS
#define CMDNAME (patch.ph_name)
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)
}
}
- if (op == DFLT)
+endargs:
+ if (op == DFLT) {
if (strcmp(cmdname, MOVENAME) == 0)
op = XMOVE;
else if (strcmp(cmdname, COPYNAME) == 0)
op = HARDLINK;
else
op = DFLTOP;
+ }
+
if (
op & DIRMOVE &&
#ifdef IS_MSDOS
static int parsepat()
{
char *p, *lastname, c;
- int totwilds, instage, x, havedot;
+ int totwilds, instage, x;
static char TRAILESC[] = "%s -> %s : trailing %c is superfluous.\n";
lastname = from;
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
DIRINFO *di;
HANDLE *h, *hto;
int prelen, litlen, nfils, i, k, flags, try;
- FILEINFO **pf, *fdel;
+ FILEINFO **pf, *fdel = NULL;
char *nto, *firstesc;
REP *p;
int wantdirs, ret = 1, laststage = (stage + 1 == nstages);
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);
}
{
char tpath[MAXPATH + 1];
char *pathend;
- FILEINFO *fdel;
+ FILEINFO *fdel = NULL;
int hlen, tlen;
if (op & DIRMOVE) {
static int badname(s)
char *s;
{
+#ifdef IS_MSDOS
char *ext;
+#endif
return (
#ifdef IS_MSDOS
struct stat dstat;
DIRID d;
DEVID v;
- DIRINFO **newdirs, *di;
- int nfils;
- FILEINFO **fils;
+ DIRINFO *di = NULL;
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 = ".";
char *pat, *s, **start1;
int *len1;
{
- char c, *olds;
+ char c;
+#ifdef IS_MSDOS
+ char *olds;
+#endif
*start1 = 0;
for(;;)
static void doreps()
{
char *fstart;
- int k, printaliased = 0, alias;
+ int k, printaliased = 0, alias = 0;
REP *first, *p;
- long aliaslen;
+ long aliaslen = 0l;
#ifdef IS_MSDOS
ctrlbrk(breakrep);
}
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))
REP *first, *p;
int *pprintaliased;
{
- long ret;
+ long ret = 0l;
#ifdef IS_MSDOS
int fd;
}
-static int breakrep()
+static void breakrep(int signum)
{
gotsig = 1;
- return(1);
+ return;
}
static int copy(ff, len)
FILEINFO *ff;
- long len;
+ off_t len;
{
- char buf[BUFSIZE], c;
+ char buf[BUFSIZE];
int f, t, k, mode, perm;
#ifdef IS_MSDOS
+ char c;
struct ftime tim;
#else
#ifdef IS_SYSV
return(-1);
}
if (op & APPEND)
- lseek(t, 0L, 2);
+ lseek(t, (off_t)0, SEEK_END);
#ifdef IS_MSDOS
if (op & ZAPPEND && filelength(t) != 0) {
if (lseek(t, -1L, 1) == -1L || read(t, &c, 1) != 1) {
lseek(t, -1L, 1);
}
#endif
- if ((op & APPEND) && len != -1L) {
+ if ((op & APPEND) && len != (off_t)-1) {
while (
len != 0 &&
- (k = read(f, buf, len > BUFSIZE ? BUFSIZE : (unsigned)len)) > 0 &&
+ (k = read(f, buf, (len > BUFSIZE) ? BUFSIZE : (size_t)len)) > 0 &&
write(t, buf, k) == k
)
len -= k;
tim.modtime = fstat.st_mtime,
#else
tim[0].tv_sec = fstat.st_atime,
+ tim[0].tv_usec = 0,
tim[1].tv_sec = fstat.st_mtime,
+ tim[1].tv_usec = 0,
#endif
utimes(fullrep, tim)
)