1 /*        $NetBSD: ip.h,v 1.3 2013/11/27 18:25:13 christos Exp $      */
2 /*-
3  * Copyright (c) 1996
4  *        Keith Bostic.  All rights reserved.
5  *
6  * See the LICENSE file for redistribution information.
7  *
8  *        Id: ip.h,v 8.29 2000/07/17 21:17:54 skimo Exp  (Berkeley) Date: 2000/07/17 21:17:54
9  */
10 
11 #include <sys/socket.h>
12 #include "ipc_def.h"
13 
14 typedef struct ipcmsghdr {
15           struct    cmsghdr   header;
16           int       __room_for_fd_with_pad[4];
17 } IPCMSGHDR;
18 
19 struct _ip_vi_win;
20 
21 typedef struct _ip_private {
22           int        i_fd;              /* Input file descriptor. */
23           int        o_fd;              /* Output file descriptor. */
24           int        t_fd;              /* Terminal file descriptor. */
25 
26           int        argc;
27           char      **argv;
28 
29           size_t     row;               /* Current row. */
30           size_t     col;               /* Current column. */
31 
32           db_recno_t           sb_total;          /* scrollbar: total lines in file. */
33           db_recno_t           sb_top;  /* scrollbar: top line on screen. */
34           size_t     sb_num;  /* scrollbar: number of lines on screen. */
35 
36           size_t     iblen;             /* Input buffer length. */
37           size_t     iskip;             /* Returned input buffer. */
38           char       ibuf[256];         /* Input buffer. */
39 
40           CHAR_T     tbuf[256];         /* Input keys. */
41 
42 #define   IP_IN_EX            0x0001  /* Currently running ex. */
43 #define IP_ON_ALTERNATE 0x0002          /* Alternate on. */
44 #define   IP_SCR_VI_INIT  0x0004  /* Vi screen initialized. */
45           u_int32_t flags;
46 } IP_PRIVATE;
47 
48 #define   IPP(sp)             ((IP_PRIVATE *)((sp)->wp->ip_private))
49 #define   WIPP(wp)  ((IP_PRIVATE *)((wp)->ip_private))
50 
51 /* The screen line relative to a specific window. */
52 #define   RLNO(sp, lno)       (sp)->roff + (lno)
53 #define   RCNO(sp, cno)       (sp)->coff + (cno)
54 
55 #define   IPO_CODE_LEN        1         /* Length of a code value. */
56 #define   IPO_INT_LEN         4         /* Length of an integer. */
57 
58 /* A structure that can hold the information for any frame. */
59 typedef struct _ip_buf {
60           int code;           /* Event code. */
61           const char *str1;   /* String #1. */
62           u_int32_t len1;               /* String #1 length. */
63           const char *str2;   /* String #1. */
64           u_int32_t len2;               /* String #1 length. */
65           u_int32_t val1;               /* Value #1. */
66           u_int32_t val2;               /* Value #2. */
67           u_int32_t val3;               /* Value #3. */
68 } IP_BUF;
69 
70 typedef int (*IPFunc) (struct _ip_vi_win *);
71 typedef int (*IPFunc_1) (struct _ip_vi_win *, u_int32_t);
72 typedef int (*IPFunc_1a) (struct _ip_vi_win *, u_int32_t, const char *, u_int32_t);
73 typedef int (*IPFunc_a) (struct _ip_vi_win *, const char *, u_int32_t);
74 typedef int (*IPFunc_ab1) (struct _ip_vi_win *, const char *, u_int32_t,
75                                   const char *, u_int32_t, u_int32_t);
76 typedef int (*IPFunc_12) (struct _ip_vi_win *, u_int32_t, u_int32_t);
77 typedef int (*IPFunc_123) (struct _ip_vi_win *, u_int32_t, u_int32_t, u_int32_t);
78 
79 typedef int (*IPUnmarshall) (struct _ip_vi_win *, IP_BUF *, IPFunc);
80 
81 typedef struct _ipfunlist {
82     const char     *format;
83     IPUnmarshall    unmarshall;
84     size_t              offset;
85 } IPFUNLIST;
86 
87 typedef struct _vipfunlist {
88     const char     *format;
89     e_event_t           e_event;
90 } VIPFUNLIST;
91 
92 typedef struct ip_si_operations {
93     IPFunc_a        addstr;
94     IPFunc_12       attribute;
95     IPFunc      bell;
96     IPFunc      busy_off;
97     IPFunc_a    busy_on;
98     IPFunc      clrtoeol;
99     IPFunc      deleteln;
100     IPFunc      discard;
101     IPFunc_ab1  editopt;
102     IPFunc      insertln;
103     IPFunc_12   move;
104     IPFunc      quit;
105     IPFunc      redraw;
106     IPFunc      refresh;
107     IPFunc_a    rename;
108     IPFunc_1    rewrite;
109     IPFunc_123  scrollbar;
110     IPFunc_a    select;
111     IPFunc      split;
112     IPFunc_a        waddstr;
113 } IPSIOPS;
114 
115 struct _ip_vi;
116 typedef struct _ip_vi IPVI;
117 
118 struct _ip_vi_win;
119 typedef struct _ip_vi_win IPVIWIN;
120 
121 struct _ip_vi {
122     int             ifd;                /* Input file descriptor. */
123     int             ofd;                /* Output file descriptor. */
124     pid_t pid;
125 
126     void  *private_data;
127 
128     u_int32_t       flags;
129 
130     int             (*run) __P((IPVI*, int, char*[]));
131     int   (*new_window) __P((IPVI *, IPVIWIN **, int));
132     int             (*close) __P((IPVI*));
133 };
134 
135 struct _ip_vi_win {
136     int             ifd;                /* Input file descriptor. */
137     int             ofd;                /* Output file descriptor. */
138 
139     void  *private_data;
140 
141     IPSIOPS          *si_ops;
142 
143     int             (*c_bol) __P((IPVIWIN*));
144     int             (*c_bottom) __P((IPVIWIN*));
145     int             (*c_del) __P((IPVIWIN*));
146     int             (*c_eol) __P((IPVIWIN*));
147     int             (*c_insert) __P((IPVIWIN*));
148     int             (*c_left) __P((IPVIWIN*));
149     int             (*c_right) __P((IPVIWIN*));
150     int             (*c_top) __P((IPVIWIN*));
151     int             (*c_settop) __P((IPVIWIN*, u_int32_t));
152 
153     int             (*string) __P((IPVIWIN*, const char*, u_int32_t));
154     int             (*wq) __P((IPVIWIN*));
155     int             (*quit) __P((IPVIWIN*));
156     int             (*resize) __P((IPVIWIN*, u_int32_t, u_int32_t));
157 
158     int             (*input) __P((IPVIWIN*, int));
159     int             (*close) __P((IPVIWIN*));
160 
161     int             (*set_ops) __P((IPVIWIN*, IPSIOPS*));
162 };
163 
164 /*
165  * Screen/editor IP_CODE's.
166  *
167  * The program structure depends on the event loop being able to return
168  * IPO_EOF/IPO_ERR multiple times -- eventually enough things will end
169  * due to the events that vi will reach the command level for the screen,
170  * at which point the exit flags will be set and vi will exit.
171  *
172  * IP events sent from the screen to vi.
173  */
174 #define   CODE_OOB   0        /* Illegal code. */
175 #if 0
176 #define   VI_C_BOL   1        /* Cursor to start of line. */
177 #define   VI_C_BOTTOM          2        /* Cursor to bottom. */
178 #define   VI_C_DEL   3        /* Cursor delete. */
179 #define   VI_C_DOWN  4        /* Cursor down N lines: IPO_INT. */
180 #define   VI_C_EOL   5        /* Cursor to end of line. */
181 #define   VI_C_INSERT          6        /* Cursor: enter insert mode. */
182 #define   VI_C_LEFT  7        /* Cursor left. */
183 #define   VI_C_PGDOWN          8        /* Cursor down N pages: IPO_INT. */
184 #define   VI_C_PGUP  9        /* Cursor up N lines: IPO_INT. */
185 #define   VI_C_RIGHT          10        /* Cursor right. */
186 #define   VI_C_SEARCH         11        /* Cursor: search: IPO_INT, IPO_STR. */
187 #define   VI_C_SETTOP         12        /* Cursor: set screen top line: IPO_INT. */
188 #define   VI_C_TOP  13        /* Cursor to top. */
189 #define   VI_C_UP             14        /* Cursor up N lines: IPO_INT. */
190 #define   VI_EDIT             15        /* Edit a file: IPO_STR. */
191 #define   VI_EDITOPT          16        /* Edit option: 2 * IPO_STR, IPO_INT. */
192 #define   VI_EDITSPLIT        17        /* Split to a file: IPO_STR. */
193 #define   VI_EOF              18        /* End of input (NOT ^D). */
194 #define   VI_ERR              19        /* Input error. */
195 #define   VI_INTERRUPT        20        /* Interrupt. */
196 #define   VI_MOUSE_MOVE       21        /* Mouse click move: IPO_INT, IPO_INT. */
197 #define   VI_QUIT             22        /* Quit. */
198 #define   VI_RESIZE 23        /* Screen resize: IPO_INT, IPO_INT. */
199 #define   VI_SEL_END          24        /* Select end: IPO_INT, IPO_INT. */
200 #define   VI_SEL_START        25        /* Select start: IPO_INT, IPO_INT. */
201 #define   VI_SIGHUP 26        /* SIGHUP. */
202 #define   VI_SIGTERM          27        /* SIGTERM. */
203 #define   VI_STRING 28        /* Input string: IPO_STR. */
204 #define   VI_TAG              29        /* Tag. */
205 #define   VI_TAGAS  30        /* Tag to a string: IPO_STR. */
206 #define   VI_TAGSPLIT         31        /* Split to a tag. */
207 #define   VI_UNDO             32        /* Undo. */
208 #define   VI_WQ               33        /* Write and quit. */
209 #define   VI_WRITE  34        /* Write. */
210 #define   VI_WRITEAS          35        /* Write as another file: IPO_STR. */
211 #define VI_FLAGS    36        /* Flags passed to nvi_create */
212 #endif
213 
214 #define   VI_SEARCH_EXT       0x001     /* VI_C_SEARCH: ignore case. */
215 #define   VI_SEARCH_IC        0x002     /* VI_C_SEARCH: ignore case. */
216 #define   VI_SEARCH_ICL       0x004     /* VI_C_SEARCH: ignore case if lower-case. */
217 #define   VI_SEARCH_INCR      0x008     /* VI_C_SEARCH: incremental search. */
218 #define   VI_SEARCH_LIT       0x010     /* VI_C_SEARCH: literal string. */
219 #define   VI_SEARCH_REV       0x020     /* VI_C_SEARCH: reverse direction. */
220 #define   VI_SEARCH_WR        0x040     /* VI_C_SEARCH: wrap at sof/eof. */
221 
222 /*
223  * IP events sent from vi to the screen.
224  */
225 #if 0
226 #define   SI_ADDSTR  1        /* Add a string: IPO_STR. */
227 #define   SI_ATTRIBUTE         2        /* Set screen attribute: 2 * IPO_INT. */
228 #define   SI_BELL              3        /* Beep/bell/flash the terminal. */
229 #define   SI_BUSY_OFF          4        /* Display a busy message: IPO_STR. */
230 #define   SI_BUSY_ON           5        /* Display a busy message: IPO_STR. */
231 #define   SI_CLRTOEOL          6        /* Clear to the end of the line. */
232 #define   SI_DELETELN          7        /* Delete a line. */
233 #define   SI_DISCARD           8        /* Discard the screen. */
234 #define   SI_EDITOPT           9        /* Edit option: 2 * IPO_STR, IPO_INT. */
235 #define   SI_INSERTLN         10        /* Insert a line. */
236 #define   SI_MOVE             11        /* Move the cursor: 2 * IPO_INT. */
237 #define   SI_QUIT             12        /* Quit. */
238 #define   SI_REDRAW 13        /* Redraw the screen. */
239 #define   SI_REFRESH          14        /* Refresh the screen. */
240 #define   SI_RENAME 15        /* Rename the screen: IPO_STR. */
241 #define   SI_REPLY  16        /* Reply: IPO_INT (0/1), IPO_STR. */
242 #define   SI_REWRITE          17        /* Rewrite a line: IPO_INT. */
243 #define   SI_SCROLLBAR        18        /* Reset the scrollbar: 3 * IPO_INT. */
244 #define   SI_SELECT 19        /* Select area: IPO_STR. */
245 #define   SI_SPLIT  20        /* Split the screen. */
246 #define   SI_EVENT_MAX        20
247 #endif
248 
249 #include "ipc_extern.h"
250 #include "ip_extern.h"
251