Побудова простого текстового редактора для платформи UNIX

Основні теоретичні відомості про ОС Linux. Мови програмування і утиліти. Система X Window. Телекомунікації і BBS, використовувані Linux. Емулятор MS-DOS для виконання додатків, які використовується Linux. Блок для роботи з текстовими фрагментами.

Рубрика Программирование, компьютеры и кибернетика
Вид курсовая работа
Язык украинский
Дата добавления 28.03.2009
Размер файла 119,2 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

22

Міністерство освіти і науки України

ФАКУЛЬТЕТ ІНФОРМАТИКИ

КАФЕДРА

КУРСОВА РОБОТА

Тема: Побудова простого текстового редактора для платформи UNIX

Зміст

Вступ

Теорія

Практична частина

Висновки

Література

Вступ

Linux - це сучасна POSIX-сумісна і Unix-подібна операційна система для персональних комп'ютерів і робочих станцій.

Це багатокористувацька мережна операційна система з мережною віконною графічною системою X Window System. ОС Linux підтримує стандарти відкритих систем і протоколи мережі Internet і сумісна із системами Unix, DOS, MS Windows. Усі компоненти системи, включаючи вихідні тексти, поширюються з ліцензією на вільне копіювання й установку для необмеженого числа користувачів.

ОС Linux широко поширена на платформах Intel PC 386/486/Pentium/Pentium Pro і завойовує позиції на ряді інших платформ

Головною задачею нашої роботи є побудова простого текстового редактора для цієї платформи.

Теорія

Основні теоретичні відомості про ОС Linux

Практически любая утилита, которую вы ожидаете найти в стандартных реализациях UNIX, имеется и в Linux. Сюда включены и базовые команды, такие как ls, awk, tr, sed, bc, more и т.д. Назовите любую - она есть в Linux. Поэтому вы в праве ожидать знакомой рабочей UNIX-среды. В Linux есть все стандартные команды и утилиты. (Новички могут посмотреть Главу 3 для начального знакомства с базовыми командами UNIX).

В Linux имеются многие текстовые редакторы, включая vi, ex, pico, jove, также как GNU Emacs и его вариации, вроде Lucid Emacs (который содержит расширение для использования под X Windows) и joe. Скорее всего, любой текстовый редактор, к которому вы привыкли, перенесен в Linux.

Выбор редактора - явление любопытное. Многие пользователи UNIX до сих пор используют "простые" редакторы вроде vi (кстати, автор писал эту книгу в Linux, используя редактор vi) (кстати, переводчик переводил эту книгу в Linux, используя редактор red).

Но vi имеет много ограничений по причине своего преклонного возраста, сейчас завоевывают популярность более современные и сложные редакторы вроде Emacs. Emacs поддерживает базирующийся на LISP макроязык и интерпретатор, мощный командный синтаксис и другие расширения. Существуют макропакеты Emacs, позволяющие читать электронную почту и новости, редактировать содержимое каталогов и даже проводить сеансы психотерапии с использованием искусственного интеллекта (неоценимая возможность для измотанных Linux-ом хакеров).

Интересное замечание - большинство утилит Linux имеют статус GNU. Эти утилиты часто поддерживают наиболее современные черты, не содержащиеся в стандартных версиях BSD или AT&T. Например, версия GNU редактора vi - elvis, содержит структурный макроязык, который отличается от исходной реализации AT&T. Но тем не менее, утилиты GNU сохраняют совместимость с их тезками из BSD и System V. Многие считают, что GNU версии лучше исходных программ.

Многие пользователи самой важной утилитой считают shell. shell - это программа, которая читает и выполняет команды пользователя. Кроме того, многие оболочки (shells) имеют такие возможности, как контроль выполнения> (job control) (позволяя пользователю управлять несколькими параллельными процессами), перенаправление входа-выхода и командный язык для написания командных файлов (shell scripts). Командный файл - это программа на языке оболочки, аналогичная "batch file" в MS-DOS.

В Linux много типов оболочек. Наиболее важное различие между ними - используемый командный язык. Например, C Shell (csh) использует командный язык, чем-то напоминающий язык программирования Си. Классический Баурновский shell (Bourne Shell) использует иной командный язык. Обычно выбор оболочки обусловлен выбором соответствующего командного языка. Выбранная оболочка в какой-то мере определяет вашу рабочую среду.

Не важно, к какой оболочке вы привыкли, та или иная ее версия есть в Linux. Наиболее популярная оболочка - это GNU Bourne Again Shell (bash), т.е. вариант Bourne shell, включающий много современных свойств и возможностей, таких как управление работами, командную историю, дописывание имен команд и имен файлов, Emacs-подобный интерфейс редактирования командной строки и мощное расширение стандартной оболочки (Bourne shell).

Другая популярная оболочка - tcsh, версия C Shell с более современными функциями по сравнению с bash. Другие оболочки: zsh - небольшая баурно-подобная оболочка; ksh - оболочка Корна; ash - оболочка BSD и rc -оболочка проекта Plan 9.

Что особенно важно сказать относительно этих оболочек? Linux дает вам уникальную возможность кроить систему под ваши личные нужды. Например, если вы единственный пользуетесь этой системой и вы предпочитаете редактор vi и bash в качестве оболочки, то нет необходимости иметь прочие редакторы и оболочки. "Сделай сам, как тебе нравится" - это позиция хакеров и пользователей Linux.

Обработка текстов и слов

Почти все пользователи нуждаются в какой-либо системе подготовки документов. (Много ли вы знаете энтузиастов компьютерной обработки, которые все еще пользуются ручкой и бумагой? Мы догадываемся, что очень немного). В мире персональных компьютеров обработка слов (word processing) - норма: она включает редактирование и манипуляции с текстом (часто в стиле WYSIWYG - "What-You-See-Is-What-You-Get" - "Что-Вы-Видите-Есть-То- Что-Вы-Имеете" - ЧВВЕТЧВИ) и получение печатных копий, содержащих рисунки, таблицы и другой гарнир.

В мире UNIX обработка текстов (text processing)- вещь более естественная, чем классическая концепция обработки слов. Вместо того, чтобы вызывать специальные средства обработки слов, исходный текст можно модифицировать любым текстовым редактором, таким как vi или Emacs. После подготовки текста пользователь форматирует текст специальными программами, преобразующими его к нужному для печати виду. Это в чем-то аналогично программированию на языке вроде Си, и "компилированию" текста в пригодную для печати форму.

В Linux много текстовых процессоров. Один из них groff - GNU версия классического форматера текстов nroff, первоначально созданного в Bell Labs и до сих пор используемого во многих UNIX. Другой современный текстовый процессор - TeX, создан знаменитым в компьютерном мире Дональдом Кнутом (Donald Knuth). Доступны диалекты TeX, такие как LaTeX.

Текстовые процессоры, такие как TeX и groff значительно различаются по синтаксису языков форматирования. Предпочтение той или иной системы форматирования в значительной мере базируется на том, какие имеются вспомогательные утилиты и насколько система вам по вкусу.

Например, некоторые люди считают groff несколько заумным, поэтому они используют TeX, который более понятен для хомо сапиенс. Между тем, groff может давать ясный ASCII выход, легко читаемый на терминале, в то время как TeX прежде всего предназначен для вывода на печать. Но существуют многочисленные программы, позволяющие получить читаемый текст из отформатированных с помощью TeX документов или конвертирующих TeX, например, в groff.

