Annotation of src/usr.bin/mg/mail.c, Revision 1.2
1.2 ! vincent 1: /* $OpenBSD: mail.c,v 1.1 2003/05/05 11:12:07 vincent Exp $ */
1.1 vincent 2: /*
3: * This file is in the public domain.
4: *
5: * Author: Vincent Labrecque, April 2003
6: */
7: #include <ctype.h>
8:
9: #include "def.h"
10: #include "kbd.h"
11: #include "funmap.h"
12:
13: #define LIMIT 72
14:
15: static int fake_self_insert(int, int);
16: static int mail(int, int);
17:
18: /* mappings for all "printable" characters ('-' -> '~') */
19: static PF mail_fake[] = {
20: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
21: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
22: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
23: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
24: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
25: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
26: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
27: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
28: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
29: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
30: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
31: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
32: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
33: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
34: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
35: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
36: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
37: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
38: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
39: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
40: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
41: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
42: fake_self_insert, fake_self_insert, fake_self_insert, fake_self_insert,
43: fake_self_insert, fake_self_insert, fake_self_insert,
44: };
45:
46: static struct KEYMAPE (1 + IMAPEXT) mailmap = {
47: 1,
48: 1 + IMAPEXT,
49: rescan,
50: {
51: { ' ', '~', mail_fake, NULL },
52: }
53: };
54:
55: void
56: mail_init(void)
57: {
58: funmap_add(mail, "mail-mode");
59: maps_add((KEYMAP *)&mailmap, "mail-mode");
60: }
61:
62: static int
63: mail(int f, int n)
64: {
65: curbp->b_modes[0] = name_mode("fundamental");
66: curbp->b_modes[1] = name_mode("mail-mode");
67: if (curbp->b_modes[1] == NULL) {
68: panic("can't happen");
69: mail_init();
70: curbp->b_modes[1] = name_mode("mail-mode");
71: }
72: curbp->b_nmodes = 1;
1.2 ! vincent 73: curwp->w_flag |= WFMODE;
1.1 vincent 74: return (TRUE);
75: }
76:
77: static int
78: fake_self_insert(int f, int n)
79: {
80: if (curwp->w_doto >= LIMIT - 1) {
81: int save = curwp->w_doto;
82:
83: /*
84: * Find the last word boundary.
85: */
86: while (curwp->w_doto > 0 &&
87: !isspace(curwp->w_dotp->l_text[curwp->w_doto - 1]))
88: curwp->w_doto--;
89: /*
90: * handle lines without any spaces correctly!
91: */
92: if (curwp->w_doto == 0 && !isspace(curwp->w_dotp->l_text[0]))
93: curwp->w_doto = save;
94: newline(FFRAND, 1);
95: gotoeol(0, 1);
96: }
97: selfinsert(f, n);
98: return (TRUE);
99: }