ЭЛЕКТРОННАЯ БИБЛИОТЕКА КОАПП
Сборники Художественной, Технической, Справочной, Английской, Нормативной, Исторической, и др. литературы.



 

Часть 7

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                   Математическое обеспечение
                        персональных ЭВМ
 
 
 
 
 
                             TURBO-C
 
 
 
                      Описание компилятора
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                           Москва 1988
 
 
 
 
 
 
 
                              - 2 -
 
 
 
 
 
 
 
 
                            Аннотация
 
 
 
 
      В данном документе приведено краткое описание вызова  ком-
 пилятора Turbo-C и его возможностей. Приведено краткое описание
 библиотеки компилятора. Документ является переработкой "Turbo-C
 User's Manual". Авторы:  Кашкарова  В.А.,  Артамоненкова  Н.Н.,
 Стариков Ю.А. (ГВМЦ СИ).
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                              - 3 -
 
 
 
 
 
 
 
 
                           Содержание
 
 
    Аннотация................................................. 2
 
 1. ОПЦИИ КОМАНДНОЙ СТРОКИ.................................... 5
 
 1.1.  СИНТАКСИС.............................................. 5
 1.2.  ОПЦИИ МОДЕЛЕЙ ПАМЯТИ................................... 6
 1.3.  ОПРЕДЕЛЕНИЯ............................................ 7
 1.4.  ОПЦИИ ПРОЦЕССОРА....................................... 7
 1.5.  ИСХОДНЫЕ ОПЦИИ......................................... 8
 1.6.  ОПЦИИ КОДА............................................. 9
 1.7.  ОПЦИИ ОБРАБОТКИ ОШИБОК.................................11
 1.8.  ОПЦИИ ИМЕН.............................................13
 1.9.  ОПЦИИ УПРАВЛЕНИЯ КОМПИЛЯЦИЕЙ...........................14
 1.10. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ.................................15
 1.11. ОПЦИИ ОКРУЖЕНИЯ........................................15
 
 2. УТИЛИТЫ TURBO-С...........................................16
 
 2.1.  ПРЕПРОЦЕССОР Turbo-C...................................16
 2.2.  УТИЛИТА MAKE...........................................16
 2.2.1. КОМАНДНЫЕ СПИСКИ......................................16
 2.2.2. МАКРООПРЕДЕЛЕНИЯ......................................17
 2.2.2.1. ОПРЕДЕЛЕНИЕ МАКРОСОВ................................18
 2.2.2.2. ИСПОЛЬЗОВАНИЕ МАКРОСОВ..............................18
 2.2.2.3. ОСОБЫЕ СЛУЧАИ.......................................18
 2.2.2.4. ПРЕДОПРЕДЕЛЕННЫЕ МАКРОСЫ............................19
 2.2.2.5. ДИРЕКТИВЫ...........................................20
 2.2.3. ВЫЗОВ MAKE............................................23
 2.2.3.1. СИНТАКСИС КОМАНДНОЙ СТРОКИ..........................23
 2.2.3.2. ФАЙЛ BULTINS.MAK....................................23
 2.2.3.3. ОПЦИИ КОМАНДНОЙ СТРОКИ..............................23
 2.3.  РЕДАКТОР СВЯЗЕЙ Turbo-C................................24
 2.3.1. ИНИЦИАЛИЗАЦИОННЫЕ МОДУЛИ..............................24
 2.3.2. БИБЛИОТЕКИ............................................25
 2.3.3. ИСПОЛЬЗОВАНИЕ TLINK с TCC.............................25
 2.3.4. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ................................25
 2.3.5. ОГРАНИЧЕНИЯ...........................................26
 
 3. ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ Turbo-C............................28
 
 3.1.  ABSREAD................................................28
 3.2.  ABSWRITE...............................................29
 3.3.  ALLOCMEM...............................................29
 3.4.  ATEXIT.................................................31
 3.5.  ATOF...................................................32
 3.6.  BIOSCOM................................................33
 3.7.  BIOSDISK...............................................35
 
                              - 4 -
 
 
 
 
 3.8.  BIOSEQUIP..............................................37
 3.9.  BIOSKEY................................................38
 3.10. BIOSMEMORY.............................................39
 3.11. BIOSPRINT..............................................39
 3.12. BIOSTIME...............................................40
 3.13. BRK....................................................40
 3.14. COUNTRY................................................40
 3.15. CTRLBRK................................................42
 3.16. DISABLE................................................43
 3.17. DOSTOUNIX..............................................44
 3.18. FARMALLOC..............................................44
 3.19. FINDFIRST..............................................45
 3.20. FNMERGE................................................47
 3.21. GETCBRK................................................50
 3.22. GETCURDIR..............................................50
 3.23. GETCWD.................................................50
 3.24. GETDATE................................................51
 3.25. GETDFREE...............................................51
 3.26. GETDISK................................................52
 3.27. GETDTA.................................................52
 3.28. GETFAT.................................................52
 3.29. GETFTIME...............................................53
 3.30. GETPASS................................................53
 3.31. GETPSP.................................................54
 3.32. GETVECT................................................54
 3.33. GETVERIFY..............................................55
 3.34. HARDERR................................................55
 3.35. INPORT.................................................57
 3.36. INTR...................................................57
 3.37. IOCTL..................................................57
 3.38. ISATTY.................................................58
 3.39. KEEP...................................................58
 3.40. LOCK...................................................59
 3.41. MOVMEM.................................................59
 3.42. PARSFNM................................................59
 3.43. PEEK...................................................60
 3.44. POKE...................................................60
 3.45. POLY...................................................60
 3.46. RANDBRD................................................61
 3.47. SEARCHPATH.............................................61
 3.48. SETCBRK................................................62
 3.49. SLEEP..................................................62
 3.50. SSIGNAL................................................62
 
 Приложение. ОБЩИЕ СТАНДАРТНЫЕ ФУНКЦИИ MSC и Turbo-C..........63
 
 
 
 
 
 
 
 
 
 
                              - 5 -
 
 
 
 
                    1. ОПЦИИ КОМАНДНОЙ СТРОКИ
 
 
 
 
 
      Данный раздел содержит опции командной строки  для  вызова
 компилятора Turbo-C. Все опиции компилятора можно разделить  на
 три следующих типа:
 
      - опции компилятора;
 
      - опции редактора связей;
 
      - опции окружения.
 
      Опции компилятора подразделяются:
 
      - опции моделей памяти;
 
      - определения (опции макро определений);
 
      - опции процессора;
 
      - опции исходного кода;
 
      - опции сообщений об ошибках;
 
      - имена (имена сегментов).
 
      Большинство опций командной строки имеют  аналоги  в  Меню
 Опций в системе Turbo-C (или в некоторых других меню).
 
      В командной строке каждой опции должен предшествовать сим-
 вол (-). Например, -I. Для того, чтобы отменить опцию  добавьте
 еще один (-) после опции. Например, -A включает опцию  ключевых
 слов ANSI, а -A- отменяет данную опцию.
 
 
      1.1. СИНТАКСИС
 
 
      При вызове компилятора Turbo-C вы можете использовать  ко-
 мандную строку, которая имеет следующий синтаксис:
 
         tcc [опции... ]  имена_файлов
 
      Компилятор обрабатывает файлы в соответствии с приведенны-
 ми ниже правилами.
 
 
          filename.asm:  вызывается  MASM  при   ассемблировании
        (получении объектного файла).
 
 
                              - 6 -
 
 
 
 
 
        filename.obj: подключается объектный файл при работе ре-
        дактора связей.
 
 
        filename.lib: подключается библиотека при работе  редак-
        тора связей.
 
 
        filename: компилируется filename.c
 
 
        filename.c: компилируется filename.c
 
 
        filename.xyz: компилируется filename.xyz.
 
      Например, командная строка
 
 tcc -a -f -C -O -Z -emyexe oldfile1.c oldfile2.c nextfile.c
 
 задает компиляцию файлов OLDFILE1.C, OLDFILE2.C,  NEXTFILE.C  в
 файл .OBJ, помещая выполняемую программу в файл MYEXE.EXE; (-a)
 задает выравнивание слова, (-f) - эмуляцию плавающей точки,  (-
 C) указывает на вложенные комментарии, (-O) - оптимизация пере-
 ходов, (-Z) - регистровая оптимизация.
 
      TCC будет подключать MASM, если вы укажите файл с расшире-
 нием  .ASM  в  командной  строке  или  если  файл  .C  содержит
 встроенный ассемблер. Для подключения макроассемблера в команд-
 ной строке нужно указать следующие флаги:
 
         /ms /D_mdl_,
 
 где mld должно принимать одно из значений: TINY, SMALL, MEDIUM,
 COMPACT, LARGE или HUGE. Флаг /mx указывает MASM  на  необходи-
 мость ассемблирования с учетом регистров.
 
 
      1.2. ОПЦИИ МОДЕЛЕЙ ПАМЯТИ
 
 
 -mc
        при компиляции используется модель памяти COMPACT.
 
 -mh
        используется модель памяти HUGE.
 
 -ml
        используется модель памяти LARGE.
 
 
 
 
 
                              - 7 -
 
 
 
 
 -mm
        используется модель памяти MEDIUM.
 
 -ms
        используется модель памяти SMALL (по умолчанию).
 
 -mt
        используется модель памяти TINY  (крошечная).  Создается
        почти такой же код как и в предыдущем случае, но  всегда
        используется C0T.OBJ при работе редактора связей.
 
 
      1.3. ОПРЕДЕЛЕНИЯ
 
 
 -Dxxx
        Определяет идентификатор xxx  как  строку  состоящую  из
        единственного пробела ( ).
 
 -Dxxx=string
        Определяет идентификатор xxx как строку  string.  String
        не может содержать пробелы и табуляции.
 
 -Uxxx
        Отменяет установленные  определения  для  идентификатора
        xxx.
 
 
      1.4. ОПЦИИ ПРОЦЕССОРА
 
 
 -1
        генерация расширенных команд процессора 80186. Эта опция
        также используется при  генерации  программ  процессором
        80286 в незащищенном режиме, например, IBM PC/AT  c  MS-
        DOS 3.0.
 
 -a
        приводит к выравниванию целых данных по границе машинно-
        го слова. Крайние биты будут включаться в структуру, для
        того чтобы обеспечить выравнивание  полей.  Выравнивание
        автоматических и глобальных переменных  будет  проходить
        успешно, переменные типа char и unsigned char могут быть
        помещены по любым адресам; все остальные -  должны  быть
        помещены по четным адресам.
 
 -f87
        генерация операций плавающей  точки,  используя  команды
        встроенного сопроцессора 8087, а не библиотеку эмулятора
        8087.
 
 
 
 
 
                              - 8 -
 
 
 
 
 -f
        во время выполнения вызывается эмулятор 8087,  если  ис-
        полняющая система не имеет  сопроцессора  8087,  который
        вызывается по умолчанию для выполнения вычислений с пла-
        вающей точкой.
 
 -fуказывает
        редактору связей, что программа не содержит вычислений с
        плавающей точкой. Библиотеки плавающей точки не  подклю-
        чаются.
 
 
      1.5. ИСХОДНЫЕ ОПЦИИ
 
 
 -A
        создается ANSI-совместимый  код:  любое  ключевое  слово
        расширения Turbo-C игнорируется и может быть использова-
        но как идентификатор. К ключевым словам расширения отно-
        сятся:
 
         near    far             huge            cdecl
         asm     pascal          interrupt
         _es     _ds             _cs             _ss
 
 
        и регистровые псевдо-переменные, такие как _AX, _BX, _SI
        и др.
 
 -C
        допускает вложенные комментарии.
 
 -i#
        Компилятор распознает только первые # символов идентифи-
        каторов. Все идентификаторы, независимо от того являются
        ли они переменными, именами макроопределений  препроцес-
        сора или именами структур, рассматриваются как различаю-
        щиеся, если их первые # символов различны.
 
 
        По умолчанию Turbo-C использует 32-символьные  идентифи-
        каторы. Другие системы, включая UNIX, используют  8-сим-
        вольные идентификаторы, остальные символы  игнорируются.
        Данный флаг позволяет избежать конфликтных ситуаций  при
        использовании идентификаторов.
 
 -K
        компилятор рассматривает все описания типа char, как тип
        unsigned char. Это допускается для совместимости с  дру-
        гими к   компиляторами,   которые   считают   тип   char
        беззнаковым.
 
 
 
 
                              - 9 -
 
 
 
 
      1.6. ОПЦИИ КОДА
 
 
 -d
        сливаются совпадающие строки; это обеспечивает  уменьше-
        ние размера программ (по умолчанию).
 
 -G
        Компилятор создает большие модули, если возможно.
 
 -N
        генерация логики переполнения стека на вход каждой функ-
        ции: это будет вызывать сообщение о переполнении  стека,
        каждый раз когда переполнение стека обнаружено. Если пе-
        реполнение   обнаружено,  печатается  сообщение   "Stack
        overflow!" и программа завершается с кодом 1.
 
 -y
        включает номера строк в объектный файл для использования
        отладчика. Это приводит к увеличению размера  объектного
        файла, но не влияет на размер или  скорость  выполняемой
        программы.
 
 -O
        оптимизация размера кода за счет  исключения  избыточных
        переходов, реорганизации циклов и переключения  операто-
        ров.
 
 -p
        Компилятор порождает все вызовы подпрограмм  и  функций,
        используя Паскалевскую последовательность передачи пара-
        метров. Функции должны получать верное число и тип аргу-
        ментов, в отличии от вызова стандартного С, который  до-
        пускает переменное число аргументов функции.  Вы  можете
        использовать оператор cdecl,  для  того  чтобы  отменить
        данную опцию и специально объявить функцию C-типа.
 
 -rподавляет
        использование регистровых переменных. При наличии данной
        опции все ключевые слова register игнорируются. Если  вы
        имеете ассемблерный код, в котором не сохранены значения
        регистров SI и DI, опция -r-  позволяет  вызвать  данный
        код из Turbo-C. Подавление регистровых переменных, в об-
        щем случае, снижает эффективность кода, но может  потре-
        боваться, если вы хотите использовать существующие подп-
        рограммы.
 
 П_р_и_м_е_ч_а_н_и_е. Когда вы используете опцию  -r-,  исходный
 файл, откомпилированный с опцией -r-, может вызывать коды,  ко-
 торые являются результатом компиляции без опции -r-,  например,
 модули системных  библиотек.  Однако,  обратное  неверно,  т.е.
 файл, откомпилированный с -r-, может быть вызван только из фай-
 ла, также откомпилированного с -r-.
 
 
                             - 10 -
 
 
 
 
 -r
        допускает использование регистровых переменных (по умол-
        чанию).
 
 -Y
        порождает стандартную запись  активации  стека,  которая
        используется отладчиком для трассировки стека  вызванных
        функций.
 
 -Z
        подавляет избыточные операции загрузки, используя  ранее
        сохраненное содержимое регистров и повторное использова-
        ние их насколько возможно часто.
 
 П_р_и_м_е_ч_а_н_и_е. Необходимо соблюдать осторожность при  ис-
 пользовании данной опции, т.к. компилятор может  не  обнаружить
 ситуации,    когда   значение   регистра   косвенно   запорчено
 указателем.
 
      Например, если переменная A загружена в  регистр  DX,  она
 сохраняется. Если переменной A присваивается значение, значение
 DX обновляется, что указывает на то, что его содержимое не  яв-
 ляется более текущим.  Если  значение  A  обновляется  косвенно
 (используя указатель), Turbo-C не будет отлавливать данной  си-
 туации и будет продолжать "помнить", что DX  содержит  значение
 A.
 
      Оптимизация -Z предназначена для подавления  загрузки  ре-
 гистров, когда значение, которое загружается, уже содержится  в
 регистре. Это позволяет исключить все команды, и также преобра-
 зовать команды из ссылок в ячейки памяти, для  того  чтобы  ис-
 пользовать регистры.
 
      Следующая искусственная последовательность команд  иллюст-
 рирует преимущества и недостатки оптимизации:
 
 C-код                           Оптимизированный
                                 ассемблер
 
 funk()
 {
         int A, *P, B;
         A=4;                    mov A,4
         ...
         B=A;                    mov ax,A
                                 mov B,ax
         P=&A;                   lea bx,A
                                 mov P,bx
         *P=B+5;                 mov dx,ax
                                 add dx,5
                                 mov [bx],dx
         printf("%d\n",A);       push ax
 }
 
 
                             - 11 -
 
 
 
 
 
      Рассмотрим команду *P=B+5. Во-первых, для  генерации  кода
 используется перемещение ax в dx. Без -Z опимизации перемещение
 будет осуществляться из B. Во-вторых, *P указывает, что  P  уже
 содержится в bx, поэтому перемещение из P в  bx  после  команды
 add должно быть исключено. Это усовершенствование  безобидно  и
 обычно используется.
 
       Однако,  обращение  к  printf  не  корректно.  Компилятор
 "видит", что ax содержит значение A, и поэтому  использует  со-
 держимое регистра, а не содержимое ячейки памяти. Printf  будет
 печатить величину 4, вместо правильного значения  9.  Косвенное
 назначение переменной P изменило значение переменой A.
 
      Если бы оператор *P=B+5 был бы записан в виде A=B+5,  ком-
 пилятор обнаружил бы изменение значения.
 
      Содержимое регистров сбрасывается всякий  раз  при  вызове
 функции, или когда  достигнута  точка,  в  которой  может  быть
 выполнен переход (например метка, условный оператор, начало или
 конец цикла). Из-за данного ограничения и небольшого числа  ре-
 гистров в процесоорах серии 8086, большинство программ, исполь-
 зующих данную оптимизацию, будут работать неверно.
 
 
      1.7. ОПЦИИ ОБРАБОТКИ ОШИБОК
 
 
 -g#
        прекращает компиляцию после # сообщений  (предупреждений
        или сообщений об ошибках).
 
 -j#
        прекращает компиляцию после # сообщений об ошибках.
 
 -wxxx
        Допускает сообщения-предупреждения, указанные в xxx. Оп-
        ция -w-xxx подавляет указанные предупреждения. Возможные
        значения для -wxxx:
 
      (ANSI-нарушения)
 
 -wdup
        переопределение 'XXXXXXXX' не идентично
 
 -wret
        используется как пустой return, так и return(значение)
 
 -wstr
        'XXXXXXXXX' не часть структуры
 
 
 
 
 
                             - 12 -
 
 
 
 
 -wstu
        неопределена структура 'XXXXXXXX'
 
 -wsus
        вызывающее сомнение преобразование указателя
 
 -wvoi
        функции типа void не могут возвращать значение
 
 -wzst
        структура нулевой длины
 
      (Общие ошибки)
 
 -waus
        'XXXXXXXX' определено, но не используется
 
 -wdef
        возможно использование 'XXXXXXXX' прежде определения
 
 -weff
        неэффективный код
 
 -wpar
        параметр 'XXXXXXXX' никогда не используется
 
 -wpia
        возможно неверное присвоение
 
 -wrch
        недостигаемый код
 
 -wrvl
        функция должна возвращать значение
 
      (Менее типичные ошибки)
 
 -wamb
        неоднозначные операторы; требуются скобки
 
 -wamp
        излишний &, примененный к функции или массиву
 
 -wnod
        нет описания для функции 'XXXXXXXX'
 
 -wpro
        обращение к функции не совпадает с формальным  описанием
        (макетом)
 
 -wstv
        structure passed by value
 
 
 
                             - 13 -
 
 
 
 
 -wuse
        'XXXXXXXXX' объявлена, но не используется
 
      (Предупреждения по мобильности)
 
 -wart
        немобильное назначение указателя
 
 -wcln
        длинная константа
 
 -wcpt
        немобильное сравнение указателей
 
 -wdgn
        константа выходит за пределы диапазона при сравнении
 
 -wrpt
        немобильный возврат преобразования типов
 
 -wsig
        при преобразовании могут быть потеряны значащие разряды
 
 -wucp
        смешивание указателей на знаковый и беззнаковый тип char
 
 
      1.8. ОПЦИИ ИМЕН
 
 
 -zAname
        Изменяет имя класса кодового сегмента на name. По  умол-
        чанию кодовому сегменту присваивается класс _CODE.
 
 -zBname
          Изменяет  имя  класса  неинициализированного  сегмента
        данных на имя name. По умолчанию используется имя класса
        _BSS.
 
 -zCname
        Изменяет имя кодового сегмента на имя name. По умолчанию
        используется имя _TEXT, за исключением модели памяти ME-
        DIUM, LARGE и HUGE, для которых используется имя filena-
        me _TEXT. (В данном случае filename - имя исходного фай-
        ла.)
 
 -zDname
        Изменяет имя неинициализированного  сегмента  данных  на
        name. По умолчанию используется _BSS, за исключением мо-
        дели HUGE,  для  которой  неинициализированные  сегменты
        данных не порождаются.
 
 
 
 
                             - 14 -
 
 
 
 
 -zGname
          Изменяет  имя  группы  неинициализированного  сегмента
        данных  на  имя  name.  По  умолчанию  используется  имя
        DGROUP, за исключением модели  HUGE,  которая  не  имеет
        групп данных.
 
 -zPname
        Приводит к тому, что все выходные файлы будут генериться
        в кодовую группу в сегменте кода с именем  name.  Данная
        опция не должна использоваться с модель TINY.
 
 -zRname
        Присваивает имя name инициализированному сегменту  кода.
        По умолчанию инициализированный сегмент кода  называется
        _DATA, исключение составляет модель памяти HUGE, которая
        использует имя filename_DATA.
 
 -zSname
        Изменяет имя группы инициализированных сегментов кода на
        name. По умолчанию всегда используется  имя  DGROUP,  за
        исключением модели HUGE, где не может быть групп данных.
        Для данной модели флаг игнорируется.
 
 -zTname
        Присваивает имя name классу инициализированных сегментов
        данных. По умолчанию используется имя _DATA.
 
 -zX*
        Использует имя по умолчанию для X: например, -zA*  озна-
        чает использование имени CODE для сегмента кода.
 
 
      1.9. ОПЦИИ УПРАВЛЕНИЯ КОМПИЛЯЦИЕЙ
 
 
 -B
        Компиляция и вызов ассемблера для обработки  встроенного
        ассемблерного кода (могут быть части, написанные на  ас-
        семблере).
 
 -c
        Компиляция и ассемблирование файлов с расширениями .C  и
        .ASM, но без выполнения команды связи.
 
 -ofilename
          Результат  компиляции  помещается  в  файл  с   именем
        filename.OBJ.
 
 -S
          Компиляция  указанных  исходных  файлов  и   получение
        выходных файлов на ассемблере; без выполнения  ассембли-
        рования.
 
 
 
                             - 15 -
 
 
 
 
      1.10. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ
 
 
 -efilename
        Имя выполняемой программы получается добавлением  расши-
        рения .EXE к  filename  (filename.EXE).  При  отсутствии
        данной опции используется имя исходного  или  объектного
        файла, указанное первым.
 
 -M
        Редактор связей  формирует  полную  карту  загрузки.  По
        умолчанию карта не формируется.
 
 
      1.11. ОПЦИИ ОКРУЖЕНИЯ
 
 
 -Idirectory
        Include-файлы ищутся в каталоге directory, в  дополнение
        к поиску в стандартном каталоге.  В  качестве  directory
        может быть указан спецификатор устройства или полное имя
        подкаталога. Спецификатор устройства должен заканчивать-
        ся двоеточием (:). Возможно  многократное  использование
        опции.
 
 -Ldirectory
        Редактор связей берет стартовый объектный файл C0x.OBJ и
         библиотеки  Turbo-C  (  Cx.LIB,  MATHx.LIB,  EMU.LIB  и
        FP87.LIB) из указанного каталога. По умолчанию  редактор
        связей ищет их в текущем каталоге.
 
 -nxxx
        Помещает файл .OBJ или .ASM, созданный  компилятором,  в
        каталог или на устройство, указанное в xxx.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                             - 16 -
 
 
 
 
                       2. УТИЛИТЫ TURBO-С
 
 
 
 
 
 
      2.1. ПРЕПРОЦЕССОР Turbo-C
 
 
      Утилита CPP - расширение компилятора Turbo-C. Препроцессор
 используется для обработки исходных текстов C-программ, исполь-
 зующих include-файлы и макро-определения.
 
      Вызов: CPP
 
      Результат работы препроцессора сохраняется в текущем ката-
 логе в файле с именем, совпадающем с именем исходного файла, но
 с расширением .I (Для того чтобы данный файл был записан в дру-
 гой каталог, а не в текущий, задайте опицию -n.)
 
      Опция -P  сообщает  препроцессору,  что  в  каждой  строке
 выходного файла необходимо указывать имя исходного файла и  но-
 мер строки. Если задана опция -P-, препроцессор пропускает дан-
 ную информацию. Если опция -P выключена, CPP может быть исполь-
 зован как макропрепроцессор; файл .I в последствии можно отком-
 пилировать, используя TCC или TC. По умолчанию  считается,  что
 опция -P включена.
 
 
      2.2. УТИЛИТА MAKE
 
 
 
      2.2.1. КОМАНДНЫЕ СПИСКИ
 
 
      Команды в списке команд MAKE-файла должны  быть  заданы  в
 следующем виде (команде предшествует по крайней мере один  про-
 бел или табуляция):
 
      [prefix... ] command_body
 
      Каждая команда состоит из списка префиксов, предшествующе-
 го самой команды.
 
      Префиксы, указанные в командах, изменяют обработку  данных
 команд утилитой MAKE. Префикс - это либо символ (@), либо  (-),
 за которым следует число.
 
 @
        MAKE не отображает команду на  экран  дисплея  перед  ее
        выполнением. Команда не отображается, даже если опция -s
        не была указана в командной строке при вызове MAKE.
 
                             - 17 -
 
 
 
 
 
 -num
        Если указано число num, MAKE будет аварийно  завершаться
        только в том случае, если  статус  завершения  превышает
        заданное число. Например:
 
      -4 myprog sample.x
 
      Если префикс -num не указан, MAKE проверяет статус  завер-
 шения для команды. Если статус завершения ненулевой, MAKE будет
 прерван.
 
 -
        MAKE не будет проверять статус завершения. Независимо от
        значения статуса MAKE будет продолжен.
 
      Тело команды рассматривается точно также, как если бы  она
 была введена как командная строка для  COMMAND.COM,  исключение
 составляют п   перенаправление   и    фильтры,    которые    не
 поддерживаются. MAKE выполняет  следующие  встроенные  команды,
 подключая копию COMMAND.COM:
 
 break   cd      chdir   cls     copy
 ctty    date    del     dir     erase
 md      mkdir   path    promt   ren
 rename  set     time    type    ver
 verify  vol
 
      Для поиска команд MAKE использует алгоритм MS-DOS.
 
 
      2.2.2. МАКРООПРЕДЕЛЕНИЯ
 
 
      Определенные команды, имена файлов или опции  могут  часто
 повторяться в make-файле. В таких случаях  удобно  использовать
 макроопределения.
 
      Макро - имя, которое представляет собой  некоторую  строку
 символов. В макроопределении задается имя и  текст  расширения.
 Впоследствии, когда MAKE встречает имя макроопределения, данное
 имя заменяется на текст расширения.
 
      Предположим, вы определили макрос MDL:
 
      MDL=m
 
      В  дальнейшем,  вы  можете  использовать  макроподстановку
 $(MDL).
 
      Если вы хотите при очередном запуске MAKE использовать мо-
 дель памяти LARGE, в вызове MAKE укажите опцию -D(Define):
 
      make -DMDL=l
 
                             - 18 -
 
 
 
 
      2.2.2.1. ОПРЕДЕЛЕНИЕ МАКРОСОВ
 
 
      Все макроопределения должны иметь вид:
 
      Имя_макро=Текст_расширения
 
      Имя_макро - строка букв и цифр, не содержащая пробелов.
 
      Текст_расширения - любая произвольная  строка,  содержащая
 буквы, цифры, пробелы, знаки пунктуации, и завершающаяся симво-
 лом перевода строки.
 
      Переопределить макрос можно либо в тексте маке-файла, либо
 используя опцию -D в командной строке вызова.
 
      В именах макроопределений заглавные и строчные буквы  раз-
 личаются.
 
 
      2.2.2.2. ИСПОЛЬЗОВАНИЕ МАКРОСОВ
 
 
      Макрос включается в маке-файл в формате:
 
      $(macro_name)
 
      Скобки всегда должны присутствовать, даже если имя макроса
 состоит из одного символа.  Исключение  составляют  специальные
 макросы, рассмотренные ниже.
 
      Если MAKE встречает в тексте неопределенный макрос, он за-
 мещается на пустую строку (NULL).
 
 
      2.2.2.3. ОСОБЫЕ СЛУЧАИ
 
 
 Макросы в макросе:
        Макросы не могут включаться в левую часть макроопределе-
        ния, т.е. в (macro_name). Они могут быть использованы  в
        правой части. Когда осуществляется макроподстановка, все
        макросы, включенные в текст расширения,  также  подстав-
        ляются.
 
 Макросы в правилах:
        В строках правил макроподстановка осуществляется  тотчас
        же.
 
 Макросы в директивах:
        В директивах !if и !elif макроподстановка осуществляется
        немедленно. Если макрос, указанный в директиве,  неопре-
        делен, он рассматривается как 0 (FALSE).
 
 
                             - 19 -
 
 
 
 
 Макросы в командах:
        Макроподстановка в командах  производится  во  время  их
        выполнения.
 
 
      2.2.2.4. ПРЕДОПРЕДЕЛЕННЫЕ МАКРОСЫ
 
 
      MAKE использует некоторые специальные макросы: $d, $*, $<,
 $:, $. и $&. Первый из них определен как  тест-макрос,  исполь-
 зуется в условных директивах !if и !elif; остальные  -  макросы
 имен файлов, используется в определенных и подразумеваемых пра-
 вилах. Кроме того, строки SET, устанавливающие текущее  окруже-
 ние, автоматически загружаются как макросы, и  макроопределение
 _MAKE_ определено как 1.
 
 $d - тест-макрос
        Тест-макрос заменяется 1, если определено имя макроса, и
        0, в противном случае. Содержимое текста расширения мак-
        роса безразлично. Данный макрос допускается только в ди-
        рективах !if и !elif. Например,  предположим  вы  хотите
        модифицировать маке-файл, так чтобы он использовал сред-
        нюю модель памяти. Добавте в начало маке-файла:
 
         !if !$d(MDL)    # Если MDL неопределено
         MDL=m           # Устанавливаем его в m (MEDIUM)
         !endif
 
      Различные макросы имен файлов:
 
 $* - макроопределение основы имени файла
        Макрос ($*) заменяется на имя файла, который должен быть
        построен, без расширения. Например,
 
      Имя файла: A:\P\TESTFILE.C
 
      $* распространяется до: A:\P\TESTFILE
 
 $< - макроопределение полного имени файла
        Макрос ($<) заменяется на полное имя файла, который дол-
        жен быть построен.
 
      Имя файла: A:\P\TESTFILE.C
 
      $< распространяется до: A:\P\TESTFILE.C
 
      Например, правило:
 
         startlib.obj: startlib.c
                 copy $< \oldobjs
                 tcc -c $*
 
 будет копировать startlib.obj в каталог \oldobj, перед компиля-
 цией startlib.c.
 
                             - 20 -
 
 
 
 
 
 $: - макроопределение имени пути
        Данный макрос заменяется на имя пути (без имени  файла),
        например:
 
      Имя файла: A:\P\TESTFILE.C
 
      $: распространяется до: A:\P\
 
 $. - макроопределение имени файла и расширения
 
      Имя файла: A:\P\TESTFILE.C
 
      $. распространяется до: TESTFILE.C
 
 $& - макроопределение только имени файла
 
      Имя файла: A:\P\TESTFILE.C
 
      $& распространяется до: TESTFILE
 
 
      2.2.2.5. ДИРЕКТИВЫ
 
 
      MAKE Turbo-C, в отличии от других версий  MAKE,  допускает
 директивы, позволяющие включать  другие  маке-файлы,  применять
 правила и условные команды, печатать сообщения об ошибках и "не
 определять" макросы.
 
      Директивы начинаются с символа (!),  который  должен  быть
 первым символом строки.
 
      Полный список директив MAKE:
 
         !include
         !if
         !else
         !elif
         !endif
         !error
         !undef
 
      ДИРЕКТИВЫ ВКЛЮЧЕНИЯ ФАЙЛОВ
 
      ФОРМАТ
 
      !include "filename"
 
      Директивы могут иметь произвольную вложенность. При попыт-
 ке включить файл, уже включенный на  некотором  внешнем  уровне
 вложенности, внутренняя директива будет игнорироваться как оши-
 бочная.
 
 
                             - 21 -
 
 
 
 
 
      УСЛОВНЫЕ ДИРЕКТИВЫ
 
      Формат директив аналогичен формату директив C-препроцессо-
 ра.
 
         !if выражение
                 [строки]
         !endif
 
 
         !if выражение
                 [строки]
         !else
                 [строки]
         !endif
 
 
         !if выражение
                 [строки]
         !elif
                 [строки]
         !endif
 
 П_р_и_м_е_ч_а_н_и_е. [строки] могут быть следующие:
 
      - макро-определения
 
      - явное правило
 
      - подразумеваемое правило
 
      - include-директива
 
      - if_group
 
      - error-директива
 
      - undef-директива
 
      Условные директивы  составляют  группу,  если  имеется  по
 крайней мере одна директива !if, открывающая группу, и директи-
 ва !endif, закрывающая ее.
 
      Одна директива !else может присутствовать в группе.
 
      Директивы !elif могут находиться между !if и !else.
 
      Условные директивы могут быть вложенными.
 
      ВЫРАЖЕНИЯ В УСЛОВНЫХ ДИРЕКТИВАХ
 
      Выражения, допускающиеся в условных директивах, имеют син-
 таксис аналогичный используемому в языке C. Выражение  рассмат-
 
                             - 22 -
 
 
 
 
 ривается как простое 32 разрядное целое выражение. Числа  могут
 задаваться как десятичные, восьмеричные  или  шестнадцатеричные
 константы.
 
      Выражения могут использовать следующие унарные операции:
 
 -
        отрицание
 
 ~
        побитовое дополнение
 
 !
        логическое "не"
 
      Выражения могут содержать следующие двоичные операторы:
 
         +       сложение
         -       вычитание
         *       умножение
         /       деление
         "       правая, левая кавычки
         &       поразрядное "и"
         |       поразрядное "или"
         ^       поразрядное исключающее "или"
         &&      логическое "и"
         ||      логическое "или"
         >
         <
         >=
         <=
         ==
         !=
 
      Выражение может включать тройной оператор ?.
 
        Для  группирования  операндов  могут  быть  использованы
 скобки. При их отсутствии порядок выполнения  операторов  такой
 же как в языке C.
 
      ДИРЕКТИВА error
 
      Данная директива вызывает прерывание MAKE и печать указан-
 ного диагностического сообщения.
 
      ФОРМАТ
 
      !error любой_текст
 
      ДИРЕКТИВА undef
 
      ФОРМАТ
 
      !undef имя_макро
 
                             - 23 -
 
 
 
 
 
      Директива отменяет макро-определение.  Игнорируется,  если
 макрос ранее не был определен.
 
 
      2.2.3. ВЫЗОВ MAKE
 
 
 
      2.2.3.1. СИНТАКСИС КОМАНДНОЙ СТРОКИ
 
 
      Общий случай вызова MAKE:
 
         make option option... target target
 
      Option - опции MAKE, target - имя файла, к которому должны
 быть применены указанные в MAKE правила.
 
      MAKE прерывается, если какая-либо его команда  завершилась
 через control-break. Т.о., выполнение текущей команды и сам MA-
 KE можно прервать по Ctrl-C.
 
 
      2.2.3.2. ФАЙЛ BULTINS.MAK
 
 
      В данный файл вы можете помещать  наиболее  часто  исполь-
 зуемые макро-определения и правила.  При  каждом  запуске  MAKE
 ищет файл BULTINS.MAK; если данный файл существует, MAKE читает
 его прежде чем MAKEFILE.
 
      Поиск файла BULTINS.MAK осуществляется в текущем  каталоге
 или в любом каталоге, указанном в  path.  Желательно  поместить
 данный файл в тот же каталог, что и MAKE.EXE.
 
 
      2.2.3.3. ОПЦИИ КОМАНДНОЙ СТРОКИ
 
 
 -Didentifier
        определяет указанный идентификатор как строку содержащую
        единственный символ 1.
 
 -Diden=string
        определяет указанный идентификатор как строку со  значе-
        нием, стоящим после знака (=). Строка не модет содержать
        пробелы или табуляции.
 
 -Ldirectory
        MAKE ищет включаемые файлы в указанном каталоге (так  же
        как и в текущем)
 
 
 
                             - 24 -
 
 
 
 
 -Uidentifier
        Отменяет ранее заданное определение идентификатора.
 
 -s
        Обычно, MAKE печатает каждую команду, которую выполняет.
        При включении данной опции выполняемые команды не  печа-
        таются.
 
 -n
        MAKE печатает команды, но не выполняет их.  Используется
        при отладке.
 
 -ffilename
        Использует filename как MAKE файл. Если  указанный  файл
        не существует,  и  не  задано  расширение,  производится
        попытка найти файл filename.mak.
 
 -? или -h
        Печатается help.
 
 
      2.3. РЕДАКТОР СВЯЗЕЙ Turbo-C
 
 
      Вызов
 
 tlink C0x , , [map],  [emu|fp87 mathx] Cx
 
  = .OBJ файлы, которые должны быть связаны.
 
  = имя выполняемого файла.
 
 [map] = имя файла, куда помещается карта загрузки.
 
  = файлы подключаемых библиотек.
 
 C0x = инициализиционный модуль для модели памяти x.
 
 emu|fp87 = библиотеки плавающей точки (выбрать одну).
 
 Cx = системная библиотека для модели памяти x.
 
 
      2.3.1. ИНИЦИАЛИЗАЦИОННЫЕ МОДУЛИ
 
 
      Инициализационные модули имеют имя C0x.OBJ, где x  -  одна
 из следующих букв, соответствующая модели памяти: t, s,  c,  m,
 l, h. Данный модуль приводит в порядок различные сегменты прог-
 раммы. Если инициализиционный модуль не указан первым  аргумен-
 том в командной строке, сегменты программы могут быть  неудачно
 размещены в памяти.
 
      Не забудьте указать имя .EXE файла в командной  строке,  в
 
                             - 25 -
 
 
 
 
 противном случае имя вашей программы будет C0x.EXE.
 
 
      2.3.2. БИБЛИОТЕКИ
 
 
      Системные библиотеки моделей памяти должны подключаться  в
 определенном порядке.
 
      Если ваша программа использует плавающую точку, вы  должны
 указать библиотеку плавающей точки (EMU.LIB или FP87.LIB) и ма-
 тематическую библиотеку (MATHx.LIB), где x=t, s, c, m, l, h.
 
 П_р_и_м_е_ч_а_н_и_е. Если вы используете операции  с  плавающей
 точкой, вы должны включить математическую библиотеку и  библио-
 теку эмулятора ПРЕЖДЕ системной библиотеки поддержки.
 
 
      2.3.3. ИСПОЛЬЗОВАНИЕ TLINK с TCC
 
 
      Редаетор связей может быть использован как последний  про-
 ход компилятора Turbo-C. В данном случае имена файлов в команд-
 ной строке вызова компилятора должны быть заданы с явными  рас-
 ширениями .OBJ и .LIB.
 
      Например,
 
      tcc -mx mainfile.obj subl.obj mylib.lib
 
      TCC будет подключать TLINK  с  файлами  C0x.OBJ,  EMU.LIB,
 MATHx.LIB и Cx.LIB (инициализационный модуль, библиотека эмуля-
 тора (по умолчанию), математическая библиотека, системная  биб-
 лиотека поддержки).
 
 П_р_и_м_е_ч_а_н_и_е. TCC всегда подключает TLINK с опцией /c.
 
 
      2.3.4. ОПЦИИ РЕДАКТОРА СВЯЗЕЙ
 
 
      По умолчанию редактор связей всегда создает карту загрузки
 выполняемого файла. Данная карта содержит только список сегмен-
 тов программы, стартовый адрес  программы  и  предупреждения  и
 сообщения об ошибках во время работы редактора связей.
 
      Опция /m позволяет создать  более  полную  карту  загрузки
 (добавляются список общих переменных, отсортированный в порядке
 увеличения адресов).
 
      Опция /s создает такой же файл карты как опция /m, но  до-
 бавляется детализированная карта сегмента. Для каждого сегмента
 в каждом модуле карта включает адрес, длину  в  байтах,  класс,
 имя сегмента, группу, модуль и ACBP информацию.
 
                             - 26 -
 
 
 
 
 
      Опция /l создает раздел в файле .MAP для номеров строк ис-
 ходного кода. Для того, чтобы использовать данную опцию,  необ-
 ходимо компилировать исходный файл с флагом -y. Если вы  задали
 редактору связей опцию -x (не создавать карту), опция /l  будет
 игнорироваться.
 
      Опция /i помещает сегменты в выполняемый файл,  даже  если
 сегменты не содержат записи данных.
 
 П_р_и_м_е_ч_а_н_и_е. Обычно это не требуется.
 
      Опция /n приводит к тому, что редактор  связей  игнорирует
 библиотеки по умолчанию, указанные для некоторых  компиляторов.
 Данная опция необходима, если библиотеки по умолчанию  распола-
 гаются в другом каталоге, т.к. редактор связей не  поддерживает
 поиск библиотек. Кроме того, опция может быть использована, ес-
 ли связываемые модули написаны на другом языке.
 
      Опция /c обеспечивает различие строчных и заглавных букв в
 именах общих и внешних переменных.
 
      Опция /d: обычно редактор связей не сообщает  о  том,  что
 символьное имя встречается более чем в одной  библиотеке.  Если
 символьное имя должно быть включено в  программу,  TLINK  будет
 использовать копию символьного имени, упомянутого в первом фай-
 ле (библиотеке), указанном в командной строке.
 
      При наличии опции /d, будет выдаваться  список  всех  сим-
 вольных имен, продублированных в  библиотеках,  даже  если  эти
 имена не используются в программе.
 
      Кроме того, использование опции /d приводит к выдаче  пре-
 дупреждений о всех одинаковых именах, встретившихся как в файле
 .OBJ так и в файле .LIB.
 
 
      2.3.5. ОГРАНИЧЕНИЯ
 
 
      Оверлейные модули не поддерживаются.
 
      Не поддерживается Microsoft CodeView Debugger.
 
      Частично поддерживаются общие  переменные.  Должен  приме-
 няться тип public.
 
      Вы можете иметь максимально 8182 символьных  имен  и  4000
 логических сегментов.
 
      Коды, полученные MSC или MSF, не могут связываться с помо-
 щью TLINK.
 
      TLINK может использоваться с MASM и другими компиляторами,
 
                             - 27 -
 
 
 
 
 однако он несовместим с MS LINK.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
                             - 28 -
 
 
 
 
                3. ДОПОЛНИТЕЛЬНЫЕ ФУНКЦИИ Turbo-C
 
 
 
 
 
      В этом разделе описаны функции, которых нет  в  библиотеке
 компилятора MSC.
 
 
      3.1. ABSREAD
 
 
 ИМЯ
        absread
 
 НАЗНАЧЕНИЕ
        чтение данных
 
 ВЫЗОВ
        int absread(int drive,  int  nsects,  int  sectno,  void
        *buffer);
 
 ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
        int abswrite(int drive, int  nsects,  int  sectno,  void
        *buffer);
 
 INCLUDE-ФАЙЛ
        dos.h
 
 ОПИСАНИЕ
        Эти функции считывают и  пишут  специальные  сектора  на
        диске. Они игнорируют логическую структуру  диска  и  не
        обращают внимания на файлы, FATы, или каталоги.
 
        absread считывает специальные сектора диска через преры-
        вание 0x25; abswrite пишет специальные сектора  на  диск
        через прерывание 0x26.
 
      ПАРАМЕТРЫ
 
      drive = номер,  идентифицирующий  устройство,  с  которого
 считываются сектора (0 = A, 1 = B и т.д.)
 
      nsects = номера считываемых секторов
 
      sectno = начальный номер логического сектора
 
      buffer = адрес памяти, куда записываются  считываемые  или
 записываемые данные
 
      Количество считываемых секторов ограничено об'емом  памяти
 в сегменте, находящемся перед адресом buffer. Т.о., 64K -  мак-
 симальный об'ем, который может быть  считан  при  одном  вызове
 
                             - 29 -
 
 
 
 
 absread или abswrite.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        Обе функции при успешном завершении возвращают 0. В слу-
        чае ошибки возвращается -1, и errno  принимает  значение
        регистра AX, возвращаемое после системного  вызова.  См.
        документацию по MS-DOS для пояснения errno.
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
 
      3.2. ABSWRITE
 
 
 ИМЯ
        abswrite
 
 НАЗНАЧЕНИЕ
        запись данных
 
 ВЫЗОВ
        int abswrite(int drive, int  nsects,  int  sectno,  void
        *buffer);
 
 INCLUDE-ФАЙЛ
        dos.h
 
 ОПИСАНИЕ
        См. absread
 
 
      3.3. ALLOCMEM
 
 
 ИМЯ
        allocmem
 
 НАЗНАЧЕНИЕ
        выделение сегмента памяти
 
 ВЫЗОВ
        int allocmem(unsigned size, unsigned *seg);
 
 ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
        int freemem(unsigned seg);  int  setblock(int  seg,  int
        newsize);
 
 INCLUDE-ФАЙЛ
        dos.h
 
 
 
 
 
                             - 30 -
 
 
 
 
 ОПИСАНИЕ
        allocmem использует  системный  вызов  0x48  MS-DOS  для
        выделения блока свободной памяти и возвращает адрес сег-
        мента выделенного блока.
 
      ПАРАМЕТРЫ
 
      size - требуемый размер памяти в параграфах.
 
      seg - указатель на слово, которому будет присвоено  значе-
 ние адреса вновь выделенного блока. Присвоения значения  слову,
 на которое указывает seg, не производится, если нет достаточно-
 го свободного места.
 
        Все  выделяемые   блоки   представляют   собой   цепочку
 параграфов.
 
      freemem освобождает  блок  памяти,  выделенный  предыдущим
 вызовом allocmem. seg - это адрес сегмента данного блока.
 
      setblock изменяет размер сегмента памяти. seg - это  адрес
 сегмента, возвращаемый предыдущим вызовом allocmem.  newsize  -
 это новый требуемый размер в параграфах.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        В случае успешного завершения allocmem возвращает -1.  В
        случае ошибки  возвращается  число  (размер  наибольшего
        свободного блока).
 
        freemem в случае нормального завершения возвращает 0.  В
        случае ошибки возвращается -1, а errno устанавливается в
 
      ENOMEM Insufficient memory
 
        setblock в случае нормального завершения возвращает  -1.
        В случае ошибки возвращается размер наибольшего  возмож-
        ного блока.
 
        Ошибочное завершение allocmem или setblock вызовет уста-
        новку _doserrno и установку глобальной переменной  errno
        в
 
      ENOMEM Not enough core
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
 СМ. ТАКЖЕ
        malloc
 
 
 
 
 
 
                             - 31 -
 
 
 
 
      3.4. ATEXIT
 
 
 ИМЯ
        atexit
 
 НАЗНАЧЕНИЕ
        определения регистров
 
      ВЫЗОВ
 
      #include 
 
      int atexit(atexit_tfunk)
 
 INCLUDE-ФАЙЛ
        dos.h
 
 ОПИСАНИЕ
        atexit регистрирует функцию, на которую  указывает  func
        как на "exit function". В случае  нормального  окончания
        программы exit вызывает *func (без аргументов)  как  раз
        перед возвратом в операционную систему. Вызываемая функ-
        ция - функция типа atexit_t, который определен в typedef
        в stdlib.h.
 
        Каждый вызов atexit  регистрирует  другую  завершающуюся
        функцию. Может быть зарегистрировано до 32 функций,  ко-
        торый выполняются в порядке "последний пришел  -  первый
        ушел" (LIFO).
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        В случае нормального окончания atexit  возвращает  0,  в
        случае ошибки (нет пространства для регистрации функции)
        - ненулевое значение.
 
 СМ. ТАКЖЕ
        exec...exit,spawn...
 
      ПРИМЕР
 
         #include 
         #include 
         void exit_fn1()
         {
             printf("Exit Function 1 called\n");
         }
 
         void exit_fn2()
         {
             printf("Exit Function 2 called\n");
         }
         main()
         {
 
                             - 32 -
 
 
 
 
             atexit(exit_fn1);   /* post exit_fn1 */
             atexit(exit_fn2);   /* post exit_fn2 */
             printf("Main quitting ...\n");
         }
     Выведется:
         Main quitting ...
         Exit Function 2 called
         Exit Function 1 called
 
 
      3.5. ATOF
 
 
 ИМЯ
        atof
 
 НАЗНАЧЕНИЕ
        преобразование строки к числу с плавающей точкой.
 
 ВЫЗОВ
        double atof(char *nptr);
 
 ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
        int atoi(char *nptr); long atol(char *nptr);
 
      INCLUDE-ФАЙЛ
 
      math.h (atof)
 
      stdlib.h (atof, atoi, atol)
 
 ОПИСАНИЕ
        atof преобразует строку, на которую  указывает  nptr,  к
        числу двойной точности. Данная функция опознает:
 
      - необязательную строку из табуляций и пробелов;
 
      - необязательный знак;
 
      - строку цифр или необязательную десятичную точку;
 
      - необязательную букву e или Е, за которой следует  необя-
        зательной целое число со знаком.
 
        atoi преобразует строку, на которую  указывает  nptr,  к
        целому числу. atol преобразует строку  символов  к  типу
        long. atoi и atol опознают:
 
      - необязательную строку из табуляций и пробелов;
 
      - необязательный знак;
 
      - строку цифр.
 
 
                             - 33 -
 
 
 
 
        Во всех трех функциях первый неопознанный символ  закан-
        чивает преобразование.
 
        Во всех трех функциях не существует поддержки переполне-
        ния.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        Эти функции возвращают величину, полученную преобразова-
        нием входной строки. Если строка не может быть  преобра-
        зована к числу соответствующего типа (double  для  atof,
        int для atoi, long для atol), возвращается 0.
 
 ПЕРЕНОСИМОСТЬ
        Аналогично для UNIX.
 
 СМ. ТАКЖЕ
        scanf
 
 
      3.6. BIOSCOM
 
 
      Вызов:
 
   #include 
   int bioscom(int cmd, char byte, int port);
 
      Функция предназначена для работы с адаптером RS232. Значе-
 ние переменной port 0 соответствует устройству  COM1,  1  соот-
 ветствует COM2 и так далее.
 
      Значение cmd может быть одним из следущих:
 
 0
        установить коммуникационные параметры, заданные парамет-
        ром byte;
 
 1
        передать символ, заданный параметром byte в линию;
 
 2
        принять символ из линии;
 
 3
        получить текущий статус крммуникационного порта.
 
      Byte представляет собой комбинацию следующих битов:
 
 0x02
        7 бит данных
 
 
 
 
 
                             - 34 -
 
 
 
 
 0x03
        8 бит данных
 
 0x00
        1 стоп-бит
 
 0x04
        2 стоп-бит
 
 0x00
        No parity
 
 0x08
        Odd parity
 
 0x18
        Even parity
 
 0x00
        110 бод
 
 0x20
        150 бод
 
 0x40
        300 бод
 
 0x60
        600 бод
 
 0x80
        1200 бод
 
 0xA0
        2400 бод
 
 0xC0
        4800 бод
 
 0xC0
        9600 бод
 
      Для всех значений cmd, возвращаемое значение есть  16-бит-
 ное слово,где старшие 8 бит - это биты статуса, а младшие возв-
 ращаемый байт. Старшие биты могут принимать следующие значения:
 
 
 
 
 
 
 
 
 
 
                             - 35 -
 
 
 
 
                                                       Таблица 1
 
 
 
            Биты старшего байта
 ----------------------------------------------------
 бит  |    значение
 ----------------------------------------------------
 15   | Time out
 14   | Transmit shift register empty
 13   | Transmit holding register empty
 12   | Break detect
 11   | Framing error
 10   | Parity error
 9    | Overrun error
 8    | Data ready
 
      Eсли значение cmd было 1 и бит 15 установлен в 1  byte  не
 был передан.
 
      Если значение cmd было 2, считанный байт в  младших  битах
 возвращаемого слова, если не было  ошибок.  Ошибкой  считается,
 если хотя бы один бит старшего байта установлен в 1.
 
      Если значение cmd было 0 или 3, старший байт может  прини-
 мать значения как было описано выше, а биты младшего байта  мо-
 гут быть следущие:
 
 
                                                       Таблица 2
 
 
 
            Биты младшего байта
 ----------------------------------------------------
 бит  |    значение
 ----------------------------------------------------
 7    | Received line signal detect
 6    | Ring indicator
 5    | Data set ready
 4    | Clear to send
 3    | Delta receive line signal detector
 2    | Trailing edge ring indicator
 1    | Delta data set ready
 0    | Delta clear to send
 
 
      3.7. BIOSDISK
 
 
      Вызов:
 
   #include 
   int biosdisk(int cmd, int drive, int head,
 
                             - 36 -
 
 
 
 
                int track, int sector,
                int nsect, void *buffer);
 
      Эта функция использует прерывание 0х13 для работы с диском
 через bios.
 
      Drive есть номер диска. 0 соответсвует первому флоппи-дис-
 ку, 1 - второму и т.д. Для работы с винчестерским диском  нуме-
 рация начинается с 0х80. 0х80 - первый, 0х81 - второй и так да-
 лее. Для жестких дисков определяется физический номер устройст-
 ва, а не часть. Прикладные программы сами должны  интерпретиро-
 вать информацию из таблицы частей если им это необходимо.
 
      Параметр cmd указывает необходимую операцию. Он может при-
 нимать следующие значения:
 
 
                                                       Таблица 3
 
 
 
            Принимаемые значения cmd
 ----------------------------------------------------
 бит  |    значение
 ----------------------------------------------------
     Для IBM PC, XT или AT
 
 0    | Сброс
      | Все остальные параметры игнорируются
 1    | Возвращает статус последней дисковой операции
      | Все остальные параметры игнорируются
 2    | Читает один или более секторов в память
      | Начальный сектор задается параметрами:
      | head, track и sector. Число секторов
      | задается параметром nsect. Данные читаются
      | по 512 байт на сектор в buffer.
 3    | Запись одного или более секторов из памяти.
      | Начальный сектор задается параметрами:
      | head, track и sector. Число секторов
      | задается параметром nsect. Данные записываются
      | по 512 байт на сектор из buffer.
 4    | Проверка одного или более секторов.
      | Начальный сектор задается параметрами:
      | head, track и sector. Число секторов
      | задается параметром nsect.
 5    | Форматирование дорожки. Дорожка определяется
      | параметрами head и track. buffer указывет на
      | таблицу соответствия секторов и головок.
      | Смотрите Ваш Technical Reference Manual
      | для описания этой таблицы и операции
      | форматирования.
 
      Только для XT и AT
 
 
                             - 37 -
 
 
 
 
                                             Продолжение табл. 3
 
            Принимаемые значения cmd
 ----------------------------------------------------
 бит  |    значение
 ----------------------------------------------------
 6   | Форматирование дорожки и установка флогов
     | для плохих секторов.
 7   | Форматирование начинается с определенной
     | дорожки
 8   | Получить текущие параметры устройства.
     | Информация возвращается в buffer в первых
     | четырех байтах.
 9   | Initalizes drive-pair characteristics
 10  | Длинное чтение, при котором читаются
     | 512 байт + 4 extra байт на сектор
 11  | Длинная запись, при котором пишутся
     | 512 байт + 4 extra байт на сектор
 12  | Установка в нужноу место
     |(Does a disk seek)
 13  | Альтернативный сброс диска
 14  | Считать секторный буфер
 15  | Записать секторный буфер
 16  | Проверить на готовность указанное устройство
 17  | Recalibrates the drive
 18  | Диагностика ОЗУ контроллера
 19  | Диагностика устройства
 20  | Внутренния диагностика контроллера
 
      При успешном завершении возвращается 0, при ошибке возвра-
 щается не 0. Смотрите Ваш Technical Reference Manual  для  под-
 робного описания возможных ошибок.
 
 
      3.8. BIOSEQUIP
 
 
      Вызов:
 
   #include 
   int biosequip(void);
 
      Эта функция возвращает целое значение, описывающее подклю-
 ченные устройства к системе. Используется прерывание 0х11 BIOS.
 Бита   возвращаемого  значения   если   установлены   указывают
 следущее:
 
 
 
 
 
 
 
 
 
                             - 38 -
 
 
 
 
                                                       Таблица 4
 
 
 
            Принимаемые значения
 ----------------------------------------------------
 бит  |    устройство
 ----------------------------------------------------
 15   |
       > число принтеров
 14   |
 13   | не используется
 12   | Джойстик
 11   |
       > число портов RS232
 10,9 |
 8    | не используется
 7    |
       > число дискет
 6    |  00 - 1 устройство
      |  01 - 2 устройства
      |  10 - 3 устройства
      |  11 - 4 устройства, толко если 0 бит в 1
 5    |
       > 00 - не используется
 4    |  01 - 40х25 BW with color card
      |  10 - 80x25 BW with color card
      |  11 - 80x25 BW with mono card
 3    |
       > Размер ОЗУ
 2    |  00 - 16 К
      |  01 - 32 К
      |  10 - 48 К
      |  11 - 64 К
 1    | Сопроцессор плавающей точки
 0    | Загрузка с дискеты
 
 
      3.9. BIOSKEY
 
 
      Вызов:
 
   #include 
   int bioskey(int cmd);
 
      Эта функция производит разнообразные операции с  клавиату-
 рой используя прерывание 0х14  BIOS.  Параметр  cmd  определяет
 следующие операции:
 
 0
        Return the next key struck at the keyboard. If the lower
        8 bits are non-zero, that is the ASCII character struck.
        If the lower 8 bits are zero, the upper 8 bits  are  ex-
 
                             - 39 -
 
 
 
 
        tended keyboard kodes defined in the Technical Reference
        Manual for the IBM PC.
 
 1
        This tests whether a keystroke is available to be  read.
        A return value of zero means no key is available. Other-
        wise, the value of the next keystroke is  returned.  The
        keystroke itself is kept to be returned by the next call
        to bioskey that has cmd value of zero.
 
 2
        Request the current shift key status. The value is  com-
        posed from ORing the following values together:
 
     0x80 Insert toggled
     0x40 Caps toggled
     0x20 Num Lock toggled
     0x10 Scroll Lock toggled
     0x08 Alt down
     0x04 Ctrl down
     0x02 Left Shift down
     0x01 Right Shift down
 
 
      3.10. BIOSMEMORY
 
 
      ВЫЗОВ
 
   #include 
   int biosmemory(void);
 
      Функция использует прерывание 0х12 BIOS. Возвращает размер
 памяти в 1К блоках.
 
 
      3.11. BIOSPRINT
 
 
      ВЫЗОВ
 
   #include 
   int biosprint(int cmd, int byte, int port);
 
      Эта функция предназначена для  работы  с  принтером,  ука-
 занным параметром port. Если  он  равен  0,  это  соответствует
 LPT1, 1 - LPT2 и т.д.
 
      Параметр cmd может принимать следующие значения:
 
 
 
 
 
 
                             - 40 -
 
 
 
 
                                                       Таблица 5
 
 
 
            Принимаемые значения cmd
 ----------------------------------------------------
 cmd  |    описание
 ----------------------------------------------------
 0    | напечатать символ в byte
 1    | инициализация принтера
 2    | прочитать статус принтера
 
      Если возвращаемое значение для операции 0 не равно 0,  это
 свидетельствует об ошибке. Для остальных операций  возвращаемое
 значение описано в Вашем Technical Reference Manual for the IBM
 PC.
 
 
      3.12. BIOSTIME
 
 
      ВЫЗОВ
 
   #include 
   long biosprint(int cmd, long newtime);
 
      Эта функция читает или устанавливает  таймер  BIOS.  Время
 определяется в тиках от полуночи. В каждой  секунде  содержится
 18.2 тика. Если cmd равно 0, функция возвращает текущее время в
 таймере. Если cmd равно 1, устанавливается новое время в тайме-
 ре.
 
 
      3.13. BRK
 
 
      Полностью совподает с аналогичной функцией в Демосе-2.
 
 
      3.14. COUNTRY
 
 
 ИМЯ
        country
 
      ВЫЗОВ
 
    #include 
    struct country *country(int countrycode,
                        struct country *countryp);
 
 
 
 
 
                             - 41 -
 
 
 
 
 ОПИСАНИЕ
         Функция  возвращает  информацию,  зависящую  от  страны
        (дата, время и т.д.). Величина,  устанавливаемая  данной
        функцией, зависит от конкретной версии ДОС.
 
        Если countryp имеет значение -1, текущая страна  берется
        из значения countrycjde, которое не должно  быть  равным
        0.  С  другой  стороны,  на  структуру  стран  указывает
        countryp. Эта структура заполнена информацией, зависящей
        от страны:
 
      текущая страна (если countrycode установлен в 0), или
 
      страна, заданная countrycode(ом).
 
      Структура стран определяется следующим образом:
 
         struct country {
                 int co_date     /* Формат даты */
                 char co_curr[5];  /* Currency symbol */
                 char co_thsep[2]; /* Разделитель
                                         между тысячами */
                 char co_desep[2]; /* Десятичный
                                          разделитель */
                 char co_dtsep[2]; /* Разделитель в дате */
                 char co_tmset[2]; /* Разделитель во
                                                 времени */
                 char co_currstyle; /* Текущий стиль */
                 char co_digits; /* Количество значимых
                         цифр in currency */
                 int(far *co_case) {};  /* Case map function */
                 char co_dasep; /* разделитель между данными */
                 char co_fill[10];  /* Символ-заполнитель */
 
      Формат даты в co_date:
 
      0 - для стиля даты, месяца и времени США;
 
      1 - европейский стиль;
 
      2 - японский стиль.
 
      Текущий стиль изображения, задаваемый co_currstyle(ом):
 
      0 - перед текущим символом численное значение ставится без
 пробела;
 
      1 - численное значение, следующее за  символом,  не  отде-
 ляется от него пробелом;
 
      2 - предшествующее текущему символу численное значение от-
 делено от него пробелом;
 
      1 - численное значение, следующее за символом,  отделяется
 
                             - 42 -
 
 
 
 
 от него пробелом.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        Возвращает указатель countryp.
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
 
      3.15. CTRLBRK
 
 
 ИМЯ
        ctrlbrk
 
 ВЫЗОВ
 
         #include 
         void ctrlbrk(int(*fptr)(void));
 
 ОПИСАНИЕ
        Функция устанавливает новую функцию обработки комбинации
        control-break, на которую указывает fptr. Вектор  преры-
        вания 0x23 преобразуется для вызова названной функции.
 
        Названная функция не вызывается непосредственно. ctrlbrk
          делает  так,  что  ДОС-овский  обработчик   прерываний
        вызывает нужную функцию.
 
        Обрабатывающая функция может выполнять любое  количество
        операций и системных вызовов. Обработчик не имеет  возв-
        рата; он  может  использовать  longjmp  для  возврата  в
        произвольную точку программы.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        ctrlbrk ничего не возвращает. Функция-обработчик возвра-
        щает 0 для сброса текущей программы; любое другое значе-
        ние вызовет продолжение выполнения программы.
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
 СМ. ТАКЖЕ
        longjmp, setjmp
 
         ПРИМЕР
 
         #include 
         #include 
 
         #define ABORT 0
 
         int c_break(void)
         {
 
                             - 43 -
 
 
 
 
           printf("Control-Break hit. Program aborting ...\n");
           return(ABORT);
         }
         main
         {
           ctrlbrk(c_break);
           for(;;) {  /* Неопределенная петля */
             printf("Looping ...\n");
           }
        }
  Вывод:
       Looping ...
       Looping ...
       Looping ...
       ^C
       Control-Break hit. Program aborting ...
 
 
      3.16. DISABLE
 
 
 ИМЯ
        disable - отменияет прерывания
 
      ВЫЗОВ
 
         #include 
         void disable(void);
 
      ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
 
         void enable(void);
         void geninterrupt(int intr_num);
 
 ОПИСАНИЕ
        Эти функции помогают программисту осуществить гибкое уп-
        равление аппаратными прерываниями.
 
        disable отменяет прерывания. Допускается лишь прерывание
        NMI от любого внешнего устройства.
 
        enable включает прерывания.  Допускаются  прерывания  от
        всех устройств.
 
        geninterrupt инициирует внутреннее прерывание  от  прог-
        раммы, заданное параметром intr_num.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        disable и  enable  ничего  не  возвращают.  geninterrupt
        возвращает значение, зависящее от вызванного прерывания.
 
 
 
 
 
                             - 44 -
 
 
 
 
 ПЕРЕНОСИМОСТЬ
        Только для архитектуры с 8086.
 
 СМ. ТАКЖЕ
        getvect
 
 
      3.17. DOSTOUNIX
 
 
 ИМЯ
        dostounix
 
 ВЫЗОВ
         #include 
         long dostounix(struct date *dateptr,
                        struct time *timeptr);
 
 ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
 
         void unixtodos(long utime, struct date *dateptr,
                        struct time *timeptr);
 
 ОПИСАНИЕ
        dostounix преобразует дату и время,  возвращаемые  функ-
        циями getdate и gettime, в unix-овский формат. dateptr -
        указатель на структуру даты, а timeptr  -  указатель  на
        структуру времени, содержащие информацию о времени и да-
        те, соответствующих данной ДОС.
 
        unixtodos преобразует время в unix-овском формате, полу-
        ченное из utime, в ДОС-овский формат, и  заносит  его  в
        структуры даты и времени, на которые указывают dateptr и
        timeptr.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
          dostounix  возвращает  unix-овскую   версию   текущего
        времени: число секунд со времени 00:00:00 1 января  1970
        г. (GMT).
 
 ПЕРЕНОСИМОСТЬ
        Обе функции - только для MS-DOS.
 
 СМ. ТАКЖЕ
        ctime, getdate, gettime
 
 
      3.18. FARMALLOC
 
 
 ИМЯ
        farmalloc - выделение памяти для данных типа far
 
 ВЫЗОВ
 
                             - 45 -
 
 
 
 
         #include 
         void far *farmalloc(unsigned long size);
 
 ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
 
         void far *farcalloc(unsigned long nunits,
                             unsigned long unitsz);
         long farcoreleft(void);
         void farfree(void far *block);
         void far *farrealloc(void far *block,
                              unsigned long newsize);
 
 ОПИСАНИЕ
        Все названные функции по назначению подобны  аналогичным
        им malloc, calloc и т.д., но  употребляются  для  данных
        типа far.
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
 СМ. ТАКЖЕ
        malloc
 
 
      3.19. FINDFIRST
 
 
 ВЫЗОВ
         #include 
         #include 
         int findfirst(char *pathname, struct ffblk *ffblk,
                       int attrib);
 
 ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
 
         int findnext(struct ffblk *ffblk);
 
 ОПИСАНИЕ
        findfirst начинает поиск каталога  на  диске,  используя
        системный вызов MS-DOS 0x4E.
 
        pathname - строка, содержащая необязательный  специфика-
        тор устройства и полное имя искомого  файла  (включающее
        имя пути). Имя файла может содержать регулярное  выраже-
        ние (? или *). Когда заданный  файл  найден,  происходит
        наполнение структуры ffblk информацией о каталоге.
 
        attrib - байт атрибутов файла MS-DOS,  используемый  при
        выборе допустимых файлов в поиске. attrib  может  прини-
        мать одно из следудующих значений, определенных в dos.h:
 
      FA_RDONLY Только чтение
 
      FA_HIDDEN Скрытый файл
 
                             - 46 -
 
 
 
 
 
      FA_SYSTEM Системный
 
      FA_LABEL Метка тома
 
      FA_DIREC Каталог
 
      FA_ARCH Архив
 
        findnext используется для поиска следующего  файла,  имя
        которого подходит под регулярное выражение,  заданное  в
        findfirst. ffblk -  это  блок,  заполненный  при  вызове
        findfirst. Он содержит информацию, необходимую для  про-
        должения поиска. На каждый вызов findnext будет  возвра-
        щаться одно имя файла до тех пор, пока не найдется более
        имени файла, подходищего под заданное регулярное выраже-
        ние.
 
      Формат структуры ffblk:
 
         struct ffblk {
           char ff_reserved[21];  /* Зарезервировано ДОС */
           char ff_attrib;  /* Искомый атрибут */
           int ff_ftime;   /* Время модификации файла */
           int ff_fdate;   /* Дата модификации файла */
           int ff_fsize;   /* Размер файла */
           int ff_fname;   /* Имя искомого файла */
         }
 
        Эти функции устанавливают DTA для адресации ffblk.  Если
        вам нужно значение DTA, вы можете  вы  можете  сохранять
        его и восстанавливать (с помощью getdta и setdta)  после
        каждого вызова findfirst и findnext.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        Возвращают 0 при успешном завершении поика. Если файл не
        найден, или в имени файла встретилась какая-либо ошибка,
        возвращается -1, и глобальной переменное errno  присваи-
        вается одно из значений:
 
      ENOENT Имя ненайденного файла
 
      ENMFILE Файлов нет
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
      ПРИМЕР
 
  #include 
  #include 
 
  main()
  {
 
                             - 47 -
 
 
 
 
         struct ffblk ffblk;
         int done;
         printf("Directory listing of *.*\n");
         done = findfirst("*.*",&ffblk,0);
         while(!done) {
                 printf("  %s\n", ffblk.ff_name);
                 done = findenext(&ffblk);
        }
  }
         Вывод:
         Directory listing of *.*
         FINDFRST.C
         FINDFRST.OBJ
         FINDFRST.MAP
         FINDFRST.EXE
 
 
      3.20. FNMERGE
 
 
      ВЫЗОВ
 
  #include 
  void fnmerge(char *path, char *drive, char *dir,
               char *name, char *ext);
 
      ВЫЗОВ РОДСТВЕННЫХ ФУНКЦИЙ
 
  void fnsplit(char *path, char *drive, char *dir,
               char *name, char *ext);
 
 ОПИСАНИЕ
        fnmerge создает новое имя файла из отдельных компонент:
 
      X:\DIR\SUBDIR\NAME.EXT
 
      где X задается drive(ом);
 
      \DIR\SUBDIR\ - dir(ом);
 
      NAME.EXT - name(ом) и ext(ом).
 
        fnsplit полное имя файла (path) представляет строкой ви-
        да
 
      X:\DIR\SUBDIR\NAME.EXT и разбивает path на  4  компоненты.
 Затем они помещаются в строки, на которые указывают drive, dir,
 name, ext. Каждая компонента обязательна, но может  быть  NULL-
 ой.
 
        Максимальные размеры этих строк представлены константами
        MAXDRIVE, MAXDIR, MAXPATH, MAXNAME, MAXEXT, описаннsми в
        dir.h, и каждый размер включает в себя пробел для конеч-
        ного нулевого знака.
 
                             - 48 -
 
 
 
 
 
 Константа   Максимальный   Строка
               размер
 
 MAXPATH        80         path
 MAXDRIVE       3          drive, включая двоеточие (:)
 MAXDIR         66         dir, включая нач. и послед.
                           слэши (/)
 MAXFILE        9          name
 MAXEXT         5          ext, включая начальную точку (.)
 
        fnsplit полагает, что достаточно места для хранения каж-
        дой ненулевой компоненты. fnmerge полагает, что для пол-
        ного имени достаточно места. Максимальная длина  полного
        имени определяется MAXPATH.
 
        При разбитии path на части fnsplit трактует знаки  пунк-
        туации следующим образом:
 
      drive включает в себя двоеточие (C:, A: и т.д.)
 
      dir  содержит  нач.  и  послед.  слэши  (\turboc\include\,
 \source\ и т.д.)
 
      ext содержит точку, предшествующую расширению (.c, .exe  и
 т.д.)
 
      Эти две описанные функции взаимно  дополняют  друг  друга:
 если вы разбили данный path с помощью fnsplit, об'единения  по-
 лученных компонент с помощью fnmerge снова даст вам path.
 
 ВОЗВРАЩАЕМОЕ ЗНАЧЕНИЕ
        fnsplit возвращает целое  значение,  составленное  из  5
        флагов, определенных в dir.h, показывающее, какие компо-
        ненты полного имени были представлены в  path.  Флаги  и
        представляемые ими компоненты:
 
      EXTENSION расширение
 
      FILENAME имя файла
 
      DIRECTORY каталог (и, возможно, подкаталоги)
 
      DRIVE спецификация устройства (см. dir.h)
 
      WILDCARD регулярное выражение (символы ? и *)
 
 ПЕРЕНОСИМОСТЬ
        Только для MS-DOS.
 
      ПРИМЕР
 
  #include 
  #include 
 
                             - 49 -
 
 
 
 
 
 char drive[MAXDRIVE];
 char dir[MAXDIR];
 char file[MAXFILE];
 char ext[MAXEXT];
 
 main()
 {
     char s[MAXPATH], t[MAXPATH];
     int flag;
 
     for (;;)  {
         printf("> ");  /* Печать приглашения */
         if(!gets(s)) break; /* ожидание ввода */
         flag = fnsplit(s,drive,dir,file,ext);
 
         /* печать компонент */
         printf("   drive: %s, dir: %s, file: %s, ext: %s, ",
                    drive,dir,file.ext);
         printf("flags: ");
         if (flag & DRIVE)
            printf(":");
         if (flag & DIRECTORY)
            printf("d");
         if (flag & FILENAME)
            printf("f");
         if (flag & EXTENSION)
            printf("e");
            printf("\n");
 
       /* сбор частей вместе и сравнение с
                         исходными данными */
         fnmerge(s,drive,dir,file,ext);
         if(strcmp(t,s) != 0)
             printf(" --> strings are different!");
         }
 }
         Вывод:
 > C:\TURBOC\FN.C
   drive: C:, dir: \TURBOC\, file: FN, ext: .C, flags: dfe
 > FILE.C
   drive: , dir: , file: FILE, ext: .C, flags: :fe
 > \TURBOC\SUBDIR\NOEXT.
   drive: , dir: \TURBOC\SUBDIR, file: NOEXT, ext: ., flags: dfe
 > C:MYFILE
   drive: C:, dir: , file: MYFILE, ext: , flags: :f
 > ^Z
 
 
 
 
 
 
 
 
                             - 50 -
 
 
 
 
      3.21. GETCBRK
 
 
      ВЫЗОВ
 
             #include 
             int getcbrk(void);
 
      ОПИСАНИЕ
 
        Функция  возвращает  установленную  реакцию  на   символ
 (control-break (ctrl/c). Функция использует прерывание 0х33 MS-
 DOS. Если функция вернула 0, то проверка выключена и  программа
 по control-break не прерывается, если 1 - включена.
 
 
      3.22. GETCURDIR
 
 
      ВЫЗОВ
 
               #include 
               int getcurdir(int drive, char *direc);
 
      ОПИСАНИЕ
 
      Функция читает имя текущего рабочего каталога на указанном
 параметром drive устройстве.
 
      Нумерация устройств с 0 (0 - по умолчанию, 1=А, 2=В, 3=С и
 т.д.).
 
      Имя каталога возвращается в массиве direc. Функция возвра-
 щает -1 при ошибке и 0 в противном случае.
 
 
      3.23. GETCWD
 
 
      ВЫЗОВ
 
             #include 
             char *getcwd (char *buf, int n);
 
      ОПИСАНИЕ
 
      Функция  читает  полное  имя  текущего  рабочего  каталога
 (включая имя устройства) длины не более n, сохраняя его в  buf.
 Если полное имя пути больше n, фиксируется ошибка. Если  перво-
 начально buf=NULL, буфер длины n байт будет выделен для  вас  с
 помощью malloc. Функция возвращает buf в случае ошиьки NULL.
 
 
 
 
                             - 51 -
 
 
 
 
      3.24. GETDATE
 
 
      ВЫЗОВ
 
         #include 
         void getdate (struct date *dateblk);
         void gettime (struct time *timep);
         void setdate (struct date *dateblk);
         void settime (struct time *timep);
 
      ОПИСАНИЕ
 
      Функция getdate получает текущую дату и помещает ее в  da-
 teblk. setdate устанавливает текущую дату, заданную в  dateblk.
 gettime получает текущее время в timep.  settime  устанавливает
 текущее время, заданное в timep.
 
         struct date {
         int da_year /* текущий год */
         char da_day /* месяц года */
         char da_mon /* месяц/январь-1 */
       }
         struct time {
         unsigned char ti_min /* минуты */
         unsigned char ti_hour /* часы */
         unsigned char ti_hund /* сотые доли секунд */
         unsigned char ti_sec /* секунды */
      }
 
 
      3.25. GETDFREE
 
 
      Вызов:
 
        #include 
         void getdfree (int drive, struct dfree *dfreep);
 
      ОПИСАНИЕ
 
      Функция получает свободное  пространство  на  диске  drive
 (0=по умолчанию, 1=А, 2=В и  т.д.).  Результат  возвращается  в
 структуре dfreep следующего вида:
 
         struct dfree {
                unsigned df_avail; /* число годных кластеров */
                unsigned df_total; /* общее число кластеров */
                unsigned df_bsec /* число байт в секторе */
                unsigned df_sclus /* число секторов в кластере */
 
        }
 
      Функция не  возвращает  значение.  Если  произошла  ошибка
 
                             - 52 -
 
 
 
 
 df_sclus устанавливается в -1.
 
 
      3.26. GETDISK
 
 
      Вызов:
 
         #include 
         int getdisk (void);
         int setdisk (int drive);
 
      ОПИСАНИЕ
 
      Функция getdisk возвращает номер текущего диска (0=А, 1=В,
 2=С и т.д.), используя прерывание 0х19 DOS. Функция setdisk ус-
 танавливает текущим диском drive (0=A, 1=B, 3=C  и  т.д.),  ис-
 пользуя 0х0Е прерывание DOS.  setdisk  возвращает  общее  число
 дисков, имеющихся в наличии.
 
 
      3.27. GETDTA
 
 
      Вызов:
 
        #include 
        char *getdta(void);
        void setdta(char far *dta);
 
      ОПИСАНИЕ
 
      Функция  getdta  возвращает  текущий  установленный  адрес
 преобразования диска (DTA) (подробности смотри Technical  Refe-
 rence Manual). setdta изменяет текущий DTA на значение,  задан-
 ное dta.
 
 П_р_и_м_е_ч_а_н_и_е. Корректно работает только с моделями памя-
 ти: compact, large и huge.
 
 
      3.28. GETFAT
 
 
      Вызов:
 
        #include 
        void getfat(int drive, struct fatinfo *fatblkp);
        void getfatd(struct fatinfo *fatblkp);
 
      ОПИСАНИЕ
 
      Функции получают информацию из таблицы  размещения  файлов
 (FAT). Для функции getfat необходимо указать  устройство  (0=по
 
                             - 53 -
 
 
 
 
 умолчанию текущий, 1=А, 2=В, 3=С и т.д.). Функция getfatd полу-
 чает информацию о текущем диске.
 
      Обе функции  заполняют  структуру,  на  которую  указывает
 fatblkp, типа:
 
         struct fatinfo {
         char fi_sclus; /* число секторов в кластере */
         char fi_fatid; /* The FAT id byte */
         char fi_ndus /* число кластеров */
         int fi_bysec /* число байт в секторе */
        }
 
 
      3.29. GETFTIME
 
 
      Вызов:
 
        #include 
        int getftime (int handle, struct ftime *ftime);
        int setftime (int handle, struct ftime *ftimep);
 
      ОПИСАНИЕ
 
      Функция getftime получает время и дату создания файла  для
 дискового  файла,  открытого  с  помощью  open  с  дескриптором
 handle. Результат возвращается в ftimep.
 
      Функция setftime изменяет дату и время для открытого файла
 с дескриптором handle. Время и дата берется из ftimep.
 
      Структура ftime имеет следующий вид:
 
         struct ftime {
         unsigned ft_sec:5;  /* two seconds */
         unsigned ft_min:6;  /* минуты */
         unsigned ft_hour:5; /* часы */
         unsigned ft_day:5; /* дни */
         unsigned ft_month:4; /* месяц */
         unsigned ft_year:7; /* год, начиная с 1980 */
       };
 
      Обе функции возвращают 0 при успешном завершении  и  число
 <0 при ошибке.
 
 
      3.30. GETPASS
 
 
      Вызов:
 
         include 
         char *getpass(char *prompt);
 
                             - 54 -
 
 
 
 
 
      ОПИСАНИЕ
 
      Функция аналогична getpass в OC DEMOC-2.
 
 
      3.31. GETPSP
 
 
      Вызов:
 
        #include 
        unsigned getpsp(void);
 
      ОПИСАНИЕ
 
      Функция получает сегментный адрес (segment adress) префик-
 са программного сегмента (PSP), используя 0х62 прерывание DOS.
 
 П_р_и_м_е_ч_а_н_и_е. Работает только в MS-DOS версий 3.х
 
 
      3.32. GETVECT
 
 
      Name ...... getvect-gets interrupt vector entry
 
      Usage ..... void interrupt(getvect(int intr_num)) ();
 
      Related
 
      fuctions usage ... void  setvect(int_num,  void  interrupt
 (isr) ());
 
      Prototype in ..... dos.h
 
      Description ...... MS-DOS includes a set  of  "hard-wired"
 interrupt vectors, numbered 0 to 255. The 4-byte value in  each
 vector is actually an address, which is the location of an  in-
 terrupt function&
 
      getvect reads the value of the vector  named  by  intr_num
 and interprets that value read as a (far) pointer to  some  in-
 terrupt function.
 
      setvect sets the value of the vector named by intr_num  to
 a new value, vector, which is a far pointer containing the add-
 ress of a new interrupt function. The address of  a  C  routine
 may only be passed to vector if that routine is declared to  be
 an interrupt routine.
 
      Note: If you use the prototypes declared in dos.h, you can
 simply pass the address of an interrupt function to setvect  in
 any memory model.
 
                             - 55 -
 
 
 
 
 
      Return value ..... getvect returns the current 4-byte  va-
 lue stored in the interrupt vector named by  intr_num.  setvect
 returns nothing.
 
      Portability ...... Unique to MS-DOS.
 
      See also ......... disable
 
 
      3.33. GETVERIFY
 
 
      Вызов:
 
        #include 
        int getverify(void);
        int setverify(int value);
 
      ОПИСАНИЕ
 
      Функции предназначены для работы с флагом проверки  записи
 на диск MS-DOS. Если этот флаг включен, каждая операция  записи
 на диск проверяется.
 
      Функция getverify возвращает 0, если флаг включен.
 
      Функция setverify устанавливает флаг: 0 - выключить,  1  -
 включить.
 
 
      3.34. HARDERR
 
 
      Вызов:
 
        #include 
        void harderr(int (*fptr) ());
        void hardresumed(int rescode);
        void hardretn(int errcode);
 
      ОПИСАНИЕ
 
      Эти функции предназначены для обработки аппаратных ошибок.
 
      Функция harderr указывает на функцию,  которая  будет  ис-
 пользоваться д   для   обработки   аппаратных   ошибок   вместо
 стандартных. Она использует прерывание 0х24. Функция, на  кото-
 рую указывает harderr, должна иметь вид:
 
         handler(int errval, int ax, int bp, int si)
 
 errval - это код ошибки, установленный в регистре DI; ax, bp  и
 si - это соответствующие регистры; ах указывает на каком  диске
 
                             - 56 -
 
 
 
 
 или устройстве произошла ошибка. Если ах<0, то не на диске. Ес-
 ли ах>0, то используя маску 0х00FF, можно получить номер  диска
 (1=А, 2=В и т.д.).
 
      Функция hardresumed используется для возврата в MS-DOS  со
 значениями: 0 - игнорировать, 1 - для повторения, 2 - аборт.
 
      Функция hardretn возвращает вызвавшей программе ошибку.
 
 П_р_и_м_е_ч_а_н_и_е. Функция handler должна возвращать 0 -  для
 игнорирования ошибки, 1 - повторить операцию, 2 - прекратить.
 
      Примеры:
 
         #include 
         #include 
 
         #define DISPLAY STRING   0x09
         #define IGNORE 0
         #define RETRY. 1
         #define ABORT  2
       int handler(int errval, int ax, int bp, int si)
       {
         char msg[25]; int drive;
 
         if (ax < 0) )  /* device error */
            /* can only use dos functions 0 - 0x0C */
            bdosptr(DISPLAY_STRING, "device erro$", 0);
            hardretn(-1); /* return to calling program */
        }
         drive = (ax & 0x00FF);
         sprintf(msg, "disk error on drive %c$", `A` + drive);
         bdosptr(DISPLAY_STRING, msg, 0);
         return(ABORT);  /* abort calling program */
       }
 
       main()
       {
          harderr(handler);
 
          printf("Make sure there is no disk in drive A:\n");
          printf("Press a key when ready...\n");
          getch();
 
          printf("Attempting to access A:n");
          fopen("A:ANY.FIL,"r");
       }
 
 
 
 
 
 
 
 
                             - 57 -
 
 
 
 
      3.35. INPORT
 
 
      Вызов:
 
         #include 
         int inport(int port);
         int inportb(int port);
         void outport(int port, int word);
         void outportb(int port, char byte);
 
      ОПИСАНИЕ
 
      Inport читает слово из порта ввода port.
 
      Inportb читает байт из порта ввода port.
 
      Outport записывает слово word в порт вывода port.
 
      Outportb записывает байт byte в порт вывода port.
 
 П_р_и_м_е_ч_а_н_и_е. Inport и outport - не функции, а макросы!
 
 
      3.36. INTR
 
 
      Вызов:
 
         #include 
         void intr (int intr_num, struct REGPACK *preg);
 
      ОПИСАНИЕ
 
      Функция выполняет прерывание intr_num  для  8086,  копируя
 значение регистров из preg. После завершения прерывания  значе-
 ния регистров возвращаются опять же в preg.
 
      Структура REGPACK описана в .
 
 
      3.37. IOCTL
 
 
      Вызов:
 
  #include 
  int ioctl(int handle, int cmd[, int *argdx,
            int argcx]);
 
 Функция предназначена для контроля устройств ввода/вывода.  Ис-
 пользует системный вызов 0х44 MS-DOS.  Параметр  cmd  указывает
 вид операции для устройства:
 
 
                             - 58 -
 
 
 
 
                                                       Таблица 6
 
 
 
 -------------------------------------------------
 cmd    |                Операция
 -------------------------------------------------
 0      | Получить информацию об устройстве
 1      | Установить информацию об устройстве
 2      | Прочитать argcx байт по адресу, указанному в
        | argdx
 3      | Записать argcx байт по адресу, указанному в
        | argdx
 4      | Аналогично 2, только handle интерпретируется
        | как номер устройства (0=текущий, 1=A и т.д.)
 5      | Аналогично 3, только handle интерпретируется
        | как номер устройства (0=текущий, 1=A и т.д.)
 6      | Прлучить статус ввода
 7      | Получить статус вывода
 8      | Test removability; DOS 3.x only
 11     | Set sharing conflict retry count;
        | DOS 3.x only
 
      Функция возвращает -1 при ошибке.
 
 П_р_и_м_е_ч_а_н_и_е. Смотрите Ваш MS-DOS Programmer's Reference
 Manual для больших подробностей.
 
 
      3.38. ISATTY
 
 
      Вызов:
 
         #include 
         int isatty (int handle);
 
      ОПИСАНИЕ
 
      Функция возвращает не  0,  если  устройство,  связанное  с
 handle, является символьным устройством, и 0 - в противном слу-
 чае.
 
      Символьными  устройствами  считаются:  терминал,  консоль,
 принтер, последовательный порт.
 
 
      3.39. KEEP
 
 
      Вызов:
 
         #include 
         void keep(int status, intsize);
 
                             - 59 -
 
 
 
 
 
      ОПИСАНИЕ
 
        Возвращает  управление  MS-DOS  со  статусом  завершения
 status. Текущая программа становится резидентной. Программа ус-
 танавливается в size параграфов длины и оставляет память  прог-
 раммы свободной. keep должна использоваться для  установки  TSR
 программ. Использует прерывание 0х31 DOS.
 
 
      3.40. LOCK
 
 
      Вызов:
 
  #include 
  int lock(int handle, long offset, long length);
  int unlock(int handle, long offset, long length);
 
       Функции  предназначены  для  блокировки  и  разблокировки
 файла, заданного дескриптором handle. Работает только в версиях
 MS-DOS 3.X. Если файл заблокирован то все  остальные  программы
 могут только читать область, заданную offset и length.
 
      Функции возвращают 0 при успехе и -1 при ошибке.
 
 
      3.41. MOVMEM
 
 
      Вызов:
 
  #include 
  int movmem(void *source, void *destin,
             unsigned len);
  int setmem(void *adr,int len, char value);
 
      Movmem копирует len байт из блока source  в  блок  destin.
 Если исходная и результирующия строка перекрываются,  копирова-
 ние производиться все равно корректно.
 
      Setmem устанавливает первые len байт блока adr в  значение
 value.
 
 
      3.42. PARSFNM
 
 
      Вызов:
 
  #include 
  char *parsfnm(char *cmdline, struct fcb *fcbptr,
                int option);
 
 
                             - 60 -
 
 
 
 
 
      Функция разбирает строку, обычно командную строку, на  ко-
 торую указывает cmdline, для получения имени файла.  Имя  файла
 будет размещено в структуре  fcbptr.  Функция  использует  сис-
 темный вызов 0x29 для разбора имени файла. Смотрите Ваш  MS-DOS
 Programmer's Reference Manual для детального перечисления  воз-
 можныз значений параметра option.  Здесь  отметим,  что  option
 соответствует   значению  регистра  AL  указанного   систменого
 вызова.
 
      Если вызов прошел удачно, то функция возвращает  указатель
 следующего байта в строке после имени файла, в противном случае
 NULL.
 
 
      3.43. PEEK
 
 
      Вызов:
 
  #include 
  int peek(int segment, unsigned offset);
  int peekb(int segment, unsigned offset);
 
      Функция peek возвращает значение слова памяти  по  адресу,
 заданного параметрами segment и offset.
 
      Функция peekb возвращает значение байта памяти по  адресу,
 заданного параметрами segment и offset.
 
 
      3.44. POKE
 
 
      Вызов:
 
  #include 
  int poke(int segment, unsigned offset, int value);
  int pokeb(int segment, unsigned offset, char value);
 
      Функция poke устанавливает значение value слова памяти  по
 адресу, заданного параметрами segment и offset.
 
      Функция pokeb устанавливает значение value байта памяти по
 адресу, заданного параметрами segment и offset.
 
 
      3.45. POLY
 
 
      Вызов:
 
  #include 
  double poly(double x, int n, double c[]);
 
                             - 61 -
 
 
 
 
 
      Функция получает значение полинома в точке  x  степени  n,
 заданного коэффициентами c[0], c[1], ..., c[n].
 
 
      3.46. RANDBRD
 
 
      Вызов:
 
  #include 
  int randbrd(struct fcb *fcbptr, int reccnt);
  int randbwr(struct fcb *fcbptr, int reccnt);
 
      Функция randbrd читает reccnt записей, используя  открытый
 FCB указатель fcbptr. Функция использует системный  вызов  0x27
 MS-DOS.
 
       Функция  randbwr  записывает  reccnt  записей,  используя
 открытый FCB указатель  fcbptr.  Функция  использует  системный
 вызов 0x28 MS-DOS.
 
      Функции возвращают следующие значения:
 
      - 0 - все записи считаны или записаны
 
      - 1 - для записи - нет свободного места, для чтения -  ко-
        нец файла означает конец последней записи
 
      - 2 - считываемая запись имеет  адрес  превышающий  0xFFFF
        (записей больше чем возможно считать).
 
      - 3 - конец файла не означает конец последней записи.
 
 
      3.47. SEARCHPATH
 
 
      Вызов:
 
  #include 
  char *searchpath(char *filename);
 
      Функция используется для поиска  файла  filename.  Сначала
 файл ищется в текущем каталоге, если его здесь нет то ищется  в
 каталогах, которые  определены  в  переменной  окружения  PATH.
 Возвращается полное имя файла при удачном  поиске  и  NULL  при
 неудачном.
 
 
 
 
 
 
 
                             - 62 -
 
 
 
 
      3.48. SETCBRK
 
 
      ВЫЗОВ
 
      #include 
      setcbrk (int value);
 
      ОПИСАНИЕ
 
      Функция устанавливает реакцию на символ control-break.
 
      Если значение value равно 0, то проверка выключается.
 
      Если значение value равно 1, то включается ( программа  по
 символу ctrl/c или ctrl/break прерывается ).
 
 
      3.49. SLEEP
 
 
      Вызов:
 
         #include 
         unsigned sleep(unsigned seconds);
 
      Функция приостанавливает выполнение программы  на  seconds
 секунд.
 
 
      3.50. SSIGNAL
 
 
      Вызов:
 
          #include 
          int *ssignal(int sig, int (*action)())();
          int gsignal(int sig);
 
      Функция ssignal аналогична функции signal MSC  V.4.  и  ОС
 ДЕМОС-2.
 
      Функция gsignal возвращает:
 
      - 1 - если для сигнала sig установлен SIG_IGN
 
      - 0 - если для сигнала sig  установлен  SIG_DFL  или  если
        указано неверное значение сигнала.
 
 
 
 
 
 
 
                             - 63 -
 
 
 
 
                                                      Приложение
 
 
             ОБЩИЕ СТАНДАРТНЫЕ ФУНКЦИИ MSC и Turbo-C
 
 
 
 
 
         abs
         assert
         bdos
         bsearch
         cabs
         cfil
         cgets
         chmod
         _clear87
         clearerr
         close
         cosh
         cprintf
         cputs
         create
         cscanf
         ctime, localtime, gmtime, asctime
         difftime
         dosexterr
         dup
         dup2
         ecvt
         eof
         execl
         execle
         execlp, execvp
         execlpe, execvpe
         execve
         _exit
         exit
         exp
         fabs
         fclose
         fcloseall
         fcvt
         fdopen
         feof
         ferror
         fflush
         fgetc
         fgetchar
         fgets
         filelength
         fileno
         floor
 
                             - 64 -
 
 
 
 
         flushall
         fmode
         _fmsize
         fopen
         fp_off, fp_seg
         _fpreset
         fprintf
         fputc
         fputchar(c) int c;
         fputs
         fread
         frexp
         fscanf
         fseek
         ftell
         ftime
         fwrite
         gcvt
         getc
         getenv
         getch
         getche
         getcwd
         gets
         getw
         hypot
         int86
         int86x
         intdos
         intdosx
         isalnum
         isatty
         itoa
         kbhit
         labs
         ldexp
         lfind-lsearch
         log
         log10
         longjmp
         lseek
         ltoa
         malloc
         matherr
         memccpy
         memchr
         memcpy
         memicmp
         memset
         mkdir
         mktmp
         modf
         movedata
         perror
 
                             - 65 -
 
 
 
 
         pow
         printf
         putc
         putch
         putchar
         putenv
         puts
         putw
         qsort
         rand
         rename
         rewind
         rmdir
         sbrk
         scanf
         segread
         setbuf
         setjmp
         setmode
         setvbuf
         sin
         sinh
         sqrt
         srand
         _status87
         strcat
         strchr
         strcmp
         strcmpi, stricmp
         strcpy
         strcspn
         strdup
         strerror
         strlen
         strlwr
         strncat
         strncmp
         strncpy
         strnicmp
         strnset
         strpbrk
         strrchr
         strrev
         strset
         strspn
         strstr
         strtod
         strtol
         strtok
         strupr
         swab
         system
         tan
         tanh
 
                             - 66 -
 
 
 
 
         tell
         time
         toascii-toupper
         tzset
         ultoa
         ungetc
         ungetch
         va_arg-va_start
         vfprintf-vsprintf
         write



Яндекс цитирования