Другой текстовый процессор texinfo - расширение TeX, используемое для подготовки программной документации в Free Software Foundation. texinfo может формировать печатный документ или гипертекст "Info" для просмотра на экране на основе одного исходного файла. Файлы Info - это основной формат для документирования, используемый в GNU, в частности в Emacs.

Текстовые процессоры широко используются в компьютерном мире для подготовки статей, диссертаций, статей для журналов и книг (типографский вариант этой книги был подготовлен с использованием LaTeX). Возможность обрабатывать исходный язык как текстовый файл открывает двери.

Как выглядит язык форматирования? В общем случае он содержит сам текст с "управляющими кодами" для производства заказанных действий, таких как изменение фонтов, установление полей, формирование страниц и т.д.

В качестве примера возьмем следующий текст:

Mr. Torvalds:

We are very upset with your current plans to implement

post-hypnotic suggestion in the Linux terminal driver code.

We feel this way for three reasons:

1. Planting subliminal messages in the terminal driver is not

only immoral, it is a waste of time;

2. It has been proven that ``post-hypnotic suggestions'' are

ineffective when used upon unsuspecting UNIX hackers;

3. We have already implemented high-voltage electric shocks,

as a security measure, in the code for login.

We hope you will reconsider.

Этот текст на языке форматирования LaTeX будет выглядеть следующим образом:

\begin{quote}

Mr. Torvalds:

We are very upset with your current plans to implement {\em post-

hypnotic

suggestion\/} in the {\bf Linux} termi-

nal driver code. We feel this

way for three reasons:

\begin{enumerate}

\item Planting subliminal messages in the ker-

nel driver is not only

immoral, it is a waste of time;

\item It has been proven that ``post-hypnotic sugges-

tions'' are ineffective

when used upon unsuspecting UNIX hackers;

\item We have already implemented high-voltage elec-

tric shocks, as a

security measure, in the code for {\tt login}.

\end{enumerate}

We hope you will reconsider.

\end{quote}

Автор входит в "исходный" текст, приведенный выше, используя любой текстовый редактор, и генерирует форматированный выход, обрабатывая текст с помощью LaTeX. На первый взгляд такой язык может показаться достаточно заумным, но в действительности он очень прост в освоении. Использование текстового процессора обеспечивает поддержку типографских стандартов. Например, все перечисленные в рамках документа страницы будут выглядеть одинаково. Пишущий может сосредоточиться на тексте, а не на том, как это следует оформлять с точки зрения типографских требований.

Процессоры слов типа WYSIWYG привлекательны по многим причинам: они обеспечивают мощный (а иногда и сложный) визуальный интерфейс для редактирования документов. Но этот интерфейс традиционно ограничен желательными и приемлемыми для пользователя формами выдачи. Так, многие процессоры имеют средства подготовки к печати математических формул.

Преимущество текстовых процессоров состоит в том, что они позволяют описывать именно то, что вы хотите. Они позволяют также редактировать исходный текст любым текстовым редактором и затем конвертировать в различные форматы. Платой за такую гибкость является отсутствие тех качеств интерфейса, которые есть у WYSIWYG.

Многие пользователи процессоров слов привыкли видеть отредактированный текст сразу в процессе редактирования. С другой стороны, при использовании текстового процессора пишущий не заботится о том, как будет выглядеть уже отформатированный текст. Пишущий лишь должен иметь представление о том, какие действия произведут вставляемые им команды форматирования.

Есть программы, которые позволяют посмотреть на графическом дисплее вид отформатированного документа перед его печатью. Например, программа xdvi отображает "независимый от устройства" файл, сгенерированный TeX под X Window. Другое приложение - xfig, обеспечивает графический интерфейс WYSIWYG для рисунков и диаграмм, который в последующем конвертируется в команды текстового процессора, включаемые в документ.

Следует напомнить, что текстовые процессоры, вроде nroff, появились задолго до процессоров слов. Многие предпочитают использовать текстовые процессоры из-за их гибкости и независимости от графической среды. В любом случае, в Linux имеется процессор слов idoc, а также скоро ожидается появление коммерческих процессоров слов. Но если вы не хотите расставаться с процессором слов, к которому вы привыкли в MS-DOS, вы всегда можете использовать MS-DOS или другую операционную систему в дополнение к Linux.

Существует и много других утилит текстовых процессоров. Мощная система METAFONT используется для проектирования фонтов в TeX. Другие программы включают ispell - интерактивный контролер правописания, makeindex - используется для генерации индексов в документах, подготовленных в LaTeX. Существует много макропакетов для groff и TeX для форматирования документов различных типов и математических текстов, а также тьма конверторов, транслирующих TeX или groff во многие другие форматы.

Языки программирования и утилиты

Linux обеспечивает полную UNIX-среду программирования, включая все стандартные библиотеки, программный инструментарий, компиляторы, отладчики, которые вы встречаете и в других UNIX-системах. В мире UNIX большинство приложений и системных программ делаются на Си или Си++. Стандартным компилятором для Си и Си++ в Linux служит GNU gcc, который является современным компилятором, поддерживающим много опций. Он способен компилировать Си++ (включая особенности AT&T 3.0 features) также, как Objective-C, другие объектно-ориентированные диалекты Си.

Кроме Си и Си++ многие другие компиляторы и интерпретаторы были перенесены в Linux, такие как Smalltalk, FORTRAN, Pascal, LISP, Scheme и Ada (если вы настолько мазохист, чтобы программировать на Аде - мы не будем вам препятствовать). В дополнение, существуют различные ассемблеры для написания кодов для защищенного режима 80386, а также любимые хакерами языки, вроде Perl (язык сценариев, как окончательный тупик или вершина для всех языков такого типа) и Tcl/Tk (shell-подобный командный язык, включающий поддержку разработки простейших приложений в X Window).

В Linux был перенесен продвинутый отладчик gdb, позволяющий пошагово выполнять программы в поисках ошибок или анализировать крах программ с помощью дампов памяти. gprof - утилита профилирования, показывающая, где ваша программа при выполнении тратит больше времени. Текстовый редактор Emacs позволяет осуществлять интерактивное редактирование. Другие инструменты, включая GNU make и imake используются для управления компиляцией больших программ; RCS - система для защиты и сопровождения исходных текстов.

Linux содержит динамические библиотеки (DLL), которые позволяют экономить место, поскольку они вызываются только во время выполнения. Эти библиотеки позволяют также прикладному программисту переопределять функции, включая свои коды. Например, если программист желает написать свою собственную версию библиотечной программы malloc(), компоновщик подключит новую программу вместо библиотечной.

Linux идеален для создания UNIX-приложений. Он обеспечивает современное программное окружение со всеми дополнительными погремушками. Поддерживаются различные стандарты вроде POSIX.1, позволяющие легко переносить программы, написанные для Linux, на другие системы. Профессиональные UNIX-программисты и системные администраторы могут использовать Linux для домашних компьютеров, а с них переносить написанные программы на компьютеры своей фирмы. Это может не только сэкономить много времени и денег, но и обеспечить комфортабельную работу на домашнем компьютере. (Автор использует дома Linux для разработки и тестирования X Window приложений, которые могут прямо транслироваться на любых рабочих станциях). Студенты, изучающие компьютерные науки, могут использовать Linux для обучения программированию в UNIX и изучения таких аспектов, как архитектура ядра.

Через Linux вы не только имеете доступ к полному набору библиотек и утилит, но также к исходным текстам ядра и библиотек.

Система X Window

Система X Window (или кратко просто Х) - стандартный графический интерфейс для UNIX-машин. Это мощная среда, поддерживающая много приложений. Используя X Window, пользователь может одновременно иметь на экране несколько окон, при этом каждое имеет независимый login. Часто используется мышь, хотя она необязательна.

