home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume18 / mush6.4 / part10 / mush.h next >
C/C++ Source or Header  |  1989-03-12  |  23KB  |  617 lines

  1. /* @(#)mush.h    (c) copyright 1986 (Dan Heller) */
  2.  
  3. #define VERSION "Mail User's Shell (6.4 2/14/89)"
  4.  
  5. #include "config.h"
  6.  
  7. #ifdef CURSES
  8.  
  9. #ifdef USG
  10. #    define _USG
  11. #    undef USG
  12. #endif /* USG */
  13. #ifdef SYSV
  14. #    define _SYSV
  15. #    undef SYSV
  16. #endif /* SYSV */
  17. #include <curses.h>
  18. #if !defined(USG) && defined(_USG)
  19. #    define USG
  20. #endif /* USG */
  21. #if !defined(SYSV) && defined(_SYSV)
  22. #    define SYSV
  23. #endif /* SYSV */
  24.  
  25. #else /* CURSES */
  26. #include <stdio.h>
  27. #if defined(SYSV) && defined(USG)
  28. #include <termio.h>
  29. #endif /* SYSV && USG */
  30. #endif /* CURSES */
  31.  
  32. #include <ctype.h>
  33. #include <errno.h>
  34. #include <setjmp.h>
  35. #include "strings.h"
  36.  
  37. #ifdef SUNTOOL
  38. #    include <suntool/tool_hs.h>
  39. #else  /* SUNTOOL */
  40. #    include <sys/types.h>
  41. #    include <signal.h>
  42. #    ifndef SYSV
  43. #        include <sys/time.h>
  44. #     include <sys/ioctl.h>   /* for ltchars */
  45. #    else
  46. #        include <time.h>
  47. #        include <fcntl.h>
  48. #    endif /* SYSV */
  49. #endif /* SUNTOOL */
  50.  
  51. #include <sys/stat.h>
  52. #include <sys/file.h>
  53.  
  54. #ifdef SUNTOOL
  55. #    include <suntool/gfxsw.h>
  56. #    include <suntool/panel.h>
  57. #    include <suntool/ttysw.h>
  58. #    include <suntool/ttytlsw.h>
  59. #    include <suntool/menu.h>
  60. #    include <suntool/icon_load.h>
  61. #endif /* SUNTOOL */
  62.  
  63. /* if no maximum number of files can be found, we'll use getdtablesize() */
  64. #ifdef _NFILE
  65. #    define MAXFILES _NFILE
  66. #else
  67. #ifdef NOFILE
  68. #    define MAXFILES NOFILE
  69. #endif /* NOFILE */
  70. #endif /* _NFILE */
  71.  
  72. #ifndef MAXPATHLEN
  73. #define MAXPATHLEN BUFSIZ
  74. #endif /* MAXPATHLEN */
  75.  
  76. #ifdef CTRL
  77. #undef CTRL
  78. #endif /* CTRL */
  79. #define CTRL(c)        ('c' & 037)
  80.  
  81. #define ESC         '\033'
  82.  
  83. #define NO_STRING    ""
  84. #ifdef  NULL
  85. #undef  NULL
  86. #endif /* NULL */
  87. #define NULL        (char *)0
  88. #define NULL_FILE    (FILE *)0
  89. #define DUBL_NULL    (char **)0
  90. #define TRPL_NULL    (char ***)0
  91. #ifdef putchar
  92. #undef putchar
  93. #endif /* putchar */
  94. #define putchar(c)    fputc(c, stdout), fflush(stdout)
  95. #define bell()         fputc('\007', stderr), fflush(stderr)
  96.  
  97. /* For error recovery purposes, send keyboard generated signals to a special
  98.  * routine (interrupt) to set a global flag (WAS_INTR) and return to the
  99.  * calling routine which is responsible for checking the flag.  For both
  100.  * on_intr() and off_intr() macros, initialize WAS_INTR to false.
  101.  */
  102. #define on_intr() \
  103.     turnoff(glob_flags, WAS_INTR), oldint = signal(SIGINT, intrpt), \
  104.     oldquit = signal(SIGQUIT, intrpt)
  105.  
  106. #define off_intr() \
  107.     turnoff(glob_flags, WAS_INTR), (void) signal(SIGINT, oldint), \
  108.     (void) signal(SIGQUIT, oldquit)
  109.  
  110. /* Don't flush input when setting echo or cbreak modes (allow typeahead) */
  111. #ifdef TIOCSETN
  112. #ifdef stty
  113. #undef stty
  114. #endif /* stty */
  115. #define stty(fd, sgttybuf)    (ioctl(fd, TIOCSETN, sgttybuf))
  116. #endif /* TIOCSETN */
  117.  
  118. /* for system-V machines that run termio */
  119. #if defined(SYSV) && defined(USG)
  120. unsigned char vmin, vtime;
  121. #define sg_erase  c_cc[2]
  122. #define sg_flags  c_lflag
  123. #define sg_kill   c_cc[3]
  124. #define sg_ospeed c_cflag
  125. #define gtty(fd, SGTTYbuf)    ioctl(fd, TCGETA, SGTTYbuf)
  126. #undef stty
  127. #define stty(fd, SGTTYbuf)    ioctl(fd, TCSETAW, SGTTYbuf)
  128. #define echon()    (_tty.sg_flags |= (ECHO|ECHOE),    stty(0, &_tty))
  129. #define echoff()   (_tty.sg_flags &= ~ECHO,   stty(0, &_tty))
  130. #define cbrkon()   \
  131.     (_tty.sg_flags &= ~ICANON, _tty.c_cc[VMIN] = 1, stty(0, &_tty))
  132. #define cbrkoff()  \
  133.     (_tty.sg_flags |= ICANON, _tty.c_cc[VMIN] = vmin, \
  134.     _tty.c_cc[VTIME] = vtime, stty(0, &_tty))
  135. #define savetty()  \
  136.     (void) gtty(0, &_tty), vtime = _tty.c_cc[VTIME], vmin = _tty.c_cc[VMIN]
  137. #define cbreak()   cbrkon()
  138. #define nocbreak() cbrkoff()
  139.  
  140. /* If curses isn't defined, declare our 'tty' and macros for echo/cbreak */
  141. #ifndef CURSES
  142. typedef struct termio SGTTY;
  143. #define echom()    echon()
  144. #define noechom()  echoff()
  145. #define crmode()   cbrkon()
  146. #define nocrmode() cbrkoff()
  147.  
  148. #else /* CURSES */
  149. /* If curses is defined, use the echo/cbreak commands in library only
  150.  * if curses is running.  If curses isn't running, use macros above.
  151.  */
  152. #define echom()    ((iscurses) ? echo(): echon())
  153. #define noechom()  ((iscurses) ? noecho(): echoff())
  154. #define crmode()   ((iscurses) ? cbreak() : cbrkon())
  155. #define nocrmode() ((iscurses) ? nocbreak() : cbrkoff())
  156. #endif /* CURSES */
  157. #endif /* SYSV && USG */
  158.  
  159. #if !defined(USG)
  160. #ifndef CURSES
  161. /* if curses is not defined, simulate the same tty based macros */
  162. typedef struct sgttyb SGTTY;
  163. /* Do real ioctl calls to set the tty modes */
  164. #define crmode()   (_tty.sg_flags |= CBREAK,  stty(0, &_tty))
  165. #define nocrmode() (_tty.sg_flags &= ~CBREAK, stty(0, &_tty))
  166. #define echom()    (_tty.sg_flags |= ECHO,    stty(0, &_tty))
  167. #define noechom()  (_tty.sg_flags &= ~ECHO,   stty(0, &_tty))
  168. #define savetty()  (void) gtty(0, &_tty)
  169. #else /* CURSES */
  170. #define echom()    echo()
  171. #define noechom()  noecho()
  172. #endif /* ~CURSES */
  173. #endif /* ~USG */
  174.  
  175. /* With all that out of the way, we can now declare our tty type */
  176. SGTTY _tty;
  177.  
  178. extern char
  179.     del_line,        /* tty delete line character */
  180.     del_word,        /* tty delete word character */
  181.     del_char,        /* backspace */
  182.     reprint_line,    /* usually ^R */
  183.     eofc,        /* usually ^D */
  184.     lit_next;        /* usually ^V */
  185.  
  186. /* These macros now turn on/off echo/cbreak independent of the UNIX running */
  187. #define echo_on()    \
  188.     if (_tty.sg_flags && isoff(glob_flags, ECHO_FLAG)) nocrmode(), echom()
  189. #define echo_off()    \
  190.     if (_tty.sg_flags && isoff(glob_flags, ECHO_FLAG)) crmode(), noechom()
  191.  
  192. #define strdup(dst, src) (xfree (dst), dst = savestr(src))
  193. #define Debug        if (debug) printf
  194.  
  195. #ifdef SYSV
  196. #ifndef L_SET
  197. #define L_SET    0
  198. #endif /* L_SET */
  199. #ifndef F_OK
  200. #define F_OK    000
  201. #define R_OK    004
  202. #define W_OK    002
  203. #define E_OK    001
  204. #endif /* F_OK */
  205. typedef    unsigned long    u_long;
  206. #define vfork   fork
  207. #ifndef SIGCHLD
  208. #define SIGCHLD SIGCLD
  209. #endif /* SIGCHLD */
  210. #endif /* SYSV */
  211.  
  212. #if !defined(SUNTOOL) && !defined(CURSES)
  213.  
  214. #define TRUE          1
  215. #define FALSE          0
  216. #define print          printf
  217. #define wprint          printf
  218. #define print_more      printf
  219.  
  220. #endif /* SUNTOOL && !CURSES */
  221.  
  222. #ifndef max
  223. #define max(a,b) (((a) > (b)) ? (a) : (b))
  224. #define min(a,b) (((a) < (b)) ? (a) : (b))
  225. #endif /* max */
  226.  
  227. #if defined(CURSES) && !defined(SUNTOOL)
  228. #define wprint printf
  229. #endif /* !SUNTOOL && CURSES */
  230.  
  231. #if defined(CURSES) || defined(SUNTOOL)
  232. #define print_more      turnon(glob_flags, CONT_PRNT), print
  233. void print();        /* printf to window or curses or tty accordingly */
  234. #endif /* CURSES || SUNTOOL */
  235.  
  236. #ifdef  SUNTOOL
  237.  
  238. #define NO_ITEM          (Panel_item)0
  239. #define NO_EVENT      (struct inputevent *)0
  240. #define TIME_OUT      60           /* sleep 60 secs between mailchecks */
  241. #define PIX_XOR          PIX_SRC ^ PIX_DST
  242. #define ID           event.ie_code
  243. #define l_width(font)      fonts[font]->pf_defaultsize.x /* width of letter */
  244. #define l_height(font)      fonts[font]->pf_defaultsize.y /* height of letter */
  245. #define Clrtoeol(w,x,y,f) pw_text(w, x, y, PIX_SRC, fonts[f], blank)
  246. #define type_cursor(op)   pw_char(msg_win, txt.x,txt.y, op, fonts[curfont],'_')
  247.  
  248. #define highlight(win,x,y,font,s) \
  249.     pw_text(win,x,y, PIX_SRC, fonts[font],s), \
  250.     pw_text(win,x+1,y, \
  251.     (ison(glob_flags, REV_VIDEO))? PIX_NOT(PIX_SRC): PIX_SRC|PIX_DST, \
  252.     fonts[font],s)
  253.  
  254. /* Fonts */
  255. #define FONTDIR          "/usr/lib/fonts/fixedwidthfonts"
  256. #define DEFAULT          0
  257. #define SMALL           1
  258. #define LARGE           2
  259. #define MAX_FONTS      3
  260.  
  261. #endif /* SUNTOOL */
  262.  
  263. /* bits and pieces */
  264. #define turnon(flg,val)   ((flg) |= ((u_long)1 << ((u_long)(val)-1L)))
  265. #define turnoff(flg,val)  ((flg) &= ~((u_long)1 << ((u_long)(val)-1L)))
  266. #define ison(flg,val)     ((u_long)(flg) & ((u_long)1 << ((u_long)(val)-1L)))
  267. #define isoff(flg,val)    (!ison((flg), (val)))
  268. #define set_replied(n)      \
  269.     if (isoff(msg[n].m_flags, REPLIED)) \
  270.         turnon(glob_flags, DO_UPDATE), turnon(msg[n].m_flags, REPLIED)
  271. #define set_isread(n)      \
  272.     if (ison(msg[n].m_flags, UNREAD)) \
  273.         turnon(glob_flags, DO_UPDATE), turnoff(msg[n].m_flags, UNREAD)
  274.  
  275. #define in_pipe() (ison(glob_flags, DO_PIPE) || ison(glob_flags, IS_PIPE))
  276. #define in_macro() (ison(glob_flags, LINE_MACRO) || ison(glob_flags, IN_MACRO))
  277. #define line_macro(s) (turnon(glob_flags, LINE_MACRO), mac_push(s))
  278. #define curs_macro(s) (turnon(glob_flags, IN_MACRO), mac_push(s))
  279. #define Ungetstr(s) (turnon(glob_flags, QUOTE_MACRO), mac_push(s))
  280.  
  281. /* msg lists represented by bits (8 should be replaced by sizeof(char) */
  282. #define clear_msg_list(list)      (void) (bzero(list, (msg_cnt+7)/8))
  283. #define msg_bit(list, n)    ((list[(n) / 8] >> ((n) % 8)) & 1)
  284. #define set_msg_bit(list, n)    (list[(n) / 8] |= (1 << ((n) % 8)))
  285. #define unset_msg_bit(list, n)  (list[(n) / 8] &= ~(1 << ((n) % 8)))
  286. #define bput(S1, S2, Len, op)                   \
  287.         {                         \
  288.             register char *s1 = S1, *s2 = S2;         \
  289.             register int len = Len;             \
  290.             while(len--)                 \
  291.             *s2++ op *s1++;             \
  292.         }
  293. #define bitput(m1,m2,len,op)    bput(m1, m2, (((len)+7)/8), op)
  294.  
  295. /* convenience and/or readability */
  296. #define when          break;case
  297. #define otherwise      break;default
  298. #define lower(c)      (isupper(c)? tolower(c): c)
  299. #define Lower(c)      (c = lower(c))
  300. #define upper(c)      (islower(c)? toupper(c): c)
  301. #define Upper(c)      (c = upper(c))
  302. #define skipspaces(n)     for(p += (n); *p == ' ' || *p == '\t'; ++p)
  303. #define skipdigits(n)     for(p += (n); isdigit(*p); ++p)
  304. #define ismsgnum(c)       (isdigit(c)||c=='.'||c=='^'||c=='$'||c=='*')
  305. #define skipmsglist(n)\
  306.     for(p += (n); ismsgnum(*p) || index(" \t,-{`}", *p); ++p)\
  307.     if (*p != '`' || !p[1]) {;} else do ++p; while (*p && *p != '`')
  308.  
  309. #define NO_FLG        0
  310.  
  311. /* various flags */
  312. u_long   glob_flags;    /* global boolean flags thruout the whole program */
  313. #define DO_UPDATE   1    /* check for changes to avoid unnecessary copyback */
  314. #define REV_VIDEO   2    /* reverse video for curses or toolmode */
  315. #define CONT_PRNT   3    /* continue to print (maybe a printf) without a '\n' */
  316. #define DO_SHELL    4    /* run a shell even if no mail? (true if tool) */
  317. #define DO_PIPE     5    /* true if commands are piping to another command */
  318. #define IS_PIPE     6    /* true if commands' "input" is piped from another */
  319. #define IGN_SIGS    7    /* true if catch() should not longjmp */
  320. #define IGN_BANG    8    /* ignore ! as a history reference (see source()) */
  321. #define ECHO_FLAG   9    /* if true, echo|cbreak is ON, echo typing (-e) */
  322. #define IS_GETTING 10    /* true if we're getting input for a letter */
  323. #define PRE_CURSES 11    /* true if curses will be run, but hasn't started yet */
  324. #define READ_ONLY  12    /* -r passed to folder() (or main) setting read only */
  325. #define REDIRECT   13    /* true if stdin is being redirected */
  326. #define WAS_INTR   14    /* catch interrupts, set this flag (signals.c) */
  327. #define WARNING    15   /* if set, various warning messages may be printed */
  328. #define NEW_MAIL   17   /* new mail has arrived; user is busy or in icon mode */
  329. #define CNTD_CMD   18   /* curses.c -- "...continue..." prompt in curses */
  330. #define IS_SENDING 19   /* was started to send mail, not to be run as a shell */
  331. #define MIL_TIME   20    /* if $mil_time is set, use 24hr military time fmt */
  332. #define DATE_RECV  21   /* if $date_received, show date received on msgs */
  333. #define IN_MACRO   22    /* input is currently being read from a macro */
  334. #define LINE_MACRO 23    /* escape to line mode from curses mode in progress */
  335. #define QUOTE_MACRO 24  /* protect current macro from recursive expansion */
  336.  
  337. #define VERBOSE        1       /* verbose flag for sendmail */
  338. #define INCLUDE        2       /* include msg in response */
  339. #define INCLUDE_H    3    /* include msg with header */
  340. #define EDIT        4    /* enter editor by default on mailing */
  341. #define SIGN        5    /* auto-include ~/.signature in mail */
  342. #define DO_FORTUNE    6    /* add a fortune at end of msgs */
  343.  
  344. /* msg flags */
  345. #define NO_HEADER    7    /* don't print header of message (top, write) */
  346. #define DELETE        8
  347. #define OLD            9
  348. #define UNREAD        10
  349. #define UPDATE_STATUS    11    /* change status of msg when copyback */
  350. #define NO_PAGE        12    /* don't page this message */
  351. #define INDENT        13    /* indent included msg with string */
  352. #define NO_IGNORE    14    /* don't ignore headers */
  353. #define PRESERVE    15      /* preserve in mailbox unless deleted */
  354. #define M_TOP        15    /* just print the top of msg (same as pre) */
  355. #define FORWARD        16    /* Forward messages into the message buffer */
  356. #define REPLIED        17    /* Messages that have been replied to */
  357. #define NEW_SUBJECT    18    /* new subject regardless of $ask (mail -s) */
  358. #define SAVED        19    /* when message has been saved */
  359. #ifdef MSG_SEPARATOR
  360. #define NO_SEPARATOR    20    /* don't include message separator lines */
  361. #endif /* MSG_SEPARATOR */
  362.  
  363. #define    MAXMSGS_BITS    MAXMSGS/sizeof(char)    /* number of bits for bitmap */
  364.  
  365. struct msg {
  366.     u_long m_flags;
  367.     long   m_offset;    /* offset in tempfile of msg */
  368.     long   m_size;    /* number of bytes in msg */
  369.     int    m_lines;    /* number of lines in msg */
  370.     char   *m_date_recv;/* Date user received msg (see dates.c for fmt) */
  371.     char   *m_date_sent;/* Date author sent msg (see dates.c for fmt) */
  372. } msg[MAXMSGS];
  373.  
  374. struct options {
  375.     char *option;
  376.     char *value;
  377.     struct options *next;
  378. } *set_options, *aliases, *ignore_hdr, *functions, *fkeys, *own_hdrs;
  379. #ifdef CURSES
  380. struct options *bindings;
  381. #endif /* CURSES */
  382.  
  383. struct cmd {
  384.     char *command;
  385.     int (*func)();
  386. };
  387. extern struct cmd ucb_cmds[];
  388. extern struct cmd cmds[], hidden_cmds[];
  389. #ifdef SUNTOOL
  390. extern struct cmd fkey_cmds[];
  391. #endif /* SUNTOOL */
  392.  
  393. FILE
  394.     *tmpf,        /* temporary holding place for all mail */
  395.     *mask_fopen(),    /* open a file with umask 077 (permissions 600) */
  396.     *open_file(),    /* open a file or program for write/append */
  397.     *popen();        /* this should be in stdio.h */
  398.  
  399. extern char
  400.     *sys_errlist[],    /* system's list of global error messages */
  401. #ifdef SUNTOOL
  402.     *font_files[],     /* the names of the files fonts are kept in */
  403.     *alt_fonts[],     /* fonts to use if first ones don't work */
  404. #endif /* SUNTOOL */
  405.     **environ;        /* user's environment variables */
  406.  
  407. extern int errno;    /* global system error number */
  408. jmp_buf jmpbuf;        /* longjmp to jmpbuf on sigs (not in tool) */
  409.  
  410. char
  411.     debug,        /* debug causes various print statements in code */
  412.     tempfile[MAXPATHLEN],    /* path to filename of temporary file */
  413.     msg_list[MAXMSGS_BITS],    /* MAXMSGS bits of boolean storage */
  414.     **alternates,    /* alternates list --see alts() */
  415.     *cmd_help,        /* filename of location for "command -?" commands. */
  416.     *login,        /* login name of user */
  417.     *mailfile,        /* path to filename of current mailfile */
  418.     **ourname,        /* the name and aliases of the current host */
  419.     **known_hosts,    /* the names of all hosts connected via uucp */
  420.     *prompt,        /* the prompt string -- may have %d */
  421.     *escape,        /* the "tilde escape" when inputting text to letter */
  422.     *hdrs_only,        /* true if -H flag was given --set to args */
  423.     *hdr_format,    /* set to the header format string; referenced a lot */
  424.     *spoolfile,        /* MAILDIR/$USER in a string -- this is used a lot */
  425.     *msg_get(),        /* find start of message and return From_ line */
  426.     *do_range(),    /* parse a string converting to a "range" of numbers */
  427.     *getpath(),        /* static char returning path (expanding ~, +, %, #) */
  428.     *do_set(),        /* set/unset an option, alias, ignored-hdr */
  429.     *reverse(),        /* reverse a string */
  430.     *prog_name,
  431.  
  432.     /* from loop.c */
  433.     **make_command(),    /* build a command vector (argv) */
  434.     **mk_argv(),    /* given a string, make a vector */
  435.     *variable_stuff(),    /* return information about variables */
  436.     *check_internal(),    /* test or evaluate internal variables */
  437.  
  438.     /* from dates.c */
  439.     *Time(),        /* returns string expression of time (takes args) */
  440.     *date_to_ctime(),    /* convert a date into ctime() format */
  441.     *date_to_string(),    /* returns a string described by parse_date() */
  442.     *msg_date(),    /* return a string of the date of a message */
  443.     *parse_date(),    /* parse an ascii date, and return message-id str */
  444.     *rfc_date(),    /* create a date string compliant to RFC822 */
  445.  
  446.     /* from hdrs.c */
  447.     *cc_to(),         /* when responding, return str which is the cc-list */
  448.     *compose_hdr(),    /* returns a formatted line describing passed msg # */
  449.     *header_field(),    /* the line in msg described by arg (message header) */
  450.     *reply_to(),    /* who do we reply to when responding */
  451.     *subject_to(),      /* when responding, return str which is the subject */
  452.  
  453.     /* addrs.c */
  454.     *alias_to_address(),/* convert a name[list] to "real" names */
  455.     *bang_form(),    /* construct a !-style form of an address */
  456.     *get_name_n_addr(), /* get name and addr from a well-formed address */
  457.     *set_header(),     /* [interactive] proc to set/display to/subject/cc */
  458.     *wrap_addrs();    /* insert newlines in between headers */
  459.  
  460. int
  461.     last_msg_cnt,    /* when checking for new mail, save the last msg_cnt */
  462.     msg_cnt,        /* total number of messages */
  463.     crt,        /* min number of lines msg contains to invoke pager */
  464.     current_msg,    /* the current message we're dealing with */
  465.     exec_pid,        /* pid of a command that has been "exec"ed */
  466.     hist_no,        /* command's history number */
  467.     iscurses,        /* if we're running curses */
  468.     istool,        /* argv[0] == "xxxxtool", ranges from 0 to 2 */
  469.     n_array[128],    /* array of message numbers in the header window */
  470.     screen,        /* number of headers window can handle */
  471.     wrapcolumn,        /* compose mode line wrap, measured from left */
  472.  
  473.     quit(), do_alias(), respond(), cd(), sh(), stop(),
  474.     folder(), folders(), merge_folders(), do_undigest(),
  475.     save_msg(), delete(), do_mail(), lpr(), alts(), set(), do_hdrs(),
  476.     save_opts(), preserve(), sort(), readmsg(), edit_msg(), eval_cmd(),
  477.     do_pick(), print_help(), question_mark(), do_from(), my_stty(),
  478.     do_version(), disp_hist(), source(), do_echo(), ls(), pipe_msg(),
  479.     nopenfiles(), Setenv(), Unsetenv(), Printenv(), msg_flags(), toggle_debug();
  480.  
  481. #ifndef SIGRET
  482. #define SIGRET int
  483. #endif /* SIGRET */
  484. SIGRET
  485. #ifdef SUNTOOL
  486.     sigtermcatcher(), sigwinchcatcher(),
  487. #endif /* SUNTOOL */
  488.     rm_edfile(), stop_start(), bus_n_seg(), sigchldcatcher(), catch(), intrpt();
  489.  
  490. long
  491.     still_more,        /* there is still more message to display */
  492.     spool_size,        /* size of spool mail regardless of current folder */
  493.     last_size,        /* the last size of the mailfile since last check */
  494.     time();        /* satisfy lint */
  495.  
  496. void
  497.     error(), getmail(), mail_status(), close_lock(),
  498.     file_to_fp(), init(), display_msg(), cleanup(), fs_error();
  499.     /* printf(), fclose(), fflush(), fputs(), fputc() */
  500. #ifdef TIOCGLTC
  501. struct ltchars ltchars;            /* tty character settings */
  502. #endif /* TIOCGLTC */
  503. #ifdef BSD /* (TIOCGETC) */
  504. struct tchars  tchars;            /* more tty character settings */
  505. #endif /* BSD (TIOCGETC) */
  506.  
  507. #ifdef CURSES
  508.  
  509. #define STANDOUT(y,x,s) standout(), mvaddstr(y,x,s), standend()
  510. #define redraw()    clearok(curscr, TRUE), wrefresh(curscr)
  511.  
  512. int
  513.     curses_init();    /* interpret commands via the curses interface */
  514. #endif /* CURSES */
  515.  
  516. int
  517.     mac_push(),        /* set up a string as a macro */
  518.     bind_it();        /* bind strings to functions or macros */
  519.  
  520. void
  521.     mac_flush();    /* Abandon macro processing (on error) */
  522.  
  523. #ifdef SUNTOOL
  524. void
  525.     lock_cursors(), unlock_cursors(), scroll_win(),
  526.     set_fkeys(), set_key(), toggle_opt(), help_opt();
  527.  
  528. char
  529.     *rite(),        /* rite a char to msg_win: return string if c == '\n' */
  530.     *find_key(),    /* pass x,y coords to find which function key assoc. */
  531.     *key_set_to(),    /* pass fkey string, return string describing func */
  532.     *panel_get(),          /* returns what has been typed in a panel item */
  533.     *tool_help,        /* help for tool-related things (sometimes, overlap) */
  534.     blank[128];        /* use to clear to end of line */
  535.  
  536. int
  537.     time_out,        /* time out interval to wait for new mail */
  538.     rootfd,        /* the root window's fd */
  539.     parentfd,        /* the parent's window fd */
  540.     getting_opts,    /* true if getting/setting opts from msg_win */
  541.     curfont,        /* the current font to use for mail message window */
  542.     total_fonts,    /* total number of fonts available */
  543.     get_hdr_field,    /* bitmask of header fields to be gotten */
  544.  
  545.     msg_io(), msgwin_handlesigwinch(), hdr_io(), hdrwin_handlesigwinch(),
  546.     do_compose(), do_edit(), read_mail(), delete_mail(), respond_mail(),
  547.     do_hdr(), display_hdrs(), print_sigwinch(), p_set_opts(),
  548.     tool_mgmt(), do_help(), text_done(), msg_num_done(), do_lpr(),
  549.     toolquit(), change_font(), do_clear(), do_update(), do_sort(),
  550.     file_dir(), do_file_dir(), do_send(), abort_mail(), check_new_mail(),
  551.     fkey_cmd(), fkey_settings();
  552.  
  553. struct tool *tool;      /* main tool structure */
  554. struct toolsw
  555.     *panel_sw,        /* main panel subwindow */
  556.     *hdr_sw,         /* subwindow for message headers */
  557.     *hdr_panel_sw,    /* panel for headers */
  558.     *tty_sw,         /* subwindow which forks a shell (usually editor) */
  559.     *print_sw,         /* subwindow for print statements */
  560.     *msg_sw;         /* main subwindow to display messages and more */
  561.  
  562. struct pixwin
  563.     *msg_win,        /* main pixwin for message display and more */
  564.     *hdr_win,        /* pixwin for message headers */
  565.     *print_win;        /* pixwin for printing messages ( print() ) */
  566.  
  567. struct pr_pos txt;               /* current position of text written */
  568. struct rect msg_rect, hdr_rect;         /* sizes of the main and hdr rects */
  569. struct pixfont *fonts[MAX_FONTS];    /* array of fonts */
  570.  
  571. Panel
  572.     main_panel,        /* the main panel dealing with generic items */
  573.     hdr_panel;        /* panel which contains message header specific items */
  574.  
  575. Panel_item
  576.     abort_item,        /* abort mail in progress */
  577.     alias_item,        /* set/view/change current mail aliases */
  578.     cd_item,        /* changes file_item to cd (for cd-ing) */
  579.     comp_item,        /* compose a letter */
  580.     delete_item,    /* delete/undelete messages */
  581.     edit_item,        /* edit a message */
  582.     font_item,        /* choose which font to use */
  583.     folder_item,    /* change folders */
  584.     file_item,         /* text item for files or directories (folder/cd) */
  585.     hdr_display,    /* format message headers are displayed */
  586.     help_item,        /* choose this to get various help */
  587.     ignore_item,    /* set/view/change message headers to be ignored */
  588.     input_item,        /* text item to get values for set/unsetting values */
  589.     msg_num_item,    /* text item to explicitly state which message to read */
  590.     next_scr,        /* display the next screenful of message headers */
  591.     option_item,    /* set/view/unset mail options */
  592.     prev_scr,        /* display the previous screen of messages */
  593.     print_item,        /* send current message to the printer */
  594.     quit_item,        /* quit tool/close to icon */
  595.     read_item,        /* read the current message */
  596.     respond_item,    /* respond to messages */
  597.     save_item,        /* saves messages; uses text item input_item */
  598.     send_item,        /* when composing letter, this will send it off */
  599.     sort_item,        /* sort routine... */
  600.     sub_hdr_item[6],    /* display items that just sit there and give help */
  601.     update_item;    /* commit changes to folder */
  602.  
  603. struct itimerval mail_timer;    /* frequency to check for new mail */
  604.  
  605.             /* mouse symbols and data */
  606. /* left, middle and right mouse pixrects */
  607. struct cursor
  608.     l_cursor, m_cursor, r_cursor, coffee, read_cursor, write_cursor,
  609.     main_cursor, checkmark;
  610.  
  611. struct pixrect *msg_pix; /* pixrect holding text of a message */
  612. extern struct pixrect mouse_left, mouse_middle, mouse_right;
  613. extern struct pixrect dn_arrow, up_arrow, cycle, shade_50;
  614.  
  615. extern struct icon mail_icon;
  616. #endif /* SUNTOOL */
  617.