Mercurial > mm7
comparison mm7text_ru.cpp @ 246:1bfe546561c4
sprintfex
author | Nomad |
---|---|
date | Mon, 18 Feb 2013 03:58:08 +0200 |
parents | |
children | 37dcbe8f3cca |
comparison
equal
deleted
inserted
replaced
236:99ef31ffa74e | 246:1bfe546561c4 |
---|---|
1 #include <string.h> | |
2 #include <stdlib.h> | |
3 #include <stdio.h> | |
4 #include <assert.h> | |
5 | |
6 #include "Log.h" | |
7 | |
8 | |
9 struct GenderTableEntry | |
10 { | |
11 const char *name; | |
12 int gender; | |
13 } gender_table_caps[] = | |
14 { | |
15 {"Авель", 0}, | |
16 {"Адам", 0}, | |
17 {"Адриан", 0}, | |
18 {"Адрианис", 0}, | |
19 {"Адская", 1}, | |
20 {"Айр", 0}, | |
21 {"Акио", 0}, | |
22 {"Акира", 0}, | |
23 {"Алан", 0}, | |
24 {"Алейн", 0}, | |
25 {"Алек", 0}, | |
26 {"Александр", 0}, | |
27 {"Ален", 0}, | |
28 {"Алехандро", 0}, | |
29 {"Алиса", 1}, | |
30 {"Альберт", 0}, | |
31 {"Альтон", 0}, | |
32 {"Альтред", 0}, | |
33 {"Альфред", 0}, | |
34 {"Аманда", 1}, | |
35 {"Амбер", 1}, | |
36 {"Амброзий", 0}, | |
37 {"Амелия", 1}, | |
38 {"Амос", 0}, | |
39 {"Ангел", 0}, | |
40 {"Андреа", 1}, | |
41 {"Андрей", 0}, | |
42 {"Анжела", 1}, | |
43 {"Анита", 1}, | |
44 {"Анна", 1}, | |
45 {"Антон", 0}, | |
46 {"Антоний", 0}, | |
47 {"Арби", 0}, | |
48 {"Арда", 0}, | |
49 {"Арден", 0}, | |
50 {"Арена", 1}, | |
51 {"Аристей", 0}, | |
52 {"Аристидис", 0}, | |
53 {"Арих", 0}, | |
54 {"Ариэль", 0}, | |
55 {"Арлен", 0}, | |
56 {"Арло", 0}, | |
57 {"Арманд", 0}, | |
58 {"Арнольд", 0}, | |
59 {"Арон", 0}, | |
60 {"Артур", 0}, | |
61 {"Архангел", 0}, | |
62 {"Архимаг", 0}, | |
63 {"Ахмед", 0}, | |
64 {"Бёртон", 0}, | |
65 {"Бад", 0}, | |
66 {"Байрон", 0}, | |
67 {"Бандит", 0}, | |
68 {"Бар", 0}, | |
69 {"Барбара", 1}, | |
70 {"Баретт", 0}, | |
71 {"Барт", 0}, | |
72 {"Батч", 0}, | |
73 {"Беатрис", 1}, | |
74 {"Беверли", 1}, | |
75 {"Беки", 1}, | |
76 {"Белинда", 1}, | |
77 {"Бен", 0}, | |
78 {"Бенджамин", 0}, | |
79 {"Бенедикт", 0}, | |
80 {"Бенито", 0}, | |
81 {"Беннет", 0}, | |
82 {"Бенни", 0}, | |
83 {"Бенуа", 0}, | |
84 {"Бернадетта", 1}, | |
85 {"Бернард", 0}, | |
86 {"Берни", 0}, | |
87 {"Бернис", 1}, | |
88 {"Бернучо", 0}, | |
89 {"Берт", 0}, | |
90 {"Бертран", 0}, | |
91 {"Бет", 1}, | |
92 {"Бетси", 1}, | |
93 {"Бетти", 1}, | |
94 {"Билли", 0}, | |
95 {"Биллис", 1}, | |
96 {"Бишоп", 0}, | |
97 {"Блейк", 0}, | |
98 {"Блейн", 0}, | |
99 {"Блондо", 0}, | |
100 {"Бо", 0}, | |
101 {"Боб", 0}, | |
102 {"Бобби", 0}, | |
103 {"Бодо", 0}, | |
104 {"Болотный", 0}, | |
105 {"Большой", 0}, | |
106 {"Бонни", 1}, | |
107 {"Борегард", 0}, | |
108 {"Борис", 0}, | |
109 {"Браден", 0}, | |
110 {"Брайс", 0}, | |
111 {"Брат", 0}, | |
112 {"Брейн", 0}, | |
113 {"Бренда", 1}, | |
114 {"Брендон", 0}, | |
115 {"Брент", 0}, | |
116 {"Брет", 0}, | |
117 {"Бронвин", 0}, | |
118 {"Бронзовый", 0}, | |
119 {"Брук", 0}, | |
120 {"Бруно", 0}, | |
121 {"Брэд", 0}, | |
122 {"Брэдли", 0}, | |
123 {"Брэдфорд", 0}, | |
124 {"Брэндон", 0}, | |
125 {"Брюс", 0}, | |
126 {"Буфорд", 0}, | |
127 {"Вадим", 0}, | |
128 {"Вал", 0}, | |
129 {"Валерия", 1}, | |
130 {"Вальтер", 0}, | |
131 {"Ванда", 1}, | |
132 {"Ванесса", 1}, | |
133 {"Ванетта", 1}, | |
134 {"Ванс", 0}, | |
135 {"Вейн", 0}, | |
136 {"Великий", 0}, | |
137 {"Венделл", 0}, | |
138 {"Венди", 1}, | |
139 {"Вера", 1}, | |
140 {"Верн", 0}, | |
141 {"Вернон", 0}, | |
142 {"Вероника", 1}, | |
143 {"Верховная", 1}, | |
144 {"Весли", 0}, | |
145 {"Виверн", 0}, | |
146 {"Вивьен", 1}, | |
147 {"Вики", 1}, | |
148 {"Виктор", 0}, | |
149 {"Викторис", 0}, | |
150 {"Виктория", 1}, | |
151 {"Вилам", 0}, | |
152 {"Вилл", 0}, | |
153 {"Виллард", 0}, | |
154 {"Вильма", 1}, | |
155 {"Вильфред", 0}, | |
156 {"Вильям", 0}, | |
157 {"Винный", 0}, | |
158 {"Винстон", 0}, | |
159 {"Винченцо", 0}, | |
160 {"Виолет", 1}, | |
161 {"Виргилий", 0}, | |
162 {"Виргиния", 1}, | |
163 {"Вихрь", 0}, | |
164 {"Владимир", 0}, | |
165 {"Властелин", 0}, | |
166 {"Водный", 0}, | |
167 {"Военное", 2}, | |
168 {"Воздушная", 1}, | |
169 {"Воздушный", 0}, | |
170 {"Волхв", 0}, | |
171 {"Вольг", 0}, | |
172 {"Восставший", 0}, | |
173 {"Врата", 1}, | |
174 {"Вудро", 0}, | |
175 {"Вурдалак", 0}, | |
176 {"Высшая", 1}, | |
177 {"Вэйд", 0}, | |
178 {"Габриэль", 0}, | |
179 {"Гай", 0}, | |
180 {"Ганс", 0}, | |
181 {"Гарет", 0}, | |
182 {"Гари", 0}, | |
183 {"Гарпия", 1}, | |
184 {"Гарри", 0}, | |
185 {"Гвендолин", 1}, | |
186 {"Гвенн", 1}, | |
187 {"Гейб", 0}, | |
188 {"Гейл", 1}, | |
189 {"Гектор", 0}, | |
190 {"Гельмут", 0}, | |
191 {"Геникки", 1}, | |
192 {"Генри", 0}, | |
193 {"Георгина", 1}, | |
194 {"Герб", 0}, | |
195 {"Герберт", 0}, | |
196 {"Герман", 0}, | |
197 {"Гертруда", 1}, | |
198 {"Герц", 0}, | |
199 {"Гигантская", 1}, | |
200 {"Гильдия", 1}, | |
201 {"Гильермо", 0}, | |
202 {"Гильмор", 0}, | |
203 {"Гимнастический", 0}, | |
204 {"Глазище", 2}, | |
205 {"Глен", 0}, | |
206 {"Гленда", 1}, | |
207 {"Глиняный", 0}, | |
208 {"Глория", 1}, | |
209 {"Гниющий", 0}, | |
210 {"Гном", 0}, | |
211 {"Гоблин", 0}, | |
212 {"Говард", 0}, | |
213 {"Гог", 0}, | |
214 {"Гомер", 0}, | |
215 {"Гонзало", 0}, | |
216 {"Гораций", 0}, | |
217 {"Гордон", 0}, | |
218 {"Горный", 0}, | |
219 {"Грабитель", 0}, | |
220 {"Грант", 0}, | |
221 {"Грахэм", 0}, | |
222 {"Грег", 0}, | |
223 {"Грегори", 0}, | |
224 {"Грей", 0}, | |
225 {"Гретхен", 1}, | |
226 {"Грифон", 0}, | |
227 {"Грозовой", 0}, | |
228 {"Гус", 0}, | |
229 {"Давид", 0}, | |
230 {"Дайана", 1}, | |
231 {"Дал", 0}, | |
232 {"Даллас", 0}, | |
233 {"Дамиан", 0}, | |
234 {"Дана", 1}, | |
235 {"Даниэль", 0}, | |
236 {"Данте", 0}, | |
237 {"Дара", 1}, | |
238 {"Дарлин", 1}, | |
239 {"Дарон", 0}, | |
240 {"Дарси", 1}, | |
241 {"Дастин", 0}, | |
242 {"Дафна", 1}, | |
243 {"Двайт", 0}, | |
244 {"Двейн", 0}, | |
245 {"Деанна", 1}, | |
246 {"Дебби", 1}, | |
247 {"Дебора", 1}, | |
248 {"Девон", 0}, | |
249 {"Дейв", 0}, | |
250 {"Дейл", 0}, | |
251 {"Дел", 0}, | |
252 {"Делорис", 1}, | |
253 {"Денис", 1}, | |
254 {"Денни", 0}, | |
255 {"Депозитарий", 0}, | |
256 {"Дерево", 2}, | |
257 {"Дерек", 0}, | |
258 {"Десмонд", 0}, | |
259 {"Джанис", 1}, | |
260 {"Джастин", 0}, | |
261 {"Джед", 0}, | |
262 {"Джедай", 0}, | |
263 {"Джей", 0}, | |
264 {"Джейк", 0}, | |
265 {"Джеймс", 0}, | |
266 {"Джейн", 1}, | |
267 {"Джейсон", 0}, | |
268 {"Джек", 0}, | |
269 {"Джеки", 1}, | |
270 {"Джеми", 0}, | |
271 {"Дженифер", 1}, | |
272 {"Дженни", 1}, | |
273 {"Джеральд", 0}, | |
274 {"Джеральдина", 1}, | |
275 {"Джером", 0}, | |
276 {"Джероми", 0}, | |
277 {"Джерри", 0}, | |
278 {"Джесс", 0}, | |
279 {"Джесса", 1}, | |
280 {"Джессика", 1}, | |
281 {"Джетано", 0}, | |
282 {"Джим", 0}, | |
283 {"Джин", 1}, | |
284 {"Джина", 1}, | |
285 {"Джинжер", 1}, | |
286 {"Джинни", 1}, | |
287 {"Джино", 0}, | |
288 {"Джо", 2}, | |
289 {"Джоан", 1}, | |
290 {"Джоанн", 1}, | |
291 {"Джоанна", 1}, | |
292 {"Джозеф", 0}, | |
293 {"Джой", 0}, | |
294 {"Джойс", 1}, | |
295 {"Джойсин", 1}, | |
296 {"Джон", 0}, | |
297 {"Джонатан", 0}, | |
298 {"Джордж", 0}, | |
299 {"Джоу", 0}, | |
300 {"Джошуа", 0}, | |
301 {"Джоэль", 0}, | |
302 {"Джуд", 0}, | |
303 {"Джуди", 1}, | |
304 {"Джудис", 1}, | |
305 {"Джули", 1}, | |
306 {"Джун", 1}, | |
307 {"Диана", 1}, | |
308 {"Дилан", 0}, | |
309 {"Дин", 0}, | |
310 {"Дитер", 0}, | |
311 {"Додридж", 0}, | |
312 {"Док", 0}, | |
313 {"Долорес", 1}, | |
314 {"Дольф", 0}, | |
315 {"Дом", 0}, | |
316 {"Доминик", 0}, | |
317 {"Доминика", 1}, | |
318 {"Дон", 0}, | |
319 {"Донайс", 1}, | |
320 {"Дональд", 0}, | |
321 {"Донна", 1}, | |
322 {"Дорин", 1}, | |
323 {"Дорис", 1}, | |
324 {"Дороти", 1}, | |
325 {"Драконовая", 1}, | |
326 {"Древнее", 2}, | |
327 {"Древний", 0}, | |
328 {"Друид", 0}, | |
329 {"Дрю", 0}, | |
330 {"Дуглас", 0}, | |
331 {"Дункан", 0}, | |
332 {"Дьявол", 0}, | |
333 {"Дэви", 0}, | |
334 {"Дэн", 0}, | |
335 {"Дэнис", 0}, | |
336 {"Дэнни", 0}, | |
337 {"Дюк", 0}, | |
338 {"Ева", 1}, | |
339 {"Евгений", 0}, | |
340 {"Елизавета", 1}, | |
341 {"Жан-Поль", 0}, | |
342 {"Жан-Пьер", 0}, | |
343 {"Жанета", 1}, | |
344 {"Жанетт", 1}, | |
345 {"Жанетта", 1}, | |
346 {"Жанин", 1}, | |
347 {"Жанис", 1}, | |
348 {"Жанна", 1}, | |
349 {"Жасмин", 1}, | |
350 {"Жейн", 1}, | |
351 {"Женна", 1}, | |
352 {"Жильбер", 0}, | |
353 {"Жофрей", 0}, | |
354 {"Жуль", 0}, | |
355 {"Зак", 0}, | |
356 {"Замок", 0}, | |
357 {"Замороженные", 2}, | |
358 {"Захарий", 0}, | |
359 {"Зебулон", 0}, | |
360 {"Зеленый", 0}, | |
361 {"Земной", 0}, | |
362 {"Зигги", 0}, | |
363 {"Зик", 0}, | |
364 {"Златые", 2}, | |
365 {"Зод", 0}, | |
366 {"Золотой", 0}, | |
367 {"Золтан", 0}, | |
368 {"Зорекс", 0}, | |
369 {"Ив", 0}, | |
370 {"Иван", 0}, | |
371 {"Ивар", 0}, | |
372 {"Иверсон", 0}, | |
373 {"Ивонна", 1}, | |
374 {"Игнасио", 0}, | |
375 {"Игорь", 0}, | |
376 {"Ида", 1}, | |
377 {"Иеремия", 0}, | |
378 {"Измаил", 0}, | |
379 {"Изумрудный", 0}, | |
380 {"Ике", 0}, | |
381 {"Илена", 1}, | |
382 {"Илья", 0}, | |
383 {"Имение", 2}, | |
384 {"Инкубатор", 0}, | |
385 {"Иоланда", 1}, | |
386 {"Ион", 0}, | |
387 {"Иона", 0}, | |
388 {"Иоханн", 0}, | |
389 {"Ирвин", 0}, | |
390 {"Ирвинг", 0}, | |
391 {"Ирена", 1}, | |
392 {"Ирина", 1}, | |
393 {"Ирис", 1}, | |
394 {"Ирма", 1}, | |
395 {"Исаак", 0}, | |
396 {"Исао", 0}, | |
397 {"Йордан", 0}, | |
398 {"Каао", 0}, | |
399 {"Кай", 0}, | |
400 {"Калеб", 0}, | |
401 {"Кальвин", 0}, | |
402 {"Каменная", 1}, | |
403 {"Каменный", 0}, | |
404 {"Кандейс", 1}, | |
405 {"Капитан", 0}, | |
406 {"Карен", 1}, | |
407 {"Кари", 0}, | |
408 {"Карин", 0}, | |
409 {"Карл", 0}, | |
410 {"Карли", 1}, | |
411 {"Карло", 0}, | |
412 {"Карлон", 0}, | |
413 {"Карлос", 0}, | |
414 {"Кармен", 1}, | |
415 {"Картер", 0}, | |
416 {"Касандра", 1}, | |
417 {"Катерина", 1}, | |
418 {"Кати", 1}, | |
419 {"Катлин", 1}, | |
420 {"Кван", 0}, | |
421 {"Квентин", 0}, | |
422 {"Квинн", 0}, | |
423 {"Кевин", 0}, | |
424 {"Кевинус", 0}, | |
425 {"Кейлин", 1}, | |
426 {"Кейт", 0}, | |
427 {"Кел", 0}, | |
428 {"Келли", 1}, | |
429 {"Кен", 0}, | |
430 {"Кеннет", 0}, | |
431 {"Кери", 1}, | |
432 {"Керн", 0}, | |
433 {"Киган", 0}, | |
434 {"Ким", 1}, | |
435 {"Кимберли", 1}, | |
436 {"Кирк", 0}, | |
437 {"Кирус", 0}, | |
438 {"Клайд", 0}, | |
439 {"Кларенс", 0}, | |
440 {"Кларк", 0}, | |
441 {"Клирик", 0}, | |
442 {"Клиффорд", 0}, | |
443 {"Клэй", 0}, | |
444 {"Клэр", 1}, | |
445 {"Коди", 0}, | |
446 {"Колин", 0}, | |
447 {"Колония", 1}, | |
448 {"Конни", 1}, | |
449 {"Коннор", 0}, | |
450 {"Конрад", 0}, | |
451 {"Константин", 0}, | |
452 {"Констанция", 1}, | |
453 {"Копи", 2}, | |
454 {"Кора", 1}, | |
455 {"Корбет", 0}, | |
456 {"Корд", 0}, | |
457 {"Кори", 0}, | |
458 {"Корисо", 0}, | |
459 {"Корнелия", 1}, | |
460 {"Корнилий", 0}, | |
461 {"Королева", 1}, | |
462 {"Королевский", 0}, | |
463 {"Король", 0}, | |
464 {"Кошка", 1}, | |
465 {"Красный", 0}, | |
466 {"Крейг", 0}, | |
467 {"Крис", 0}, | |
468 {"Криста", 1}, | |
469 {"Кристен", 1}, | |
470 {"Кристина", 1}, | |
471 {"Кристис", 1}, | |
472 {"Кристофер", 0}, | |
473 {"Кровавый", 0}, | |
474 {"Ксуан", 0}, | |
475 {"Кулак", 0}, | |
476 {"Курган", 0}, | |
477 {"Курица", 1}, | |
478 {"Кэй", 1}, | |
479 {"Кэйс", 1}, | |
480 {"Кэл", 0}, | |
481 {"Кэлло", 0}, | |
482 {"Кэмерон", 0}, | |
483 {"Кэнди", 1}, | |
484 {"Кэри", 1}, | |
485 {"Кэрол", 1}, | |
486 {"Кэролан", 1}, | |
487 {"Кэролин", 1}, | |
488 {"Кэрри", 1}, | |
489 {"Кэси", 0}, | |
490 {"Лабиринт", 0}, | |
491 {"Лаборатория", 1}, | |
492 {"Лазарь", 0}, | |
493 {"Лайонел", 0}, | |
494 {"Лаки", 0}, | |
495 {"Лана", 1}, | |
496 {"Ланс", 0}, | |
497 {"Лара", 1}, | |
498 {"Ларри", 0}, | |
499 {"Ларс", 0}, | |
500 {"Лаура", 1}, | |
501 {"Лаури", 1}, | |
502 {"Леа", 1}, | |
503 {"Леаса", 1}, | |
504 {"Лейф", 0}, | |
505 {"Лео", 0}, | |
506 {"Леонард", 0}, | |
507 {"Леора", 1}, | |
508 {"Лерой", 0}, | |
509 {"Лесли", 1}, | |
510 {"Лестер", 0}, | |
511 {"Летучая", 1}, | |
512 {"Ли", 0}, | |
513 {"Ли", 1}, | |
514 {"Лиам", 0}, | |
515 {"Ливия", 1}, | |
516 {"Лиза", 1}, | |
517 {"Лила", 1}, | |
518 {"Лиланд", 0}, | |
519 {"Лилли", 1}, | |
520 {"Лиман", 0}, | |
521 {"Линда", 1}, | |
522 {"Линден", 0}, | |
523 {"Линдсей", 0}, | |
524 {"Линн", 1}, | |
525 {"Лион", 0}, | |
526 {"Лич", 0}, | |
527 {"Ллойд", 0}, | |
528 {"Ловчий", 0}, | |
529 {"Логан", 0}, | |
530 {"Логово", 2}, | |
531 {"Лон", 0}, | |
532 {"Лонни", 0}, | |
533 {"Лора", 1}, | |
534 {"Лорд", 0}, | |
535 {"Лорен", 1}, | |
536 {"Лорена", 1}, | |
537 {"Лоу", 0}, | |
538 {"Лоувелл", 0}, | |
539 {"Лояльный", 0}, | |
540 {"Луи", 0}, | |
541 {"Луиджи", 0}, | |
542 {"Луиза", 1}, | |
543 {"Луис", 0}, | |
544 {"Луиса", 1}, | |
545 {"Лучник", 0}, | |
546 {"Льюис", 0}, | |
547 {"Людвиг", 0}, | |
548 {"Люк", 0}, | |
549 {"Люсиль", 1}, | |
550 {"Лютер", 0}, | |
551 {"Маделена", 1}, | |
552 {"Майк", 0}, | |
553 {"Майлз", 0}, | |
554 {"Майлс", 0}, | |
555 {"Мак", 0}, | |
556 {"Макро", 0}, | |
557 {"Макс", 0}, | |
558 {"Максвелл", 0}, | |
559 {"Малкольм", 0}, | |
560 {"Малый", 0}, | |
561 {"Мами", 1}, | |
562 {"Манни", 0}, | |
563 {"Мантикора", 1}, | |
564 {"Манфред", 0}, | |
565 {"Марвин", 0}, | |
566 {"Маргарита", 1}, | |
567 {"Марджори", 1}, | |
568 {"Марж", 1}, | |
569 {"Мариана", 1}, | |
570 {"Марианна", 1}, | |
571 {"Марио", 0}, | |
572 {"Марион", 0}, | |
573 {"Марис", 1}, | |
574 {"Мариса", 1}, | |
575 {"Маришаль", 1}, | |
576 {"Мария", 1}, | |
577 {"Марк", 0}, | |
578 {"Марко", 0}, | |
579 {"Маркони", 0}, | |
580 {"Маркус", 0}, | |
581 {"Марлен", 1}, | |
582 {"Марлон", 0}, | |
583 {"Марни", 1}, | |
584 {"Марси", 1}, | |
585 {"Марсия", 1}, | |
586 {"Марта", 1}, | |
587 {"Мартил", 1}, | |
588 {"Мартин", 0}, | |
589 {"Мархэм", 0}, | |
590 {"Марчелло", 0}, | |
591 {"Марша", 1}, | |
592 {"Маршал", 0}, | |
593 {"Мастер", 0}, | |
594 {"Матвей", 0}, | |
595 {"Материальные", 2}, | |
596 {"Матт", 0}, | |
597 {"Мегадракон", 0}, | |
598 {"Медный", 0}, | |
599 {"Медуза", 1}, | |
600 {"Мейм", 1}, | |
601 {"Мелани", 1}, | |
602 {"Мелвин", 0}, | |
603 {"Мелинда", 1}, | |
604 {"Мелисса", 1}, | |
605 {"Мелководье", 2}, | |
606 {"Мелоди", 1}, | |
607 {"Мертвец", 0}, | |
608 {"Мертвый", 0}, | |
609 {"Местная", 1}, | |
610 {"Местный", 0}, | |
611 {"Мик", 0}, | |
612 {"Минди", 1}, | |
613 {"Минеральные", 2}, | |
614 {"Миникора", 1}, | |
615 {"Минни", 1}, | |
616 {"Мириам", 1}, | |
617 {"Митч", 0}, | |
618 {"Мишель", 1}, | |
619 {"Могучий", 0}, | |
620 {"Мойра", 1}, | |
621 {"Монах", 0}, | |
622 {"Моника", 1}, | |
623 {"Монте", 0}, | |
624 {"Морел", 0}, | |
625 {"Морина", 1}, | |
626 {"Моррис", 0}, | |
627 {"Мортон", 0}, | |
628 {"Мохаммед", 0}, | |
629 {"Мраморная", 1}, | |
630 {"Мудрый", 0}, | |
631 {"Мэл", 0}, | |
632 {"Мэнди", 1}, | |
633 {"Мэри", 1}, | |
634 {"Мэри", 1}, | |
635 {"Мэрилин", 1}, | |
636 {"Мюрель", 1}, | |
637 {"Мюррей", 0}, | |
638 {"Надина", 1}, | |
639 {"Налётчик", 0}, | |
640 {"Наоми", 1}, | |
641 {"Натали", 1}, | |
642 {"Натан", 0}, | |
643 {"Натаниэль", 0}, | |
644 {"Начальная", 1}, | |
645 {"Небеса", 1}, | |
646 {"Нед", 0}, | |
647 {"Некромант", 0}, | |
648 {"Нельсон", 0}, | |
649 {"Неустрашимый", 0}, | |
650 {"Ник", 0}, | |
651 {"Ники", 1}, | |
652 {"Николай", 0}, | |
653 {"Николас", 0}, | |
654 {"Николь", 1}, | |
655 {"Нил", 0}, | |
656 {"Новобранец", 0}, | |
657 {"Ной", 0}, | |
658 {"Норина", 1}, | |
659 {"Норм", 0}, | |
660 {"Норма", 1}, | |
661 {"Норман", 0}, | |
662 {"Норрис", 0}, | |
663 {"Ньют", 0}, | |
664 {"Нэйт", 0}, | |
665 {"Нэнси", 1}, | |
666 {"Нэнсис", 1}, | |
667 {"Обсидиановая", 1}, | |
668 {"Огненный", 0}, | |
669 {"Олаф", 0}, | |
670 {"Оливер", 0}, | |
671 {"Оливия", 1}, | |
672 {"Орден", 0}, | |
673 {"Особняк", 0}, | |
674 {"Остин", 0}, | |
675 {"Отис", 0}, | |
676 {"Оувен", 0}, | |
677 {"Охотник", 0}, | |
678 {"Павел", 0}, | |
679 {"Пам", 1}, | |
680 {"Памела", 1}, | |
681 {"Паркер", 0}, | |
682 {"Парти", 1}, | |
683 {"Патрик", 0}, | |
684 {"Патрисия", 1}, | |
685 {"Пег", 1}, | |
686 {"Пегги", 1}, | |
687 {"Пейдж", 1}, | |
688 {"Пенни", 1}, | |
689 {"Перри", 0}, | |
690 {"Перси", 0}, | |
691 {"Персиваль", 0}, | |
692 {"Петер", 0}, | |
693 {"Пикси", 1}, | |
694 {"Пирс", 0}, | |
695 {"Пит", 0}, | |
696 {"Плавучий", 0}, | |
697 {"Покои", 2}, | |
698 {"Пол", 0}, | |
699 {"Посвящённый", 0}, | |
700 {"Посвященный", 0}, | |
701 {"Последний", 0}, | |
702 {"Послушник", 0}, | |
703 {"Постоялый", 0}, | |
704 {"Предводитель", 0}, | |
705 {"Престон", 0}, | |
706 {"Привидение", 2}, | |
707 {"Придорожный", 0}, | |
708 {"Призрак", 0}, | |
709 {"Природные", 2}, | |
710 {"Пьер", 0}, | |
711 {"Пэт", 0}, | |
712 {"Пэтти", 1}, | |
713 {"Раду", 0}, | |
714 {"Разбойник", 0}, | |
715 {"Райан", 0}, | |
716 {"Раймонд", 0}, | |
717 {"Ральф", 0}, | |
718 {"Рамей", 0}, | |
719 {"Рамси", 0}, | |
720 {"Рандольф", 0}, | |
721 {"Рассел", 0}, | |
722 {"Расти", 0}, | |
723 {"Ратуша", 1}, | |
724 {"Рауль", 0}, | |
725 {"Рафаэль", 0}, | |
726 {"Рашель", 1}, | |
727 {"Ребекка", 1}, | |
728 {"Реви", 1}, | |
729 {"Рег", 0}, | |
730 {"Регина", 1}, | |
731 {"Реджинальд", 0}, | |
732 {"Рекс", 0}, | |
733 {"Рене", 0}, | |
734 {"Рени", 1}, | |
735 {"Ренцо", 0}, | |
736 {"Ресанда", 1}, | |
737 {"Речной", 0}, | |
738 {"Рики", 0}, | |
739 {"Ринальдо", 0}, | |
740 {"Рита", 1}, | |
741 {"Ричард", 0}, | |
742 {"Роб", 0}, | |
743 {"Робби", 0}, | |
744 {"Роберт", 0}, | |
745 {"Роберта", 1}, | |
746 {"Робин", 0}, | |
747 {"Рогатый", 0}, | |
748 {"Родни", 0}, | |
749 {"Роза", 1}, | |
750 {"Розали", 1}, | |
751 {"Розанна", 1}, | |
752 {"Рози", 1}, | |
753 {"Розмари", 1}, | |
754 {"Розмарина", 1}, | |
755 {"Рой", 0}, | |
756 {"Роки", 0}, | |
757 {"Роланд", 0}, | |
758 {"Ромона", 1}, | |
759 {"Рон", 0}, | |
760 {"Рональд", 0}, | |
761 {"Ронда", 1}, | |
762 {"Рори", 0}, | |
763 {"Росс", 0}, | |
764 {"Роуз", 1}, | |
765 {"Рошель", 1}, | |
766 {"Рубина", 1}, | |
767 {"Руди", 0}, | |
768 {"Руперт", 0}, | |
769 {"Рут", 1}, | |
770 {"Рути", 1}, | |
771 {"Рэндал", 0}, | |
772 {"Рэнди", 0}, | |
773 {"Саад", 0}, | |
774 {"Сабрина", 1}, | |
775 {"Сади", 1}, | |
776 {"Сал", 0}, | |
777 {"Салли", 1}, | |
778 {"Сальваторе", 0}, | |
779 {"Самюэль", 0}, | |
780 {"Сандип", 0}, | |
781 {"Сандра", 1}, | |
782 {"Сантос", 0}, | |
783 {"Сапфировый", 0}, | |
784 {"Сара", 1}, | |
785 {"Свен", 0}, | |
786 {"Свет", 0}, | |
787 {"Светлана", 1}, | |
788 {"Светящийся", 0}, | |
789 {"Святилище", 2}, | |
790 {"Священная", 1}, | |
791 {"Священник", 0}, | |
792 {"Себастьян", 0}, | |
793 {"Седрик", 0}, | |
794 {"Сеймур", 0}, | |
795 {"Секлия", 1}, | |
796 {"Селена", 1}, | |
797 {"Сергио", 0}, | |
798 {"Серый", 0}, | |
799 {"Сесиль", 0}, | |
800 {"Сет", 0}, | |
801 {"Сидней", 0}, | |
802 {"Сильвестр", 0}, | |
803 {"Сильфида", 1}, | |
804 {"Симон", 0}, | |
805 {"Симона", 1}, | |
806 {"Синди", 1}, | |
807 {"Синдис", 1}, | |
808 {"Синий", 0}, | |
809 {"Синтия", 1}, | |
810 {"Скалис", 0}, | |
811 {"Скелет", 0}, | |
812 {"Скорпикора", 1}, | |
813 {"Скотт", 0}, | |
814 {"Слабый", 0}, | |
815 {"Слейд", 0}, | |
816 {"Собака", 1}, | |
817 {"Собор", 0}, | |
818 {"Сол", 0}, | |
819 {"Солнце", 2}, | |
820 {"Сонни", 0}, | |
821 {"Спенсер", 0}, | |
822 {"Старший", 0}, | |
823 {"Стейси", 1}, | |
824 {"Стелс", 0}, | |
825 {"Стефан", 0}, | |
826 {"Стефани", 1}, | |
827 {"Стив", 0}, | |
828 {"Стивен", 0}, | |
829 {"Сторожевая", 1}, | |
830 {"Страж", 0}, | |
831 {"Стражник", 0}, | |
832 {"Стрекозавр", 0}, | |
833 {"Стрелок", 0}, | |
834 {"Стэн", 0}, | |
835 {"Стэнли", 0}, | |
836 {"Стюарт", 0}, | |
837 {"Суанна", 1}, | |
838 {"Судья", 0}, | |
839 {"Сулейман", 0}, | |
840 {"Сумеречный", 0}, | |
841 {"Сьюзан", 1}, | |
842 {"Сьюзи", 1}, | |
843 {"Сэм", 0}, | |
844 {"Сэнди", 1}, | |
845 {"Сэндин", 1}, | |
846 {"Сэра", 1}, | |
847 {"Сюзанна", 1}, | |
848 {"Тадеус", 0}, | |
849 {"Тайлер", 0}, | |
850 {"Тайсон", 0}, | |
851 {"Така", 0}, | |
852 {"Тамара", 1}, | |
853 {"Тамми", 1}, | |
854 {"Таня", 1}, | |
855 {"Тара", 1}, | |
856 {"Тейн", 0}, | |
857 {"Теодор", 0}, | |
858 {"Тереза", 1}, | |
859 {"Тереса", 1}, | |
860 {"Терранс", 0}, | |
861 {"Терри", 1}, | |
862 {"Тим", 0}, | |
863 {"Тимоти", 0}, | |
864 {"Тина", 1}, | |
865 {"Тиффани", 1}, | |
866 {"Тобиас", 0}, | |
867 {"Тодд", 0}, | |
868 {"Том", 0}, | |
869 {"Томас", 0}, | |
870 {"Тон", 0}, | |
871 {"Тони", 0}, | |
872 {"Тран", 0}, | |
873 {"Трейси", 1}, | |
874 {"Трент", 0}, | |
875 {"Трентон", 0}, | |
876 {"Трина", 1}, | |
877 {"Трип", 0}, | |
878 {"Трисия", 1}, | |
879 {"Троглодит", 0}, | |
880 {"Тронный", 0}, | |
881 {"Трувор", 0}, | |
882 {"Трэвис", 0}, | |
883 {"Туманный", 0}, | |
884 {"Тэд", 0}, | |
885 {"Тэрри", 1}, | |
886 {"Тюрьма", 1}, | |
887 {"Уальдо", 0}, | |
888 {"Уилберт", 0}, | |
889 {"Уильсон", 0}, | |
890 {"Ундина", 1}, | |
891 {"Уоллес", 0}, | |
892 {"Уоррен", 0}, | |
893 {"Упырь", 0}, | |
894 {"Учебный", 0}, | |
895 {"Уэбб", 0}, | |
896 {"Фабиан", 0}, | |
897 {"Фамильный", 0}, | |
898 {"Фарелл", 0}, | |
899 {"Федрус", 0}, | |
900 {"Фейт", 1}, | |
901 {"Феликс", 0}, | |
902 {"Фелиция", 1}, | |
903 {"Фердинанд", 0}, | |
904 {"Фил", 0}, | |
905 {"Филип", 0}, | |
906 {"Филлис", 1}, | |
907 {"Филомена", 1}, | |
908 {"Флетчер", 0}, | |
909 {"Флойд", 0}, | |
910 {"Флоренция", 1}, | |
911 {"Флосси", 1}, | |
912 {"Форрест", 0}, | |
913 {"Франк", 0}, | |
914 {"Франклин", 0}, | |
915 {"Франц", 0}, | |
916 {"Франциск", 0}, | |
917 {"Франческа", 1}, | |
918 {"Фред", 0}, | |
919 {"Фредерик", 0}, | |
920 {"Хавьер", 0}, | |
921 {"Хайден", 0}, | |
922 {"Хайди", 1}, | |
923 {"Хан", 0}, | |
924 {"Ханк", 0}, | |
925 {"Ханн", 0}, | |
926 {"Хаос", 0}, | |
927 {"Харви", 0}, | |
928 {"Харди", 0}, | |
929 {"Хариетта", 1}, | |
930 {"Харлан", 0}, | |
931 {"Харлей", 0}, | |
932 {"Харольд", 0}, | |
933 {"Харрисон", 0}, | |
934 {"Хелен", 1}, | |
935 {"Хильда", 1}, | |
936 {"Хит", 0}, | |
937 {"Хитер", 1}, | |
938 {"Хитет", 0}, | |
939 {"Хитоми", 1}, | |
940 {"Ходячий", 0}, | |
941 {"Хок", 0}, | |
942 {"Холден", 0}, | |
943 {"Холли", 1}, | |
944 {"Храм", 0}, | |
945 {"Хранилище", 2}, | |
946 {"Хью", 0}, | |
947 {"Хьюго", 0}, | |
948 {"Хэл", 0}, | |
949 {"Хэмптон", 0}, | |
950 {"Царь", 0}, | |
951 {"Цезарь", 0}, | |
952 {"Циклон", 0}, | |
953 {"Цитадель", 1}, | |
954 {"Чад", 0}, | |
955 {"Чак", 0}, | |
956 {"Чан", 0}, | |
957 {"Чандра", 1}, | |
958 {"Чарли", 0}, | |
959 {"Чарльз", 0}, | |
960 {"Чародей", 0}, | |
961 {"Часовой", 0}, | |
962 {"Чемпион", 0}, | |
963 {"Черная", 1}, | |
964 {"Чернокнижник", 0}, | |
965 {"Чертог", 0}, | |
966 {"Честер", 0}, | |
967 {"Чет", 0}, | |
968 {"Чип", 0}, | |
969 {"Чудище", 2}, | |
970 {"Шатер", 0}, | |
971 {"Шахтерская", 1}, | |
972 {"Шейла", 1}, | |
973 {"Шейлани", 1}, | |
974 {"Шелдон", 0}, | |
975 {"Шелл", 0}, | |
976 {"Шелли", 1}, | |
977 {"Шеллис", 1}, | |
978 {"Шердон", 0}, | |
979 {"Шерил", 1}, | |
980 {"Шерман", 0}, | |
981 {"Шерри", 1}, | |
982 {"Шеррин", 1}, | |
983 {"Шимон", 0}, | |
984 {"Школа", 1}, | |
985 {"Шон", 0}, | |
986 {"Шоуна", 1}, | |
987 {"Штаб", 0}, | |
988 {"Шэнон", 1}, | |
989 {"Шэри", 1}, | |
990 {"Шэрон", 1}, | |
991 {"Эван", 0}, | |
992 {"Эвелин", 1}, | |
993 {"Эд", 0}, | |
994 {"Эдгар", 0}, | |
995 {"Эдди", 0}, | |
996 {"Эдисон", 0}, | |
997 {"Эдит", 1}, | |
998 {"Эдмонд", 0}, | |
999 {"Эдна", 1}, | |
1000 {"Эйб", 0}, | |
1001 {"Эйлин", 1}, | |
1002 {"Эйприл", 1}, | |
1003 {"Экспертная", 1}, | |
1004 {"Эл", 0}, | |
1005 {"Элвин", 0}, | |
1006 {"Элегантный", 0}, | |
1007 {"Элен", 1}, | |
1008 {"Элеонора", 1}, | |
1009 {"Элиот", 0}, | |
1010 {"Элисон", 1}, | |
1011 {"Элисса", 1}, | |
1012 {"Элитный", 0}, | |
1013 {"Элла", 1}, | |
1014 {"Эллен", 1}, | |
1015 {"Элси", 1}, | |
1016 {"Элтон", 0}, | |
1017 {"Эльф", 0}, | |
1018 {"Эми", 1}, | |
1019 {"Эмиль", 0}, | |
1020 {"Эмма", 1}, | |
1021 {"Эммануил", 0}, | |
1022 {"Эммет", 0}, | |
1023 {"Энджи", 1}, | |
1024 {"Энди", 0}, | |
1025 {"Энн", 1}, | |
1026 {"Энн", 2}, | |
1027 {"Энок", 0}, | |
1028 {"Эрвин", 0}, | |
1029 {"Эрик", 0}, | |
1030 {"Эрин", 1}, | |
1031 {"Эрл", 0}, | |
1032 {"Эрнест", 0}, | |
1033 {"Эрни", 0}, | |
1034 {"Эрнин", 0}, | |
1035 {"Эрол", 0}, | |
1036 {"Этан", 0}, | |
1037 {"Этель", 1}, | |
1038 {"Эш", 0}, | |
1039 {"Эштон", 0}, | |
1040 {"Юдифь", 1}, | |
1041 {"Юрий", 0}, | |
1042 {"Ядовитый", 0}, | |
1043 {"Якоб", 0}, | |
1044 {"Ян", 0}, | |
1045 {"Янси", 0}, | |
1046 {"Ярод", 0}, | |
1047 {"Яспер", 0} | |
1048 }, | |
1049 gender_table[] = | |
1050 { | |
1051 {"ад", 0}, {"акула", 1}, {"банк", 0}, {"башня", 1}, {"бластер", 0}, {"вампир", 0}, {"вдова", 1}, {"ведьма", 1}, {"витерсмит", 0}, {"владыка", 0}, {"владычица", 1}, | |
1052 {"воин", 0}, {"вор", 0}, {"гидра", 1}, {"глаз", 0}, {"голем", 0}, {"гора", 1}, {"горгулья", 1}, {"город", 0}, {"громовая", 1}, {"двор", 0}, {"джинн", 0}, | |
1053 {"дракон", 0}, {"дух", 0}, {"житель", 0}, {"жительница", 1}, {"зал", 0}, {"защитник", 0}, {"земля", 1}, {"искатель", 0}, {"ифрит", 0}, {"квартира", 1}, {"кольчуга", 1}, | |
1054 {"командир", 0}, {"крыса", 1}, {"лейтенант", 0}, {"луна", 1}, {"людоед", 0}, {"магог", 0}, {"меч", 0}, {"мечник", 0}, {"минотавр", 0}, {"мышь", 1}, {"наемник", 0}, | |
1055 {"огненная", 1}, {"огонь", 0}, {"орк", 0}, {"паук", 0}, {"пещера", 1}, {"пещеры", 1}, {"повелитель", 0}, {"погреб", 0}, {"полигон", 0}, {"приют", 0}, {"птица", 1}, | |
1056 {"птичий", 0}, {"работник", 0}, {"рай", 0}, {"рейнджер", 0}, {"рух", 0}, {"слизень", 0}, {"солдат", 0}, {"титан", 0}, {"трактир", 0}, {"тролль", 0}, {"убийца", 0}, | |
1057 {"улан", 0}, {"училище", 2}, {"шляпа", 1}, {"элементал", 0} | |
1058 }; | |
1059 | |
1060 | |
1061 | |
1062 #include <mbstring.h> | |
1063 | |
1064 int GetGender(char *ansi_name, int name_len) | |
1065 { | |
1066 auto name = (unsigned char *)ansi_name; | |
1067 | |
1068 GenderTableEntry *table = nullptr; | |
1069 unsigned int table_size = 0; | |
1070 if (name[0] >= (unsigned char)'а' && name[0] <= (unsigned char)'я') | |
1071 { | |
1072 table = gender_table; | |
1073 table_size = sizeof(gender_table) / sizeof(*gender_table); | |
1074 } | |
1075 else if (name[0] >= (unsigned char)'А' && name[0] <= (unsigned char)'Я') | |
1076 { | |
1077 table = gender_table_caps; | |
1078 table_size = sizeof(gender_table_caps) / sizeof(*gender_table_caps); | |
1079 } | |
1080 else return 0; | |
1081 | |
1082 int left = 0, | |
1083 right = table_size - 1, | |
1084 match = 0; | |
1085 while (left <= right) | |
1086 { | |
1087 match = left + (right - left) / 2; | |
1088 switch (_mbsncmp(name, (unsigned char *)table[match].name, name_len)) | |
1089 { | |
1090 case -1: right = match; break; | |
1091 case 0: return table[match].gender; | |
1092 case 1: left = match; break; | |
1093 } | |
1094 } | |
1095 assert(false); | |
1096 return 0; | |
1097 } | |
1098 | |
1099 | |
1100 bool IsSpecialName(const char *ansi_name) | |
1101 { | |
1102 auto name = (unsigned char *)ansi_name; | |
1103 return !_mbsncmp(name, (unsigned char *)"Мэри Джо", 8) || !_mbsncmp(name, (unsigned char *)"Ли Энн", 6) || | |
1104 !_mbsncmp(name, (unsigned char *)"Врата в Бездну", 14) || !_mbsncmp(name, (unsigned char *)"Стены тумана", 12); | |
1105 } | |
1106 int GetSpecialGender(const char *ansi_name) | |
1107 { | |
1108 auto name = (unsigned char *)ansi_name; | |
1109 if (!_mbsncmp(name, (unsigned char *)"Мэри Джо", 8)) | |
1110 return 1; | |
1111 if (!_mbsncmp(name, (unsigned char *)"Ли Энн", 6)) | |
1112 return 1; | |
1113 if (!_mbsncmp(name, (unsigned char *)"Врата в Бездну", 14)) | |
1114 return 1; | |
1115 if (!!_mbsncmp(name, (unsigned char *)"Стены тумана", 12)) | |
1116 return 0; | |
1117 return 0; | |
1118 } | |
1119 const char *GetSpecialCase(const char *ansi_name, char c) | |
1120 { | |
1121 auto name = (unsigned char *)ansi_name; | |
1122 | |
1123 if (!_mbsncmp(name, (unsigned char *)"Мэри Джо", 8)) | |
1124 return "Мэри Джо"; | |
1125 if (!_mbsncmp(name, (unsigned char *)"Ли Энн", 6)) | |
1126 return "Ли Энн"; | |
1127 | |
1128 if (!_mbsncmp(name, (unsigned char *)"Врата в Бездну", 14)) | |
1129 switch (c) | |
1130 { | |
1131 case 'I': case 'i': return "Врата в Бездну"; | |
1132 case 'R': case 'r': return "Врат в Бездну"; | |
1133 case 'D': case 'd': return "Вратам в Бездну"; | |
1134 case 'V': case 'v': return "Врат в Бездну"; | |
1135 case 'T': case 't': return "Вратами в Бездну"; | |
1136 case 'P': case 'p': return "Вратах в Бездну"; | |
1137 } | |
1138 | |
1139 if (!_mbsncmp(name, (unsigned char *)"Стены тумана", 12)) | |
1140 switch (c) | |
1141 { | |
1142 case 'I': case 'i': return "Стены тумана"; | |
1143 case 'R': case 'r': return "Стен тумана"; | |
1144 case 'D': case 'd': return "Стенам тумана"; | |
1145 case 'V': case 'v': return "Стены тумана"; | |
1146 case 'T': case 't': return "Стенами тумана"; | |
1147 case 'P': case 'p': return "Стенах тумана"; | |
1148 } | |
1149 | |
1150 return nullptr; | |
1151 } | |
1152 | |
1153 int __cdecl sprintfex_internal(char *str) | |
1154 { | |
1155 auto p = strstr(str, "^"); | |
1156 if (!p) | |
1157 return strlen(str); | |
1158 | |
1159 char buf[8192]; | |
1160 assert(strlen(str) < sizeof(buf)); | |
1161 | |
1162 bool integer_token_defined = false; | |
1163 int integer_token = 0; | |
1164 | |
1165 bool gender_token_defined = false; | |
1166 int gender_token = 0; | |
1167 | |
1168 auto src = buf, | |
1169 dst = p; | |
1170 strcpy(buf, str + (p - str)); | |
1171 while (true) | |
1172 { | |
1173 switch (src[1]) | |
1174 { | |
1175 case 'I': | |
1176 { | |
1177 if (src[2] != '[') | |
1178 goto _invalid_token; | |
1179 src += 3; // ^I[ | |
1180 | |
1181 if (sscanf(src, "%d", &integer_token)) | |
1182 integer_token_defined = true; | |
1183 | |
1184 auto int_begin = src; | |
1185 while (*src++ != ']'); | |
1186 | |
1187 int int_len = src - int_begin - 1; | |
1188 strncpy(dst, int_begin, int_len); | |
1189 dst += int_len; | |
1190 } | |
1191 break; | |
1192 | |
1193 case 'L': | |
1194 { | |
1195 if (src[2] != '[') | |
1196 goto _invalid_token; | |
1197 assert(integer_token_defined); | |
1198 src += 3; // ^L[ | |
1199 | |
1200 auto ending1 = src; | |
1201 while (*src++ != ';'); | |
1202 auto ending2 = src; | |
1203 while (*src++ != ';'); | |
1204 auto ending3 = src; | |
1205 while (*src++ != ']'); | |
1206 | |
1207 char *actual_ending = nullptr; | |
1208 int actual_ending_len = 0; | |
1209 | |
1210 int modulo = abs(integer_token) % 10; | |
1211 if (modulo == 1) | |
1212 { | |
1213 actual_ending = ending1; | |
1214 actual_ending_len = ending2 - ending1 - 1; | |
1215 } | |
1216 else if (modulo >= 2 && modulo <= 4) | |
1217 { | |
1218 actual_ending = ending2; | |
1219 actual_ending_len = ending3 - ending2 - 1; | |
1220 } | |
1221 else | |
1222 { | |
1223 actual_ending = ending3; | |
1224 actual_ending_len = src - ending3 - 1; | |
1225 } | |
1226 | |
1227 strncpy(dst, actual_ending, actual_ending_len); | |
1228 dst += actual_ending_len; | |
1229 } | |
1230 break; | |
1231 | |
1232 case 'R': | |
1233 { | |
1234 if (src[2] != '[') | |
1235 goto _invalid_token; | |
1236 assert(gender_token_defined); | |
1237 | |
1238 src += 3; // ^R[ | |
1239 | |
1240 auto ending1 = src; | |
1241 while (*src++ != ';'); | |
1242 auto ending2 = src; | |
1243 while (*src++ != ';'); | |
1244 auto ending3 = src; | |
1245 while (*src++ != ']'); | |
1246 | |
1247 char *actual_ending = nullptr; | |
1248 int actual_ending_len = 0; | |
1249 | |
1250 if (gender_token == 0) | |
1251 { | |
1252 actual_ending = ending1; | |
1253 actual_ending_len = ending2 - ending1 - 1; | |
1254 } | |
1255 else if (gender_token == 1) | |
1256 { | |
1257 actual_ending = ending2; | |
1258 actual_ending_len = ending3 - ending2 - 1; | |
1259 } | |
1260 else if (gender_token == 2) | |
1261 { | |
1262 actual_ending = ending3; | |
1263 actual_ending_len = src - ending3 - 1; | |
1264 } | |
1265 else assert(false); | |
1266 | |
1267 strncpy(dst, actual_ending, actual_ending_len); | |
1268 dst += actual_ending_len; | |
1269 } | |
1270 break; | |
1271 | |
1272 case 'P': | |
1273 { | |
1274 if (src[3] != '[') | |
1275 goto _invalid_token; | |
1276 switch (src[2]) | |
1277 { | |
1278 case 'I': case 'i': | |
1279 case 'R': case 'r': | |
1280 case 'D': case 'd': | |
1281 case 'V': case 'v': | |
1282 case 'T': case 't': | |
1283 case 'P': case 'p': break; | |
1284 default: | |
1285 goto _invalid_token; | |
1286 } | |
1287 | |
1288 if (IsSpecialName(src + 4)) | |
1289 { | |
1290 __debugbreak(); // check this is ok | |
1291 auto name = GetSpecialCase(src + 4, src[2]); | |
1292 int name_len = strlen(name); | |
1293 | |
1294 gender_token = GetSpecialGender(src + 4); | |
1295 gender_token_defined = true; | |
1296 | |
1297 strncpy(dst, name, name_len); | |
1298 dst += name_len; | |
1299 while (*src++ != ']'); | |
1300 break; | |
1301 } | |
1302 | |
1303 auto name_begin = src + 4; | |
1304 int name_len = 0; | |
1305 for (int i = 0; name_begin[i] != ']'; ++i) | |
1306 name_len++; | |
1307 gender_token = GetGender(name_begin, name_len); | |
1308 gender_token_defined = true; | |
1309 | |
1310 switch (src[2]) | |
1311 { | |
1312 case 'I': case 'i': | |
1313 { | |
1314 strncpy(dst, name_begin, name_len); | |
1315 dst += name_len; | |
1316 } | |
1317 break; | |
1318 | |
1319 case 'R': case 'r': | |
1320 case 'D': case 'd': | |
1321 case 'V': case 'v': | |
1322 case 'T': case 't': | |
1323 case 'P': case 'p': | |
1324 { | |
1325 auto token_begin = src; | |
1326 int token_len = 0; | |
1327 for (int i = 0; token_begin[i] != ']'; ++i) | |
1328 token_len++; | |
1329 strncpy(dst, token_begin, token_len); | |
1330 dst += token_len; | |
1331 } | |
1332 } | |
1333 while (*src++ != ']'); | |
1334 } | |
1335 break; | |
1336 | |
1337 default: | |
1338 { | |
1339 _invalid_token: | |
1340 auto token_begin = src; | |
1341 while (*src++ != ']'); | |
1342 | |
1343 int token_len = src - token_begin; | |
1344 char token[1024]; | |
1345 strncpy(token, token_begin, token_len); | |
1346 token[token_len] = 0; | |
1347 | |
1348 Log::Warning(L"Invalid format token: %S", token); | |
1349 assert(false); | |
1350 } | |
1351 break; | |
1352 } | |
1353 | |
1354 *dst = 0; | |
1355 | |
1356 auto copy_begin = src; | |
1357 src = strstr(src, "^"); | |
1358 if (!src) | |
1359 { | |
1360 strcpy(dst, copy_begin); // just copy the rest | |
1361 break; | |
1362 } | |
1363 | |
1364 int copy_len = src - copy_begin; | |
1365 strncpy(dst, copy_begin, copy_len); | |
1366 dst += copy_len; | |
1367 } | |
1368 | |
1369 return dst - str; | |
1370 } | |
1371 | |
1372 | |
1373 | |
1374 | |
1375 | |
1376 | |
1377 //mm6text.non -> c structure array | |
1378 /*FILE *f = fopen("_1.txt", "w+t"); | |
1379 FILE *in = fopen("mm6text.non", "rt"); | |
1380 fscanf(in, "%*[^\n]\n"); | |
1381 | |
1382 int idx = 0; | |
1383 auto pairs = new NameGender[8000]; | |
1384 | |
1385 char line[1024]; | |
1386 while (fscanf(in, "%[^\n]\n", line) && !feof(in)) | |
1387 { | |
1388 char name1[100], name2[100], name3[100]; | |
1389 int e = sscanf(line, "%s\t%s\t%s", pairs[idx].name, pairs[idx + 1].name, pairs[idx + 2].name); | |
1390 pairs[idx].gender = 0; | |
1391 pairs[idx+1].gender = 1; | |
1392 pairs[idx+2].gender = 2; | |
1393 idx += e; | |
1394 } | |
1395 | |
1396 for (int i = 0; i < idx; ++i) | |
1397 for (int j = 0; j < i; ++j) | |
1398 { | |
1399 if (_mbsicmp(pairs[i].name, pairs[j].name) < 0) | |
1400 { | |
1401 char n[1024]; | |
1402 strcpy(n, (char *)pairs[j].name); | |
1403 auto g = pairs[j].gender; | |
1404 | |
1405 strcpy((char *)pairs[j].name, (char *)pairs[i].name); | |
1406 pairs[j].gender = pairs[i].gender; | |
1407 | |
1408 strcpy((char *)pairs[i].name, n); | |
1409 pairs[i].gender = g; | |
1410 } | |
1411 } | |
1412 | |
1413 for (int i = 0; i < idx; ++i) | |
1414 { | |
1415 fprintf(f, " {\"%s\", %u},\n", pairs[i].name, pairs[i].gender); | |
1416 } | |
1417 fclose(f);*/ |