Было написано много специфических Х-приложений, таких как игры, графические утилиты, инструментарий для программирования и документирования и т.д. С Linux и X ваш компьютер - замечательная рабочая станция. Используя протоколы TCP/IP, вы можете смотреть у себя X-приложения, выполняемые на других машинах.

Система X Window была первоначально создана в MIT и свободно распространялась. Существует много и коммерческих приложений, расширяющих возможности X Window. Для Linux есть система X Window, известная как XFree86; версия X11R5 свободно распространяется для UNIX-систем типа Linux. XFree86 поддерживает широкий спектр видео устройств, включая VGA, Super VGA, различные видео адаптеры с ускорителями. Это полный комплект X Window, содержащий сам сервер, много прикладных программ и утилит, программные библиотеки и документацию.

Стандартные Х-приложения включают xterm (эмулятор терминала, используемый в большинстве текстовых приложений в X Window); xdm (X-менеджер, обслуживающий login); xclock (представление простых часов); xman (X-ориентированное руководство по Linux) и т.д. Трудно перечислить все приложения X, доступные в Linux, но базовый комплект XFree86 включает "стандартные" приложения, содержащиеся в исходной версии MIT. Но доступно и многое другое, теоретически, все написанное для X Window должно прямо компилироваться и для Linux.

Интерфейс X Window в большой степени контролируется менеджером окон (window manager). Эта программа отвечает за размещение окон, изменение их размеров, размещение иконок, перемещение окон, вид оконных рамок и т.д. Стандартный дистрибутив XFree86 включает twm, классический оконный менеджер MIT, но также имеются и более современные менеджеры, такие как Open Look Virtual Window Manager (olvwm). Среди пользователей Linux популярен fvwm. Это небольшой менеджер окон, требующий в два с лишним раза меньше памяти, чем twm. Он обеспечивает трехмерное представление обрамления окон и виртуальный рабочий стол (desktop) - если пользователь подвигает мышь к краю экрана, все изображение смещается, будто дисплей имеет большие размеры, чем на самом деле. fvwm более традиционен и позволяет реализовать все функции доступа как с клавиатуры, так и от мыши. Многие дистрибутивы Linux содержат fvwm, как стандартный менеджер окон.

Дистрибутив XFree86 содержит программные библиотеки и включает файлы для тех программистов, кто желает создавать приложения в X. Поддерживаются различные множества widget (графических представлений), такие как Athena, Open Look и Xaw3D. Включены все стандартные фонты, битмэпы и документация. Поддерживается также PEX (программный интерфейс для трехмерной графики).

Многие пользующиеся Х-ом используют и имеющиеся в Motif наборы widget. Несколько компаний продают одно- и многопользовательские лицензии бинарников Motif в Linux. Поскольку Motif сам по себе сравнительно дорог, немногие владельцы Linux имеют Motif. Тем не менее, бинарники, статически связанные с библиотечными программами Motif, могут свободно распространяться. Если вы написали программы с использованием Motif и хотите их передавать, вы должны позаботиться о самодостаточности кодов.

Главные ограничения использования X Window происходят от требований к аппаратуре. Минимально необходим 386 процессор с 4 Мбайт RAM. Но для более комфортного режима желательно не менее 8 Мбайт. Желательно и процессор побыстрее, но прежде всего необходима память. Для действительно хорошего результата лучше иметь карту с акселератором (как например S3-chipset). На Linux с XFree86 был достигнут рейтинг выполнения, превосходящий 140000 xstones. На приличном компьютере вы можете убедиться, что X под Linux работает не хуже, или даже быстрее, чем на других UNIX.

Работа в сети

Интересует ли вас связь с миром? Да? Нет? Может быть? Linux поддерживает два базовых сетевых протокола UNIX: TCP/IP и UUCP. TCP/IP (Transmission Control Protocol/Internet Protocol) есть множество сетевых парадигм, позволяющих системам по всему миру связываться по единой сети, известной как Internet. С помощью Linux, TCP/IP и подключения к сети вы можете общаться с пользователями и машинами всего Internet через электронную почту, новости USENET, передачу файлов FTP и т.п. В Internet много машин под Linux.

Большинство сетей TCP/IP используют Ethernet, как физическое транспортное средство. Linux поддерживает многие популярные карты Ethernet и интерфейсы.

Однако, поскольку не у всех есть дома плата Ethernet, Linux также поддерживает SLIP (Serial Line Internet Protocol), позволяющий связываться с Internet через модем. Для использования SLIP вы должны иметь доступ к SLIP-серверу, машине связанной с сетью и обеспечивающей вам вход в Internet. Многие фирмы и университеты предоставляют SLIP-сервис. Если ваш Linux имеет Ethernet и модем, вы можете сконфигурировать систему как SLIP-сервер для других хостов.

NFS (Network File System) позволяет вам использовать файлы совместно с другими машинами сети. FTP (File Transfer Protocol) позволяет передавать файлы между машинами. Другие приложения включают sendmail - систему передачи и получения электронной почты с использованием протокола SMTP; базирующуюся на протоколе NNTP, системе электронных новостей типа C-News и INN; telnet, rlogin и rsh - позволяют войти и выполнить команды на других машинах сети; finger - позволяет получать информацию о других пользователях Internet. Фигурально выражаясь - существуют тонны различных приложений для протокола TCP/IP.

Полный спектр различных программ для чтения почты и новостей существует в Linux, это, например, elm, pine, rn, nn и tin.

Если у вас есть опыт работы с приложениями TCP/IP на других UNIX-системах, Linux не будет для вас чем-то новым. Система обеспечивает стандартный программный интерфейс, поэтому любая программа, использующая TCP/IP, может быть легко перенесена на Linux. X-сервер Linux также поддерживает TCP/IP, позволяя отображать выполняемые на других машинах прикладные программы на вашем дисплее.

UUCP (UNIX-to-UNIX Copy) - старейший механизм передачи файлов, электронной почты и электронных новостей между UNIX-машинами. Классически, UUCP-машины связываются друг с другом по телефонным линиям через модем, но UUCP может использовать в качестве транспортного средства и связь по TCP/IP. Если у вас нет доступа по TCP/IP или SLIP-сервера, вы можете сконфигурировать свою систему так, чтобы посылать и получать файлы и электронную почту с использованием UUCP. Подробнее смотрите в Главе 5.

Телекоммуникации и BBS

Если у вас есть модем, вы можете связываться с другими машинами, используя телекоммуникационные пакеты, имеющиеся в Linux. Многие используют программы телекоммуникации для связи с BBS (Bulletin Board Systems), а также и с коммерческими он-лайновыми системами, вроде Prodigy, CompuServe и America On-Line. Другие через модемы связываются с UNIX-системой в школе или на работе. Вы можете использовать модем и Linux для посылки и приема факсов. Телекоммуникационные пакеты Linux очень похожи на имеющиеся в MS-DOS или других операционных системах.

Один из наиболее популярных телекоммуникационных пакетов в Linux - Seyon - X-приложение, предоставляющее традиционный эргономичный интерфейс со встроенной поддержкой различных протоколов передачи файлов, таких как Kermit, ZModem и т.п. Есть также телекоммуникационные программы C-Kermit, pcomm и minicom. Это напоминает наборы телекоммуникационных программ в других системах.

