-
Notifications
You must be signed in to change notification settings - Fork 308
/
lib.rs
1482 lines (1376 loc) · 54.6 KB
/
lib.rs
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
#![allow(non_camel_case_types, non_snake_case, non_upper_case_globals)]
//! This module contains all FFI declarations.
//!
//! These types and constants are generated at build time to mimic how they are
//! in C:
//!
//! - `EmacsInt`
//! - `EmacsUint`
//! - `EmacsDouble`
//! - `EMACS_INT_MAX`
//! - `EMACS_INT_SIZE`
//! - `EMACS_FLOAT_SIZE`
//! - `GCTYPEBITS`
//! - `USE_LSB_TAG`
extern crate libc;
pub mod libm;
use libc::{c_char, c_uchar, c_short, c_int, c_double, c_float, c_void, ptrdiff_t, size_t, off_t,
time_t, timespec};
include!(concat!(env!("OUT_DIR"), "/definitions.rs"));
pub type Lisp_Object = EmacsInt;
pub const Qnil: Lisp_Object = 0;
pub type char_bits = u32;
pub const CHAR_ALT: char_bits = 0x0400000;
pub const CHAR_SUPER: char_bits = 0x0800000;
pub const CHAR_HYPER: char_bits = 0x1000000;
pub const CHAR_SHIFT: char_bits = 0x2000000;
pub const CHAR_CTL: char_bits = 0x4000000;
pub const CHAR_META: char_bits = 0x8000000;
pub const CHAR_MODIFIER_MASK: char_bits = CHAR_ALT | CHAR_SUPER | CHAR_HYPER | CHAR_SHIFT |
CHAR_CTL | CHAR_META;
pub const CHARACTERBITS: char_bits = 22;
pub const PSEUDOVECTOR_FLAG: ptrdiff_t = std::isize::MAX - std::isize::MAX / 2;
pub const PSEUDOVECTOR_SIZE_BITS: ptrdiff_t = 12;
pub const PSEUDOVECTOR_SIZE_MASK: ptrdiff_t = (1 << PSEUDOVECTOR_SIZE_BITS) - 1;
pub const PSEUDOVECTOR_REST_BITS: ptrdiff_t = 12;
pub const PSEUDOVECTOR_REST_MASK: ptrdiff_t = (((1 << PSEUDOVECTOR_REST_BITS) - 1) <<
PSEUDOVECTOR_SIZE_BITS);
pub const PSEUDOVECTOR_AREA_BITS: ptrdiff_t = PSEUDOVECTOR_SIZE_BITS + PSEUDOVECTOR_REST_BITS;
pub const PVEC_TYPE_MASK: ptrdiff_t = 0x3f << PSEUDOVECTOR_AREA_BITS;
// Number of bits in a Lisp_Object tag.
pub const VALBITS: EmacsInt = EMACS_INT_SIZE * 8 - GCTYPEBITS;
pub const INTTYPEBITS: EmacsInt = GCTYPEBITS - 1;
pub const FIXNUM_BITS: EmacsInt = VALBITS + 1;
pub const VAL_MAX: EmacsInt = EMACS_INT_MAX >> (GCTYPEBITS - 1);
pub const VALMASK: EmacsInt = [VAL_MAX, -(1 << GCTYPEBITS)][USE_LSB_TAG as usize];
pub const INTMASK: EmacsInt = (EMACS_INT_MAX >> (INTTYPEBITS - 1));
// Largest and smallest numbers that can be represented as fixnums in
// Emacs lisp.
pub const MOST_POSITIVE_FIXNUM: EmacsInt = EMACS_INT_MAX >> INTTYPEBITS;
pub const MOST_NEGATIVE_FIXNUM: EmacsInt = (-1 - MOST_POSITIVE_FIXNUM);
/// Bit pattern used in the least significant bits of a lisp object,
/// to denote its type.
#[repr(u8)]
#[derive(PartialEq, Eq)]
#[derive(Copy, Clone, Debug)]
pub enum Lisp_Type {
// Symbol. XSYMBOL (object) points to a struct Lisp_Symbol.
Lisp_Symbol = 0,
// Miscellaneous. XMISC (object) points to a union Lisp_Misc,
// whose first member indicates the subtype.
Lisp_Misc = 1,
// Integer. XINT (obj) is the integer value.
Lisp_Int0 = 2,
Lisp_Int1 = 3 + (USE_LSB_TAG as usize as u8) * 3, // 3 | 6
// String. XSTRING (object) points to a struct Lisp_String.
// The length of the string, and its contents, are stored therein.
Lisp_String = 4,
// Vector of Lisp objects, or something resembling it.
// XVECTOR (object) points to a struct Lisp_Vector, which contains
// the size and contents. The size field also contains the type
// information, if it's not a real vector object.
Lisp_Vectorlike = 5,
// Cons. XCONS (object) points to a struct Lisp_Cons.
Lisp_Cons = 6 - (USE_LSB_TAG as usize as u8) * 3, // 6 | 3
Lisp_Float = 7,
}
#[repr(C)]
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
pub enum PseudovecType {
PVEC_NORMAL_VECTOR = 0,
PVEC_FREE,
PVEC_PROCESS,
PVEC_FRAME,
PVEC_WINDOW,
PVEC_BOOL_VECTOR,
PVEC_BUFFER,
PVEC_HASH_TABLE,
PVEC_TERMINAL,
PVEC_WINDOW_CONFIGURATION,
PVEC_SUBR,
PVEC_OTHER,
PVEC_XWIDGET,
PVEC_XWIDGET_VIEW,
PVEC_THREAD,
PVEC_MUTEX,
PVEC_CONDVAR,
PVEC_MODULE_FUNCTION,
/* These should be last, check internal_equal to see why. */
PVEC_COMPILED,
PVEC_CHAR_TABLE,
PVEC_SUB_CHAR_TABLE,
PVEC_RECORD,
PVEC_FONT, /* Should be last because it's used for range checking. */
}
#[repr(C)]
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
pub enum TextCursorKinds {
DEFAULT_CURSOR = -2,
NO_CURSOR = -1,
FILLED_BOX_CURSOR,
HOLLOW_BOX_CURSOR,
BAR_CURSOR,
HBAR_CURSOR,
}
pub type bits_word = size_t;
/// Representation of an Emacs Lisp function symbol.
#[repr(C)]
pub struct Lisp_Subr {
pub header: Lisp_Vectorlike_Header,
/// This is the function pointer that will be called when the user invokes
/// the Emacs Lisp function. Also, this field is actually an union in C.
pub function: *const c_void,
/// The minimum number of arguments that can be passed to the Emacs Lisp
/// function.
pub min_args: c_short,
/// The maximum number of arguments that can be passed to te Emacs Lisp
/// function.
pub max_args: c_short,
/// The name of the function in Emacs Lisp.
pub symbol_name: *const c_char,
/// The interactive specification. This may be a normal prompt
/// string, such as `"bBuffer: "` or an elisp form as a string.
/// If the function is not interactive, this should be a null
/// pointer.
pub intspec: *const c_char,
// TODO: Change this to EMACS_INT
//
// If you wan't to give it a try and solve this you should see this commit:
// https://github.com/Wilfred/remacs/commit/c5461d03a411ff5c6f43885a0a9030e8a94bbc2e
/// The docstring of the Emacs Lisp function.
pub doc: *const c_char,
}
// In order to use `lazy_static!` with LispSubr, it must be Sync. Raw
// pointers are not Sync, but it isn't a problem to define Sync if we
// never mutate LispSubr values. If we do, we will need to create
// these objects at runtime, perhaps using forget().
//
// Based on http://stackoverflow.com/a/28116557/509706
unsafe impl Sync for Lisp_Subr {}
/// Represents a string value in elisp
#[repr(C)]
pub struct Lisp_String {
pub size: ptrdiff_t,
pub size_byte: ptrdiff_t,
// TODO: Use correct definition for this.
//
// Maybe use rust nightly unions?
pub intervals: *mut c_void, // @TODO implement
pub data: *mut c_char,
}
#[repr(C)]
pub union SymbolUnion {
pub value: Lisp_Object,
pub alias: *mut Lisp_Symbol,
pub blv: *mut c_void, // @TODO implement Lisp_Buffer_Local_Value
pub fwd: *mut c_void, // @TODO implement Lisp_Fwd
}
/// This struct has 4 bytes of padding, representing the bitfield that
/// lives at the top of a Lisp_Symbol. The first 10 bits of this field are
/// used.
#[repr(C)]
pub struct Lisp_Symbol {
pub symbol_bitfield: u32,
pub name: Lisp_Object,
pub val: SymbolUnion,
pub function: Lisp_Object,
pub plist: Lisp_Object,
pub next: *mut Lisp_Symbol,
}
/* The only field contains various pieces of information:
- The MSB (ARRAY_MARK_FLAG) holds the gcmarkbit.
- The next bit (PSEUDOVECTOR_FLAG) indicates whether this is a plain
vector (0) or a pseudovector (1).
- If PSEUDOVECTOR_FLAG is 0, the rest holds the size (number
of slots) of the vector.
- If PSEUDOVECTOR_FLAG is 1, the rest is subdivided into three fields:
- a) pseudovector subtype held in PVEC_TYPE_MASK field;
- b) number of Lisp_Objects slots at the beginning of the object
held in PSEUDOVECTOR_SIZE_MASK field. These objects are always
traced by the GC;
- c) size of the rest fields held in PSEUDOVECTOR_REST_MASK and
measured in word_size units. Rest fields may also include
Lisp_Objects, but these objects usually needs some special treatment
during GC.
There are some exceptions. For PVEC_FREE, b) is always zero. For
PVEC_BOOL_VECTOR and PVEC_SUBR, both b) and c) are always zero.
Current layout limits the pseudovectors to 63 PVEC_xxx subtypes,
4095 Lisp_Objects in GC-ed area and 4095 word-sized other slots. */
#[repr(C)]
pub struct Lisp_Vectorlike_Header {
pub size: ptrdiff_t,
}
#[repr(C)]
pub struct Lisp_Vectorlike {
pub header: Lisp_Vectorlike_Header,
// shouldn't look at the contents without knowing the structure...
}
#[repr(C)]
pub struct Lisp_Vector {
pub header: Lisp_Vectorlike_Header,
// actually any number of items... not sure how to express this
pub contents: [Lisp_Object; 1],
}
#[repr(C)]
pub struct Lisp_Bool_Vector {
pub _header: Lisp_Vectorlike_Header,
pub size: EmacsInt,
// actually any number of items again
pub _data: [bits_word; 1],
}
// This is the set of data types that share a common structure.
// The first member of the structure is a type code from this set.
// The enum values are arbitrary, but we'll use large numbers to make it
// more likely that we'll spot the error if a random word in memory is
// mistakenly interpreted as a Lisp_Misc.
#[repr(u16)]
#[derive(PartialEq, Eq, Copy, Clone, Debug)]
pub enum Lisp_Misc_Type {
Free = 0x5eab,
Marker,
Overlay,
SaveValue,
Finalizer,
}
// Supertype of all Misc types.
#[repr(C)]
pub struct Lisp_Misc_Any {
pub ty: Lisp_Misc_Type,
// This is actually a GC marker bit plus 15 bits of padding, but
// we don't care right now.
padding: u16,
}
// TODO: write a docstring based on the docs in lisp.h.
#[repr(C)]
pub struct Lisp_Marker {
pub ty: Lisp_Misc_Type,
// GC mark bit, 13 bits spacer, needs_adjustment flag,
// insertion_type flag.
padding: u16,
// TODO: define a proper buffer struct.
pub buffer: *const Lisp_Buffer,
pub next: *const Lisp_Marker,
pub charpos: ptrdiff_t,
pub bytepos: ptrdiff_t,
}
/// Represents the cursor position within an Emacs window. For
/// documentation see stuct cursor_pos in window.h.
#[repr(C)]
pub struct CursorPos {
// Pixel position. These are always window relative.
x: c_int,
y: c_int,
// Glyph matrix position.
hpos: c_int,
vpos: c_int,
}
/// Represents an Emacs window. For documentation see struct window in
/// window.h.
#[repr(C)]
pub struct Lisp_Window {
pub header: Lisp_Vectorlike_Header,
pub frame: Lisp_Object,
pub next: Lisp_Object,
pub prev: Lisp_Object,
pub parent: Lisp_Object,
pub normal_lines: Lisp_Object,
pub normal_cols: Lisp_Object,
pub new_total: Lisp_Object,
pub new_normal: Lisp_Object,
pub new_pixel: Lisp_Object,
pub contents: Lisp_Object,
pub start: Lisp_Object,
pub pointm: Lisp_Object,
pub old_pointm: Lisp_Object,
pub temslot: Lisp_Object,
pub vertical_scroll_bar: Lisp_Object,
pub vertical_scroll_bar_type: Lisp_Object,
pub horizontal_scroll_bar: Lisp_Object,
pub horizontal_scroll_bar_type: Lisp_Object,
pub display_table: Lisp_Object,
pub dedicated: Lisp_Object,
pub redisplay_end_trigger: Lisp_Object,
pub combination_limit: Lisp_Object,
pub window_parameters: Lisp_Object,
pub current_matrix: *mut c_void,
pub desired_matrix: *mut c_void,
pub prev_buffers: Lisp_Object,
pub next_buffers: Lisp_Object,
pub use_time: EmacsInt,
pub sequence_number: EmacsInt,
pub pixel_left: c_int,
pub pixel_top: c_int,
pub left_col: c_int,
pub top_line: c_int,
pub pixel_width: c_int,
pub pixel_height: c_int,
pub pixel_width_before_size_change: c_int,
pub pixel_height_before_size_change: c_int,
pub total_cols: c_int,
pub total_lines: c_int,
pub hscroll: ptrdiff_t,
pub min_hscroll: ptrdiff_t,
pub hscroll_whole: ptrdiff_t,
pub last_modified: EmacsInt,
pub last_overlay_modified: EmacsInt,
pub last_point: ptrdiff_t,
pub base_line_number: ptrdiff_t,
pub base_line_pos: ptrdiff_t,
pub column_number_displayed: ptrdiff_t,
pub nrows_scale_factor: c_int,
pub ncols_scale_factor: c_int,
pub cursor: CursorPos,
pub phys_cursor: CursorPos,
pub output_cursor: CursorPos,
pub last_cursor_vpos: c_int,
pub phys_cursor_type: TextCursorKinds,
pub phys_cursor_width: c_int,
pub phys_cursor_ascent: c_int,
pub phys_cursor_height: c_int,
pub left_fringe_width: c_int,
pub right_fringe_width: c_int,
pub left_margin_cols: c_int,
pub right_margin_cols: c_int,
pub scroll_bar_width: c_int,
pub scroll_bar_height: c_int,
pub mode_line_height: c_int,
pub header_line_height: c_int,
pub window_end_pos: ptrdiff_t,
pub window_end_vpos: c_int,
// XXX: in Emacs, a bitfield of 16 booleans
pub flags: u16,
pub vscroll: c_int,
pub window_end_bytepos: ptrdiff_t,
}
/// Represents an Emacs buffer. For documentation see struct buffer in
/// buffer.h.
#[repr(C)]
pub struct Lisp_Buffer {
pub header: Lisp_Vectorlike_Header,
pub name: Lisp_Object,
pub filename: Lisp_Object,
pub directory: Lisp_Object,
pub backed_up: Lisp_Object,
pub save_length: Lisp_Object,
pub auto_save_file_name: Lisp_Object,
pub read_only: Lisp_Object,
pub mark: Lisp_Object,
pub local_var_alist: Lisp_Object,
pub major_mode: Lisp_Object,
pub mode_name: Lisp_Object,
pub mode_line_format: Lisp_Object,
pub header_line_format: Lisp_Object,
pub keymap: Lisp_Object,
pub abbrev_table: Lisp_Object,
pub syntax_table: Lisp_Object,
pub category_table: Lisp_Object,
pub case_fold_search: Lisp_Object,
pub tab_width: Lisp_Object,
pub fill_column: Lisp_Object,
pub left_margin: Lisp_Object,
pub auto_fill_function: Lisp_Object,
pub downcase_table: Lisp_Object,
pub upcase_table: Lisp_Object,
pub case_canon_table: Lisp_Object,
pub case_eqv_table: Lisp_Object,
pub truncate_lines: Lisp_Object,
pub word_wrap: Lisp_Object,
pub ctl_arrow: Lisp_Object,
pub bidi_display_reordering: Lisp_Object,
pub bidi_paragraph_direction: Lisp_Object,
pub selective_display: Lisp_Object,
pub selective_display_ellipses: Lisp_Object,
pub minor_modes: Lisp_Object,
pub overwrite_mode: Lisp_Object,
pub abbrev_mode: Lisp_Object,
pub display_table: Lisp_Object,
pub mark_active: Lisp_Object,
pub enable_multibyte_characters: Lisp_Object,
pub buffer_file_coding_system: Lisp_Object,
pub file_format: Lisp_Object,
pub auto_save_file_format: Lisp_Object,
pub cache_long_scans: Lisp_Object,
pub width_table: Lisp_Object,
pub pt_marker: Lisp_Object,
pub begv_marker: Lisp_Object,
pub zv_marker: Lisp_Object,
pub point_before_scroll: Lisp_Object,
pub file_truename: Lisp_Object,
pub invisibility_spec: Lisp_Object,
pub last_selected_window: Lisp_Object,
pub display_count: Lisp_Object,
pub left_margin_cols: Lisp_Object,
pub right_margin_cols: Lisp_Object,
pub left_fringe_width: Lisp_Object,
pub right_fringe_width: Lisp_Object,
pub fringes_outside_margins: Lisp_Object,
pub scroll_bar_width: Lisp_Object,
pub scroll_bar_height: Lisp_Object,
pub vertical_scroll_bar_type: Lisp_Object,
pub horizontal_scroll_bar_type: Lisp_Object,
pub indicate_empty_lines: Lisp_Object,
pub indicate_buffer_boundaries: Lisp_Object,
pub fringe_indicator_alist: Lisp_Object,
pub fringe_cursor_alist: Lisp_Object,
pub display_time: Lisp_Object,
pub scroll_up_aggressively: Lisp_Object,
pub scroll_down_aggressively: Lisp_Object,
pub cursor_type: Lisp_Object,
pub extra_line_spacing: Lisp_Object,
pub cursor_in_non_selected_windows: Lisp_Object,
pub own_text: Lisp_Buffer_Text,
pub text: *mut Lisp_Buffer_Text,
pub next: *mut Lisp_Buffer,
pub pt: ptrdiff_t,
pub pt_byte: ptrdiff_t,
pub begv: ptrdiff_t,
pub begv_byte: ptrdiff_t,
pub zv: ptrdiff_t,
pub zv_byte: ptrdiff_t,
pub base_buffer: *mut Lisp_Buffer,
pub indirections: c_int,
pub window_count: c_int,
pub local_flags: [c_uchar; 50],
pub modtime: timespec,
pub modtime_size: off_t,
pub auto_save_modified: EmacsInt,
pub display_error_modiff: EmacsInt,
pub auto_save_failure_time: time_t,
pub last_window_start: ptrdiff_t,
pub newline_cache: *mut c_void,
pub width_run_cache: *mut c_void,
pub bidi_paragraph_cache: *mut c_void,
// XXX in C, bitfield with two bools
pub flags: u8,
pub overlays_before: *mut c_void,
pub overlays_after: *mut c_void,
pub overlay_center: ptrdiff_t,
pub undo_list: Lisp_Object,
}
/// Represents text contents of an Emacs buffer. For documentation see
/// struct buffer_text in buffer.h.
#[repr(C)]
pub struct Lisp_Buffer_Text {
pub beg: *mut c_uchar,
pub gpt: ptrdiff_t,
pub z: ptrdiff_t,
pub gpt_byte: ptrdiff_t,
pub z_byte: ptrdiff_t,
pub gap_size: ptrdiff_t,
pub modiff: EmacsInt,
pub chars_modiff: EmacsInt,
pub save_modiff: EmacsInt,
pub overlay_modiff: EmacsInt,
pub compact: EmacsInt,
pub beg_unchanged: ptrdiff_t,
pub end_unchanged: ptrdiff_t,
pub unchanged_modified: EmacsInt,
pub overlay_unchanged_modified: EmacsInt,
// until we define struct interval
pub intervals: *mut c_void,
pub markers: *mut Lisp_Marker,
// XXX: in Emacs, a bitfield of 2 booleans
pub flags: u8,
}
/// Represents a floating point value in elisp, or GC bookkeeping for
/// floats.
///
/// # Porting from C
///
/// `Lisp_Float` in C uses a union between a `double` and a
/// pointer. We assume a double, as that's the common case, and
/// require callers to transmute to a `LispFloatChain` if they need
/// the pointer.
#[repr(C)]
pub struct Lisp_Float {
pub data: [u8; EMACS_FLOAT_SIZE as usize],
}
/// Represents a cons cell, or GC bookkeeping for cons cells.
///
/// A cons cell is pair of two pointers, used to build linked lists in
/// lisp.
///
/// # C Porting Notes
///
/// The equivalent C struct is `Lisp_Cons`. Note that the second field
/// may be used as the cdr or GC bookkeeping.
// TODO: this should be aligned to 8 bytes.
#[repr(C)]
pub struct Lisp_Cons {
/// Car of this cons cell.
pub car: Lisp_Object,
/// Cdr of this cons cell, or the chain used for the free list.
pub cdr: Lisp_Object,
}
/// Type of comparison for `internal_equal()`.
#[repr(C)]
pub enum EqualKind {
NoQuit,
Plain,
IncludingProperties,
}
#[repr(C)]
pub struct re_registers {
pub num_regs: libc::c_uint,
pub start: *mut c_void, // TODO
pub end: *mut c_void, // TODO
}
#[repr(C)]
pub struct thread_state {
pub header: Lisp_Vectorlike_Header,
/// The buffer in which the last search was performed, or
/// Qt if the last search was done in a string;
/// Qnil if no searching has been done yet.
pub m_last_thing_searched: Lisp_Object,
pub m_saved_last_thing_searched: Lisp_Object,
/// The thread's name.
pub name: Lisp_Object,
/// The thread's function.
pub function: Lisp_Object,
/// If non-nil, this thread has been signaled.
pub error_symbol: Lisp_Object,
pub error_data: Lisp_Object,
/// If we are waiting for some event, this holds the object we are
/// waiting on.
pub event_object: Lisp_Object,
/// m_stack_bottom must be the first non-Lisp field.
/// An address near the bottom of the stack.
/// Tells GC how to save a copy of the stack.
pub m_stack_bottom: *mut c_char,
/// An address near the top of the stack.
pub stack_top: *mut c_char,
pub m_catchlist: *mut c_void, // TODO
/// Chain of condition handlers currently in effect.
/// The elements of this chain are contained in the stack frames
/// of Fcondition_case and internal_condition_case.
/// When an error is signaled (by calling Fsignal),
/// this chain is searched for an element that applies.
pub m_handlerlist: *mut c_void, // TODO
pub m_handlerlist_list: *mut c_void, // TODO
/// Current number of specbindings allocated in specpdl.
pub m_specpdl_size: ptrdiff_t,
/// Pointer to beginning of specpdl.
pub m_specpdl: *mut c_void, // TODO
/// Pointer to first unused element in specpdl.
pub m_specpdl_ptr: *mut c_void, // TODO
/// Depth in Lisp evaluations and function calls.
pub m_lisp_eval_depth: EmacsInt,
/// This points to the current buffer.
pub m_current_buffer: *mut c_void,
/// Every call to re_match, etc., must pass &search_regs as the regs
/// argument unless you can show it is unnecessary (i.e., if re_match
/// is certainly going to be called again before region-around-match
/// can be called).
/// Since the registers are now dynamically allocated, we need to make
/// sure not to refer to the Nth register before checking that it has
/// been allocated by checking search_regs.num_regs.
/// The regex code keeps track of whether it has allocated the search
/// buffer using bits in the re_pattern_buffer. This means that whenever
/// you compile a new pattern, it completely forgets whether it has
/// allocated any registers, and will allocate new registers the next
/// time you call a searching or matching function. Therefore, we need
/// to call re_set_registers after compiling a new pattern or after
/// setting the match registers, so that the regex functions will be
/// able to free or re-allocate it properly.
pub m_search_regs: re_registers,
/// If non-zero the match data have been saved in saved_search_regs
/// during the execution of a sentinel or filter. */
pub m_search_regs_saved: bool,
pub m_saved_search_regs: re_registers,
/// This is the string or buffer in which we
/// are matching. It is used for looking up syntax properties.
/// If the value is a Lisp string object, we are matching text in that
/// string; if it's nil, we are matching text in the current buffer; if
/// it's t, we are matching text in a C string.
pub m_re_match_object: Lisp_Object,
/// This member is different from waiting_for_input.
/// It is used to communicate to a lisp process-filter/sentinel (via the
/// function Fwaiting_for_user_input_p) whether Emacs was waiting
/// for user-input when that process-filter was called.
/// waiting_for_input cannot be used as that is by definition 0 when
/// lisp code is being evalled.
/// This is also used in record_asynch_buffer_change.
/// For that purpose, this must be 0
/// when not inside wait_reading_process_output.
pub m_waiting_for_user_input_p: c_int,
/// True while doing kbd input.
pub m_waiting_for_input: bool,
// TODO: this struct is incomplete. We're missing thread_id,
// thread_condvar, wait_condvar, not_holding_lock, and
// next_thread.
}
/// Lisp_Char_Table
#[repr(C)]
#[allow(dead_code)]
enum ChartabSize {
Bits0 = 6,
Bits1 = 4,
Bits2 = 5,
Bits3 = 7,
}
#[repr(C)]
pub struct Lisp_Char_Table {
/// HEADER.SIZE is the vector's size field, which also holds the
/// pseudovector type information. It holds the size, too.
/// The size counts the defalt, parent, purpose, ascii,
/// contents, and extras slots.
pub header: Lisp_Vectorlike_Header,
/// This holds a default value,
/// which is used whenever the value for a specific character is nil.
pub default: Lisp_Object,
/// This points to another char table, which we inherit from when the
/// value for a specific character is nil. The `defalt' slot takes
/// precedence over this.
pub parent: Lisp_Object,
/// This is a symbol which says what kind of use this char-table is
/// meant for.
pub purpose: Lisp_Object,
/// The bottom sub char-table for characters of the range 0..127. It
/// is nil if none of ASCII character has a specific value.
pub ascii: Lisp_Object,
pub contents: [Lisp_Object; 1 << ChartabSize::Bits0 as u8],
/// These hold additional data. It is a vector.
// actually any number of items
pub extras: [Lisp_Object; 1],
}
/// Represents the global state of the editor.
///
/// This has been factored out to a single struct in C Emacs to help
/// with future threading support.
#[repr(C)]
pub struct emacs_globals {
pub f_Vafter_change_functions: Lisp_Object,
pub f_Vafter_init_time: Lisp_Object,
pub f_Vafter_insert_file_functions: Lisp_Object,
pub f_Vafter_load_alist: Lisp_Object,
pub f_Valternate_fontname_alist: Lisp_Object,
pub f_Vauto_composition_function: Lisp_Object,
pub f_Vauto_composition_mode: Lisp_Object,
pub f_Vauto_fill_chars: Lisp_Object,
pub f_Vauto_resize_tool_bars: Lisp_Object,
pub f_Vauto_save_include_big_deletions: Lisp_Object,
pub f_Vauto_save_list_file_name: Lisp_Object,
pub f_Vauto_save_timeout: Lisp_Object,
pub f_Vauto_save_visited_file_name: Lisp_Object,
pub f_Vbefore_change_functions: Lisp_Object,
pub f_Vbefore_init_time: Lisp_Object,
pub f_Vblink_cursor_alist: Lisp_Object,
pub f_Vbuffer_access_fontified_property: Lisp_Object,
pub f_Vbuffer_access_fontify_functions: Lisp_Object,
pub f_Vbuffer_list_update_hook: Lisp_Object,
pub f_Vbuild_files: Lisp_Object,
pub f_Vbyte_boolean_vars: Lisp_Object,
pub f_Vbyte_code_meter: Lisp_Object,
pub f_Vbytecomp_version_regexp: Lisp_Object,
pub f_Vcairo_version_string: Lisp_Object,
pub f_Vchange_major_mode_hook: Lisp_Object,
pub f_Vchar_code_property_alist: Lisp_Object,
pub f_Vchar_property_alias_alist: Lisp_Object,
pub f_Vchar_script_table: Lisp_Object,
pub f_Vchar_width_table: Lisp_Object,
pub f_Vcharset_list: Lisp_Object,
pub f_Vcharset_map_path: Lisp_Object,
pub f_Vcharset_revision_table: Lisp_Object,
pub f_Vcode_conversion_map_vector: Lisp_Object,
pub f_Vcoding_category_list: Lisp_Object,
pub f_Vcoding_system_alist: Lisp_Object,
pub f_Vcoding_system_for_read: Lisp_Object,
pub f_Vcoding_system_for_write: Lisp_Object,
pub f_Vcoding_system_list: Lisp_Object,
pub f_Vcombine_after_change_calls: Lisp_Object,
pub f_Vcommand_debug_status: Lisp_Object,
pub f_Vcommand_error_function: Lisp_Object,
pub f_Vcommand_history: Lisp_Object,
pub f_Vcommand_line_args: Lisp_Object,
pub f_Vcompletion_ignored_extensions: Lisp_Object,
pub f_Vcompletion_regexp_list: Lisp_Object,
pub f_Vcompose_chars_after_function: Lisp_Object,
pub f_Vcomposition_function_table: Lisp_Object,
pub f_Vconfigure_info_directory: Lisp_Object,
pub f_Vcurrent_iso639_language: Lisp_Object,
pub f_Vcurrent_load_list: Lisp_Object,
pub f_Vcurrent_prefix_arg: Lisp_Object,
pub f_Vdata_directory: Lisp_Object,
pub f_Vdbus_compiled_version: Lisp_Object,
pub f_Vdbus_debug: Lisp_Object,
pub f_Vdbus_message_type_error: Lisp_Object,
pub f_Vdbus_message_type_invalid: Lisp_Object,
pub f_Vdbus_message_type_method_call: Lisp_Object,
pub f_Vdbus_message_type_method_return: Lisp_Object,
pub f_Vdbus_message_type_signal: Lisp_Object,
pub f_Vdbus_registered_objects_table: Lisp_Object,
pub f_Vdbus_runtime_version: Lisp_Object,
pub f_Vdeactivate_mark: Lisp_Object,
pub f_Vdebug_ignored_errors: Lisp_Object,
pub f_Vdebug_on_error: Lisp_Object,
pub f_Vdebug_on_event: Lisp_Object,
pub f_Vdebug_on_message: Lisp_Object,
pub f_Vdebug_on_signal: Lisp_Object,
pub f_Vdebugger: Lisp_Object,
pub f_Vdefault_file_name_coding_system: Lisp_Object,
pub f_Vdefault_frame_alist: Lisp_Object,
pub f_Vdefault_frame_scroll_bars: Lisp_Object,
pub f_Vdefault_process_coding_system: Lisp_Object,
pub f_Vdefault_text_properties: Lisp_Object,
pub f_Vdeferred_action_function: Lisp_Object,
pub f_Vdeferred_action_list: Lisp_Object,
pub f_Vdefine_key_rebound_commands: Lisp_Object,
pub f_Vdelayed_warnings_list: Lisp_Object,
pub f_Vdelete_frame_functions: Lisp_Object,
pub f_Vdelete_terminal_functions: Lisp_Object,
pub f_Vdisable_point_adjustment: Lisp_Object,
pub f_Vdisplay_pixels_per_inch: Lisp_Object,
pub f_Vdoc_directory: Lisp_Object,
pub f_Vdoc_file_name: Lisp_Object,
pub f_Vdouble_click_time: Lisp_Object,
pub f_Vdynamic_library_alist: Lisp_Object,
pub f_Vecho_keystrokes: Lisp_Object,
pub f_Vemacs_copyright: Lisp_Object,
pub f_Vemacs_version: Lisp_Object,
pub f_Vemulation_mode_map_alists: Lisp_Object,
pub f_Venable_character_translation: Lisp_Object,
pub f_Venable_disabled_menus_and_buttons: Lisp_Object,
pub f_Veval_buffer_list: Lisp_Object,
pub f_Vexec_directory: Lisp_Object,
pub f_Vexec_path: Lisp_Object,
pub f_Vexec_suffixes: Lisp_Object,
pub f_Vexecuting_kbd_macro: Lisp_Object,
pub f_Vface_default_stipple: Lisp_Object,
pub f_Vface_font_rescale_alist: Lisp_Object,
pub f_Vface_ignored_fonts: Lisp_Object,
pub f_Vface_new_frame_defaults: Lisp_Object,
pub f_Vface_remapping_alist: Lisp_Object,
pub f_Vfeatures: Lisp_Object,
pub f_Vfile_coding_system_alist: Lisp_Object,
pub f_Vfile_name_coding_system: Lisp_Object,
pub f_Vfile_name_handler_alist: Lisp_Object,
pub f_Vfind_word_boundary_function_table: Lisp_Object,
pub f_Vfirst_change_hook: Lisp_Object,
pub f_Vfloat_output_format: Lisp_Object,
pub f_Vfocus_in_hook: Lisp_Object,
pub f_Vfocus_out_hook: Lisp_Object,
pub f_Vfont_ccl_encoder_alist: Lisp_Object,
pub f_Vfont_encoding_alist: Lisp_Object,
pub f_Vfont_encoding_charset_alist: Lisp_Object,
pub f_Vfont_log: Lisp_Object,
pub f_Vfont_slant_table: Lisp_Object,
pub f_Vfont_weight_table: Lisp_Object,
pub f_Vfont_width_table: Lisp_Object,
pub f_Vfontification_functions: Lisp_Object,
pub f_Vfontset_alias_alist: Lisp_Object,
pub f_Vframe_alpha_lower_limit: Lisp_Object,
pub f_Vframe_title_format: Lisp_Object,
pub f_Vfringe_bitmaps: Lisp_Object,
pub f_Vfunction_key_map: Lisp_Object,
pub f_Vgc_cons_percentage: Lisp_Object,
pub f_Vgc_elapsed: Lisp_Object,
pub f_Vglobal_disable_point_adjustment: Lisp_Object,
pub f_Vglobal_mode_string: Lisp_Object,
pub f_Vglyph_table: Lisp_Object,
pub f_Vglyphless_char_display: Lisp_Object,
pub f_Vgtk_version_string: Lisp_Object,
pub f_Vhelp_char: Lisp_Object,
pub f_Vhelp_event_list: Lisp_Object,
pub f_Vhelp_form: Lisp_Object,
pub f_Vhistory_add_new_input: Lisp_Object,
pub f_Vhistory_length: Lisp_Object,
pub f_Vhourglass_delay: Lisp_Object,
pub f_Vhscroll_step: Lisp_Object,
pub f_Vicon_title_format: Lisp_Object,
pub f_Vignore_relative_composition: Lisp_Object,
pub f_Vimage_cache_eviction_delay: Lisp_Object,
pub f_Vimage_types: Lisp_Object,
pub f_Vinhibit_changing_match_data: Lisp_Object,
pub f_Vinhibit_debugger: Lisp_Object,
pub f_Vinhibit_field_text_motion: Lisp_Object,
pub f_Vinhibit_file_name_handlers: Lisp_Object,
pub f_Vinhibit_file_name_operation: Lisp_Object,
pub f_Vinhibit_point_motion_hooks: Lisp_Object,
pub f_Vinhibit_quit: Lisp_Object,
pub f_Vinhibit_read_only: Lisp_Object,
pub f_Vinhibit_redisplay: Lisp_Object,
pub f_Vinitial_environment: Lisp_Object,
pub f_Vinitial_window_system: Lisp_Object,
pub f_Vinput_method_function: Lisp_Object,
pub f_Vinput_method_previous_message: Lisp_Object,
pub f_Vinstallation_directory: Lisp_Object,
pub f_Vinternal__top_level_message: Lisp_Object,
pub f_Vinternal_interpreter_environment: Lisp_Object,
pub f_Vinvocation_directory: Lisp_Object,
pub f_Vinvocation_name: Lisp_Object,
pub f_Vkbd_macro_termination_hook: Lisp_Object,
pub f_Vkey_translation_map: Lisp_Object,
pub f_Vkill_buffer_query_functions: Lisp_Object,
pub f_Vkill_emacs_hook: Lisp_Object,
pub f_Vlast_code_conversion_error: Lisp_Object,
pub f_Vlast_coding_system_used: Lisp_Object,
pub f_Vlast_event_frame: Lisp_Object,
pub f_Vlatin_extra_code_table: Lisp_Object,
pub f_Vlexical_binding: Lisp_Object,
pub f_Vline_number_display_limit: Lisp_Object,
pub f_Vline_prefix: Lisp_Object,
pub f_Vload_file_name: Lisp_Object,
pub f_Vload_file_rep_suffixes: Lisp_Object,
pub f_Vload_history: Lisp_Object,
pub f_Vload_path: Lisp_Object,
pub f_Vload_read_function: Lisp_Object,
pub f_Vload_source_file_function: Lisp_Object,
pub f_Vload_suffixes: Lisp_Object,
pub f_Vlocale_coding_system: Lisp_Object,
pub f_Vlucid_menu_bar_dirty_flag: Lisp_Object,
pub f_Vmake_pointer_invisible: Lisp_Object,
pub f_Vmark_even_if_inactive: Lisp_Object,
pub f_Vmax_image_size: Lisp_Object,
pub f_Vmax_mini_window_height: Lisp_Object,
pub f_Vmemory_full: Lisp_Object,
pub f_Vmemory_signal_data: Lisp_Object,
pub f_Vmenu_bar_final_items: Lisp_Object,
pub f_Vmenu_bar_mode: Lisp_Object,
pub f_Vmenu_bar_update_hook: Lisp_Object,
pub f_Vmenu_updating_frame: Lisp_Object,
pub f_Vmessage_log_max: Lisp_Object,
pub f_Vminibuf_scroll_window: Lisp_Object,
pub f_Vminibuffer_completing_file_name: Lisp_Object,
pub f_Vminibuffer_completion_confirm: Lisp_Object,
pub f_Vminibuffer_completion_predicate: Lisp_Object,
pub f_Vminibuffer_completion_table: Lisp_Object,
pub f_Vminibuffer_exit_hook: Lisp_Object,
pub f_Vminibuffer_help_form: Lisp_Object,
pub f_Vminibuffer_history_position: Lisp_Object,
pub f_Vminibuffer_history_variable: Lisp_Object,
pub f_Vminibuffer_local_map: Lisp_Object,
pub f_Vminibuffer_local_ns_map: Lisp_Object,
pub f_Vminibuffer_message_timeout: Lisp_Object,
pub f_Vminibuffer_prompt_properties: Lisp_Object,
pub f_Vminibuffer_setup_hook: Lisp_Object,
pub f_Vminor_mode_map_alist: Lisp_Object,
pub f_Vminor_mode_overriding_map_alist: Lisp_Object,
pub f_Vmodule_file_suffix: Lisp_Object,
pub f_Vmost_negative_fixnum: Lisp_Object,
pub f_Vmost_positive_fixnum: Lisp_Object,
pub f_Vmotif_version_string: Lisp_Object,
pub f_Vmouse_autoselect_window: Lisp_Object,
pub f_Vmouse_highlight: Lisp_Object,
pub f_Vmouse_leave_buffer_hook: Lisp_Object,
pub f_Vmouse_position_function: Lisp_Object,
pub f_Vnetwork_coding_system_alist: Lisp_Object,
pub f_Vnobreak_char_display: Lisp_Object,
pub f_Vobarray: Lisp_Object,
pub f_Vold_style_backquotes: Lisp_Object,
pub f_Voperating_system_release: Lisp_Object,
pub f_Votf_script_alist: Lisp_Object,
pub f_Vother_window_scroll_buffer: Lisp_Object,
pub f_Voverflow_newline_into_fringe: Lisp_Object,
pub f_Voverlay_arrow_position: Lisp_Object,
pub f_Voverlay_arrow_string: Lisp_Object,
pub f_Voverlay_arrow_variable_list: Lisp_Object,
pub f_Voverriding_local_map: Lisp_Object,
pub f_Voverriding_local_map_menu_flag: Lisp_Object,
pub f_Vpath_separator: Lisp_Object,
pub f_Vpost_command_hook: Lisp_Object,
pub f_Vpost_gc_hook: Lisp_Object,
pub f_Vpost_self_insert_hook: Lisp_Object,
pub f_Vpre_command_hook: Lisp_Object,
pub f_Vpre_redisplay_function: Lisp_Object,
pub f_Vprefix_help_command: Lisp_Object,
pub f_Vpreloaded_file_list: Lisp_Object,
pub f_Vprevious_system_messages_locale: Lisp_Object,
pub f_Vprevious_system_time_locale: Lisp_Object,
pub f_Vprint_charset_text_property: Lisp_Object,
pub f_Vprint_circle: Lisp_Object,
pub f_Vprint_continuous_numbering: Lisp_Object,
pub f_Vprint_gensym: Lisp_Object,
pub f_Vprint_length: Lisp_Object,
pub f_Vprint_level: Lisp_Object,
pub f_Vprint_number_table: Lisp_Object,
pub f_Vprintable_chars: Lisp_Object,
pub f_Vprocess_adaptive_read_buffering: Lisp_Object,
pub f_Vprocess_coding_system_alist: Lisp_Object,
pub f_Vprocess_connection_type: Lisp_Object,
pub f_Vprocess_environment: Lisp_Object,
pub f_Vpurify_flag: Lisp_Object,
pub f_Vquit_flag: Lisp_Object,
pub f_Vread_buffer_function: Lisp_Object,
pub f_Vread_circle: Lisp_Object,
pub f_Vread_expression_history: Lisp_Object,
pub f_Vread_hide_char: Lisp_Object,
pub f_Vread_symbol_positions_list: Lisp_Object,
pub f_Vread_with_symbol_positions: Lisp_Object,
pub f_Vreal_this_command: Lisp_Object,
pub f_Vrecenter_redisplay: Lisp_Object,
pub f_Vredisplay__all_windows_cause: Lisp_Object,
pub f_Vredisplay__mode_lines_cause: Lisp_Object,
pub f_Vredisplay__variables: Lisp_Object,
pub f_Vredisplay_end_trigger_functions: Lisp_Object,
pub f_Vreport_emacs_bug_address: Lisp_Object,
pub f_Vresize_mini_windows: Lisp_Object,
pub f_Vresume_tty_functions: Lisp_Object,
pub f_Vring_bell_function: Lisp_Object,
pub f_Vsaved_region_selection: Lisp_Object,
pub f_Vscalable_fonts_allowed: Lisp_Object,
pub f_Vscript_representative_chars: Lisp_Object,
pub f_Vscroll_preserve_screen_position: Lisp_Object,
pub f_Vsearch_spaces_regexp: Lisp_Object,
pub f_Vselect_active_regions: Lisp_Object,