|
|
researchv10 Norman
#include "asd.h"
getargs (argc, argv, optkey, func)
int argc;
char **argv;
char *optkey;
int (*func)();
{
register int c;
int rc = 0;
while ((c = getopt (argc, argv, optkey)) != EOF) {
register struct replist *rl;
register char *p, *q;
switch (c) {
case 'b':
bflag++;
break;
case 'k':
kflag++;
break;
case 'n':
nflag++;
break;
case 'v':
vflag++;
break;
case 'x':
if (xstr) {
fprintf (stderr, "duplicate -x ignored\n");
rc++;
} else if (Xstr) {
fprintf (stderr, "cannot have both -x and -X\n");
rc++;
} else
xstr = optarg;
break;
case 'X':
if (Xstr) {
fprintf (stderr, "duplicate -X ignored\n");
rc++;
} else if (xstr) {
fprintf (stderr, "cannot have both -x and -X\n");
rc++;
} else
Xstr = copy (transname (optarg));
break;
case 'D':
p = strchr (optarg, '=');
if (p == NULL) {
fprintf (stderr, "invalid option %s\n", optarg);
exit (1);
}
rl = new (struct replist);
/* copy the pathname to rl->source */
rl->source = alloc ((unsigned) (p - optarg + 1));
p = rl->source;
q = optarg;
while (*q != '=')
*p++ = *q++;
*p = '\0';
/* now expand rl->source */
p = rl->source;
rl->source = copy (fullname (p));
free (p);
/* expand rl->dest */
rl->dest = copy (fullname (q + 1));
/* link rl into the chain */
rl->link = replist;
replist = rl;
break;
case 'K':
Kflag++;
keyfile = optarg;
break;
case '?':
default:
rc++;
break;
}
}
if (rc) {
fprintf (stderr, "%s: bad argument\n", argv[0]);
exit (rc);
}
if (kflag && Kflag) {
fprintf (stderr, "%s: cannot specify both k and K\n", argv[0]);
exit (1);
}
/* read key from terminal if requested */
if (kflag) {
register char *p;
p = getpass ("Key:");
/* a null key is treated as no key at all */
if (p && *p)
setup (p);
else
kflag = 0;
}
/* read key from file if requested */
if (Kflag) {
char key[100];
register FILE *kf;
register char *p;
/* try to open the file */
kf = fopen (keyfile, "r");
if (kf == NULL) {
perror (keyfile);
exit (1);
}
/* read the first line */
p = fgets (key, sizeof (key), kf);
fclose (kf);
/* if EOF, assume no key */
if (p == NULL) {
Kflag = 0;
} else {
/* delete the trailing newline */
p = key;
while (*p != '\n' && *p != '\0')
p++;
*p = '\0';
/* if the key is empty, assume no key */
if (key[0] == '\0')
Kflag = 0;
else
setup (key);
}
}
if (func) {
/* process the arguments */
if (optind >= argc)
rc = (*func) (stdin, "standard input");
else {
register int i;
for (i = optind; i < argc; i++) {
register char *fn = argv[i];
register FILE *f = fopen (fn, "r");
if (f) {
rc += (*func) (f, argv[i]);
fclose (f);
} else {
fprintf (stderr, "%s: can't open %s\n", argv[0], fn);
rc++;
}
}
}
}
return rc;
}
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.