Если у вас нет доступа к SLIP-серверу, вы можете использовать term для мультиплексирования вашей последовательной линии. term обеспечит вам множественный доступ через модем на удаленную машину. term также позволит перенаправлять X-клиента на локальный X-сервер через последовательную линию, давая возможность отобразить удаленное X-приложение на вашей Linux-системе. Другой пакет - KA9Q - обеспечивает интерфейс, похожий на SLIP.

BBS - это сегодня хобби многих программистов. Linux поддерживает большое разнообразие программ для BBS, большинство из которых более мощные, чем в других операционных системах. С телефонной линией, модемом и Linux вы можете превратить ваш компьютер в BBS, обеспечив dial-in доступ к своей системе для пользователей с Земного шара. Программное обеспечение BBS для Linux включает XBBS и пакеты UniBoard BBS.

Большинство программ BBS ограничивают пользователя меню-системой, где имеется некоторый фиксированный набор функций. Альтернативой доступу в BBS служит полный спектр возможностей доступа UNIX, который позволяет вам работать с удаленной машиной на правах обычного пользователя.

Если у вас нет возможностей использовать TCP/IP или UUCP, Linux позволяет также связываться с рядом BBS, таких как FidoNet по телефонным линиям и обмениваться новостями и почтой. Дополнительную информацию можно найти в Главе 5.

Интерфейс с MS-DOS

Существуют различные утилиты для связи с миром MS-DOS. Наиболее известен Linux MS-DOS Emulator, позволяющий выполнять многие MS-DOS программы прямо на Linux. Несмотря на то, что Linux и MS-DOS абсолютно различные операционные системы, среда защищенного режима для 80386 позволяет некоторым задачам вести себя так, как это делают прикладные программы MS-DOS.

Эмулятор MS-DOS все еще в стадии совершенствования, но многие популярные пакеты в нем уже выполняются. Понятно, что некоторые приложения MS-DOS, использующие специфические или скрытые свойства системы, никогда не будут выполняться, поскольку эмулятор не знает, как их эмулировать. Например, вы не сможете без шероховатостей выполнять программы, использующие свойства защищенного режима 80386, такие как Microsoft Windows (в расширенном режиме 386-го). Приложения, которые успешно работают под Linux MS-DOS Emulator включают: 4DOS (интерпретатор команд), Foxpro 2.0, Harvard Graphics, MathCad, Stacker 3.1, Turbo Assembler, Turbo C/C++, Turbo Pascal, Microsoft Windows 3.0 (в реальном режиме) и WordPerfect 5.1. Стандартные команды и утилиты MS-DOS (такие как PKZIP и т.п.) также работают с эмулятором.

Эмулятор MS-DOS прежде всего предназначается для тех, кому MS-DOS нужен только для выполнения нескольких приложений, но в основном используется Linux. Эмулятор, это не полное повторение MS-DOS. Разумеется, если эмулятор не удовлетворяет вашим потребностям, вы можете использовать MS-DOS непосредственно, как и Linux, на одной и той же машине. При использовании загрузчика LILO можно во время загрузки указать, какую загрузить операционную систему. Linux может сосуществовать с другими операционными системами, с той же OS/2.

Linux обеспечивает "гладкий" интерфейс для обмена файлами между Linux и MS-DOS. Вы можете примонтировать раздел MS-DOS или гибкий диск под Linux и иметь прямой доступ к файлам MS-DOS, как и к "родным".

В настоящее время находится в работе проект, известный как WINE - эмулятор Microsoft Windows для X Window System под Linux. По завершению WINE, пользователи будут иметь возможность выполнять MS-Windows приложения прямо из Linux. Это похоже на эмулятор Windows от Sun Microsystems. В момент написания этих строк WINE все еще на ранней стадии создания, но имеет хорошие перспективы. В Главе 5 мы поговорим об инструментарии MS-DOS, доступном из Linux.

Другие приложения

В Linux огромное количество всевозможных приложений, что и следует ожидать от такой "разносторонней" операционной системы. Основная ориентация Linux была на персональные UNIX-вычисления, но она быстро меняется. Все больше его используют в бизнесе и обучении, все больше появляется на рынке всевозможных коммерческих приложений.

В Linux доступно несколько реляционных баз, включая Postgres, Ingres, и Mbase. Это полномасштабные профессиональные системы управления базами данных типа клиент-сервер, похожие на имеющиеся на других платформах UNIX. Имеется также коммерческая база /rdb.

Прикладные научные пакеты включают FELT (Finite Element Analysis Tool); gnuplot (анализ данных и черчение); Octave (пакет символических вычислений, похожий на MATLAB); xspread ( калькулятор типа spreadsheet); xfractint (X-вариант популярного рекурсивного генератора Fractint); xlispstat (пакет статистики) и многое другое. Другие приложения содержат Spice (проектирование и анализ цепей) и Khoros (аналого/цифровая обработка сигналов и визуализация).

Разумеется, есть еще много приложений, которые были или будут перенесены на Linux. Linux обеспечивает полный программный UNIX-интерфейс, удобный в качестве исходной базы для любых приложений в любой научной области.

Как и другие операционные системы, Linux не стоит в стороне от компьютерных игр. Это и классические текстовые "подземельные" игры, вроде Nethack и Moria; игры типа MUDs (Multi-User Dungeons, которые позволяют взаимодействовать многим пользователям), вроде DikuMUD и TinyMUD; а также тьма игр в X, таких как xtetris, netrek и Xboard (X11-версия gnuchess). Популярная игра типа перестреляй-их-всех-в-лабиринтах - Doom также перенесена в Linux.

Для меломанов Linux поддерживает различные саунд-карты, вроде CDplayer (программа, которая может управлять драйвером CD-ROM, как традиционным CD-плейером), MIDI последовательности и редакторы (позволяющие создавать музыку на синтезаторе или другом, управляемом MIDI инструменте) и саунд-редакторы цифровой записи.

Вы не можете найти нужную прикладную программу? Карта программ Linux, приведенная в приложении А имеет большой список пакетов, которые были написаны для Linux или перенесены в него. Список далеко не полный, хотя и перечисляет большое количество пакетов. Другой способ поиска приложений в Linux, это просматривать файлы INDEX на FTP серверах под Linux, если вы имеете доступ в Internet. Оглянитесь вокруг и вы найдете много того, с чем интересно повозиться.

Но если вы совершенно не можете найти того, что вам надо, вы всегда можете попытаться перенести нужные приложения в Linux. Большая часть свободно распространяемых программ для UNIX могут быть откомпилированы для Linux, как правило, без больших проблем. Или, если компиляция не проходит, вы сами можете написать соответствующую программу. Если вам нужна коммерческая программа, возможно, что существует ее свободно распространяемый вариант. А может, вы убедите компанию сделать выполняемые версии для Linux. История знает случаи, когда удавалось уговорить компании.

Практична частина

Результатом нашої роботи є програма для роботи з текстом (найпростіший текстовий редактор для OS Linux) (мал. 1.)

Мал. 1.Загальний вигляд програми текстового редактора.

Основною частиною програми є блок для роботи з текстовими фрагментами.

Лістинг .

#include "_all.h"

char *main_menu[4]= {"File","Edit","Options","Help"};

struct menu

{

int menu_num;

char *item[MAX_CHOICE_LEN];

char hotkeys[8];

int num_items;

int x;

struct menu *next;

struct menu *prev;

};

typedef struct menu Menu;

Menu file=

{

0,

{"~New","~Open F3","~Save F2","save ~As","~Delete "," e~Xit F10"},

"NOSADX",

6,2,NULL,NULL

};

Menu edit=

{

1,

{"~Cut F6","c~Opy F7","~Paste F8","~Del line ","ins ~Line","del ~Word","in~S Word"},

"COPDLWS",

7,13,NULL,&file

};

Menu options=

{

2,

{"~Os shell F4","~Find","~Margins","~Encrypt","~Decrypt","~Quotes & jokes"},

"OFMEDQ",

6,24,NULL,&edit

};

Menu help=

{

3,

{"~Help F1","~About"},

"HA",

2,37,&file,&options

};

int MenuShow(Menu *);

void MenuHandler(Menu *,int);

int AskSaved(WINDOW*);

WINDOW *main_win[2]; /* main global twin windows */

LIST l[2]; /* data structures */

char filename[2][20]={"noname0.txt","noname1.txt"};

char buffer[2000];

int x_pos[2]={1,1},y_pos[2]={0,0},ins[2]={INS_ON,INS_ON};

int b_stx,b_sty,b_endx,b_endy,copied=0;

int saved[2]={1,1},sty[2]={0,0},endy[2]={22,22},lcnt[2]={0,0};

int lmar[2]={0,0},rmar[2]={0,0};

bool bs=0,blocked=0,cw=0,set[2]={0,0};

int MAX=78-rmar[cw]; //right margon value

void main(int argc,char *argv[]) /* for opening file from command pronpt*/

{

int startx, starty, width, height;

StartCurses();

InitAllPairs();

// SplashScreen();

CreateWindows(height,width,starty,startx);

if(argc==2)

{

strcpy(filename[cw],argv[1]);

l[cw].OpenFile(1);

set[cw]=1;

}

MainProgram();

}

int MainProgram()

{

int ch,ser;

while(1)

{

ch=getch();

switch(ch)

{

case 27:

{

ch=getch();

switch(ch)

{

case 'f':

case 'F':MenuShow(&file);

break;

case 'e':

case 'E':MenuShow(&edit);

break;

case 'o':

case 'O':MenuShow(&options);

break;

case 'h':

case 'H':MenuShow(&help);

break;

case 'x':

case 'X':

l[cw].ExitCurses();

break;

}

}break;

case ENTER:

l[cw].Enter(1,0);

break;

case KEY_F(11):

GetJoke();

break;

case KEY_F(10):

l[cw].ExitCurses();

break;

case KEY_F(1):

HelpHandler();

break;

case KEY_F(9):

l[cw].DeleteFile();

break;

case KEY_F(4):

OsShell();

break;

case KEY_F(3):

l[cw].OpenFile(0);

case KEY_F(2):

l[cw].SaveFile(0);

break;

case KEY_F(5):

ChooseWin();

break;

case KEY_F(6):

copied=l[cw].CutCopyBlock(1);

break;

case KEY_F(7):

copied=l[cw].CutCopyBlock(0);

break;

case KEY_F(8):

l[cw].PasteBlock(copied);

break;

case KEY_IC:

beep();

if(ins[cw]==INS_OFF) ins[cw]=INS_ON;

else ins[cw]=INS_OFF;

curs_set(ins[cw]);

case KEY_LEFT:

l[cw].Left();

break;

case KEY_RIGHT:

l[cw].Right();

break;

case KEY_UP:

l[cw].Up();

break;

case KEY_DOWN:

l[cw].Down();

break;

case KEY_END:

l[cw].End();

break;

case KEY_HOME:

l[cw].Home();

break;

case KEY_PPAGE:

l[cw].PageUp();

break;

case KEY_NPAGE:

l[cw].PageDown();

break;

case KEY_BACKSPACE:

l[cw].Backspace();

break;

case KEY_DC:

l[cw].DeleteChar();

break;

case '\t':

l[cw].TabKey();

break;

case CTRL('b'):

bs=l[cw].BlockStart();

break;

case CTRL('e'):

blocked=l[cw].BlockEnd(bs);

break;

case CTRL('q'): //cut

copied=l[cw].CutCopyBlock(1);

break;

case CTRL('s'): //copy

copied=l[cw].CutCopyBlock(0);

break;

case CTRL('a'): l[cw].PasteBlock(copied);

break;

case CTRL('y'):

l[cw].DeleteLine();

break;

case CTRL('w'):

l[cw].DeleteWord();

break;

default:

if(ch>=32 && ch<=126)

{

if(x_pos[cw]==MAX+1) l[cw].Enter(0,0);

l[cw].Insert(ch,0);

}

break;

}

PrintPos();

}

endwin();

return 0;

}

/*--------------------------------*/

void SplashScreen()

{

WINDOW *win;

for(int i=1;i<=10;i+=1)

{

win=newwin(i,3*i,(LINES-i)/2,(COLS-(3*i))/2);

//win=newwin(i,3*i,i,3*i);

wbkgd(win,COLOR_PAIR(8));

usleep(3000);

wrefresh(win);

delwin(win);

}

curs_set(0);

mvwprintw(win,3,8,"%s","l i n E D I T");

mvwprintw(win,5,8,"%s","-by Tejus.A.G");

mvwprintw(win,7,9,"%s","-------------");

wrefresh(win);

sleep(2);

delwin(win);

curs_set(ins[cw]);

}

/*-----------------------------*/

void LIST::ExitCurses()

{

int t;

WINDOW *dlg_win;

dlg_win=CreateDialogBox();

if(!saved[cw]) t=::AskSaved(dlg_win);

if(t!=0)

{

ChooseWin();

if(!saved[cw]) t=::AskSaved(dlg_win);

}

if(t==0)

{

delwin(dlg_win);

touchwin(main_win[cw]),wrefresh(main_win[cw]);

}

else

{

endwin();

system("clear");

exit(0);

}

}

/*--------------------------------*/

void LIST::PageDown()

{

node *tp,*temp;

int i=0;

tp=head->llink,temp=head->rlink;

if(tp->l_num > endy[cw])

{

sty[cw]=sty[cw]+21,endy[cw]=endy[cw]+21,lcnt[cw]=lcnt[cw]+21;

while(i!=sty[cw]) temp=temp->rlink,i++;

cur=temp,cur->i=lmar[cw];

x_pos[cw]=lmar[cw]+1,y_pos[cw]=i+2;

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

for(int i=2;i<=22;i++)

for(int j=1;j<79;j++)

mvwprintw(main_win[cw],i,j,"%s"," ");

ReDisplay(0);

}

}

/*-------------------------------*/

void LIST::PageUp()

{

node *temp;

temp=head->rlink;

int i=0;

sty[cw]=sty[cw]-21,endy[cw]=endy[cw]-21,lcnt[cw]=lcnt[cw]-21;

if(sty[cw]<0) sty[cw]=0,endy[cw]=22,lcnt[cw]=0;

while(i!=sty[cw]) temp=temp->rlink,i++;

cur=temp,cur->i=lmar[cw];

x_pos[cw]=lmar[cw]+1,y_pos[cw]=i+2;

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

for(int i=2;i<=22;i++)

for(int j=1;j<79;j++)

mvwprintw(main_win[cw],i,j,"%s"," ");

ReDisplay(0);

}

/*--------------------------------*/

void LIST::FreeNodes()

{

node *temp,*next;

temp=head->rlink,next=temp->rlink;

while(next!=head)

{

next->llink=head,head->rlink=next;

free(temp);

temp=next;

next=next->rlink;

}

free(next);

head->rlink=head->llink=head;

node_index=0;

}

/*------------------------------*/

void LIST::ScrollDown()

