1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
1001
1002
1003
1004
1005
1006
1007
1008
1009
1010
1011
1012
1013
1014
1015
1016
1017
1018
1019
1020
1021
1022
1023
1024
1025
1026
1027
1028
1029
1030
1031
1032
1033
1034
1035
1036
1037
1038
1039
1040
1041
1042
1043
1044
1045
1046
1047
1048
1049
1050
1051
1052
1053
1054
1055
1056
1057
1058
1059
1060
1061
1062
1063
1064
1065
1066
1067
1068
1069
1070
1071
1072
1073
1074
1075
1076
1077
1078
1079
1080
1081
1082
1083
1084
1085
1086
1087
1088
1089
1090
1091
1092
1093
1094
1095
1096
1097
1098
1099
1100
1101
1102
1103
1104
1105
1106
1107
1108
1109
1110
1111
1112
1113
1114
1115
1116
1117
1118
1119
1120
1121
1122
1123
1124
1125
1126
1127
1128
1129
1130
1131
1132
1133
1134
1135
1136
1137
1138
1139
1140
1141
1142
1143
1144
1145
1146
1147
1148
1149
1150
1151
1152
1153
1154
1155
1156
1157
1158
1159
1160
1161
1162
1163
1164
1165
1166
1167
1168
1169
1170
1171
1172
1173
1174
1175
1176
1177
1178
1179
1180
1181
1182
1183
1184
1185
1186
1187
1188
1189
1190
1191
1192
1193
1194
1195
1196
1197
1198
1199
1200
1201
1202
1203
1204
1205
1206
1207
1208
1209
1210
1211
1212
1213
1214
1215
1216
1217
1218
1219
1220
1221
1222
1223
1224
1225
1226
1227
1228
1229
1230
1231
1232
1233
1234
1235
1236
1237
1238
1239
1240
1241
1242
1243
1244
1245
1246
1247
1248
1249
1250
1251
1252
1253
1254
1255
1256
1257
1258
1259
|
$NetBSD: patch-ab,v 1.4 2004/02/13 23:49:12 snj Exp $
--- netbsd/estruct.h.orig Wed Mar 25 14:21:05 1998
+++ netbsd/estruct.h Wed Mar 25 14:25:34 1998
@@ -0,0 +1,1254 @@
+/* ESTRUCT: Structure and preprocesser defined for
+ MicroEMACS 4.00
+
+ (C)Copyright 1995 by Daniel Lawrence
+ written by Daniel Lawrence
+ based on code by Dave G. Conroy,
+ Steve Wilhite and George Jones
+*/
+
+#ifdef LATTICE
+#undef LATTICE /* don't use their definitions...use ours */
+#endif
+#ifdef MSDOS
+#undef MSDOS
+#endif
+#ifdef WINNT
+#undef WINNT
+#endif
+#ifdef AMIGA
+#undef AMIGA
+#endif
+#ifdef EGA
+#undef EGA
+#endif
+#ifdef CTRLZ
+#undef CTRLZ
+#endif
+
+/* Program Identification.....
+
+ PROGNAME should always be MicroEMACS for a distribution
+ unmodified version. People using MicroEMACS as a shell
+ for other products should change this to reflect their
+ product. Macros can query this via the $progname variable
+*/
+
+#define PROGNAME "MicroEMACS"
+#define VERSION "4.00"
+
+/* Machine/OS definitions */
+/* [Set one of these!!] */
+
+#define AMIGA 0 /* AmigaDOS */
+#define AOSVS 0 /* Data General AOS/VS */
+#define AUX 0 /* Apple UNIX for Macintosh */
+#define AIX 0 /* IBM UNIX for various machines*/
+#define AVIION 0 /* Data General AViiON */
+#define BSD 0 /* UNIX BSD 4.2 and ULTRIX */
+#define FINDER 0 /* Macintosh OS */
+#define FREEBSD 1 /* Works fine for FreeBSD, too */
+#define HPUX8 0 /* HPUX HP 9000 ver 8 or less */
+#define HPUX9 0 /* HPUX HP 9000 ver 9 */
+#define MPE 0 /* HP MPE/XL */
+#define MSDOS 0 /* MS-DOS */
+#define WINNT 0 /* MS-Win NT */
+#define OS2 0 /* Microsoft or IBM OS/2 */
+#define SMOS 0 /* Supermax UNIX System V */
+#define SUN 0 /* SUN v4.0 */
+#define TOS 0 /* ST520, TOS */
+#define USG 0 /* UNIX system V */
+#define VMS 0 /* VAX/VMS */
+#define WMCS 0 /* Wicat's MCS */
+#define XENIX 0 /* IBM-PC SCO XENIX */
+
+/* Compiler definitions */
+/* [Set one of these!!] */
+#define ALCYON 0 /* ALCYON Atari ST compiler */
+#define AZTEC 0 /* Aztec C 4.00e ONLY for the amiga now... */
+#define DGC 0 /* Data General AOS/VS C... */
+#define GCC 0 /* the GNU C compiler */
+#define IC 0 /* Rational Systems Instant C */
+#define LATTICE 0 /* Lattice 2.14 through 3.0 compilers */
+#define MSC 0 /* MicroSoft C compile version 3 thru 7 */
+#define MWC 0 /* Mark Williams C */
+#define TURBO 0 /* Turbo C and Borland C++ under MSDOS */
+#define UNIX 1 /* a standard UNIX compiler (cc) */
+#define ZTC 0 /* Zortech C/C++ 1.02 thru 2.10 under MSDOS */
+
+/* Machine stack growth direction. */
+/* [Set this to 1 if your machine stack grows UP!!!] */
+/* data general mv/eclipse series stack grows up. */
+/* dec vax series stack grows down... got it??? */
+
+#define STACK_GROWS_UP 0
+
+/* Debugging options */
+#define RAMSIZE 0 /* dynamic RAM memory usage tracking */
+#define RAMSHOW 0 /* auto dynamic RAM reporting */
+#define RAMTRCK 0 /* send debug info to MALLOC.DAT */
+#define DEBUG_SEARCH 0 /* pop some search info on patterns */
+
+/* Special keyboard/network definitions */
+
+#define ATKBD 0 /* AT-style keyboard with F11, F12 & grey keys */
+#define WANGPC 0 /* WangPC - mostly escape sequences */
+#define VT100 1 /* Handle VT100 style keypad - NOT VMS. */
+#define KEYPAD 0 /* VMS - turn on and off application */
+ /* keypad automatically */
+#define XONDATA 0 /* VMS - set to force /NOTTSYNC/NOHOSTSY */
+#define RMSIO 0 /* VMS - skip the rotten C runtime and */
+ /* use RMS directly */
+#define OPTMEM 0 /* VMS 5.0 and up - use a less standard */
+ /* but more efficient memory allocator */
+
+/* Terminal Output definitions */
+/* [Set one of these!!] */
+
+#define ANSI 0 /* ANSI escape sequences */
+#define DASHER 0 /* DG Dasher 2xx/4xx crts */
+#define DG10 0 /* Data General system/10 */
+#define FMR 0 /* Fujitsu FMR series driver */
+#define HP110 0 /* HP110 screen driver */
+#define HP150 0 /* HP150 screen driver */
+#define I55 0 /* IBM PS55 DOS J4.0/V */
+#define IBMPC 0 /* IBM-PC CGA/MONO/EGA/VGA drvr */
+#define MAC 0 /* Macintosh */
+#define NEC 0 /* NEC-9801VM driver */
+#define OS2NPM 0 /* OS/2 non-Presentation Mgr. */
+#define SMG 0 /* SMG library on VMS */
+#define ST52 0 /* Atari 520/1040ST screen */
+#define TERMCAP 1 /* Use TERMCAP */
+#define TIPC 0 /* TI Profesional PC driver */
+#define VT52 0 /* VT52 terminal (Zenith). */
+#define NTCON 0 /* Windows NT console */
+#define XVT 0 /* XVT windowing system */
+#define Z309 0 /* Zenith 100 PC family driver */
+
+/* Windowing system style (pick one) */
+
+#define WINDOW_TEXT 1 /* [default] Text mode */
+#define WINDOW_MSWIN 0 /* MicroSoft Windows */
+#define WINDOW_MSWIN32 0 /* MicroSoft Windows 32 bit API */
+#define WINDOW_X 0 /* X/Unix */
+
+/* Language text options (pick one) */
+
+#define ENGLISH 1 /* [default] */
+#define FRENCH 0
+#define SPANISH 0
+#define GERMAN 0
+#define DUTCH 0
+#define PLATIN 0 /* Pig Latin */
+#define JAPAN 0
+#define LATIN 0 /* real Latin */
+
+/* Configuration options */
+
+#define TYPEAH 1 /* type ahead causes update to be skipped */
+#define LOGFLG 0 /* send all executed commands to EMACS.LOG */
+#define VISMAC 0 /* update display during keyboard macros */
+#define CTRLZ 0 /* add a ^Z at end of files under MSDOS only */
+#define CLEAN 0 /* de-alloc memory on exit */
+#define CALLED 0 /* is emacs a called subroutine? or stand alone */
+
+#define REVSTA 1 /* Status line appears in reverse video */
+#define COLOR 1 /* color commands and windows */
+
+#define FILOCK 0 /* file locking under unix BSD 4.2 */
+#define ISRCH 1 /* Incremental searches like ITS EMACS */
+#define FLABEL 0 /* function key label code [HP150] */
+#define CRYPT 1 /* file encryption enabled? */
+#define MAGIC 1 /* include regular expression matching? */
+#define MOUSE 1 /* Include routines for mouse actions */
+#define NOISY 1 /* Use a fancy BELL if it exists */
+#define CTAGS 1 /* include vi-like tagging? */
+#define SPEECH 0 /* spoken EMACS, for the sight impared [not ready] */
+#define VARARG 0 /* use varargs.h for mlwrite() */
+
+#if XVT
+#undef COLOR
+#define COLOR 1 /* overide this to be TRUE for XVT always */
+#endif
+
+/* Character set options */
+/* [Set one of these!!] */
+#define ASCII 1 /* always using ASCII char sequences for now */
+#define EBCDIC 0 /* later IBM mainfraim versions will use EBCDIC */
+
+/* handle constant and voids properly */
+
+#if VMS
+#define CONST readonly
+#define VOID void
+#define NOSHARE noshare
+#else
+#if AOSVS
+#define CONST $shared $align(1) /* fake a const */
+#define VOID
+#define NOSHARE $low32k $align(1) /* attempt to optimize read/write vars. */
+#else
+
+#if __STDC__ || MSC || TURBO || GCC || (AMIGA && LATTICE)
+#define CONST const
+#define VOID void
+#define NOSHARE
+#else
+#define CONST
+#if IC
+#define VOID void
+#else
+#define VOID
+#endif
+#define NOSHARE
+#endif
+
+#endif
+#endif
+
+/* System dependent library redefinitions, structures and includes */
+
+/* multibyte character support? */
+
+#if NEC || FMR || I55
+#define DBCS 1 /* double byte character sets enabled */
+#define INSDEL 1 /* use insert/delete line display optimizations */
+
+/* define DBCS prefix bytes */
+#define is2char(ch) (((ch&0xff) >= 0x81 && (ch&0xff) <= 0x9f) || ((ch&0xff) >=0xe0 && (ch&0xff) <= 0xfc))
+
+#else
+#define DBCS 0
+#define INSDEL 0
+#endif
+
+/* Can we catch the SIGWINCH (the window size change signal)? */
+
+#if AIX || HPUX9 || FREEBSD
+#define HANDLE_WINCH 1
+#else
+#define HANDLE_WINCH 0
+#endif
+
+/* Prototypes in use? */
+
+#if MSC || TURBO || IC || VMS || GCC || ZTC
+#define PROTO 1
+#else
+#define PROTO 0
+#endif
+
+/* the following define allows me to initialize unions...
+ otherwise we make them structures (like the keybinding table) */
+
+#if __STDC__ || MSC || TURBO || IC || ZTC
+#define ETYPE union
+#else
+#define ETYPE struct
+#endif
+
+/* Instant C can't do stat()s. Arrrg. No file locking for you */
+#if IC && MSDOS
+#undef FILOCK
+#define FILOCK 0
+#endif
+
+/* Mark Williams/Atari has no standard or varargs or directory functions */
+#if TOS & MWC
+#undef VARARG
+#define VARARG 0
+#undef FILOCK
+#define FILOCK 0
+#endif
+
+/* MS-Windows */
+
+#if WINNT || WINDOW_MSWIN || WINDOW_MSWIN32
+#if WINDOW_MSWIN32
+#undef WINDOW_MSWIN
+#define WINDOW_MSWIN 1
+#endif
+#if WINDOW_MSWIN && WINNT
+#undef WINDOW_MSWIN32
+#define WINDOW_MSWIN32 1
+#endif
+#undef VOID /* windows.h will wind up defining this */
+#include <windows.h> /* --------- Huge include file here !!! ---------*/
+#if NTCON
+#include <wincon.h>
+#include <stdio.h>
+#include <dos.h>
+#endif
+
+#undef NEAR
+#define NEAR
+#define DNEAR
+#if MSC || IC
+#undef CDECL
+#define CDECL __cdecl
+#define DUMMYSZ 1 /* dummy size for unsized extern arrays to avoid
+ silly DGROUP fixup */
+#else
+#if TURBO
+#define DUMMYSZ /* nothing */
+#else
+#define CDECL _cdecl /* ZTC */
+#define DUMMYSZ /* nothing */
+#endif
+#endif
+
+#if WINNT
+#define EXPORT /* Windows NT doesn't like this */
+#endif
+
+#if WINDOW_MSWIN
+#undef TYPEAH
+#define TYPEAH 0 /* typeahead is handled at the term driver level */
+#undef CALLED
+#define CALLED 1 /* under MS Windows, "main" resides in the sys driver */
+#if MSC
+#define EXPORT __export
+#else
+#define EXPORT _export /* Fine for TURBO and ZTC */
+#endif
+#endif
+#else
+
+/* neither Windows NT nor MS-Windows */
+
+#define DUMMYSZ /* nothing */
+
+#if MSDOS & (TURBO | MSC | TIPC)
+#define NEAR
+#define DNEAR
+#define PASCAL pascal
+#define CDECL cdecl
+#else
+#if MSDOS & ZTC
+#define NEAR
+#define DNEAR
+#define PASCAL _pascal
+#define CDECL _cdecl
+#else
+#define NEAR
+#define DNEAR
+#define PASCAL
+#define CDECL
+#endif
+#endif
+
+#endif
+
+#if TURBO
+#include <dos.h>
+#include <mem.h>
+#undef peek
+#undef poke
+#define peek(a,b,c,d) movedata(a,b,FP_SEG(c),FP_OFF(c),d)
+#define poke(a,b,c,d) movedata(FP_SEG(c),FP_OFF(c),a,b,d)
+#endif
+
+#if IC
+#include <dos.h>
+#undef peek
+#undef poke
+#define peek(a,b,c,d) movedata(a,b,FP_SEG(c),FP_OFF(c),d)
+#define poke(a,b,c,d) movedata(FP_SEG(c),FP_OFF(c),a,b,d)
+#endif
+
+#if LATTICE & MSDOS
+/* you may have to remove this one definition with LATTICE version
+ 3.2 and above */
+#define unsigned
+#endif
+
+#if IC
+#define inp inportb
+#define outp outportb
+#define intdos(a, b) int86(33, a, b)
+#endif
+
+#if AZTEC
+#undef putc
+#undef getc
+#if MSDOS
+#define getc a1getc
+#define int86 sysint
+#define intdos(a, b) sysint(33, a, b)
+#define inp inportb
+#define outp outportb
+#else
+#define getc agetc
+#endif
+#define putc aputc
+
+struct XREG {
+ unsigned ax,bx,cx,dx,si,di,ds,es;
+};
+
+struct HREG {
+ char al,ah,bl,bh,cl,ch,dl,dh,d1,d2,e1,e2;
+};
+
+union REGS {
+ struct XREG x;
+ struct HREG h;
+};
+
+struct SREGS {
+ unsigned cs, ss, ds, es;
+};
+#endif
+
+#if MSDOS & MWC
+#include <dos.h>
+#define int86(a, b, c) intcall(b, c, a)
+#define intdos(a, b) intcall(a, b, DOSINT)
+#define inp(a) in(a)
+#define outp(a, b) out(a, b)
+#define movmem(a, b, c) memcpy(b, a, c)
+
+struct XREG {
+ unsigned int ax,bx,cx,dx,si,di,ds,es,flags;
+};
+
+struct HREG {
+ char al,ah,bl,bh,cl,ch,dl,dh;
+ unsigned int ds,es,flags;
+};
+
+union REGS {
+ struct XREG x;
+ struct HREG h;
+};
+#endif
+
+#if MSDOS & MSC
+#include <dos.h>
+#include <memory.h>
+#define peek(a,b,c,d) movedata(a,b,FP_SEG(c),FP_OFF(c),d)
+#define poke(a,b,c,d) movedata(FP_SEG(c),FP_OFF(c),a,b,d)
+#define movmem(a, b, c) memcpy(b, a, c)
+#define _strrev(a) strrev(a)
+#endif
+
+#if MSDOS & LATTICE
+#undef CPM
+#undef LATTICE
+#include <dos.h>
+#undef CPM
+#endif
+
+/* System V doesn't name this the same as others */
+#if USG | AIX | AUX | SUN | (OS2 & MSC)
+#define movmem(a, b, c) memcpy(b, a, c)
+#endif
+
+/* this keeps VMS happy */
+#if VMS
+#define getname xgetname
+#define unlink(a) delete(a)
+#endif
+
+/* some options for AOS/VS */
+#if AOSVS
+#define ORMDNI 1
+#endif
+
+/* define some ability flags */
+
+#if (IBMPC | Z309 | FMR | TIPC) & !(WINDOW_MSWIN | WINDOW_MSWIN32)
+#define MEMMAP 1
+#else
+#define MEMMAP 0
+#endif
+
+#if MSDOS | WINNT | OS2 | USG | AIX | AUX | SMOS | HPUX8 | HPUX9 | BSD | FREEBSD | (TOS & MWC) | WMCS | SUN | MPE
+#define ENVFUNC 1
+#else
+#define ENVFUNC 0
+#endif
+
+#if AUX
+#define RETCHAR '\n'
+#else
+#define RETCHAR '\r'
+#endif
+
+#if MPE
+#define DIRSEPSTR "."
+#define DIRSEPCHAR '.'
+#else
+#if TOS || MSDOS || WINNT || OS2
+#define DIRSEPSTR "\\"
+#define DIRSEPCHAR '\\'
+#define DRIVESEPCHAR ':'
+#else
+#define DIRSEPSTR "/"
+#define DIRSEPCHAR '/'
+#define DRIVESEPCHAR '\0'
+#endif
+#endif
+
+#if VARARG
+#if (GCC == 0) && (USG || AIX || AUX || BSD || FREEBSD || SUN || XENIX || HPUX8 || HPUX9 || AVIION || MPE)
+#define VARG 1
+#define SARG 0
+#include <varargs.h>
+#else
+#define VARG 0
+#define SARG 1
+#include <stdarg.h>
+#endif
+#endif
+
+#if ZTC
+#include <dos.h>
+#define movmem(a, b, c) memcpy(b, a, c)
+#endif
+
+/* Emacs global flag bit definitions (for gflags) */
+
+#define GFREAD 1 /* read first file in at startup */
+#define GFSDRAW 2 /* suppress a screen redraw */
+#define GFEXIT 4 /* exit from emacs pending */
+
+/* internal constants */
+
+#define NBINDS 300 /* max # of bound keys */
+#if AOSVS | VMS | WINNT | SUN | BSD | FREEBSD | USG | ZENIX | HPUX8 | HPUX9 | OS2
+#define NFILEN 256
+#else
+#define NFILEN 80 /* # of bytes, file name */
+#endif
+#define NBUFN 128 /* # of bytes, buffer name */
+#define NLINE 256 /* # of bytes, input line */
+#define NSTRING 128 /* # of bytes, string buffers */
+#define NKBDM 4096 /* # of strokes, keyboard macro */
+#define NPAT 128 /* # of bytes, pattern */
+#define HUGE 1000 /* Huge number */
+#define NLOCKS 256 /* max # of file locks active */
+#define NCOLORS 16 /* number of supported colors */
+#define KBLOCK 250 /* sizeof kill buffer chunks */
+#define NRING 16 /* # of buffers in kill ring */
+#define NBLOCK 16 /* line block chunk size */
+#define NVSIZE 16 /* max #chars in a var name */
+#define NMARKS 16 /* number of marks */
+#define MAXSYM 32 /* max # chars in symbol to expand */
+#define MINFLEN 3 /* min # chars to match &func */
+
+#define CTRL 0x0100 /* Control flag, or'ed in */
+#define META 0x0200 /* Meta flag, or'ed in */
+#define CTLX 0x0400 /* ^X flag, or'ed in */
+#define SPEC 0x0800 /* special key (function keys) */
+#define MOUS 0x1000 /* alternative input device (mouse) */
+#define SHFT 0x2000 /* shifted (for function keys) */
+#define ALTD 0x4000 /* ALT key... */
+#define MENU MOUS+SPEC /* menu selection (WINDOW_MSWIN) */
+
+#define BINDNUL 0 /* not bound to anything */
+#define BINDFNC 1 /* key bound to a function */
+#define BINDBUF 2 /* key bound to a buffer */
+
+#ifdef FALSE
+#undef FALSE
+#endif
+#ifdef TRUE
+#undef TRUE
+#endif
+
+#define FALSE 0 /* False, no, bad, etc. */
+#define TRUE 1 /* True, yes, good, etc. */
+#define ABORT 2 /* Death, ^G, abort, etc. */
+#define FAILD 3 /* not-quite fatal false return */
+
+#define STOP 0 /* keyboard macro not in use */
+#define PLAY 1 /* playing */
+#define RECORD 2 /* recording */
+
+/* Completion types */
+
+#define CMP_BUFFER 0
+#define CMP_COMMAND 1
+#define CMP_FILENAME 2
+
+/* Directive definitions */
+
+#define DIF 0
+#define DELSE 1
+#define DENDIF 2
+#define DGOTO 3
+#define DRETURN 4
+#define DENDM 5
+#define DWHILE 6
+#define DENDWHILE 7
+#define DBREAK 8
+#define DFORCE 9
+
+#define NUMDIRS 10
+
+/*
+ * PTBEG, PTEND, FORWARD, and REVERSE are all toggle-able values for
+ * routines that need directions.
+ */
+#define PTBEG 0 /* Leave the point at the beginning on search */
+#define PTEND 1 /* Leave the point at the end on search */
+#define FORWARD 0 /* do things in a forward direction */
+#define REVERSE 1 /* do things in a backwards direction */
+
+#define FIOSUC 0 /* File I/O, success. */
+#define FIOFNF 1 /* File I/O, file not found. */
+#define FIOEOF 2 /* File I/O, end of file. */
+#define FIOERR 3 /* File I/O, error. */
+#define FIOMEM 4 /* File I/O, out of memory */
+#define FIOFUN 5 /* File I/O, eod of file/bad line*/
+#define FIODEL 6 /* Can't delete/rename file */
+
+#if WINDOW_MSWIN
+/* values for the fbusy flag */
+#define FREADING 1 /* file read in progress */
+#define FWRITING 2 /* file write in progress */
+/* if no file activity, the value FALSE is used */
+#endif
+
+#define CFCPCN 0x0001 /* Last command was C-P, C-N */
+#define CFKILL 0x0002 /* Last command was a kill */
+#define CFSRCH 0x0004 /* last command was a search */
+#define CFYANK 0x0008 /* last command was a yank */
+
+#define SRNORM 0 /* end past, begin front */
+#define SRBEGIN 1 /* always at front */
+#define SREND 2 /* always one past end */
+
+#define BELL 0x07 /* a bell character */
+#define TAB 0x09 /* a tab character */
+
+#if USG | AIX | AUX | SMOS | HPUX8 | HPUX9 | BSD | FREEBSD | SUN | XENIX | AVIION
+#define PATHCHR ':'
+#else
+#if WMCS || MPE
+#define PATHCHR ','
+#else
+#define PATHCHR ';'
+#endif
+#endif
+
+#define INTWIDTH sizeof(int) * 3
+#define LONGWIDTH sizeof(long) * 3
+
+/* Macro argument token types */
+
+#define TKNUL 0 /* end-of-string */
+#define TKARG 1 /* interactive argument */
+#define TKBUF 2 /* buffer argument */
+#define TKVAR 3 /* user variables */
+#define TKENV 4 /* environment variables */
+#define TKFUN 5 /* function.... */
+#define TKDIR 6 /* directive */
+#define TKLBL 7 /* line label */
+#define TKLIT 8 /* numeric literal */
+#define TKSTR 9 /* quoted string literal */
+#define TKCMD 10 /* command name */
+
+/* Internal defined functions */
+
+#define nextab(a) (a - (a % tabsize)) + tabsize
+
+/* DIFCASE represents the integer difference between upper
+ and lower case letters. It is an xor-able value, which is
+ fortunate, since the relative positions of upper to lower
+ case letters is the opposite of ascii in ebcdic.
+*/
+
+#if ASCII
+#define DIFCASE 0x20
+#else
+#define DIFCASE 0x40
+#endif
+
+/* Dynamic RAM tracking and reporting redefinitions */
+
+#if RAMSIZE
+#define malloc allocate
+#define free release
+#else
+#if VMS & OPTMEM
+#define malloc VAXC$MALLOC_OPT
+#define free VAXC$FREE_OPT
+#define calloc VAXC$CALLOC_OPT
+#define realloc VAXC$REALLOC_OPT
+#define cfree VAXC$CFREE_OPT
+#endif
+#endif
+
+/* under MS Windows, we use dialog boxes to prompt the user for filenames */
+#if WINDOW_MSWIN
+#define FILENAMEREPLY(p,b,nb) filenamedlg(p,b,nb,TRUE)
+#else
+#define FILENAMEREPLY(p,b,nb) mlreply(p,b,nb)
+#endif
+
+/* formal parameters to procedures are stored as a linked list
+ of argument names using the following simple structure:
+*/
+
+typedef struct PARG {
+ struct PARG *next; /* ptr to next linked argument */
+ char name[NVSIZE+1]; /* name of the argument */
+} PARG;
+
+/* UNDO definitions and types */
+
+typedef int OPTYPE; /* type of operation being recorded/played back */
+
+#define OP_CMND 1 /* beginning of command */
+#define OP_DELC 2 /* delete a single character */
+#define OP_INSC 3 /* insert a single character */
+#define OP_DSTR 4 /* delete a string of characters */
+#define OP_ISTR 5 /* insert a string of characters */
+#define OP_REPC 6 /* replace a character */
+#define OP_CPOS 7 /* set the cursor position */
+
+/* object to be undone! */
+
+typedef union OBJECT {
+ char obj_char; /* a character */
+ char obj_string[1]; /* many characters */
+ char *obj_sptr; /* a ptr to a character */
+} OBJECT;
+
+typedef struct UNDO_OBJ {
+ struct UNDO_OBJ *next; /* ptr to next undo object */
+ OPTYPE type; /* type of operation */
+ long line_num; /* line offset from buffer beginning */
+ int offset; /* offset into that line */
+ long count; /* repetitions? */
+ OBJECT undo_obj; /* object to be undone */
+} UNDO_OBJ;
+
+/*
+ * There is a window structure allocated for every active display window. The
+ * windows are kept in a big list, in top to bottom screen order, with the
+ * listhead at "wheadp". Each window contains its own values of dot and mark.
+ * The flag field contains some bits that are set by commands to guide
+ * redisplay. Although this is a bit of a compromise in terms of decoupling,
+ * the full blown redisplay is just too expensive to run for every input
+ * character.
+ */
+typedef struct EWINDOW {
+ struct EWINDOW *w_wndp; /* Next window */
+ struct BUFFER *w_bufp; /* Buffer displayed in window */
+ struct LINE *w_linep; /* Top line in the window */
+ struct LINE *w_dotp; /* Line containing "." */
+ short w_doto; /* Byte offset for "." */
+ struct LINE *w_markp[NMARKS]; /* Line containing "mark" */
+ short w_marko[NMARKS]; /* Byte offset for "mark" */
+ char w_toprow; /* Origin 0 top row of window */
+ char w_ntrows; /* # of rows of text in window */
+ char w_force; /* If NZ, forcing row. */
+ char w_flag; /* Flags. */
+#if COLOR
+ char w_fcolor; /* current forground color */
+ char w_bcolor; /* current background color */
+#endif
+ int w_fcol; /* first column displayed */
+} EWINDOW;
+
+#define WFFORCE 0x01 /* Window needs forced reframe */
+#define WFMOVE 0x02 /* Movement from line to line */
+#define WFEDIT 0x04 /* Editing within a line */
+#define WFHARD 0x08 /* Better to a full display */
+#define WFMODE 0x10 /* Update mode line. */
+#define WFCOLR 0x20 /* Needs a color change */
+
+/* This structure holds the information about each line appearing on the
+ * video display. The redisplay module uses an array of virtual display
+ * lines. On systems that do not have direct access to display memory,
+ * there is also an array of physical display lines used to minimize
+ * video updating. In most cases, these two arrays are unique. If
+ * WINDOW_MSWIN is 1, there is a pair of such arrays in each SCREEN
+ * structure.
+ */
+
+typedef struct VIDEO {
+ int v_flag; /* Flags */
+#if COLOR
+ int v_fcolor; /* current forground color */
+ int v_bcolor; /* current background color */
+ int v_rfcolor; /* requested forground color */
+ int v_rbcolor; /* requested background color */
+#endif
+ int v_left; /* left edge of reverse video */
+ int v_right; /* right right of reverse video */
+#if INSDEL && MEMMAP == 0
+ int v_rline; /* requested screen line # */
+#endif
+ char v_text[1]; /* Screen data. */
+} VIDEO;
+
+#define VFNEW 0x0001 /* contents not meaningful yet */
+#define VFCHG 0x0002 /* Changed flag */
+#define VFEXT 0x0004 /* extended (beyond column 80) */
+#define VFCOL 0x0008 /* color change requested */
+
+/*
+ * This structure holds the information about each separate "screen"
+ * within the current editing session. On a character based system, these
+ * screens overlay each other, and can individually be brought to front.
+ * On a windowing system like MicroSoft Windows 3.0, OS/2, the Macintosh,
+ * Intuition, Sunview or X-windows, each screen is represented in an OS
+ * window. The terminolgy is wrong in emacs.....
+ *
+ * EMACS The outside World
+ * screen window
+ * window pane
+ */
+
+typedef struct SCREEN {
+ struct SCREEN *s_next_screen; /* link to next screen in list */
+ EWINDOW *s_first_window; /* head of linked list of windows */
+ EWINDOW *s_cur_window; /* current window in this screen */
+ char *s_screen_name; /* name of the current window */
+ short s_roworg; /* row origin of stored screen */
+ short s_colorg; /* column origin of stored screen */
+ short s_nrow; /* row width of stored screen */
+ short s_ncol; /* column origin of stored screen */
+#if WINDOW_MSWIN
+ VIDEO **s_virtual; /* virtual screen contents */
+ VIDEO **s_physical; /* physical screen contents */
+ HWND s_drvhandle; /* handle for the "term" driver */
+#endif
+} SCREEN;
+
+/*
+ * Text is kept in buffers. A buffer header, described below, exists for every
+ * buffer in the system. The buffers are kept in a big list, so that commands
+ * that search for a buffer by name can find the buffer header. There is a
+ * safe store for the dot and mark in the header, but this is only valid if
+ * the buffer is not being displayed (that is, if "b_nwnd" is 0). The text for
+ * the buffer is kept in a circularly linked list of lines, with a pointer to
+ * the header line in "b_linep". Buffers may be "Inactive" which means the
+ * files associated with them have not been read in yet. These get read in
+ * at "use buffer" time.
+ * Some buffers are really procedures and have a little extra information
+ * stored with them.
+ */
+typedef struct BUFFER {
+ struct BUFFER *b_bufp; /* Link to next BUFFER */
+ struct LINE *b_dotp; /* Link to "." LINE structure */
+ short b_doto; /* Offset of "." in above LINE */
+ struct LINE *b_markp[NMARKS]; /* The same as the above two, */
+ short b_marko[NMARKS]; /* but for the "mark" */
+ int b_fcol; /* first col to display */
+ struct LINE *b_linep; /* Link to the header LINE */
+ struct LINE *b_topline; /* Link to narrowed top text */
+ struct LINE *b_botline; /* Link to narrowed bottom text */
+ char b_active; /* window activated flag */
+ char b_nwnd; /* Count of windows on buffer */
+ char b_exec; /* how many active executions */
+ char b_flag; /* Flags */
+ int b_mode; /* editor mode of this buffer */
+ char b_fname[NFILEN]; /* File name */
+ char b_bname[NBUFN]; /* Buffer name */
+#if CRYPT
+ char b_key[NPAT]; /* current encrypted key */
+#endif
+ int b_numargs; /* number of arguments to procedure */
+ PARG *b_args; /* ptr to the first argument */
+ UNDO_OBJ *undo_head; /* head of undo stack for buffer */
+ long undo_count; /* # of undo operations stacked */
+ long last_access; /* time of last access */
+} BUFFER;
+
+#define BFINVS 0x01 /* Internal invisable buffer */
+#define BFCHG 0x02 /* Changed since last write */
+#define BFTRUNC 0x04 /* buffer was truncated when read */
+#define BFNAROW 0x08 /* buffer has been narrowed */
+
+#define NOTPROC -1 /* buffer is not a procedure */
+
+/* mode flags */
+#define NUMMODES 11 /* # of defined modes */
+
+#define MDWRAP 0x0001 /* word wrap */
+#define MDCMOD 0x0002 /* C indentation and fence match*/
+#define MDSPELL 0x0004 /* spell error parsing */
+#define MDEXACT 0x0008 /* Exact matching for searches */
+#define MDVIEW 0x0010 /* read-only buffer */
+#define MDOVER 0x0020 /* overwrite mode */
+#define MDMAGIC 0x0040 /* regular expresions in search */
+#define MDCRYPT 0x0080 /* encrytion mode active */
+#define MDASAVE 0x0100 /* auto-save mode */
+#define MDREPL 0x0200 /* replace mode */
+#define MDABBR 0x0400 /* abbreviation expansion mode */
+
+/*
+ * The starting position of a region, and the size of the region in
+ * characters, is kept in a region structure. Used by the region commands.
+ */
+typedef struct {
+ struct LINE *r_linep; /* Origin LINE address. */
+ short r_offset; /* Origin LINE offset. */
+ long r_size; /* Length in characters. */
+} REGION;
+
+/*
+ * All text is kept in circularly linked lists of "LINE" structures. These
+ * begin at the header line (which is the blank line beyond the end of the
+ * buffer). This line is pointed to by the "BUFFER". Each line contains a the
+ * number of bytes in the line (the "used" size), the size of the text array,
+ * and the text. The end of line is not stored as a byte; it's implied.
+ */
+typedef struct LINE {
+ struct LINE *l_fp; /* Link to the next line */
+ struct LINE *l_bp; /* Link to the previous line */
+ short l_size; /* Allocated size */
+ short l_used; /* Used size */
+ char l_text[1]; /* A bunch of characters. */
+} LINE;
+
+#define lforw(lp) ((lp)->l_fp)
+#define lback(lp) ((lp)->l_bp)
+#if UNIX && (SUN || HPUX8 || HPUX9 || BSD || FREEBSD)
+#define lgetc(lp, n) ((unsigned char)(lp)->l_text[(n)])
+#else
+#define lgetc(lp, n) ((lp)->l_text[(n)])
+#endif
+#define lputc(lp, n, c) ((lp)->l_text[(n)]=(c))
+#define lused(lp) ((lp)->l_used)
+#define lsize(lp) ((lp)->l_size)
+#define ltext(lp) ((lp)->l_text)
+
+/* This structure is used to hold a user variables name and its
+ current value. These are used for both the global and the
+ local symbol tables.
+*/
+
+typedef struct UVAR {
+ char u_name[NVSIZE + 1]; /* name of user variable */
+ char *u_value; /* value (string) */
+} UVAR;
+
+#define VT_NONE 0 /* don't declare it if not found */
+#define VT_LOCAL 1 /* local to the current procedure */
+#define VT_GLOBAL 2 /* global to all procedures */
+
+/* A UTABLE is a user variable table.... containing some header
+ information and an array of user variable names and definitions.
+ They are held together in a linked list, the last member of
+ the list being the global user variable table.
+*/
+
+typedef struct UTABLE {
+ struct UTABLE *next; /* ptr to next user variable table */
+ int size; /* max number of variables in table */
+ BUFFER *bufp; /* ptr to buffer holding procedure
+ assosiated with this symbol table. */
+ UVAR uv[1]; /* list of variable names/definitions
+ in this variable table */
+} UTABLE;
+
+/*
+ * The editor communicates with the display using a high level interface. A
+ * "TERM" structure holds useful variables, and indirect pointers to routines
+ * that do useful operations. The low level get and put routines are here too.
+ * This lets a terminal, in addition to having non standard commands, have
+ * funny get and put character code too. The calls might get changed to
+ * "termp->t_field" style in the future, to make it possible to run more than
+ * one terminal type.
+ */
+#if PROTO
+typedef struct {
+ short t_mrow; /* max number of rows allowable */
+ short t_nrow; /* current number of rows used */
+ short t_mcol; /* max Number of columns. */
+ short t_ncol; /* current Number of columns. */
+ short t_roworg; /* origin row (normally zero) */
+ short t_colorg; /* origin column (normally zero)*/
+ short t_margin; /* min margin for extended lines*/
+ short t_scrsiz; /* size of scroll region " */
+ int t_pause; /* # times thru update to pause */
+ int (PASCAL NEAR *t_open)(void); /* Open terminal at the start.*/
+ int (PASCAL NEAR *t_close)(void); /* Close terminal at end. */
+ int (PASCAL NEAR *t_kopen)(void); /* Open keyboard */
+ int (PASCAL NEAR *t_kclose)(void); /* Close keyboard */
+ int (PASCAL NEAR *t_getchar)(void); /* Get character from keyboard. */
+ int (PASCAL NEAR *t_putchar)(int); /* Put character to display.*/
+ int (PASCAL NEAR *t_flush)(void); /* Flush output buffers. */
+ int (PASCAL NEAR *t_move)(int, int);/* Move the cursor, origin 0.*/
+ int (PASCAL NEAR *t_eeol)(void); /* Erase to end of line. */
+ int (PASCAL NEAR *t_eeop)(void); /* Erase to end of page. */
+ int (PASCAL NEAR *t_clrdesk)(void); /* Clear the page totally */
+ int (PASCAL NEAR *t_beep)(void); /* Beep. */
+ int (PASCAL NEAR *t_rev)(int); /* set reverse video state */
+ int (PASCAL NEAR *t_rez)(char *); /* change screen resolution */
+#if COLOR
+ int (PASCAL NEAR *t_setfor)(int); /* set forground color */
+ int (PASCAL NEAR *t_setback)(int); /* set background color */
+#endif
+#if INSDEL
+ int (PASCAL NEAR *t_insline)(int); /* insert a screen line */
+ int (PASCAL NEAR *t_delline)(int); /* delete a screen line */
+#endif
+#if WINDOW_MSWIN
+ int (PASCAL NEAR *t_sleep)(int); /* go to sleep for a while */
+ int (PASCAL NEAR *t_newscr)(SCREEN *); /* create new screen display */
+ int (PASCAL NEAR *t_delscr)(SCREEN *); /* destroy screen display */
+ int (PASCAL NEAR *t_selscr)(SCREEN *); /* select screen display */
+ int (PASCAL NEAR *t_sizscr)(SCREEN *); /* resize screen display */
+ int (PASCAL NEAR *t_topscr)(SCREEN *); /* bring screen to top */
+#endif
+} TERM;
+#else /* TERM structure, no prototyping.*/
+
+typedef struct {
+ short t_mrow; /* max number of rows allowable */
+ short t_nrow; /* current number of rows used */
+ short t_mcol; /* max Number of columns. */
+ short t_ncol; /* current Number of columns. */
+ short t_roworg; /* origin row (normally zero) */
+ short t_colorg; /* origin column (normally zero)*/
+ short t_margin; /* min margin for extended lines*/
+ short t_scrsiz; /* size of scroll region " */
+ int t_pause; /* # times thru update to pause */
+ int (PASCAL NEAR *t_open)(); /* Open terminal at the start. */
+ int (PASCAL NEAR *t_close)(); /* Close terminal at end. */
+ int (PASCAL NEAR *t_kopen)(); /* Open keyboard */
+ int (PASCAL NEAR *t_kclose)(); /* close keyboard */
+ int (PASCAL NEAR *t_getchar)(); /* Get character from keyboard. */
+ int (PASCAL NEAR *t_putchar)(); /* Put character to display. */
+ int (PASCAL NEAR *t_flush)(); /* Flush output buffers. */
+ int (PASCAL NEAR *t_move)(); /* Move the cursor, origin 0. */
+ int (PASCAL NEAR *t_eeol)(); /* Erase to end of line. */
+ int (PASCAL NEAR *t_eeop)(); /* Erase to end of page. */
+ int (PASCAL NEAR *t_clrdesk)(); /* Clear the page totally */
+ int (PASCAL NEAR *t_beep)(); /* Beep. */
+ int (PASCAL NEAR *t_rev)(); /* set reverse video state */
+ int (PASCAL NEAR *t_rez)(); /* change screen resolution */
+#if COLOR
+ int (PASCAL NEAR *t_setfor)(); /* set forground color */
+ int (PASCAL NEAR *t_setback)(); /* set background color */
+#endif
+#if INSDEL
+ int (PASCAL NEAR *t_insline)(); /* insert a screen line */
+ int (PASCAL NEAR *t_delline)(); /* delete a screen line */
+#endif
+#if WINDOW_MSWIN
+ int (PASCAL NEAR *t_sleep)(); /* go to sleep for a while */
+ int (PASCAL NEAR *t_newscr)(); /* create new screen display */
+ int (PASCAL NEAR *t_delscr)(); /* destroy screen display */
+ int (PASCAL NEAR *t_selscr)(); /* select screen display */
+ int (PASCAL NEAR *t_sizscr)(); /* resize screen display */
+ int (PASCAL NEAR *t_topscr)(); /* bring screen to top */
+#endif
+} TERM;
+#endif
+
+
+/* TEMPORARY macros for terminal I/O (to be placed in a machine
+ dependent place later) */
+
+#define TTopen (*term.t_open)
+#define TTclose (*term.t_close)
+#define TTkopen (*term.t_kopen)
+#define TTkclose (*term.t_kclose)
+#define TTgetc (*term.t_getchar)
+#define TTputc (*term.t_putchar)
+#define TTflush (*term.t_flush)
+#define TTmove (*term.t_move)
+#define TTeeol (*term.t_eeol)
+#define TTeeop (*term.t_eeop)
+#define TTclrdesk (*term.t_clrdesk)
+#define TTbeep (*term.t_beep)
+#define TTrev (*term.t_rev)
+#define TTrez (*term.t_rez)
+#if COLOR
+#define TTforg (*term.t_setfor)
+#define TTbacg (*term.t_setback)
+#endif
+
+/* Structure for the table of current key bindings */
+
+ETYPE EPOINTER {
+ int (PASCAL NEAR *fp)(); /* C routine to invoke */
+ BUFFER *buf; /* buffer to execute */
+};
+
+typedef struct {
+ short k_code; /* Key code */
+ short k_type; /* binding type (C function or EMACS buffer) */
+ ETYPE EPOINTER k_ptr; /* ptr to thing to execute */
+} KEYTAB;
+
+/* structure for the name binding table */
+
+typedef struct {
+ char *n_name; /* name of function key */
+ int (PASCAL NEAR *n_func)(); /* function name is bound to */
+} NBIND;
+
+/* The editor holds deleted text chunks in the KILL buffer. The
+ kill buffer is logically a stream of ascii characters, however
+ due to its unpredicatable size, it gets implemented as a linked
+ list of chunks. (The d_ prefix is for "deleted" text, as k_
+ was taken up by the keycode structure)
+*/
+
+typedef struct KILL {
+ struct KILL *d_next; /* link to next chunk, NULL if last */
+ char d_chunk[KBLOCK]; /* deleted text */
+} KILL;
+
+/* When emacs's command interpetor needs to get a variable's name,
+ rather than it's value, it is passed back as a VDESC variable
+ description structure. The v_num field is a index into the
+ appropriate variable table.
+*/
+
+typedef struct VDESC {
+ int v_type; /* type of variable */
+ int v_num; /* ordinal pointer to variable in list */
+ UTABLE *v_ut; /* ptr to appropriate user table if user var */
+} VDESC;
+
+/* The !WHILE directive in the execution language needs to
+ stack references to pending whiles. These are stored linked
+ to each currently open procedure via a linked list of
+ the following structure
+*/
+
+typedef struct WHBLOCK {
+ LINE *w_begin; /* ptr to !while statement */
+ LINE *w_end; /* ptr to the !endwhile statement*/
+ int w_type; /* block type */
+ struct WHBLOCK *w_next; /* next while */
+} WHBLOCK;
+
+#define BTWHILE 1
+#define BTBREAK 2
+
+/* Abbreviations are short symbols that expand to longer strings
+ when typed into a buffer with no intervening whitespace or commands.
+ This structure grows dynamically as needed.
+*/
+
+typedef struct ABBREV {
+ struct ABBREV *ab_next; /* pointer to the next abbreviation */
+ char ab_sym[MAXSYM + 1]; /* name to expand */
+ char ab_exp[1]; /* string to expand to */
+} ABBREV;
+
+/* Search definitions... */
+
+/* HICHAR - 1 is the largest character we will deal with.
+ * BMAPSIZE represents the number of bytes in the bitmap.
+ */
+#define HICHAR 256
+#define BMAPSIZE HICHAR >> 3
+
+/*
+ * Jump table structures.
+ */
+typedef struct {
+ int jump;
+ int patlen;
+ int delta[HICHAR];
+ char patrn[NPAT];
+} DELTA;
+
+#if MAGIC
+/*
+ * Defines for the metacharacters in the regular expression
+ * search routines. MCNIL and GROUP are used in both search
+ * and replace metachar-arrays.
+ */
+#define MCNIL 0 /* Like the '\0' for strings.*/
+#define JMPTABLE 1
+#define LITSTRING 2 /* Literal string.*/
+#define LITCHAR 3 /* Literal character.*/
+#define ANY 4 /* Any character but the <NL>.*/
+#define CCL 5
+#define NCCL 6
+#define BOL 7
+#define EOL 8
+#define BOWRD 9
+#define EOWRD 10
+#define GRPBEG 11 /* Signal start of group.*/
+#define GRPEND 12 /* Signal end of group.*/
+#define GROUP 13 /* String of group match.*/
+#define DITTO 14 /* Replacement with match string.*/
+
+#define CLOSURE 0x0100 /* An or-able value for a closure modifier.*/
+#define CLOSURE_1 0x0200 /* An or-able value for a closure modifier.*/
+#define ZEROONE 0x0400 /* An or-able value for a closure modifier.*/
+
+#define ALLCLOS (CLOSURE | CLOSURE_1 | ZEROONE)
+#define MASKCLO (~ALLCLOS)
+
+#define MC_ANY '.' /* 'Any' character (except newline).*/
+#define MC_CCL '[' /* Character class.*/
+#define MC_NCCL '^' /* Negate character class.*/
+#define MC_RCCL '-' /* Range in character class.*/
+#define MC_ECCL ']' /* End of character class.*/
+#define MC_BOL '^' /* Beginning of line.*/
+#define MC_EOL '$' /* End of line.*/
+#define MC_CLOSURE '*' /* Closure - zero to many characters match.*/
+#define MC_CLOSURE_1 '+' /* Closure - one to many characters match.*/
+#define MC_ZEROONE '?' /* Closure - zero to one characters match.*/
+#define MC_DITTO '&' /* Use matched string in replacement.*/
+#define MC_GRPBEG '(' /* Start of group (begun with a backslash).*/
+#define MC_GRPEND ')' /* End of group (begun with a backslash).*/
+#define MC_BOWRD '<' /* Beginning of word (begun with a backslash).*/
+#define MC_EOWRD '>' /* End of word (begun with a backslash).*/
+#define MC_ESC '\\' /* Escape - suppress meta-meaning.*/
+
+#define MAXGROUPS 10 /* 1 + maximum # of r. e. groups. */
+#define BIT(n) (1 << (n)) /* An integer with one bit set.*/
+
+/* Typedefs that define the bitmap type for searching (EBITMAP),
+ * the meta-character structure for MAGIC mode searching (MC),
+ * and the meta-character structure for MAGIC mode replacment (RMC).
+ */
+typedef char *EBITMAP;
+
+typedef struct {
+ short int mc_type;
+ union {
+ int lchar;
+ int group_no;
+ char *lstring;
+ DELTA *jmptable;
+ EBITMAP cclmap;
+ } u;
+} MC;
+
+typedef struct {
+ short int mc_type;
+ union {
+ int group_no;
+ char *rstr;
+ } u;
+} RMC;
+#endif
+
+/*
+ This is the message which should be added to any "About MicroEMACS"
+ boxes on any of the machines with window managers.
+
+
+ ------------------------------------------
+ | |
+ | MicroEMACS v4.xx |
+ | for the ............ |
+ | |
+ | Text Editor and Corrector |
+ | |
+ | written by Daniel M. Lawrence |
+ | [based on code by Dave Conroy] |
+ | |
+ | Send inquiries and donations to: |
+ | 617 New York St |
+ | Lafayette, IN 47901 |
+ | |
+ ------------------------------------------
+*/
|