aboutsummaryrefslogtreecommitdiffstats
path: root/code/custom/4coder_fleury/4coder_fleury_index.h
blob: c6bdc44974a51448e068a2440bf2f21e556b9e27 (plain) (blame)
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
/* date = December 17th 2020 6:16 pm */

#ifndef FCODER_FLEURY_INDEX_H
#define FCODER_FLEURY_INDEX_H

enum F4_Index_NoteKind
{
    F4_Index_NoteKind_Null,
    F4_Index_NoteKind_Scope,
    F4_Index_NoteKind_Type,
    F4_Index_NoteKind_Constant,
    F4_Index_NoteKind_Function,
    F4_Index_NoteKind_Decl,
    F4_Index_NoteKind_Macro,
    F4_Index_NoteKind_CommentTag,
    F4_Index_NoteKind_CommentToDo,
    F4_Index_NoteKind_COUNT
};

typedef u32 F4_Index_NoteFlags;
enum
{
    F4_Index_NoteFlag_Prototype   = (1<<0),
    F4_Index_NoteFlag_ProductType = (1<<1),
    F4_Index_NoteFlag_SumType     = (1<<2),
};

struct F4_Index_File;

struct F4_Index_Note
{
    F4_Index_Note *next;
    F4_Index_Note *prev;
    F4_Index_Note *hash_next;
	F4_Index_Note *hash_prev;
    F4_Index_Note *parent;
    F4_Index_Note *next_sibling;
    F4_Index_Note *prev_sibling;
    F4_Index_Note *first_child;
    F4_Index_Note *last_child;
    
    u64 hash;
    String_Const_u8 string;
    F4_Index_NoteKind kind;
    F4_Index_NoteFlags flags;
    Range_i64 range;
    F4_Index_File *file;
	int file_generation;
};

struct F4_Index_File
{
    F4_Index_File *hash_next;
    Arena arena;
    Buffer_ID buffer;
    F4_Index_Note *first_note;
    F4_Index_Note *last_note;
	int generation;
};

struct F4_Index_State
{
    System_Mutex mutex;
    Arena arena;
    F4_Index_Note *note_table[16384];
	F4_Index_Note *free_note;
    F4_Index_File *file_table[16384];
    F4_Index_File *free_file;
};

struct F4_Index_ParseCtx
{
    b32 done;
    Application_Links *app;
    F4_Index_File *file;
    String_Const_u8 string;
    Token_Array tokens;
    Token_Iterator_Array it;
    F4_Index_Note *active_parent;
};

typedef u32 F4_Index_TokenSkipFlags;
enum
{
    F4_Index_TokenSkipFlag_SkipWhitespace = (1<<0),
};

function void F4_Index_Initialize(void);
function void F4_Index_Lock(void);
function void F4_Index_Unlock(void);
function F4_Index_File *F4_Index_LookupFile(Application_Links *app, Buffer_ID buffer);
function F4_Index_File *F4_Index_LookupOrMakeFile(Application_Links *app, Buffer_ID buffer);
function void F4_Index_EraseFile(Application_Links *app, Buffer_ID id);
function void F4_Index_ClearFile(F4_Index_File *file);
function F4_Index_Note *F4_Index_LookupNote(String_Const_u8 string, F4_Index_Note *parent);
function F4_Index_Note *F4_Index_LookupNote(String_Const_u8 string);
function F4_Index_Note *F4_Index_AllocateNote(void);
function void F4_Index_InsertNote(F4_Index_ParseCtx *ctx, F4_Index_Note *note, Range_i64 name_range, F4_Index_NoteKind note_kind, F4_Index_NoteFlags note_flags);
function F4_Index_Note *F4_Index_MakeNote(F4_Index_ParseCtx *ctx, Range_i64 name_range, F4_Index_NoteKind note_kind, F4_Index_NoteFlags note_flags);
function void F4_Index_ParseFile(Application_Links *app, F4_Index_File *file, String_Const_u8 string, Token_Array tokens);
function b32 F4_Index_ParseCtx_Inc(F4_Index_ParseCtx *ctx, F4_Index_TokenSkipFlags flags);
function b32 F4_Index_RequireToken(F4_Index_ParseCtx *ctx, String_Const_u8 string, F4_Index_TokenSkipFlags flags);
function b32 F4_Index_RequireTokenKind(F4_Index_ParseCtx *ctx, Token_Base_Kind kind, Token **token_out, F4_Index_TokenSkipFlags flags);
function b32 F4_Index_RequireTokenSubKind(F4_Index_ParseCtx *ctx, int sub_kind, Token **token_out, F4_Index_TokenSkipFlags flags);
function b32 F4_Index_PeekToken(F4_Index_ParseCtx *ctx, String_Const_u8 string);
function void F4_Index_ParseComment(F4_Index_ParseCtx *ctx, Token *token);
function void F4_Index_SkipSoftTokens(F4_Index_ParseCtx *ctx, b32 preproc);
function void F4_Index_SkipOpTokens(F4_Index_ParseCtx *ctx);
function String_Const_u8 F4_Index_StringFromRange(F4_Index_ParseCtx *ctx, Range_i64 range);
function String_Const_u8 F4_Index_StringFromToken(F4_Index_ParseCtx *ctx, Token *token);
function F4_Index_Note *F4_Index_PushParent(F4_Index_ParseCtx *ctx, F4_Index_Note *new_parent);
function void F4_Index_PopParent(F4_Index_ParseCtx *ctx, F4_Index_Note *last_parent);
function void F4_Index_Tick(Application_Links *app);

// Format:
// %t -> token,         requires char * specifying token string
// %k -> token kind,    requires Token_Base_Kind and Token ** for output token
// %b -> token subkind, requires token subkind and Token ** for output token
// %n -> note,          requires F4_Index_NoteKind and F4_Index_Note ** for output note
// %s -> soft group,    requires no arguments
// %o -> operator group,requires no arguments
function b32 F4_Index_ParsePattern(F4_Index_ParseCtx *ctx, char *fmt, ...);

#endif // FCODER_FLEURY_INDEX_H