{

if(y_pos[cw] == endy[cw])

{

sty[cw]=sty[cw]+1,endy[cw]=endy[cw]+1,lcnt[cw]=lcnt[cw]+1;

for(int i=2;i<=22;i++)

for(int j=1;j<79;j++)

mvwprintw(main_win[cw],i,j,"%s"," ");

ReDisplay(0);

}

}

/*-----------------------*/

void LIST::ScrollUp()

{

if(y_pos[cw] > 2 && y_pos[cw]-lcnt[cw]==2)

{

sty[cw]=sty[cw]-1,endy[cw]=endy[cw]-1,lcnt[cw]=lcnt[cw]-1;

for(int i=2;i<=22;i++)

for(int j=1;j<79;j++)

mvwprintw(main_win[cw],i,j,"%s"," ");

ReDisplay(0);

}

}

/*-------------------------------*/

int LIST::CutCopyBlock(int flag) //if flag=0 copy, flag=1 cut

{

int len=0;

if(blocked)

{

node *temp,*pres;

int y=2,x=b_stx;

temp=head->rlink;

while(y!=b_sty) temp=temp->rlink,y+=1;

pres=temp;

while(y!=b_endy)

{

while(x!=temp->maxcol+1)

{

buffer[len]=temp->ch[x-1];

x=x+1,len+=1;

}

x=1,y+=1,temp=temp->rlink;

}

while(x!=b_endx+1)

{

buffer[len]=temp->ch[x-1];

x+=1,len+=1;

}

if(flag)

{

bool k;

cur=pres;

cur->i=b_stx-1;

y_pos[cw]=b_sty,x_pos[cw]=b_stx;

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

wrefresh(main_win[cw]);

int i=0;

while(i!=len)

{

k=DeleteChar();

if(k) DeleteChar();

i+=1;

}

blocked=0;

}

ReDisplay(0);

}

return len;

}

/*-------------------------------*/

void LIST::PasteBlock(int len)

{

if(len)

{

int i=0;

while(i!=len)

{

if(x_pos[cw]==MAX+1) Enter(0,0);

Insert(buffer[i],1);

i+=1;

}

ReDisplay(1);

cur->i=lmar[cw];

x_pos[cw]=lmar[cw]+1;

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

wrefresh(main_win[cw]);

}

}

/*-------------------------------*/

bool LIST::BlockStart()

{

b_stx=x_pos[cw],b_sty=y_pos[cw];

return 1;

}

/*--------------------------------*/

bool LIST::BlockEnd(int bs)

{

if(bs)

{

b_endx=x_pos[cw],b_endy=y_pos[cw];

int y=2,x=b_stx;

node *temp;

temp=head->rlink;

if(temp==head) return 0;

while(y!=b_sty) temp=temp->rlink,y+=1;

wattron(main_win[cw],A_REVERSE);

while(y!=b_endy)

{

while(x!=temp->maxcol+1)

{

mvwprintw(main_win[cw],y,x,"%c",temp->ch[x-1]);

x=x+1;

}

x=1,y+=1,temp=temp->rlink;

}

while(x!=b_endx+1)

{

mvwprintw(main_win[cw],y,x,"%c",temp->ch[x-1]);

x+=1;

}

wattroff(main_win[cw],A_REVERSE);

return 1;

}

}

/*--------------------------*/

void CreateWindows(int height,int width,int starty,int startx)

{

main_win[0]=CreateNewwin(height,width,starty,startx);

main_win[1]=CreateNewwin(height,width,starty,startx);

x_pos[1]=lmar[1]+1,x_pos[0]=lmar[0]+1;

y_pos[1]=2,y_pos[0]=2;

move(y_pos[0]-lcnt[0],x_pos[0]);

move(y_pos[1]-lcnt[1],x_pos[1]);

PrintPos();

}

/*---------------------------*/

void ChooseWin()

{

if(cw==1) cw=0;

else cw=1;

MAX=(78-rmar[cw]);

redrawwin(main_win[cw]);

wrefresh(main_win[cw]);

}

/*--------------------------------*/

int LIST::DeleteChar()

{

if(!(cur->i==cur->maxcol)) //delete only present line

{

memmove(&cur->ch[cur->i],&cur->ch[cur->i+1],cur->maxcol-cur->i-1);

cur->maxcol-=1;

ReDisplay(0);

return 0;

}

else if(cur->rlink!=head)

{

int len=MAX-cur->maxcol;

node *temp;

temp=cur->rlink;

if(len > temp->maxcol) len = temp->maxcol-lmar[cw];

memmove(&cur->ch[cur->i],&temp->ch[lmar[cw]],len);

cur->maxcol=cur->maxcol+len;

temp->maxcol=temp->maxcol-len;

if(temp->maxcol!=lmar[cw])

memmove(&temp->ch[lmar[cw]],&temp->ch[len+lmar[cw]],temp->maxcol);

else

{

node *t1;

t1=cur;

cur=temp;

DeleteLine();

cur=t1;

}

ReDisplay(0);

return 1;

}

}

/*-------------------------------*/

void LIST::Home()

{

x_pos[cw]=lmar[cw]+1;

cur->i=lmar[cw];

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

wrefresh(main_win[cw]);

}

/*--------------------------------*/

void LIST::End()

{

x_pos[cw]=cur->maxcol+1;

cur->i=cur->maxcol;

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

wrefresh(main_win[cw]);

}

/*-----------------------------------*/

void LIST::TabKey()

{

for(int i=1;i<=8;i++)

{

if(cur->maxcol!=MAX)

Insert(' ',0);

else

break;

}

}

/*---------------------------------*/

node* LIST::CreateNode(node *cur)

{

node *temp;

temp=new node;

temp->rlink=head,head->llink=temp;

temp->llink=cur,cur->rlink=temp;

temp->l_num=node_index++;

if(lmar[cw]!=0)

{

memset(&temp->ch[0],' ',lmar[cw]);

temp->i=lmar[cw],temp->maxcol=lmar[cw];

}

else

temp->i=0,temp->maxcol=0;

return temp;

}

/*------------------------------*/

node* LIST::CreateNode(node *cur,node *next)

{

node *temp;

temp=new node;

temp->rlink=next,next->llink=temp;

temp->llink=cur,cur->rlink=temp;

temp->i=0,temp->maxcol=0;

if(lmar[cw]!=0) memset(&temp->ch[0],' ',lmar[cw]);

temp->i=lmar[cw];

temp->maxcol=lmar[cw];

return temp;

}

/*---------------------------------*/

void LIST::Insert(char ch,int flag)

{

saved[cw]=0;

if(cur->i == cur->maxcol)

InsertRear(ch,0);

else if(ins[cw]==INS_ON || flag==1)

InsertPos(ch);

else

InsertReplace(ch);

}

/*-------------------------------*/

void LIST::InsertReplace(char ch)

{

cur->ch[cur->i]=ch;

cur->i+=1;

ReDisplay(0);

x_pos[cw]+=1;

wrefresh(main_win[cw]);

}

/*------------------------------*/

void LIST::ReDisplay(int flag)

{

int x=1,y=2,j,i=0;

node *temp;

temp=head->rlink;

while(i!=sty[cw]) temp=temp->rlink,i++;

while(temp!=head && i!=endy[cw])

{

for(j=0;j<temp->maxcol;j++)

{

mvwprintw(main_win[cw],y,x,"%c",temp->ch[j]);

x=x+1;

}

while(j < MAX)

{

mvwprintw(main_win[cw],y,x,"%c",' ');

x+=1,j+=1;

}

y=y+1,x=1,i+=1,temp=temp->rlink;

}

if(flag==1 && lcnt[cw]==0)

{

int i=1,_x=1;

while(i<=MAX)

{

mvwprintw(main_win[cw],y,_x,"%c",' ');

i+=1,_x+=1;

}

}

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

wrefresh(main_win[cw]);

refresh();

}

