home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.freefriends.org
/
ftp.freefriends.org.tar
/
ftp.freefriends.org
/
arnold
/
Source
/
mush.rstevens.tar.gz
/
mush.tar
/
options.c
< prev
next >
Wrap
C/C++ Source or Header
|
1992-10-30
|
9KB
|
351 lines
/* @(#)options.c (c) copyright 10/10/88 (Dan Heller, Bart Schaefer) */
#include "mush.h"
#include "options.h"
/*
* NOTE: Any word flag which is a prefix of another word flag must be
* listed AFTER the flag it prefixes in the list below
*/
char *word_flags[][2] = {
{ "-bcc", "-b" },
{ "-blindcarbon", "-b" },
{ "-blind", "-b" },
{ "-carbon", "-c" },
{ "-cc", "-c" },
{ "-copy", "-c" },
{ "-curses", "-C" },
{ "-debug", "-d" },
{ "-draft", "-h" },
{ "-echo", "-e" },
{ "-folder", "-f" }, /* Maybe -file should become -f too? */
{ "-file", "-F" }, /* Don't really like -file for -F */
{ "-headerfile", "-h" },
{ "-headers", "-H" },
{ "-initialize", "-I" },
{ "-init", "-I" },
{ "-interactive", "-i" },
{ "-interact", "-i" },
{ "-mailbox", "-m" },
{ "-message", "-h" },
{ "-noheaders", "-N" },
{ "-noinit", "-n" },
{ "-readonly", "-r" },
{ "-send", "-U" },
{ "-shell", "-S" },
{ "-source", "-F" }, /* This is better for -F */
{ "-subject", "-s" },
{ "-timeout", "-T" },
{ "-toolhelp", "-2" },
{ "-tool", "-t" },
{ "-user", "-u" },
{ "-verbose", "-v" },
{ "-visual", "-C" },
{ NULL, NULL } /* This must be the last entry */
};
fix_word_flag(argp)
register char **argp;
{
int i;
Debug("%s --> ", *argp);
for (i = 0; word_flags[i][0]; i++) {
int len = strlen(word_flags[i][0]);
if (! strncmp(*argp, word_flags[i][0], len)) {
char buf[BUFSIZ], *p = buf;
p += Strcpy(buf, word_flags[i][1]);
(void) strcpy(p, *argp + len);
(void) strcpy(*argp, buf);
}
}
Debug("%s\n", *argp);
}
/*
* preparse the command line to determine whether or not we're going
* to bail out after checking that the user has no mail. Also, check
* to see if we're going to run a tool because it must be built first.
*/
preparse_opts(argcp, argv)
register int *argcp; /* Pointer to argument count */
register char **argv; /* Argument vector */
{
int n = FALSE;
char **args;
#ifdef SUNTOOL
/* Note: we are assigning a boolean result to n and istool here */
if (n = istool = (strlen(prog_name) > 3 &&
(!strcmp(prog_name+strlen(prog_name)-4, "tool") ||
!strcmp(prog_name+strlen(prog_name)-4, "view")))) {
turnon(glob_flags, DO_SHELL);
parse_tool_opts(argcp, argv);
}
#endif /* SUNTOOL */
if (!istool && *argcp > 1) {
for (args = argv+1; *args && args[0][0] == '-'; args++) {
int next = 1;
fix_word_flag(&args[0]);
DoNext:
switch (args[0][next]) {
#if defined(SUNTOOL) || defined(POP3_SUPPORT)
case 'T' :
if (args[1])
args++;
#ifdef POP3_SUPPORT
break;
#endif /* POP3_SUPPORT */
#ifdef SUNTOOL
case 't' :
/* Note: we won't ever get here if started as
* "mushtool" or "mushview" because istool is true.
*/
istool = 1;
parse_tool_opts(argcp, argv);
turnon(glob_flags, DO_SHELL);
return TRUE;
/* break; */
#endif /* SUNTOOL */
#endif /* SUNTOOL || POP3_SUPPORT */
case 'S' :
turnon(glob_flags, DO_SHELL);
n = TRUE;
break;
case 'f' :
case 'F' :
case 'h' :
case 'm' :
case 'u' :
n = TRUE;
case 'b' :
case 'c' :
case 'I' :
case 's' :
if (args[1]) {
args++;
next = 0;
}
break;
case 'H' :
if (args[0][next+1] == ':')
next = 0;
break;
case '\0':
next = 0;
default : ;
}
if (next) {
++next;
goto DoNext;
}
}
if (*args) { /* unused args indicates sending mail to someone */
n = TRUE;
if (!istool)
turnon(glob_flags, IS_SENDING);
}
}
return n;
}
static char *usage_str =
#ifdef SUNTOOL
"usage: %s [-t] [-C] [-i] [-f [folder] ] [-v] [-S] [-s subject] [users]\n";
#else
#ifdef CURSES
"usage: %s [-C] [-i] [-f [folder] ] [-v] [-S] [-s subject] [user list]\n";
#else
"usage: %s [-i] [-f [folder] ] [-v] [-S] [-s subject] [user list]\n";
#endif /* CURSES */
#endif /* SUNTOOL */
parse_options(argvp, flags)
register char ***argvp;
struct mush_flags *flags;
{
char buf[256];
bzero((char *) flags, sizeof (struct mush_flags));
flags->source_rc = TRUE;
flags->folder = "";
for (++(*argvp); **argvp && ***argvp == '-'; (*argvp)++) {
int look_again;
DoLookAgain:
look_again = TRUE;
switch ((*argvp)[0][1]) {
case 'e':
/*
* don't set tty modes -- e.g. echo and cbreak modes aren't
* changed.
*/
turnon(glob_flags, ECHO_FLAG);
#ifdef CURSES
when 'C':
/* don't init curses -- don't even set iscurses. */
if (istool) {
puts("-C: You are already running in tool mode");
turnoff(glob_flags, PRE_CURSES);
} else if (hdrs_only)
puts("headers only: ignoring -C flag");
else
turnon(glob_flags, PRE_CURSES);
#endif /* CURSES */
when 'F':
flags->src_n_exit = ((*argvp)[0][2] == '!');
if (!(flags->src_file = *++(*argvp)))
puts("specify filename to source"), exit(1);
look_again = FALSE;
/* fall thru! */
case 'N':
(void) strcat(flags->f_flags, "-N ");
when 'r':
(void) strcat(flags->f_flags, "-r "); /* folder() argument */
when 'H':
if (istool) {
puts("running in tool-mode; -H option ignored.");
break;
}
turnoff(glob_flags, PRE_CURSES);
if (*(hdrs_only = (*(*argvp))+2) != ':')
hdrs_only = ":a";
else
look_again = FALSE;
/* read only cuz no updates */
(void) strcat(flags->f_flags, "-N -r ");
when 'i':
/* force interactive even if !isatty(0) */
turnoff(glob_flags, REDIRECT);
when 'u': /* specify a user's mailbox */
if (*(flags->folder))
puts("You can't specify more than one mailbox"), exit(1);
#ifdef HOMEMAIL
{
char *p;
int isdir = 1;
(void) sprintf(buf, "%%%s",
(*argvp)[1] ? (*argvp)[1] : "root");
if ((p = getpath(buf, &isdir)) && !isdir)
strdup(flags->folder, p);
else if (isdir < 0)
puts(p), exit(1);
else if (isdir)
(void) printf("\"%s\" is a directory\n", p), exit(1);
}
#else /* HOMEMAIL */
strdup(flags->folder, sprintf(buf, "%s/%s",
MAILDIR, ((*argvp)[1])? (*argvp)[1] : "root"));
#endif /* HOMEMAIL */
if ((*argvp)[1])
++(*argvp);
look_again = FALSE;
when 'h':
if (istool)
puts("bad option when run as a tool"), exit(1);
if ((*argvp)[1])
flags->draft = *++(*argvp);
else
(void) printf("-h: missing file name.\n"), exit(1);
look_again = FALSE;
turnon(glob_flags, IS_SENDING);
when 'U':
if (istool)
puts("bad option when run as a tool"), exit(1);
turnon(flags->flg, SEND_NOW);
if ((*argvp)[0][2] == '!') {
turnon(flags->flg, NO_SIGN);
++(**argvp);
}
when 'm':
if ((*argvp)[1])
strdup(spoolfile, *++(*argvp));
else
(void) printf("-m: missing mailbox name.\n"), exit(1);
look_again = FALSE;
when 'f':
if (*(flags->folder))
puts("You can't specify more than one mailbox"), exit(1);
if ((*argvp)[1]) {
strdup(flags->folder, *++(*argvp));
look_again = FALSE;
} else
strdup(flags->folder, "&");
when 's':
if (istool)
puts("bad option when run as a tool"), exit(1);
else if ((*argvp)[1])
flags->Subj = *++(*argvp);
else
puts("-s \"subject\""), exit(1);
look_again = FALSE;
when 'b':
if (istool)
puts("-b: bad option when run as a tool"), exit(1);
else if ((*argvp)[1])
flags->Bcc = *++(*argvp);
else
puts("-b \"bcc list\""), exit(1);
look_again = FALSE;
when 'c':
if (istool)
puts("-c: bad option when run as a tool"), exit(1);
else if ((*argvp)[1])
flags->Cc = *++(*argvp);
else
puts("-c \"cc list\""), exit(1);
look_again = FALSE;
break;
#ifdef VERBOSE_ARG
case 'v':
if (istool)
puts("bad option when run as a tool"), exit(1);
turnon(flags->flg, VERBOSE);
break;
#endif /* VERBOSE_ARG */
#if defined(SUNTOOL) || defined(POP3_SUPPORT)
case 'T':
if ((time_out = atoi(*(*argvp))) < MIN_TIME_OUT)
time_out = MIN_TIME_OUT;
look_again = FALSE;
#ifdef POP3_SUPPORT
break;
#endif /* POP3_SUPPORT */
#ifdef SUNTOOL
/* -T implies -t */
case 't': istool = 1;
#endif /* SUNTOOL */
#endif /* SUNTOOL || POP3_SUPPORT */
case 'S': turnon(glob_flags, DO_SHELL);
when 'n':
if ((*argvp)[0][2] == '!') {
++(**argvp);
flags->source_rc = -1; /* No init files sourced */
} else
flags->source_rc = 0; /* Only ~/.mushrc sourced */
when 'I':
if ((*argvp)[0][2] == '!' && flags->source_rc > 0)
flags->source_rc = 0; /* Only ~/.mushrc sourced */
if (!(flags->init_file = *++(*argvp)))
puts("specify filename for init"), exit(1);
look_again = FALSE;
when 'd': debug = 1;
when '\0' : look_again = FALSE;
otherwise:
print("%s: unknown option: `%c'\n", prog_name,
(*argvp)[0][1]? (*argvp)[0][1] : '-');
print(usage_str, prog_name);
}
if (look_again && ++(**argvp) != '\0')
goto DoLookAgain;
}
if (ison(flags->flg, SEND_NOW) && !flags->draft) {
print("You must specify a draft file to autosend\n");
exit(1);
}
}