📄 maillib.c
字号:
/*--------------------------------------------------------------------*/
/* m a i l l i b . c */
/* */
/* Mail user agent subroutine library for UUPC/extended */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* Changes Copyright (c) 1989-1993 by Kendra Electronic */
/* Wonderworks. */
/* */
/* All rights reserved except those explicitly granted by */
/* the UUPC/extended license agreement. */
/*--------------------------------------------------------------------*/
/*--------------------------------------------------------------------*/
/* RCS Information */
/*--------------------------------------------------------------------*/
/*
* $Id: maillib.c 1.6 1993/09/20 04:41:54 ahd Exp $
*
* $Log: maillib.c $
* Revision 1.6 1993/09/20 04:41:54 ahd
* OS/2 2.x support
*
* Revision 1.5 1993/07/31 16:26:01 ahd
* Changes in support of Robert Denny's Windows support
*
* Revision 1.4 1993/06/13 14:06:00 ahd
* Add precedence to the standard ignore list
*
* Revision 1.3 1993/04/11 00:33:05 ahd
* Global edits for year, TEXT, etc.
*
* Revision 1.2 1992/11/27 14:36:10 ahd
* Use scrsize() for screen size
*
* 3 May 90 Create from mail.c
* 16 Jun 90: Added support for mail (~) subcommands pdm
* chgd calling seq of Collect_Mail to support
* above
* chges to CopyMsg to support ~i subcmd
* mods to SendMail to support autosign option
* broke out signature append code to seperate fn
* added support for alternate signature file
*/
/*--------------------------------------------------------------------*/
/* System include files */
/*--------------------------------------------------------------------*/
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
/*--------------------------------------------------------------------*/
/* UUPC/extended include files */
/*--------------------------------------------------------------------*/
#include "lib.h"
#include "address.h"
#include "hlib.h"
#include "mlib.h"
#include "alias.h"
#include "mail.h"
#include "maillib.h"
#include "scrsize.h"
#define INDENT "> "
/*--------------------------------------------------------------------*/
/* Local variables */
/*--------------------------------------------------------------------*/
static int PageCount = 0;
static char *ignorelist[] = { "Message-ID:",
"Received:",
"Status: ",
"X-Mailer: ",
"From " ,
"Precedence: " ,
"Path: ",
"Lines: ",
"References: ",
"" };
currentfile(); /* Define current file for panic() */
/*--------------------------------------------------------------------*/
/* P a g e r */
/* */
/* Page through a message */
/* */
/* There are hooks here to let the user use his/her own pager, */
/* like LIST, MORE, or LESS. We just write the message out to */
/* a temporary file and invoke the appropriate external program */
/* to do the browsing. */
/*--------------------------------------------------------------------*/
boolean Pager(const int msgnum,
boolean external,
copyopt received,
const boolean reset)
{
long nextloc;
char *browse = NULL;
char buf[BUFSIZ];
boolean exit = FALSE; /* Flag for PRE-MATURE exit ahd */
FILE *fmailbag;
if (msgnum == -1)
return FALSE;
if (bflag[F_PAGER]) /* User want pager option inverted? */
external = ! external; /* Yes --> Do the inversion */
if (letters[msgnum].status < M_READ)
letters[msgnum].status = M_READ;
if (external && (E_pager != nil(char)))
{
browse = mktempname( NULL,"TMP" );/* Get a temporary file name */
if ((fmailbag = FOPEN(browse, "w",TEXT_MODE)) == nil(FILE))
{
printerr(browse);
printmsg(0,"Cannot open browse file %s",browse);
return FALSE;
} /* if */
CopyMsg(msgnum, fmailbag, received, FALSE);
fclose(fmailbag);
Invoke(E_pager, browse);
remove(browse);
free(browse);
} /* if */
else {
fseek(fmailbox, letters[msgnum].adr , SEEK_SET);
nextloc = letters[msgnum + 1].adr;
if ( reset )
ClearScreen();
else
PageLine("\n");
sprintf(buf,"Mailbox item %d:\n",msgnum + 1);
PageLine(buf);
while (ftell(fmailbox) < nextloc && (!exit) &&
fgets(buf, BUFSIZ, fmailbox) != nil(char))
{
boolean print = TRUE;
switch(received)
{
case nocontinue:
if ((*buf != '\n') && !isgraph(*buf)) {
print = FALSE;
break;
}
else
received = noreceived;
case noreceived:
{
char entry = 0;
while ( strlen(ignorelist[entry]) && print )
{
if (equalni(ignorelist[entry],
buf,strlen(ignorelist[entry])))
{
print = FALSE;
received = nocontinue;
}
else
entry++;
} /* while */
} /* case noreceived */
} /* switch */
if (received != seperators)
if (equal(buf,"\n"))
received = seperators;
if (print)
if (PageLine(buf)) /* Exit if the user hits Q */
exit = TRUE;
} /* while */
if (equal(buf,"\n") && (!exit)) /* ahd */
putchar('\n'); /* ahd */
} /* else */
return ! exit;
} /*Pager*/
/*--------------------------------------------------------------------*/
/* S u b _ P a g e r */
/* pager for the ~p mail subcommand */
/* page through a mail message currently being entered */
/* */
/* Clone of the Pager function */
/*--------------------------------------------------------------------*/
void Sub_Pager(const char *tinput,
boolean external )
{
boolean exit = FALSE; /* Flag for PRE-MATURE exit ahd */
if (bflag[ F_PAGER ])
external = ! external;
if ( external && (E_pager != nil(char)) )
Invoke(E_pager, tinput);
else {
FILE *finput;
char buf[BUFSIZ];
finput = FOPEN(tinput, "r",TEXT_MODE);
if (finput == NULL) {
printmsg(0,"Cannot open file %s for display",tinput);
printerr(tinput);
return;
}
PageReset();
ClearScreen();
while ( (!exit) && fgets(buf, BUFSIZ, finput) != nil(char))
{
if (PageLine(buf)) /* Exit if the user hits Q */
exit = TRUE;
}
fclose(finput);
}
} /*Sub_Pager*/
/*--------------------------------------------------------------------*/
/* P a g e R e s e t */
/* */
/* Reset page function to top of page */
/*--------------------------------------------------------------------*/
void PageReset()
{
PageCount = 0;
} /*PageReset*/
/*--------------------------------------------------------------------*/
/* P a g e L i n e */
/* */
/* Print one line when paging through a file */
/*--------------------------------------------------------------------*/
boolean PageLine(char *line)
{
#ifdef _Windows
short pagesize = scrsize() - 3;
#else
short pagesize = scrsize() - 3;
#endif
fputs(line, stdout);
PageCount = PageCount + 1 + strlen(line) / 81; /* Handle long lines */
if (PageCount > (pagesize))
{
int c;
fputs("More?", stdout);
c = Get_One();
switch (tolower(c))
{
case 'q':
case '\003':
case 'n': /* Because that's what I
keep Pressing */
case 'x':
fputs("\rAborted.\n", stdout);
return TRUE;
case 'd':
PageCount = pagesize / 2; /* Half a Page More */
break;
case '\r':
PageCount = pagesize; /* Only print one line */
break;
default:
PageCount = 0; /* Print full screen */
}
fputs("\r \r",stdout);
}
return FALSE;
} /*PageLine*/
/*--------------------------------------------------------------------*/
/* C o p y M s g */
/* */
/* Copy a message */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -