V10/cmd/asd/args.c

Compare this file to the similar file:
Show the results in this format:

#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;
}