Математическое обеспечение персональных ЭВМ 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