/*------------------------------*/

void LIST::DeleteLine()

{

node *temp,*prev;

if(cur!=head)

{

temp=cur;

prev=temp->llink;

cur=temp->rlink;

cur->llink=prev,prev->rlink=cur;

free(temp);

ReDisplay(1);

x_pos[cw]=lmar[cw]+1;

if(cur==head) cur=cur->llink,y_pos[cw]-=1;

if(y_pos[cw]<2) y_pos[cw]=2;

cur->i=lmar[cw];

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

wrefresh(main_win[cw]);

}

}

/*------------------------------*/

void LIST::InsertPos(char ch)

{

int j,flag1=0,flag2=0,x=x_pos[cw]+1,y=y_pos[cw]-lcnt[cw],len;

node *t1,*t2,*t3;

if(cur->maxcol == MAX)

{

t1=cur->rlink;

if(t1==head) t1=CreateNode(cur);

t2=head;

while(t1->maxcol >= MAX)

{

t2=t2->llink;

if(t2->maxcol == MAX)

t2=CreateNode(t2);

else

memmove(&t2->ch[lmar[cw]+1],&t2->ch[lmar[cw]],t2->maxcol-lmar[cw]);

t3=t2->llink;

flag2=1;

t2->ch[lmar[cw]]=t3->ch[t3->maxcol-1];

t2->maxcol+=1,t2->i+=1;

t3->i-=1,t3->maxcol-=1;

}

memmove(&t1->ch[lmar[cw]+1],&t1->ch[lmar[cw]],(t1->maxcol-lmar[cw]));

flag1=1;

t1->maxcol+=1;

t1->ch[lmar[cw]]=cur->ch[cur->maxcol-1];

cur->maxcol-=1;

}

j=cur->i;

len=cur->maxcol-cur->i+1;

memmove(&cur->ch[j+1],&cur->ch[j],len); //shift areas of memory

j+=1; //even if overlapping

cur->ch[cur->i]=ch;

cur->maxcol+=1,cur->i+=1;

x_pos[cw]+=1;

ReDisplay(0);

wrefresh(main_win[cw]);

}

/*------------------------------*/

void LIST::InsertRear(char ch,bool i)

{

node *temp;

if(cur==head)

{

temp=CreateNode(cur);

cur=temp;

}

cur->ch[cur->i]=ch;

cur->i=cur->i+1,cur->maxcol=cur->maxcol+1;

x_pos[cw]=x_pos[cw]+1;

if(i==0) ReDisplay(0);

wrefresh(main_win[cw]);

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

}

/*--------------------------------------*/

int MenuShow(Menu *show)

{

WINDOW *menu_win,*v_win,*h_win;;

int y=0,win_x=1,win_y=1,i,j,dir=1,ch,res=0,tx,ty,nx,ny;

wattron(main_win[cw],COLOR_PAIR(2)|A_REVERSE);

mvwprintw(main_win[cw],y,show->x,"%s",main_menu[show->menu_num]);

wrefresh(main_win[cw]);

wattroff(main_win[cw],COLOR_PAIR(2)|A_REVERSE);

menu_win=newwin((show->num_items)+2,MAX_CHOICE_LEN,y+1,show->x);

h_win=newwin(1,MAX_CHOICE_LEN,y+show->num_items+3,show->x+2);

v_win=newwin(show->num_items+2,2,y+2,show->x+MAX_CHOICE_LEN);

curs_set(0);

keypad(menu_win,TRUE);

wattron(menu_win,COLOR_PAIR(6));

wbkgd(menu_win,COLOR_PAIR(6));

wbkgd(h_win,COLOR_PAIR(6)|A_REVERSE);

wbkgd(v_win,COLOR_PAIR(6)|A_REVERSE);

box(menu_win,0,0);

for(i=0;i<show->num_items;i++)

{

mvwprintw(menu_win,win_y,win_x,"%s",show->item[i]);

win_y++;

}

wrefresh(menu_win);

wrefresh(h_win),wrefresh(v_win);

win_x=1,win_y=1,i=0;

notimeout(menu_win,TRUE);

while(1)

{

ch=getch();

switch(ch)

{

case KEY_LEFT:

res=PREV;

goto reset;

case KEY_RIGHT:

res=NEXT;

goto reset;

case ESC:

res=0;

goto reset;

case KEY_UP:

tx=1,ty=1;

for(int k=0;k<show->num_items;k++)

{

mvwprintw(menu_win,ty,tx,"%s"," ");

mvwprintw(menu_win,ty,tx,"%s",show->item[k]);

ty++;

}

if(i==show->num_items) i=0;

wattron(menu_win,A_REVERSE);

mvwprintw(menu_win,i+1,tx,"%s"," ");

mvwprintw(menu_win,i+1,tx,"%s",show->item[i]);

res=i+1,i=i-1;

wattroff(menu_win,A_REVERSE);

if(i==-1) i=show->num_items-1;

wrefresh(menu_win);

break;

case KEY_DOWN:

nx=1,ny=1;

for(int k=0;k<show->num_items;k++)

{

mvwprintw(menu_win,ny,nx,"%s"," ");

mvwprintw(menu_win,ny,nx,"%s",show->item[k]);

ny++;

}

if(i==show->num_items) i=0;

wattron(menu_win,A_REVERSE);

mvwprintw(menu_win,i+1,nx,"%s"," ");

mvwprintw(menu_win,i+1,nx,"%s",show->item[i]);

res=++i;

wattroff(menu_win,A_REVERSE);

wrefresh(menu_win);

break;

case ENTER:

goto reset;

default:

j=show->num_items;

for(i=0;i<j;i++)

{

if(ch==show->hotkeys[i] || ch==(show->hotkeys[i]+32))

{

res=i+1;

goto reset;

}

}

res=0;

goto reset;

}

}

reset:

wattroff(menu_win,COLOR_PAIR(6));

delwin(menu_win);

delwin(h_win),delwin(v_win);

curs_set(ins[cw]);

touchwin(main_win[cw]);

wattron(main_win[cw],COLOR_PAIR(2)|A_BOLD);

mvwaddstr(main_win[cw],0,show->x,main_menu[show->menu_num]);

wattroff(main_win[cw],COLOR_PAIR(2)|A_BOLD);

wrefresh(main_win[cw]);

if(res==0) return(0);

MenuHandler(show,res);

}

/*-----------------------------------*/

void InitMenu()

{

file.next=&edit,file.prev=&help;

edit.next=&options;

options.next=&help;

}

/*------------------------------------*/

void LIST::DeleteWord()

{

if(cur!=head)

{

int i,j;

i=j=x_pos[cw];

if(cur->ch[i]!=' ')

{

while(cur->ch[i]!=' '&&i!=0) i--;

while(cur->ch[j]!=' '&&j!=cur->maxcol) j++;

cur->i=i;

while(j!=i) DeleteChar(),j--;

x_pos[cw]=cur->i+1;

move(y_pos[cw]-lcnt[cw],x_pos[cw]);

}

ReDisplay(0);

}

}

/*---------------------------------------------*/

void MenuHandler(Menu *show,int ch)

