home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
The World of Computer Software
/
World_Of_Computer_Software-02-387-Vol-3of3.iso
/
b
/
bmh02src.zip
/
BMH.C
< prev
next >
Wrap
C/C++ Source or Header
|
1992-08-20
|
8KB
|
293 lines
/*
bmh.c : Copyright Paul Healy, EI9GL, 1992.
Derived from bm source. See the file copyright.bm for conditions of use.
920709 : Created.
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <process.h>
#include <alloc.h>
#include <string.h>
#include <sys/stat.h>
#include "misc.h"
#include "help.h"
#include "buffer.h"
#include "current.h"
#include "pc.h"
#include "rc.h"
static void bmhhelp(void);
static void callprog(int argc, char *argv[]);
int ali_main(int argc, char *argv[]);
int comp_main(int argc, char *argv[]);
int dist_main(int argc, char *argv[]);
int folders_main(int argc, char *argv[]);
int forw_main(int argc, char *argv[]);
int next_main(int argc, char *argv[]);
int pager_main(int argc, char *argv[]);
int repl_main(int argc, char *argv[]);
int rmm_main(int argc, char *argv[]);
int scan_main(int argc, char *argv[]);
int show_main(int argc, char *argv[]);
int smtp_main(int argc, char *argv[]);
static long FileSize = -1L;
static int
fsize(char *dir, char *file, char *ext)
{
char filename[256];
struct stat statbuf;
sprintf(filename, "%s/%s%s", dir, file, ext);
return stat(filename, &statbuf) == -1 ? -1L : statbuf.st_size;
}
static void
doprompt(void)
{
static char owrite[] = "\r \r";
long curfsize = fsize(getrc(maildir), getrc(username), EXT);
if (FileSize != curfsize) {
printf("%sYou have new mail\n", owrite);
FileSize = curfsize;
}
printf("%s%s> ", owrite, newsfile());
fflush(stdout);
}
int
main(int argc, char *argv[])
{
int haveread1 = 0;
char *s, line[255];
/*
if (curmsg == -1)
return -1;
*/
dohelp(argc, argv, "bmh [many options]");
callprog(argc, argv);
scan_main(argc, argv);
FileSize = fsize(getrc(maildir), getrc(username), EXT);
doprompt();
while ( (s = getline(line, sizeof(line)) ) != NULL) {
char *arg[MAXARGS];
int ch,
nargs = parse(rip(s), arg, MAXARGS);
freebuf();
switch (ch = nargs > 0 ? arg[0][0] : 0) {
case '?':
bmhhelp();
break;
case '.': /* (re-)display current message */
show_main(1, arg);
haveread1 = 1;
break;
case '!':
/*
fprintf(stderr, "bmh: coreleft is %u bytes\n", coreleft);
*/
arg[nargs] = NULL;
if (spawnvp(P_WAIT, arg[1], &arg[1]) == -1)
perror("bmh");
break;
case '#':
printf("'#' is not a bmh command: enter a number, e.g. \n 1\n");
break;
case 0:
case '\n':
if (haveread1)
next_main(1, arg);
else
show_main(1, arg);
haveread1 = 1;
break;
case 'a':
ali_main(nargs, arg);
putchar('\n');
break;
case 'b':
dist_main(nargs, arg);
haveread1 = 1;
break;
case 'd':
rmm_main(nargs, arg);
haveread1 = 1;
FileSize = fsize(getrc(maildir), getrc(username), EXT);
break;
case 'f':
forw_main(nargs, arg);
haveread1 = 1;
break;
case 'h':
scan_main(nargs, arg);
break;
case 'k':
smtp_main(nargs, arg);
break;
case 'l':
smtp_main(1, arg);
break;
case 'm':
comp_main(1, arg);
break;
case 'n':
if (nargs == 1) {
arg[1] = "-short";
folders_main(2, arg);
putchar('\n');
}
else {
if (setcurrent(arg[1], 1) == -1)
fprintf(stderr, "bmh: can't change to %s\n", arg[1]);
else
scan_main(1, arg);
}
break;
case 'N':
folders_main(1, arg);
break;
case 'p':
savemsgs(nargs, arg, "prn", 1);
break;
case 'x':
printf("bmh: warning mail file may already have been updated");
case 'q': /* fall thru */
return 0;
case 'r':
repl_main(nargs, arg);
haveread1 = 1;
break;
case 's':
case 'w':
if ((nargs == 1) || isdigit(arg[nargs-1][0])) {
savemsgs(nargs, arg, "mbox", ch == 's');
printf("bmh: appended msg(s) to mbox\n");
}
else
savemsgs(nargs-1, arg, arg[nargs-1], ch == 's');
haveread1 = 1;
break;
case '$':
fprintf(stderr, "bmh: there is no need to sync the mailfile\n");
break;
case 'u':
fprintf(stderr, "bmh: undelete is not supported\n");
break;
case 'v':
pager_main(nargs, arg);
break;
default:
if (isdigit(ch)) {
arg[nargs] = arg[0];
show_main(nargs+1, arg);
haveread1 = 1;
}
else
printf("Invalid command - ? for help\n");
break;
}
doprompt();
}
return 0;
}
static void
bmhhelp(void)
{
version();
printf("\n");
printf(" d [msglist] delete message(s)\n");
printf(" m mail a message\n");
printf(" s [msglist] [file] save message(s) in file (default mbox)\n");
printf(" w [msglist] [file] save message(s) in file (default mbox, no headers)\n");
printf(" f [msg] forward a message\n");
printf(" b [msg] bounce a message (remail)\n");
printf(" r [msg] reply to a message\n");
printf(" p [msglst] print message(s) on printer\n");
printf(" . display current message\n");
printf(" h list messages in notesfile\n");
printf(" l list unsent messages\n");
printf(" k kill unsent messages\n");
printf(" n [file] / N display / change notesfile, N for verbose listing\n");
printf(" # display message(s) (where # is the number of the message)\n");
printf(" q quit\n");
printf(" ! cmd run shell command\n");
printf(" ? print this help screen\n");
printf(" a [alias] display mail alias(es)\n");
/*
printf(" v file view this file\n");
*/
}
typedef int (*FN)(int argc, char *argv[]);
static struct jumptable {
char jump[8];
FN prog;
} table[] = {
"ali", ali_main,
"comp", comp_main,
"dist", dist_main,
"folders", folders_main,
"forw", forw_main,
"next", next_main,
"repl", repl_main,
"rmm", rmm_main,
"scan", scan_main,
"show", show_main,
"smtp", smtp_main
};
static void
callprog(int argc, char *argv[])
{
struct jumptable *result;
char *start = argv[0] + strlen(argv[0]), *cp, *lookup;
while ( (start>=argv[0]) && (*start != '/') && (*start != '\\')) {
*start = tolower(*start);
start--;
}
start++;
if ((cp = strchr(start, '.')) != NULL)
*cp = 0;
/*
printf("command base is %s\n", start);
*/
if (strcmp(start, "bmh") != 0)
lookup = start;
else if ( (argc == 1) || (argv[1][0] != '-') )
return ;
else
lookup = &argv[1][1];
result = (struct jumptable *) bsearch(lookup, table,
sizeof(table) / sizeof(struct jumptable),
sizeof(struct jumptable), strcmp);
if (result == NULL)
return ;
else {
if (lookup == start)
exit( (*result->prog) (argc, argv) );
else {
argv[1]++; /* skip '-' */
exit( (*result->prog) (argc-1, &argv[1]) );
}
}
}