Намедни в новостях промелькнуло, что Микрософт откопал и выложил в открытый доступ доисторические тексты 86-DOS, который позже превратился в MS-DOS. Там не так много, но среди прочего фрагмент EDLIN, текстового редактора той эпохи. То есть EDLIN старше чем сам MS-DOS.
У меня с детства слабость к текстовым редакторам. Никогда не приходилось пользоваться EDLIN, и я подумал, пора бы научиться. Но не ползать же по ассемблерным исходникам, выясняя фичи. Можно запрячь ИИ для благородной цели.
Я взял аутентичные исходники EDLIN, благо Микрософт открыл их два года назад в составе MS-DOS 4.0. Подсунул ассемблерные тексты Курсору и говорю: перепиши на современный Си11. Он пошуршал и переписал. Хорошо, говорю, а теперь изучи как оно работает и документируй. Тоже сделал. И тестами покрыл.
Вот вам готовый проект того самого EDLIN в современном переносимом виде. По сравнению с оригиналом я сделал два простых изменения. Добавил команду H (help), показывающую список команд редактора. И вместо ^Z как конец ввода разрешил просто точку, как в юниксном ed.
У меня с детства слабость к текстовым редакторам. Никогда не приходилось пользоваться EDLIN, и я подумал, пора бы научиться. Но не ползать же по ассемблерным исходникам, выясняя фичи. Можно запрячь ИИ для благородной цели.
Я взял аутентичные исходники EDLIN, благо Микрософт открыл их два года назад в составе MS-DOS 4.0. Подсунул ассемблерные тексты Курсору и говорю: перепиши на современный Си11. Он пошуршал и переписал. Хорошо, говорю, а теперь изучи как оно работает и документируй. Тоже сделал. И тестами покрыл.
Вот вам готовый проект того самого EDLIN в современном переносимом виде. По сравнению с оригиналом я сделал два простых изменения. Добавил команду H (help), показывающую список команд редактора. И вместо ^Z как конец ввода разрешил просто точку, как в юниксном ed.
- Репозиторий на Гитхабе: sergev/edlin
- Руководство пользователя: Manual.md
- Введение в EDLIN для чайников: Tutorial.md
$ edlin main.c
*93p
93: int main(int argc, char **argv)
94: {
95: char *path = NULL;
96: int binary = 0;
97: if (parse_invocation(argc, argv, &path, &binary) != 0) {
98: msg_ndname();
99: return 1;
100: }
101:
102: Editor ed;
103: editor_init(&ed);
104: ed.disp_rows = env_u("EDLIN_LINES", tty_rows());
105:
106: if (fileio_startup(&ed, path, binary) != 0) {
107: editor_free(&ed);
*_