{

if(ch==NEXT) MenuShow(show->next);

if(ch==PREV) MenuShow(show->prev);

switch(show->menu_num)

{

case 0: /* file menu */

switch(ch)

{

case 1:

l[cw].NewFile();

break;

case 2:

l[cw].OpenFile(0); /*-done*/

break;

case 3:

l[cw].SaveFile(0); /*-done*/

break;

case 4:

l[cw].SaveFile(1); /*-done*/

break;

case 5:

l[cw].DeleteFile();

break;

case 6:

l[cw].ExitCurses();

break;

} break;

delwin(dlg_win);

touchwin(main_win[cw]);

ReDisplay(0);

wrefresh(main_win[cw]);

}

/*--------------------------*/

WINDOW *CreateDialogBox()

{

WINDOW *local_win;

int ht=12,wd=50,sty=(LINES-ht)/2,stx=(COLS-wd)/2;

local_win=newwin(ht,wd,sty,stx);

wbkgd(local_win,COLOR_PAIR(7));

box(local_win,0,0);

wrefresh(local_win);

return local_win;

}

/*-----------------------------*/

int GetDlgItem(WINDOW *local_win,char *hd,char *mesg)

{

int ch=0;

char sw[20];

strcpy(sw,filename[cw]);

int x=strlen(mesg)+2,i=0;

notimeout(local_win,TRUE);

mvwprintw(local_win,5,5,"%s",mesg);

wattron(local_win,A_STANDOUT);

mvwprintw(local_win,1,21,"%s",hd);

x=x+3;

wmove(local_win,5,x);

keypad(local_win,TRUE);

wrefresh(local_win);

noecho();

while((ch=getch())!=ESC)

{

switch(ch)

{

default:

if(ch>=32 && ch <=126)

{

filename[cw][i++]=ch;

mvwprintw(local_win,5,x++,"%c",ch);

wrefresh(local_win);

}

else

{

strcpy(filename[cw],sw);

return 1;

}

break;

case ENTER:

filename[cw][i]='\0';

return 0;

case KEY_BACKSPACE:

if(i!=0)

{

i=i-1;

mvwprintw(local_win,5,--x,"%c",' ');

wmove(local_win,5,x);

wrefresh(local_win);

}

}

}

return 1;

}

/*--------------------------*/

void LIST::DeleteFile()

{

WINDOW *win;

char ch[20],w[20];

strcpy(ch,filename[cw]);

win=CreateDialogBox();

GetDlgItem(win,"Delete file","Enter file to delete:");

strcpy(w,filename[cw]);

strcpy(filename[cw],ch);

int i=unlink(w);

if(i==0) mvwprintw(win,8,19,"%s","FILE DELETED");

else mvwprintw(win,8,17,"%s","FILE NOT FOUND");

wrefresh(win);

getch();

delwin(win);

touchwin(main_win[cw]);

wrefresh(main_win[cw]);

}

/*-----------------------------*/

void LIST::SaveFile(int flag)

{

int t=0;

char ch[20],f[20];

strcpy(ch,filename[cw]);

WINDOW *dlg_win;

if(flag==1)

{

dlg_win=CreateDialogBox();

t=GetDlgItem(dlg_win,"**Save As**","Enter filename:");

}

if(set[cw]==0)

{

set[cw]=1;

dlg_win=CreateDialogBox();

t=GetDlgItem(dlg_win,"**Save**","Enter filename:");

}

saved[cw]=1;

if(t==0)

{

FILE *fp;

node *temp;

temp=head->rlink;

fp=fopen(filename[cw],"w");

while(temp!=head)

{

for(int i=lmar[cw];i<=temp->maxcol;i++)

putc(temp->ch[i],fp);

temp=temp->rlink;

}

}

delwin(dlg_win);

touchwin(main_win[cw]);

wrefresh(main_win[cw]);

}

Для компіляції необхіден наступний маке - файл. (лістинг 2)

echo compiling editor files....

g++ test.cpp -o edit -lncurses

echo starting editor....

./edit

Висновки

В роботі були проаналізовані питання стосовно операційної системи LINUX. Так був даний короткий огляд її основних можливостей в теоретичній частині роботи, а в практичній частині розроблена програма для редагування текстової інформації - навединий її лістинг та скріншот.

Програма відрізняється від існуючих на ринку простотою інтерфейсу та простою роботи.

Література

1. Касаткин А.И., Вальвачев А.Н. Профессиональное прогрпммирование на языке Си. Мн., 1992. 240 С.

2. Нейбауэр А. Моя первая программа на С/С++. П., 1995. 368 С.

3. Бруно Бабэ. Просто и ясно о Borland C++. М., 1996. 400 С.

4. Шамас Н.К. Основы С++ и обьектно-ориентированного программирования. К., 1996. 448 С.


Подобные документы

  • UNIX - одна з найпопулярніших в світі операційних систем. Ключеві риси Linux. Порівняльні характеристики 32-розрядних операційних систем. Поверхневий огляд характеристик ядра Linux. Програмні характеристики: базові команди і утиліти, мови програмування.

    курсовая работа [33,3 K], добавлен 07.12.2010

  • Операционная система Linux как ПК-версия операционной системы Unix. Характеристика KOrganizer — простого в использовании менеджера персональной информации. Основные разработки в ALT Linux Master. Особенности разработки в Альт Линукс Школьный Мастер.

    курсовая работа [1,3 M], добавлен 06.06.2011

  • Linux - POSIX-совместимая и Unix-подобная операционная система для ПК и рабочих станций, ее возможности, характерные особенности как ОС: виртуальная мультиконсоль, одновременное выполнение нескольких программ, документирование, работа с сетью Internet.

    контрольная работа [84,3 K], добавлен 07.06.2011

  • Анализ технических возможностей операционной системы Mandriva Linux - дистрибутива GNU/Linux, разрабатываемого французской компанией Mandriva, выпускающей свободные, коммерческие и корпоративные версии своего дистрибутива. Этапы установки оболочки Linux.

    презентация [26,2 M], добавлен 23.05.2010

  • ОС Linux - название Unix-подобных операционных систем, основанных на одноимённом ядре. Дистрибутив Lubuntu 12: интерфейс, командная строка, основные программы, входящие в состав пакета. Работа с сетью, конфигурированием и администрированием системы.

    методичка [2,0 M], добавлен 28.10.2014

  • Linux - ядро операционной системы с монолитной архитектурой. Прародители операционной системы Linux, ее стабильные и экспериментальные версии. Процесс внедрения Linux и свободного программного обеспечения в школах и государственных учреждениях России.

    реферат [18,2 K], добавлен 19.01.2013

  • Основи адміністрування. Стадії завантаження та керування режимами роботи Linux. Особливості завантаження системи X Window. Конфігураційний файл XF86Config. Монтування файлових систем та додання нових користувачів і груп. Ущільнення і архівування файлів.

    реферат [21,3 K], добавлен 15.03.2009

  • Основні особливості операційної системи Linux, її системні та програмні характеристики. Файли, каталоги та посилання ОС. Робота зі з'ємними носіями інформації. Архівування даних. Особливості роботи в мережі, додатки, текстовий режим функціонування в ОС.

    курсовая работа [2,5 M], добавлен 07.07.2013

  • Управление памятью в операционной системе Linux. Физическая и виртуальная память. Исполнение и загрузка пользовательских программ, файловая система. Передача данных между процессами. Структура сети в операционной системе. Развитие и использование Linux.

    презентация [1,4 M], добавлен 24.01.2014

  • Знайомство з інтерфейсом ОС Linux, робота з довідковою системою Linux. Робота з утилітами командного рядка. Символічні посилання та архівація даних. Пошук файлів за критеріями. Робота з програмою Midnight Commander. Використання офісних додатків.

    методичка [396,5 K], добавлен 17.05.2011

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.