abcb18d9f711dcea4189eefb721b60e382168a85
[alioth/jupp.git] / types.h
1 #ifndef _JOE_TYPES_H
2 #define _JOE_TYPES_H
3
4 #ifdef EXTERN
5 __RCSID("$MirOS: contrib/code/jupp/types.h,v 1.16 2017/12/02 02:07:33 tg Exp $");
6 #endif
7
8 /* Prefix to make string constants unsigned */
9 #define US (unsigned char *)
10
11 #define LINK(type) struct { type *next; type *prev; }
12
13 #define KEYS            256
14 #define stdsiz          8192
15 #define FITHEIGHT       4               /* Minimum text window height */
16 #define LINCOLS         6
17 #define NPROC           8               /* Number of processes we keep track of */
18 #define UNDOKEEP        100
19 #define INC             16              /* Pages to allocate each time */
20
21 #define TYPETW          0x0100
22 #define TYPEPW          0x0200
23 #define TYPEMENU        0x0800
24 #define TYPEQW          0x1000
25
26
27 typedef struct header H;
28 typedef struct buffer B;
29 typedef struct point P;
30 typedef struct options OPTIONS;
31 typedef struct macro MACRO;
32 typedef struct cmd CMD;
33 typedef struct entry HENTRY;
34 typedef struct hash HASH;
35 typedef struct kmap KMAP;
36 typedef struct kbd KBD;
37 typedef struct key KEY;
38 typedef struct watom WATOM;
39 typedef struct screen SCREEN;
40 typedef struct window W;
41 typedef struct base BASE;
42 typedef struct bw BW;
43 typedef struct menu MENU;
44 typedef struct scrn SCRN;
45 typedef struct cap CAP;
46 typedef struct pw PW;
47 typedef struct stditem STDITEM;
48 typedef struct query QW;
49 typedef struct tw TW;
50 typedef struct irec IREC;
51 typedef struct undo UNDO;
52 typedef struct undorec UNDOREC;
53 typedef struct search SRCH;
54 typedef struct srchrec SRCHREC;
55 typedef struct vpage VPAGE;
56 typedef struct vfile VFILE;
57
58
59 struct header {
60         LINK(H) link;           /* LINK ??? */
61         long    seg;            /* ??? */
62         int     hole;           /* ??? */
63         int     ehole;          /* ??? */
64         int     nlines;         /* ??? */
65 };
66
67 struct point {
68         LINK(P) link;           /* ?LINK ??? */
69
70         B       *b;             /* ?B ??? */
71         int     ofst;           /* ??? */
72         unsigned char   *ptr;   /* ??? */
73         H       *hdr;           /* ?H ??? */
74
75         long    byte;           /* ??? */
76         long    line;           /* ??? */
77         long    col;            /* current column */
78         long    xcol;           /* ??? */
79         int     valcol;         /* bool: is col valid? */
80         int     end;            /* ??? */
81
82         P       **owner;        /* ??? */
83 };
84
85 struct options {
86         OPTIONS *next;
87         unsigned char   *name_regex;
88         unsigned char   *contents_regex;
89         int     overtype;
90         int     lmargin;
91         int     rmargin;
92         int     autoindent;
93         int     wordwrap;
94         int     tab;
95         int     indentc;
96         int     istep;
97         unsigned char   *context;
98         unsigned char   *lmsg;
99         unsigned char   *rmsg;
100         char    *hmsg;
101         int     linums;
102         int     readonly;
103         int     french;
104         int     spaces;
105         int     crlf;
106         int     highlight;      /* Set to enable highlighting */
107         unsigned char *syntax_name;     /* Name of syntax to use */
108         struct high_syntax *syntax;     /* Syntax for highlighting (load_dfa() from syntax_name happens in setopt()) */
109         unsigned char *map_name;        /* Name of character set */
110         struct charmap *charmap;        /* Character set */
111         int     smarthome;      /* Set for smart home key */
112         int     indentfirst;    /* Smart home goes to indentation point first */
113         int     smartbacks;     /* Set for smart backspace key */
114         int     purify;         /* Purify indentation */
115         int     picture;        /* Picture mode */
116         MACRO   *mnew;          /* Macro to execute for new files */
117         MACRO   *mold;          /* Macro to execute for existing files */
118         MACRO   *msnew;         /* Macro to execute before saving new files */
119         MACRO   *msold;         /* Macro to execute before saving existing files */
120         int     vispace;        /* Set to make spaces visible */
121         int     hex;            /* Hex edit mode */
122 };
123
124 struct macro {
125         int     k;              /* Keycode */
126         int     arg;            /* Repeat argument */
127         CMD     *cmd;           /* Command address */
128         int     n;              /* Number of steps */
129         int     size;           /* Malloc size of steps */
130         MACRO   **steps;        /* Block */
131 };
132
133 struct recmac {
134         struct recmac *next;
135         int     n;
136         MACRO   *m;
137 };
138
139
140 /* Command entry */
141
142 struct cmd {
143         unsigned char   *name;          /* Command name */
144         int     flag;           /* Execution flags */
145         int     (*func) ();     /* Function bound to name */
146         MACRO   *m;             /* Macro bound to name */
147         int     arg;            /* 0= arg is meaningless, 1= ok */
148         unsigned char   *negarg;        /* Command to use if arg was negative */
149 };
150
151
152
153 struct buffer {
154         LINK(B) link;
155         P       *bof;
156         P       *eof;
157         unsigned char   *name;
158         long    mod_time;       /* Last modification time for file */
159         int     orphan;
160         int     count;
161         int     changed;
162         int     backup;
163         void    *undo;
164         P       *marks[11];     /* Bookmarks */
165         OPTIONS o;              /* Options */
166         P       *oldcur;        /* Last cursor position before orphaning */
167         P       *oldtop;        /* Last top screen position before orphaning */
168         int     rdonly;         /* Set for read-only */
169         int     internal;       /* Set for internal buffers */
170         int     scratch;        /* Set for scratch buffers */
171         int     er;             /* Error code when file was loaded */
172         pid_t   pid;            /* Process id */
173         int     out;            /* fd to write to process */
174 };
175
176
177 struct entry {
178         unsigned char   *name;
179         HENTRY  *next;
180         void    *val;
181 };
182
183 struct hash {
184         int     len;
185         HENTRY  **tab;
186 };
187
188
189 struct help {
190         unsigned char   *text;          /* help text with attributes */
191         unsigned int    lines;          /* number of lines */
192         struct help     *prev;          /* previous help screen */
193         struct help     *next;          /* nex help screen */
194         unsigned char   *name;          /* context name for context sensitive help */
195 };
196
197 /* A key binding */
198 struct key {
199         int     k;                      /* Flag: 0=binding, 1=submap */
200         union {
201                 void    *bind;          /* What key is bound to */
202                 KMAP    *submap;        /* Sub KMAP address (for prefix keys) */
203         } value;
204 };
205
206 /* A map of keycode to command/sub-map bindings */
207 struct kmap {
208         KEY     keys[KEYS];     /* KEYs */
209 };
210
211 /** A keyboard handler **/
212 struct kbd {
213         KMAP    *curmap;        /* Current keymap */
214         KMAP    *topmap;        /* Top-level keymap */
215         int     seq[16];        /* Current sequence of keys */
216         int     x;              /* What we're up to */
217 };
218
219
220 struct watom {
221         unsigned char   *context;       /* Context name */
222         void    (*disp) ();     /* Display window */
223         void    (*follow) ();   /* Called to have window follow cursor */
224         int     (*abort) ();    /* Common user functions */
225         int     (*rtn) ();
226         int     (*type) ();
227         void    (*resize) ();   /* Called when window changed size */
228         void    (*move) ();     /* Called when window moved */
229         void    (*ins) ();      /* Called on line insertions */
230         void    (*del) ();      /* Called on line deletions */
231         int     what;           /* Type of this thing */
232 };
233
234 struct screen {
235         SCRN    *t;             /* Screen data on this screen is output to */
236
237         int     wind;           /* Number of help lines on this screen */
238
239         W       *topwin;        /* Top-most window showing on screen */
240         W       *curwin;        /* Window cursor is in */
241
242         int     w, h;           /* Width and height of this screen */
243 };
244
245 struct window {
246         LINK(W) link;           /* Linked list of windows in order they
247                                    appear on the screen */
248
249         SCREEN  *t;             /* Screen this thing is on */
250
251         int     x, y, w, h;     /* Position and size of window */
252                                 /* Currently, x = 0, w = width of screen. */
253                                 /* y == -1 if window is not on screen */
254
255         int     ny, nh;         /* Temporary values for wfit */
256
257         int     reqh;           /* Requested new height or 0 for same */
258                                 /* This is an argument for wfit */
259
260         int     fixed;          /* If this is zero, use 'hh'.  If not, this
261                                    is a fixed size window and this variable
262                                    gives its height */
263
264         int     hh;             /* Height window would be on a screen with
265                                    1000 lines.  When the screen size changes
266                                    this is used to calculate the window's
267                                    real height */
268
269         W       *win;           /* Window this one operates on */
270         W       *main;          /* Main window of this family */
271         W       *orgwin;        /* Window where space from this window came */
272         int     curx, cury;     /* Cursor position within window */
273         KBD     *kbd;           /* Keyboard handler for this window */
274         WATOM   *watom;         /* The type of this window */
275         void    *object;        /* Object which inherits this */
276 #if 0
277         union {                 /* FIXME: instead of void *object we should */
278                 BW      *bw;    /* use this union to get strict type checking */
279                 PW      *pw;    /* from C compiler (need to check and change */
280                 QW      *qw;    /* all of the occurrencies of ->object) */
281                 TW      *tw;
282                 MENU    *menu;
283                 BASE    *base;
284         } object;
285 #endif
286
287         const unsigned char *msgt;      /* Message at top of window */
288         const unsigned char *msgb;      /* Message at bottom of window */
289         const unsigned char *huh;       /* Name of window for context sensitive hlp */
290         int     *notify;        /* Address of kill notification flag */
291 };
292
293 /* Anything which goes in window.object must start like this: */
294 struct base {
295         W       *parent;
296 };
297
298 struct bw {
299         W       *parent;
300         B       *b;
301         P       *top;
302         P       *cursor;
303         long    offset;
304         SCREEN  *t;
305         int     h, w, x, y;
306
307         OPTIONS o;
308         void    *object;
309
310         int     linums;
311         int     top_changed;    /* Top changed */
312 };
313
314 struct menu {
315         W       *parent;        /* Window we're in */
316         unsigned char   **list;         /* List of items */
317         int     top;            /* First item on screen */
318         int     cursor;         /* Item cursor is on */
319         int     width;          /* Width of widest item, up to 'w' max */
320         int     perline;        /* Number of items on each line */
321         int     nitems;         /* No. items in list */
322         int     saved_co;       /* Saved #columns of screen */
323         SCREEN  *t;             /* Screen we're on */
324         int     h, w, x, y;
325         int     (*abrt) ();     /* Abort callback function */
326         int     (*func) ();     /* Return callback function */
327         int     (*backs) ();    /* Backspace callback function */
328         void    *object;
329 };
330
331 struct hentry {
332         int     next;
333         int     loc;
334 };
335
336 /* Each terminal has one of these */
337
338 #ifdef __MSDOS__
339
340 struct scrn {
341         int     li;             /* Height of screen */
342         int     co;             /* Width of screen */
343         short   *scrn;          /* Buffer */
344         int     scroll;
345         int     insdel;
346         int     *updtab;        /* Lines which need to be updated */
347         /* HIGHLIGHT_STATE *syntab; */ /* Syntax highlight state at start of each line */
348         int     *syntab;
349         int     *compose;
350         int     *sary;
351 };
352
353 #else
354 struct scrn {
355         CAP     *cap;           /* Termcap/Terminfo data */
356
357         int     li;             /* Screen height */
358         int     co;             /* Screen width */
359
360         unsigned char   *ti;            /* Initialization string */
361         unsigned char   *cl;            /* Home and clear screen... really an
362                                    init. string */
363         unsigned char   *cd;            /* Clear to end of screen */
364         unsigned char   *te;            /* Restoration string */
365
366         int     haz;            /* Terminal can't print ~s */
367         int     os;             /* Terminal overstrikes */
368         int     eo;             /* Can use blank to erase even if os */
369         int     ul;             /* _ overstrikes */
370         int     am;             /* Terminal has autowrap, but not magicwrap */
371         int     xn;             /* Terminal has magicwrap */
372
373         unsigned char   *so;            /* Enter standout (inverse) mode */
374         unsigned char   *se;            /* Exit standout mode */
375
376         unsigned char   *us;            /* Enter underline mode */
377         unsigned char   *ue;            /* Exit underline mode */
378         unsigned char   *uc;            /* Single time underline character */
379
380         int     ms;             /* Ok to move when in standout/underline mode */
381
382         unsigned char   *mb;            /* Enter blinking mode */
383         unsigned char   *md;            /* Enter bold mode */
384         unsigned char   *mh;            /* Enter dim mode */
385         unsigned char   *mr;            /* Enter inverse mode */
386         unsigned char   *me;            /* Exit above modes */
387
388         unsigned char   *Sb;            /* Set background color */
389         unsigned char   *Sf;            /* Set foregrond color */
390         int     ut;             /* Screen erases with background color */
391
392         int     da, db;         /* Extra lines exist above, below */
393         unsigned char   *al, *dl, *AL, *DL;     /* Insert/delete lines */
394         unsigned char   *cs;            /* Set scrolling region */
395         int     rr;             /* Set for scrolling region relative addressing */
396         unsigned char   *sf, *SF, *sr, *SR;     /* Scroll */
397
398         unsigned char   *dm, *dc, *DC, *ed;     /* Delete characters */
399         unsigned char   *im, *ic, *IC, *ip, *ei;        /* Insert characters */
400         int     mi;             /* Set if ok to move while in insert mode */
401
402         unsigned char   *bs;            /* Move cursor left 1 */
403         int     cbs;
404         unsigned char   *lf;            /* Move cursor down 1 */
405         int     clf;
406         unsigned char   *up;            /* Move cursor up 1 */
407         int     cup;
408         unsigned char   *nd;            /* Move cursor right 1 */
409
410         unsigned char   *ta;            /* Move cursor to next tab stop */
411         int     cta;
412         unsigned char   *bt;            /* Move cursor to previous tab stop */
413         int     cbt;
414         int     tw;             /* Tab width */
415
416         unsigned char   *ho;            /* Home cursor to upper left */
417         int     cho;
418         unsigned char   *ll;            /* Home cursor to lower left */
419         int     cll;
420         unsigned char   *cr;            /* Move cursor to left edge */
421         int     ccr;
422         unsigned char   *RI;            /* Move cursor right n */
423         int     cRI;
424         unsigned char   *LE;            /* Move cursor left n */
425         int     cLE;
426         unsigned char   *UP;            /* Move cursor up n */
427         int     cUP;
428         unsigned char   *DO;            /* Move cursor down n */
429         int     cDO;
430         unsigned char   *ch;            /* Set cursor column */
431         int     cch;
432         unsigned char   *cv;            /* Set cursor row */
433         int     ccv;
434         unsigned char   *cV;            /* Goto beginning of specified line */
435         int     ccV;
436         unsigned char   *cm;            /* Set cursor row and column */
437         int     ccm;
438
439         unsigned char   *ce;            /* Clear to end of line */
440         int     cce;
441
442         /* Basic abilities */
443         int     scroll;         /* Set to use scrolling */
444         int     insdel;         /* Set to use insert/delete within line */
445
446         /* Current state of terminal */
447         int     *scrn;          /* Characters on screen */
448         int     *attr;          /* Attributes on screen */
449         int     x, y;           /* Current cursor position (-1 for unknown) */
450         int     top, bot;       /* Current scrolling region */
451         int     attrib;         /* Current character attributes */
452         int     ins;            /* Set if we're in insert mode */
453
454         int     *updtab;        /* Dirty lines table */
455         int     *syntab;
456         int     avattr;         /* Bits set for available attributes */
457         int     *sary;          /* Scroll buffer array */
458
459         int     *compose;       /* Line compose buffer */
460         int     *ofst;          /* stuff for magic */
461         struct hentry   *htab;
462         struct hentry   *ary;
463 };
464 #endif
465
466
467 struct sortentry {
468         unsigned char   *name;
469         unsigned char   *value;
470 };
471
472 struct cap {
473         unsigned char   *tbuf;          /* Termcap entry loaded here */
474
475         struct sortentry *sort; /* Pointers to each capability stored in here */
476         int     sortlen;        /* Number of capabilities */
477
478         unsigned char   *abuf;          /* For terminfo compatible version */
479         unsigned char   *abufp;
480
481         int     div;            /* tenths of MS per char */
482         int     baud;           /* Baud rate */
483         unsigned char   *pad;           /* Padding string or NULL to use NUL */
484         void    (*out) (unsigned char *, unsigned char);                /* Character output routine */
485         void    *outptr;        /* First arg passed to output routine.  Second
486                                    arg is character to write */
487         int     dopadding;      /* Set if pad characters should be used */
488         const char *paste_on;   /* Enable bracketed paste mode */
489         const char *paste_off;  /* Disable bracketed paste mode */
490 };
491
492
493 struct pw {
494         int     (*pfunc) ();    /* Func which gets called when RTN is hit */
495         int     (*abrt) ();     /* Func which gets called when window is aborted */
496         int     (*tab) ();      /* Func which gets called when TAB is hit */
497         unsigned char   *prompt;        /* Prompt string */
498         int     promptlen;      /* Width of prompt string */
499         int     promptofst;     /* Prompt scroll offset */
500         B       *hist;          /* History buffer */
501         void    *object;        /* Object */
502 };
503
504 struct stditem {
505         LINK(STDITEM)   link;
506 };
507
508 struct query {
509         W       *parent;        /* Window we're in */
510         int     (*func) ();     /* Func. which gets called when key is hit */
511         int     (*abrt) ();
512         void    *object;
513         unsigned char   *prompt;        /* Prompt string */
514         int     promptlen;      /* Width of prompt string */
515         int     promptofst;     /* Prompt scroll offset */
516 };
517
518
519 typedef struct mpx MPX;
520 struct mpx {
521         int     ackfd;          /* Packetizer response descriptor */
522         int     kpid;           /* Packetizer process id */
523         int     pid;            /* Client process id */
524         void    (*func) ();     /* Function to call when read occures */
525         void    *object;        /* First arg to pass to function */
526         void    (*die) ();      /* Function: call when client dies or closes */
527         void    *dieobj;
528 };
529
530
531 struct tw {
532         unsigned char   *stalin;        /* Status line info */
533         unsigned char   *staright;
534         int     staon;          /* Set if status line was on */
535         long    prevline;       /* Previous cursor line number */
536         int     changed;        /* Previous changed value */
537         B       *prev_b;        /* Previous buffer (we need to update status line on nbuf/pbuf) */
538 };
539
540 struct irec {
541         LINK(IREC)      link;
542         int     what;           /* 0 repeat, >0 append n chars */
543         long    start;          /* Cursor search position */
544         long    disp;           /* Original cursor position */
545         int     wrap_flag;      /* Wrap flag */
546 };
547
548 struct isrch {
549         IREC    irecs;          /* Linked list of positions */
550         unsigned char *pattern; /* Search pattern string */
551         unsigned char *prompt;  /* Prompt (usually same as pattern unless utf-8/byte conversion) */
552         int     ofst;           /* Offset in pattern past prompt */
553         int     dir;            /* 0=fwrd, 1=bkwd */
554         int     quote;          /* Set to quote next char */
555 };
556
557
558 struct undorec {
559         LINK(UNDOREC)   link;
560         UNDOREC *unit;
561         int     min;
562         int     changed;        /* Status of modified flag before this record */
563         long    where;          /* Buffer address of this record */
564         long    len;            /* Length of insert or delete */
565         int     del;            /* Set if this is a delete */
566         B       *big;           /* Set to buffer containing a large amount of deleted data */
567         unsigned char   *small;         /* Set to malloc block containg a small amount of deleted data */
568 };
569
570 struct undo {
571         LINK(UNDO)      link;
572         B       *b;
573         int     nrecs;
574         UNDOREC recs;
575         UNDOREC *ptr;
576         UNDOREC *first;
577         UNDOREC *last;
578 };
579
580 struct srchrec {
581         LINK(SRCHREC)   link;   /* Linked list of search & replace locations */
582         int     yn;             /* Did we replace? */
583         int     wrap_flag;      /* Did we wrap? */
584         long    addr;           /* Where we were */
585 };
586
587 struct search {
588         unsigned char   *pattern;       /* Search pattern */
589         unsigned char   *replacement;   /* Replacement string */
590         int     backwards;      /* Set if search should go backwards */
591         int     ignore;         /* Set if we should ignore case */
592         int     repeat;         /* Set with repeat count (or -1 for no repeat count) */
593         int     replace;        /* Set if this is search & replace */
594         int     rest;           /* Set to do remainder of search & replace w/o query */
595         unsigned char   *entire;        /* Entire matched string */
596         unsigned char   *pieces[26];    /* Peices of the matched string */
597         int     flg;            /* Set after prompted for first replace */
598         SRCHREC recs;           /* Search & replace position history */
599         P       *markb, *markk; /* Original marks */
600         P       *wrap_p;        /* Wrap point */
601         int     wrap_flag;      /* Set if we've wrapped */
602         int     valid;          /* Set if original marks are a valid block */
603         long    addr;           /* Addr of last replacement or -1 for none */
604         int     block_restrict; /* Search restricted to marked block */
605 };
606
607
608
609 /* Page header */
610
611 struct vpage {
612         VPAGE   *next;          /* Next page with same hash value */
613         VFILE   *vfile;         /* Owner vfile */
614         long    addr;           /* Address of this page */
615         int     count;          /* Reference count */
616         int     dirty;          /* Set if page changed */
617         unsigned char   *data;          /* The data in the page */
618 };
619
620 /* File structure */
621
622 struct vfile {
623         LINK(VFILE)     link;   /* Doubly linked list of vfiles */
624         long    size;           /* Number of bytes in physical file */
625         long    alloc;          /* Number of bytes allocated to file */
626         int     fd;             /* Physical file */
627         int     writeable;      /* Set if we can write */
628         unsigned char   *name;          /* File name.  0 if unnamed */
629         int     flags;          /* Set if this is only a temporary file */
630
631         /* For array I/O */
632         unsigned char   *vpage1;        /* Page address */
633         long    addr;           /* File address of above page */
634
635         /* For stream I/O */
636         unsigned char   *bufp;          /* Buffer pointer */
637         unsigned char   *vpage;         /* Buffer pointer points in here */
638         int     left;           /* Space left in bufp */
639         int     lv;             /* Amount of append space at end of buffer */
640 };
641
642 #endif