> -- Wlad писал(а):
> - портированиеПредставляю вашему вниманию, коллеги, результат моей давней задумки, когда-то начатой и не доведённой до конца... А теперь завершённой.

Преамбула. Когда-то я загорелся идеей портировать подА2игруDOOM
Нашёл в сети портDelphi DOOMи начал его портировать. Написал тогда для этой цели небольшойPascalPreprocessor, который переводил все ключевые слова в капсы, менял некоторые типы... паскалевские крышечки вPOINTER TO, например и т.д. и тому подобное.
Но передо мной встала во весь рост большая проблема. Юнитов в паскалевском исходнике>80штук и все они тесно друг друга используют. Т.е. не проблема код подправить в почти аналогичный код на Активном Обероне, апопрописывать везде квалифицированный импорт это уже огромная проблема.
И мне пришла идея скинуть весь код юнитов в один здоровенный юнит, тогда квалифицированный импорт просто не надо будет прописывать.
Вот, и начал я тогда писать этот инструмент. И сейчас закончил
При объединении объединяются соответствующие секции: интерфейсная, реализации, инициализации и финализации каждого модуля. Что-бы всё объединить в правильном порядке применена топологическая сортировка.
В таком объединённом юните конечно возникает другая проблема - конфликты имён в реализационной части. Но как я и предполагал, таких конфликтов будет не слишком много. В проектеDelphi DOOMоказалось всего 12 таких конфликтов.
Я их все задокументировал (на инглиш). Какие-то лучше править в исходных юнитах, какие-то в конечном результате:
> -- Цитата:
> Implementation parts conflicts:Fix in original units:* BACKUPTICS constant in d_net and i_net units. Solution: BACKUPTICS -> I_NET_BACKUPTICS in i_net unit* finished variable in wi_stuff and i_system units. Solution: finished -> i_system_finished in i_system unit* MAXSPECIALCROSS constant in p_enemy and p_map units. Solution: constant in p_enemy just not used, remove it* NUMSPRITES enum and numsprites variable in info_h and r_things units respectively. Solution: numsprites -> r_things_numsprites in r_things and r_data units* mousex and mousey variables in m_menu and g_game units. Solution: mousex -> g_game_mousex and mousey -> g_game_mousey in g_game unit* anims variable in p_spec and wi_stuff units. Solution: anims -> wi_stuff_anims in wi_stuff unit* BG constant and bg variable in hu_lib and wi_stuff units respectively. Solution: BG constant just not used, remove it* plr variable in hu_stuff and am_map units. Solution: plr -> hu_stuff_plr in hu_stuff unit* messages enum in m_menu unit conflicts with standard messages unit name. Solution: messages -> enum_messages in m_menu unit* WindowProc function in i_midi and i_main units. Solution: WindowProc -> i_midi_WindowProc in i_midi unit* y variable in m_menu rename to m_menu_y* close function rename to closefile function in d_delphi, d_main, i_music, m_menu, m_misc and z_zone unitsFix in combined unit:* SAVESTRINGSIZE constant in g_game and m_menu units. Solution: both constants are equal, just leave one of it that will be declared earlier in combined unit
Потом обработать этот комбинированный код тем первоначальным препроцессором и глядишь, скоро думец под А2 будет

Прилагаю файлы оригинального порта, утилиту и конечный результат. Код так же залит в Oberon Community репозиторий.
Замечания, пожелания, планы... что портировать в первую очередь?