-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy pathстарт.ц
186 lines (161 loc) · 12.2 KB
/
старт.ц
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
взяти визначення мавка/мавка_втілення;
дія нативна_дія_мавки_друк(предмет_нативної_дії: адреса<мавка::Предмет>, В: адреса<мавка::Виконувач>, предмет_я: адреса<мавка::Предмет>, кількість_аргументів: позитивне, аргументи: памʼять<адреса<мавка::Предмет>>, іменовані_аргументи: адреса<мавка::ІменованіАргументи>, дані: адреса): мавка::Результат {
якщо аргументи != пусто {
змінна ціль па: позитивне = 0;
поки па < кількість_аргументів {
ціль значення_ю8 = ю8 { пусто, 0 };
мавка::отримати_текстове_зображення_предмета_як_Ю8(аргументи[па], В, значення_ю8::адреса);
мавка::вивести_Ю8(В, значення_ю8);
мавка::звільнити(В, значення_ю8.дані як адреса);
якщо (па + 1) < кількість_аргументів {
мавка::вивести_Ю8(В, ю8" ");
}
па += 1;
}
мавка::вивести_Ю8(В, ю8"\n");
}
вернути мавка::результат_успіх(В, пусто);
}
дія надрукувати_помилку(В: адреса<мавка::Виконувач>, шлях: памʼять<п8>, рядок: позитивне, повідомлення: памʼять<п8>) {
мавка::вивести_Ю8(В, ю8 { шлях, МаМа::порахувати_розмір_Ю8(шлях) });
мавка::вивести_Ю8(В, ю8":");
мавка::вивести_п64(В, п64(рядок));
мавка::вивести_Ю8(В, ю8": ");
мавка::надрукувати_Ю8(В, ю8 { повідомлення, МаМа::порахувати_розмір_Ю8(повідомлення) });
}
дія надрукувати_помилку(В: адреса<мавка::Виконувач>, шлях: ю8, рядок: позитивне, повідомлення: памʼять<п8>) {
мавка::вивести_Ю8(В, шлях);
мавка::вивести_Ю8(В, ю8":");
мавка::вивести_п64(В, п64(рядок));
мавка::вивести_Ю8(В, ю8": ");
мавка::надрукувати_Ю8(В, ю8 { повідомлення, МаМа::порахувати_розмір_Ю8(повідомлення) });
}
дія надрукувати_помилку(В: адреса<мавка::Виконувач>, шлях: ю8, рядок: позитивне, повідомлення: ю8) {
мавка::вивести_Ю8(В, шлях);
мавка::вивести_Ю8(В, ю8":");
мавка::вивести_п64(В, п64(рядок));
мавка::вивести_Ю8(В, ю8": ");
мавка::надрукувати_Ю8(В, повідомлення);
}
дія надрукувати_помилку(В: адреса<мавка::Виконувач>, повідомлення: памʼять<п8>) {
мавка::надрукувати_Ю8(В, ю8 { повідомлення, МаМа::порахувати_розмір_Ю8(повідомлення) });
}
дія надрукувати_помилку(В: адреса<мавка::Виконувач>, повідомлення: ю8) {
мавка::надрукувати_Ю8(В, ю8"ПОМИЛКА!!!");
}
дія надрукувати_падіння(В: адреса<мавка::Виконувач>, значення: адреса<мавка::Предмет>, падіння: адреса<мавка::Падіння>) {
ціль значення_ю8 = ю8 { пусто, 0 };
мавка::отримати_текстове_зображення_предмета_як_Ю8(значення, В, значення_ю8::адреса);
якщо падіння.місцезнаходження != пусто {
надрукувати_помилку(
В,
мавка::отримати_шлях_до_файлу_з_місцезнаходження_падіння(В, падіння.місцезнаходження),
мавка::отримати_рядок_з_місцезнаходження_падіння(В, падіння.місцезнаходження),
значення_ю8
);
} інакше {
надрукувати_помилку(В, значення_ю8);
}
мавка::звільнити_памʼять(В, значення_ю8.дані);
}
зовнішня дія mavka_check_if_str_ends_with(значення: памʼять<п8>, закінчення: памʼять<п8>): п8;
зовнішня дія mavka_get_filename_without_extension(шлях: памʼять<п8>, вихід: адреса<памʼять<п8>>);
зовнішня дія mavka_malloc(size: size_t): адреса;
зовнішня дія mavka_realloc(ptr: адреса, size: size_t): адреса;
зовнішня дія mavka_free(ptr: адреса);
зовнішня дія mavka_print_utf8(value: адреса<char>, length: size_t);
зовнішня дія mavka_exit(code: int);
зовнішня дія mavka_read_file(path: адреса<char>, path_size: size_t, buffer_size: адреса<size_t>): адреса<п8>;
зовнішня дія mavka_fix_path(path: адреса<char>, path_size: size_t, buffer_size: адреса<size_t>): адреса<п8>;
зовнішня дія mavka_dialog(data: адреса, run: (data: адреса, value: адреса<char>, value_size: size_t) -> ніщо);
дія виділити_памʼять(розмір: позитивне): памʼять<п8> {
вернути mavka_malloc(size_t(розмір)) як памʼять<п8>;
}
дія виконувач_виділити_памʼять(В: адреса<мавка::Виконувач>, розмір: позитивне): памʼять<п8> {
вернути mavka_malloc(size_t(розмір)) як памʼять<п8>;
}
дія виконувач_перевиділити_памʼять(В: адреса<мавка::Виконувач>, значення: памʼять<п8>, новий_розмір: позитивне): памʼять<п8> {
вернути mavka_realloc(значення як адреса, size_t(новий_розмір)) як памʼять<п8>;
}
дія виконувач_звільнити_памʼять(В: адреса<мавка::Виконувач>, значення: памʼять<п8>) {
mavka_free(значення як адреса);
}
дія виконувач_вивести(В: адреса<мавка::Виконувач>, значення: текст) {
}
дія виконувач_вивести_Ю8(В: адреса<мавка::Виконувач>, значення: ю8) {
mavka_print_utf8(значення.дані як адреса<char>, size_t(значення.розмір));
}
дія виконувач_померти(В: адреса<мавка::Виконувач>, код: ц32) {
mavka_exit(код);
}
дія виконувач_прочитати_файл(В: адреса<мавка::Виконувач>, шлях: ю8, вихід: адреса<ю8>): позитивне {
ціль buffer_size: size_t = 0;
ціль прочитаний_файл = mavka_read_file(шлях.дані як адреса<char>, size_t(шлях.розмір), buffer_size::адреса) як памʼять<п8>;
якщо прочитаний_файл == пусто {
вернути 1;
}
вихід::вміст = ю8 { прочитаний_файл, позитивне(buffer_size) };
вернути 0;
}
дія виконувач_виправити_шлях(В: адреса<мавка::Виконувач>, шлях: ю8, вихід: адреса<ю8>): позитивне {
ціль buffer_size: size_t = 0;
ціль виправлений_шлях = mavka_fix_path(шлях.дані як адреса<char>, size_t(шлях.розмір), buffer_size::адреса) як памʼять<п8>;
якщо виправлений_шлях == пусто {
вернути 1;
}
вихід::вміст = ю8 { виправлений_шлях, позитивне(buffer_size) };
вернути 0;
}
структура MavkaDialogData {
В: адреса<мавка::Виконувач>;
відгук: (дані: адреса, значення: памʼять<п8>, розмір_значення: позитивне) -> ніщо;
дані: адреса;
}
дія mavka_dialog_callback(data: адреса, value: адреса<char>, value_size: size_t) {
ціль mavka_dialog_data = data як адреса<MavkaDialogData>;
mavka_dialog_data.відгук(mavka_dialog_data.дані, value як памʼять<п8>, позитивне(value_size));
}
дія виконувач_розпочати_діалог(В: адреса<мавка::Виконувач>, дані: адреса, відгук: (дані: адреса, значення: памʼять<п8>, розмір_значення: позитивне) -> ніщо) {
ціль data = мавка::виділити<MavkaDialogData>(В);
data.В = В;
data.відгук = відгук;
data.дані = дані;
mavka_dialog(data, mavka_dialog_callback);
мавка::звільнити(В, data як адреса);
}
зовнішня дія стартувати_мавку(кількість_аргументів: ц32, аргументи: памʼять<памʼять<п8>>): ц32 {
ціль В = мавка::виділити_виконувач(виділити_памʼять);
мавка::налаштувати_виконувач(В, мавка::ВерсіяМавки { 0, 113, 0 }, мавка::Система {
виділити_сиру_памʼять = виконувач_виділити_памʼять,
перевиділити_сиру_памʼять = виконувач_перевиділити_памʼять,
звільнити_сиру_памʼять = виконувач_звільнити_памʼять,
вивести = виконувач_вивести,
вивести_Ю8 = виконувач_вивести_Ю8,
померти = виконувач_померти,
виправити_шлях = виконувач_виправити_шлях,
прочитати_файл = виконувач_прочитати_файл,
розпочати_діалог = виконувач_розпочати_діалог,
});
мавка::визначити_глобальний_підмет(В, мавка::назва_з_Ю8(В, ю8"друк"), мавка::створити_нативну_дію(В, мавка::назва_з_Ю8(В, ю8"друк"), нативна_дія_мавки_друк, пусто, пусто));
якщо кількість_аргументів == 1 {
ціль результат = мавка::почати_діалог(В);
вернути 0;
} інакше {
якщо МаМа::перевірити_чи_ю8_рівні(ю8 { аргументи[1], МаМа::порахувати_розмір_Ю8(аргументи[1]) }, ю8"допомога") == так {
} інакше {
ціль шлях = аргументи[1];
якщо mavka_check_if_str_ends_with(шлях, ю8сі".м") == 0 {
// потім: помилка
вернути 1;
}
ціль назва_файлу_без_розширення: памʼять<п8> = пусто;
mavka_get_filename_without_extension(шлях, назва_файлу_без_розширення::адреса);
ціль результат_взяття_модуля = мавка::взяти_файл_Ю8(В, мавка::назва_з_Ю8(В, ю8 { назва_файлу_без_розширення, МаМа::порахувати_розмір_Ю8(назва_файлу_без_розширення) }), ю8 { шлях, МаМа::порахувати_розмір_Ю8(шлях) });
якщо результат_взяття_модуля.падіння != пусто {
надрукувати_падіння(В, результат_взяття_модуля.значення, результат_взяття_модуля.падіння);
вернути 1;
}
}
}
вернути 0;
}