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



 

Часть 1



                          Изучение Code Base



Code Base  представляет собой библиотеку языка Си для управления базой
данных и экраном. Совместимость с dBASE позволяет ей работать с любыми
другими dBASE-совместимыми продуктами.

Так как  Code Base  пользуется теми  же условными обозначениями, что и
dBASE, изучить  его не  представляет сложности  - для этого достаточно
знакомства с  языком программирования  Си и  представления о некоторых
основных понятиях, связанных с базами данных.

Всем пользователям,  изучающим Code  Base необходимо  прочесть  данную
главу. Раздел  справочной информации  даст возможность  быстро понять,
какие  подпрограммы  для  вас  наиболее  полезны.  В  Главе  'Описание
функций' важнейшая  информация содержится  во  введениях  к  разделам.
Перед использованием  какой-либо  функции,  предварительно  прочитайте
введение к разделу в котором она описана.

Любому, кто  собирается использовать Code Base в многопользовательском
режиме, необходимо  прочитать главу  'Работа  в  многопользовательской
среде'.

Обратите внимание  на функции,  работающие  с  базой  данных,  полями,
индексными файлами,  окнами, меню,  на  функции  'чтения'  (Get).  Для
большинства применений это наиболее важные функции.

Функции просмотра  (browse) позволят  вам создавать настраиваемые окна
для просмотра  и  редактирования.  Однако,  необходимо  предварительно
изучить функции чтения (Get) и некоторые из функций работы с окнами.

Интересующиеся фильтрами  и отношениями  (relation) могут обратиться к
разделу ' Расширенные Функции'.

Основные термины

Ниже даны  основные термины,  используемые в  настоящем руководстве по
Code Base.

База данных


База данных представляет собой файл, в котором хранятся ваши данные. К
примеру, база  данных 'почтовой  рассылки'  содержит  имена  и  адреса
людей.

Запись


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


Для каждой  базы данных,  Code Base  выделяет память для одной записи.
Каждая из  этих областей памяти называется 'буфером записи'. Многие из

                                 -2-

высокоуровневых функций  базы  данных  Code  Base  (например,  функция
'd4go') используют этот буфер памяти автоматически. Указатель на буфер
записи может быть получен при помощи функции 'f4record'. Формат буфера
записи будет описан далее (см. 'Внутренняя организация Code Base').

Номер записи


Каждой записи  в базе  данных присваивается  порядковый номер  записи,
начиная с первого. Термин 'текущий номер записи' соответствует записи,
находящейся в  данный момент  в буфере  записи. Текущий  номер  записи
может быть получен при помощи функции 'd4recno'.

Поле


Записи организованы  по полям.  Поле базы  данных описывает  один  вид
информации в каждой записи базы данных. Например, полями в базе данных
'почтовой рассылки'  могут быть  поля 'фамилия',  'адрес', 'город',  и
'телефонный номер'  с именами  LAST_NAME, ADDRESS,  CITY и  PHONE_NUM,
соответственно.

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

Индексный файл


В различных  случаях бывает  необходимым  обследовать  базу  данных  в
разном порядке.  В одном  случае, скажем,  нужно произвести сортировку
базы данных  'почтовой рассылки' по полю фамилии LAST_NAME, в другом -
по полю  адреса ADDRESS.  Перезапись базы  данных  каждый  раз,  когда
необходим новый порядок сортировки, потребовала бы много времени.

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

Выражение Индексного файла


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

Номер ссылки (указателя) (ссылочный номер)


В Code  Base номера  ссылок (ссылочный номер) используются практически
для всего.  Каждая база  данных, индексный  файл, поле, область ввода,
окно или  пункт меню,  используемые Code  Base  имеют  соответствующий
номер ссылки  (указателя). Эти  номера ссылок  используются в качестве
параметров для многих функций Code Base.

                                 -3-

Понятие о базе данных

Здесь излагаются  основные понятия, которые используются в последующих
разделах данного руководства.

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

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

Для каждой  открытой базы данных имеется специальная область в памяти,
которая называется  буфером записи. Формат буфера записи описывается в
Приложении G  ('Внутренняя организация  Code Base').  С буфером записи
работают  многие  высокоуровневые  функции  управления  базой  данных.
Например, функция  'd4go' считывает запись базы данных с диска в буфер
записи. Аналогично,  функции 'd4write'  и  'd4append'  записывают  или
прибавляют буфер базы к файлу базы данных.

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

Каждая база данных может иметь набор открытых индексных файлов. Каждый
индексный файл  соответствует определенной  базе данных,  и когда база
данных изменяется,  то автоматически  поддерживаются изменения во всех
соответствующих индексных  файлах. Каждая база данных может иметь свой
собственный  'выбранный'   индексный  файл.   Высокоуровневые  функции
управления базой  данных, такие, как 'd4seek' или 'd4skip', используют
текущий  выбранный   индексный  файл  текущей  выбранной  базы  даннх.
Низкоуровневые  функции   управления  индексными   файлами,  например,
'i4seek' или 'i4skip', как правило, непосредственно не используются.

Файлы примечаний (файлы memo) (Файлы памяти) используются для хранения
текста  переменной   длины.  В   целях  эффективности,   каждое   поле
сохраняется в  фиксированной по  размеру области  внутри  записи  базы
данных. Поле  примечаний в  записе  базы  данных  имеет  фиксированный
размер, равный  десяти  байтам,  а  в  отдельном  файле  примечаний  -
переменный  размер.   Файл  примечаний   имеет  то   же  имя,   что  и
соответствующий файл  базы данных,  но другое расширение - не 'dbf', а
'dbt'. Для  всех полей  примечаний  определенного  файла  базы  данных
используется один и тот же файл примечаний.

Начало работы

Перед тем, как приступить к работе с Code Base в первый раз, выполните
следующие действия:

1.Сделайте рабочую копию дискет.

2.Просмотрите файл 'README'.

3.Прочтите раздел Информация о компиляторах. (Следующий подраздел).

                                 -4-

4.Произведите установку Code Base.

5.Запустите программу 'd4learn' для проверки функций Code Base. Перед
тем, как вы начнете использовать определенную функцию Code Base,
прочитайте информацию по ней, которая дается в настоящем руководстве,
просмотрите примеры.

6.Прочитайте раздел 'Создание Вашей собственной прикладной программы
Code Base'. (Последний подраздел этого раздела)

7.Напишите  программу,   используя  Code   Base.  В   случае  неудачи,
обратитесь к разделу 'Общие проблемы'.

Информация о компиляторах.


В настоящее  время Code  Base  непосредственно  поддерживает  Turbo C,
Quick C, Microsoft C,  Zortec C++, Watcom C 386 и операционные системы
SCO Unix  и Xenix.  Для тех,  кто  использует  другой  компилятор  или
операционную систему,  Code Base  поставляется в комплектации с полным
исходным кодом  и тестовыми  программами, так  что вы  можете свободно
создать свою  библиотеку и оттестировать ее работу. Тестовые программы
находятся на  дискете в  директории '\TEST',  а документация к ним - в
файле '\TEST\TEST.DOC'

Две готовые  библиотеки T4.LIB  и М4.LIB,  поставляемые с  Code  Base,
используются соответственно  с Turbo C и Microsoft C Библиотека М4.LIB
используется также с Quick C версии 2.0 и выше. Эти библиотеки созданы
для большой  модели памяти  с эмуляцией операций с плавающей точкой, с
использованием управления  экраном Code  Base, индексных  dBASE-файлов
NDX, в  операционной среде DOS. Если вы используете другой компилятор,
операционную систему, или вам нужна другая конфигурация - обратитесь к
приложению Построение Библиотек.

Использование Code Base с Turbo C


Для  того,   чтобы  использовать   библиотеку  Code  Base  't4.lib'  в
интерактивной среде Turbo C, необходим файл проекта 'project'. Образец
файла проекта  'd4learn.prj', который  можно использовать для создания
программы  'd4learn.exe'   -  находится   на  дискете   в   директории
'\EXAMPLES'. Он содержит следующие две строки:


           D4LEARN.C
           T4.LIB


При работе  в интерактивной  среде Turbo  C, с  использованием готовой
библиотеки T4.LIB  проверьте установку  большой модели  памяти.  Кроме
того,  определите  ключ  компилятора  'TURBO'.  Этот  ключ  необходимо
определить в описании окружения (environment).

Размер стека  по умолчанию для Turbo C равен 3000 байтам. При работе с
большими индексными файлами саме безопасное - увеличить его, добавив в
верхней части программы строку:


           extern unsigned _stklen = 10000;

                                 -5-

Кроме того,  на дискете  в директории  '\TC' имеется файл 'TURBO.CFG',
который определяет  опции для  строкового компилятора 'TCC'. Этот файл
должен содержать следующую строку (или подобную):


           -LC:\TC\LIB -IC:\TC\INCLUDE -ml -c -DTURBO -N


Эта строка  устанавливает директорию  библиотек, директорию включаемых
файлов, большую  модель памяти,  опцию только  компиляции,  определяет
переключатель 'TURBO'.  Переключатель 'TURBO' определяет использование
в исходном  коде некоторых  функций, специфичных для Turbo C. Исходный
код  Code   Base  использует   переключатель  'TURBO'   в   директивах
предпроцессора компилятору '#ifdef' и '#ifndef'.

На дискете  в директории  '\TC'имеется командный  файл  'C4TC.BAT'  Он
может  быть   использован  для   компиляции  и   компоновки  небольших
приложений Code Base.

Использование Code Base с Quick C


Для  того,   чтобы  использовать   библиотеку  Code  Base  'm4.lib'  в
интерактивной среде  Quick C,  необходимо использовать  файлы  'make'.
Чтобы создать  файл  'make'  для  компиляции  и  компоновки  программы
'd4learn.exe', добавьте  файлы 'd4learn.c' и 'm4.lib' при помощи опций
меню Quick C.

Проверьте, чтобы  была определена  большая модель  памяти и  чтобы был
выделен дополнительный  объем  памяти  для  стека.  Будет  оптимальным
использовать стек размером примерно 10 кбайт. Выбор также производится
при помощи опций меню в интерактивной среде Quick C.

Компилятор командной  строки Quick  C 'qcl.exe'  используется таким же
образом, что  и компилятор  Microsoft C  'cl.exe' (см.  'Использование
Code Base с Microsoft C').

Использование Code Base с Microsoft C


При компиляции  с помощью строкового  компилятора 'cl.exe', определите
большую модель памяти и дополнительный объем памяти для стека.

Пример:
           CL /AL D3LEARN*.C /link M4.LIB /STACK:10000


Более полная информация об опциях компиляции и компоновки содержится в
руководстве пользователя по компилятору.На дискете в директории '\MSC'
имеется командный  файл 'C4MSC.BAT'.  Он может  быть  использован  для
компиляции и компоновки небольших прикладных программ на Code Base.

Использование Code Base с Zortech C++ и Watcom C


Документация об  использовании Code Base с каждым из этих компиляторов
содержится   на    дискете   в   директориях   'ZORTECH'   и   WATCOM'
соответственно.

                                 -6-

Установка Code Base


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

!!!!Для построения  отличной от  поставляемой  библиотеке  Code  Base,
нужно скопировать также и исходный код.

А.  Скопируйте  одну  из  трех  готовых  библиотек  с  соответствующей
дискеты. Если  ни одна  из библиотек  Вам не  подходит,  обратитесь  к
информации  по   созданию  библиотек,   которая  дается  в  приложении
Построение Библиотек.

Пример для Turbo C:
           COPY A:\TC\T4.LIB C:\TC\LIB


Данная команда  копирования скопирует совместимую с Turbo C библиотеку
Code Base  с 'библиотечной'  дискеты ТС  Code Base  в дисководе  А: на
библиотечный каталог '\TC\LIB' в дисковод С:.

Пример для Microsoft C (Quick C):
           COPY A:\MSC\M4.LIB C:\MSC


В этом  примере,  совместимая  с  Microsoft  C  библиотека  Code  Base
'm4.lib' копируется с дискеты из директории MSC в директорию 'C:\MSC'.
Для того, чтобы использовать Microsoft C с операционной системой OS/2,
обратитесь к информации по построению библиотек в приложении Е.

B. Скопируйте файлы заголовка с дискеты из директории '\H'. Заметьте,
что файлы заголовка Turbo C такие же, что и файлы заголовка Microsoft
C и Quick C.

Пример:
           COPY A:\H\*.* C:\TC\INCLUDE


Эта  команда  скопирует  все  файлы  заголовка  Code  Base  с  дискеты
заголовков в  директорию  включаемых  файлов  Turbo  C.  Данные  файлы
заголовков необходимы для работы с Code Base.

C.  Если   вы  собираетесь  использовать  исходные  файлы  Code  Base,
скопируйте исходные файлы из директории '\SOURCE' дискеты.

Пример:
           COPY A:\SOURCE\*.C C:\MSC


Запуск программы 'd4learn'


Для того,  чтобы облегчить  Вам обучение  Code Base,  в  директорию  с
примерами '\EXAMPLES'  дискеты  включена  программа  'd4learn'.  Выбор
функций Code  Base в  ней осуществляется при помощи спускающихся меню.
После того,  как эта  программа  получит  от  вас  параметры  функции,
выбранная функция выполняется; результаты будут показаны на экране.

                                 -7-

Есть также  несколько дополнительных примеров в директории '\EXAMPLES'
дискеты. См. файл '\EXAMPLES\EXAMPLES.DOC'.

Создание прикладных программ с использованием средств Code Base.


В исходных  файлах прикладной  программы Code  Base часто используются
следующие директивы '#include':


           #include 
           #include 


Если вы  поместили файлы заголовка Code Base в Ваш исходный каталог, а
не во  включающий каталог,  вместо них используйте следующие директивы
'#include':


           #include "d4base.h"
           #include "w4.h"


Файл  'd4base.h'   определяет  структуры   и  прототипы   для  функций
управления базой  данных Code Base. Файл 'w4.h' определяет структуры и
прототипы для функций управления экраном Code Base.
Пример     /* Этот пример находится в файле 'd4exampl.c' */

           #include "d4base.h"
           #include "w4.h"

           #ifdef TURBO
              extern unsigned _stklen = 10000 ;
           #endif

           main()
           {
              int j ;  long ref ;

           /* Инициализировать Code Base и очистить экран */
              d4init() ;
              w4clear ( -1 ) ;

           /* Открыть базу данных */
              if ( d4use("d4learn") < 0 ) exit(1);

              w4( 0, 5, "D4LEARN.DBF Field Names: " ) ;
              for ( j=1; j<=f4num_fields(); j++ )
              {
                   ref = f4j_ref ( j ) ;

                   /* Показать имя поля */
                   w4( j, 0, f4name( ref ) ) ;
              }

              w4cursor( j, 0 ) ;

              w4exit( 0 ) ;
           }

                                 -8-

Общие проблемы

Есть четыре  главные проблемы: компиляция, построение задачи, отладка,
понимание.

Компиляция


При компиляции  примеров или  исходных текстов  Code Base пользователи
иногда сталкиваются  с ошибками  компиляции.  Обычно  это  обусловлено
отсутствием соответствующих  ключей компиляции. Например, пользователи
Turbo C  часто забывают  ключ условной  компиляции TURBO. К сожалению,
различные компиляторы  часто используют  различные файлы  заголовков и
различные подпрограммы  библиотеки. Code  Base учитывает  эти различия
посредством ключей условной компиляции.

Если при  компиляции прикладной  программы Вы  встретили  затруднения,
попробуйте упростить  ее. Выделите строки с предполагаемыми ошибками в
тестовый файл.  Удаляйте части тестовой программы, до тех пор пока она
не откомпилируется. Этот метод часто помогает конкретизировать задачу.

Построение задачи


Большинство неясных  ошибок, таких  как, например,  'undefined  symbol
_fcvt87' или  'fixup overflow'  обусловлены неправильной  компиляцией.
Например, вы  сменили модель  памяти и  не перекомпилировали объектные
файлы.  Напротив,   объектные  модули   вашей  библиотеки   созданы  с
использованием другой модели памяти, нежели ваша прикладная программа.
Другой   возможной    причиной   неправильной    компиляции   является
использовании эмуляции  плавающей точки  при одной  компиляции и смена
плавающей арифметики  при следующей  компиляции. Это правило применимо
также и  к объектным  модулям  вашей  библиотеки.  Ообъектные  модули,
содержащиеся в  вашей библиотеке  должны быть откомпилированы в тех же
условиях, что и ваша прикладная программа.

Другой причиной  неопределенных  внешних  ссылок  является  отсутствие
соответствующей  библиотеки  или  объектного  модуля,  а  также  вызов
несуществующей подпрограммы.

Все внешние  ссылки, которые  имеют цифру '4' во второй позиции имени,
вероятно  определены  Code  Base.  Этому  соглашению  подчиняются  все
внешние ссылки Code Base. Внешние переменные, используемые внутри Code
Base, в  большинстве определены  в файле 'd4init.c'. Иногда переменная
Code  Base   является  неопределенной  потому,  что  не  было  вызвано
подпрограмм,  инициализирующих   Code  Base.   Например,   если   ваша
прикладная программа вызывает только подпрограмму 'd4seek', переменная
'v4cur_base' становится  неопределенной внешней  ссылкой. Если  же  вы
вызовете  'd4use'   до  вызова   'd4seek',   'v4cur_base'   становится
определенной.  Это   происходит  потому,  что  'd4seek'  ссылается  на
подпрограмму  инициализации,   содержащуюся  в   файле  'd4init.c'   и
объектный модуль  соответствующий 'd4init.c'  становится частью  вашей
прикладной  программы.   переменная  'v4cur_base'   становится   тогда
определенной, поскольку она объявлена в файле 'd4init.c'.

                                -9-

Отладка


Если ваша  Code Base-программа  работает не  в соответствии  с  вашими
ожиданиями, могут быть применены несколько способов решения проблемы.

1. Компиляция с  максимальным уровнем предупреждения, используя полные
   прототипы. Пусть компилятор найдет вам ваши ошибки.

2. Вычленение (изоляция)

   Возьмите неработающую  часть вашей программы и запустите независимо
   от других частей.

3. Первая проблема решается первой

   Исследуйте первую  встреченную ошибку.  Вторая  ошибка  может  быть
   обусловлена первой.

4. Определение точки сбоя.

   Если работающая подпрограмма перестает работать, ее рабочая память,
   вероятно, испорчена.  Определите,  где  выполняющаяся  подпрограмма
   перестает работать.  Эта точка,  скорее  всего  находится  в  месте
   вероятной ошибки.

   К сожалению  некоторые ошибки  могут быть  очень тонкими. Например,
   подпрограмма A может портить подпрограмму B, которая в свою очередь
   портит подпрограмму  C. Подпрограмма  C может оказаться испорченной
   таким образом, что это обнаруживается лишь при пятом ее вызове.

Если вы  почувствовали, что  обнаружили ошибку в Code Base, попробуйте
сделать то  же самое,  используя 'd4learn.exe'. Эта информация поможет
Sequiter Software  Inc. при  определении причины  ошибки. Это  поможет
определить род  ошибки: концептуальная  ошибка, ошибка  данных, и т.п.
'd4learn.exe' является  также прекрасным средством определения причины
ошибки самим  пользователем. Например,  'd4go' сообщает  об ошибке при
использовании 'd4learn.exe',  запись, которую  вы пытаетесь  прочесть,
возможно, не существует.

Понимание Code Base


Если не  понимаете какой-либо  из частей  Code Base, убедитесь, что вы
читаете именно  тот материал, просмотрите примеры, поэкспериментируйте
с 'd4learn.exe'.

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

Список функций по категориям

Приведенный список  функций Code  Base сформирован по категориям. Этот
список содержит только наиболее употребляемые функции.

                                 -10-

Управление базой.


Добавление, Запись, Вставка


d4append, d4write, w4insert

Доступ к файлам


f4char, f4double, f4int, f4long, f4ncpy, f4ptr, f4str, f4record

Замещение содержимого полей


f4r_char, d4r_doudle, f4r_int, f4r_long, f4r_str

Информация о полях


f4decimal,  f4j_ref,   f4num_fields,  f4name,  f4record_width,  f4ref,
f4type, f4width

Фильтры


x4filter, x4filter_reset, x4filter_do, i4filter

Открытие, закрытие, создание файлов


d4create, d4use, d4use_excl, i4open, i4index, u4open

Функции блокировки, разблокировки


d4lock,  d4locked,  d4lock_all,  d4lock_code,  d4lock_wait,  d4unlock,
i4lock, i4unlock, u4lock, u4unlock

Файлы примечаний


m4edit, m4exist, m4read, m4write

Упаковка (удаление помеченных), Удаление (удаление части),
Перериндексация


d4pack, d4zap, i4reindex

Позиционирование


d4bottom, d4go,  d4seek_double, d4seek_str,  d4skip, d4top,  x4bottom,
x4go, x4seek, x4skip, x4top

                                 -11-

Связи (Отношения)


x4relate, x4relate_do, x4relate_reset

Управление экраном


Цвет/Атрибуты


g4attribute, n4attribute, n4attribute_item, w4attribute, w4num_att

Ввод данных


g4, g4double, g4picture, g4read, g4upper, g4valid, b4browse, b4edit

Ввод данных через меню


g4call, n4get_calc, n4menu, n4menu_help

Вывод


u4error, w4,  w4box, w4clear,  w4display,  w4double,  w4field,  w4int,
w4long, w4num, x4list

Определение меню


n4, n4action, n4activate, n4calc, n4item, n4reaction

Определение, активация и закрытие окон


w4activate, w4deactivate, w4define, w4close

Характеристики окон


w4border, w4handle, w4height, w4memory, w4popup, w4title, w4width

                                 -12-

                         Описание подпрограмм



Данная глава содержит описание всех внешних функций Code Base, которые
могут быть вызваны из программы пользователя.

Для того,  чтобы  эффективно  осуществлять  управление  базой  данных,
необходимо ознакомиться с работой всех функций управления базой данных
и полями,  а также  с работой  некоторых функций управления индексными
файлами. Если  Вы хотите  использовать отношения  и фильтры, Вам также
будут необходимы расширенные функции.

Управление экраном зависит от работы функций управления окнами, меню и
функций чтения  'get'.   Функции управления  меню  и  функции  чтения,
построенные на  функциях  управления  окнами,  позволяют  использовать
такие средства, как спускающиеся меню и полноэкранный ввод данных.

Функции 'преобразования',  'обработки памяти',  и  'оценки  выражений'
являются универсальными для любого программиста прикладных программ.

Если Вы  хотите получить  обзорную информацию о функциях Code Base, Вы
можете  прочитать   введение  к   функциям  и   потом   самостоятельно
поэкспериментировать с программой 'd4learn'.

                                 -13-

Функции Модификации/Редактирования (BROWSE/EDIT)

Функции модификации используют обе чисти Code Base управление базами и
экраном для  построения экранов  просмотра  и/или  редактирования  для
занесения и просмотра данных.

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

На  Code   Base  дискете   в  директории  'BROWSE'  имеется  некоторая
нелицензированная  документация   для  конечного   пользователя.   Эта
документация позволяет  разработчику программного  обеспечения  быстро
создавать документацию для конечного пользователя.

Можно  создавать   экран  редактирования   одной  записи,   или  экран
просмотра, в  котором будут  несколько записей одновременно, или экран
просмотра/редактирования позволяющий  пользователю быстро переключатся
эти возможности.

Экран  просмотра/редактирования  может  быть  очень  удобен  конечному
пользователю.   Например,    конечный   пользователь    может   быстро
просматривать несколько записей, используя экран просмотра. По нажатии
клавиши, вызывается  окно редактирования и конечный пользователь может
детально просмотреть информацию в одной записи.

Изучите, как  использовать ввод  данных и  функции управления  окнами,
прежде чем  пытаться использовать функции просмотра/редактирования.

                                 -14-

b4browse

Использование    int b4browse( int (*browse_define)(int),
                           int (*edit_define)(int))

Описание   'b4browse' создает  и активирует окно просмотра для текущей
           базы.

           См. пример ниже.

Параметры

         Наименование  Использование

         browse_define Это указатель  на функцию  которая обеспечивает
                       поддержку экрана просмотра.

                       См. пример ниже.

         edit_define   Это указатель  на функцию, которая обеспечивает
                       поддержку  экрана   редактирования.  Если  этот
                       параметр ноль  (NULL), то  экран редактирования
                       не поддерживается.

                       См. фунцию 'b4edit'.

Возврат    Возвращение '(int)-1'  свидетельствует  об  ошибке.  Иначе,
           возвращает '(int)0'.

Блокировки Текущая база  и все ее индексные файлы разблокируются перед
           ожиданием   любого    ввода   пользователя.    Они    также
           разблокируются  перед возвратом.

                                 -15-

Пример     #include 
           #include 

           static int browse_setup(void);
           static int browse_setup(){
           /* The first few lines of the browse setup routine defines
           an appropriate window. */
              w4define( 1,0,24,79 );
              w4border( DOUBLE, F_WHITE );
              w4title( 0, -1, " Customer Database Browsing ",
                   F_WHITE);

           /* The next three routine calls must be present in every
           browse routine */
              w4memory();
              w4activate(-1);
              g4release(0);

           /* Now the screen layout is defined. Note that any 'GET'
           routine except 'g4read' can be called. Refer to the 'Get
           Routines chapter. */

           /* When calling a 'Get Initialize' routine from a browse
           setup routine from a browse setup routine, make the first
           parameter '(int)-1'. This is the 'row' parameter which is
           set by Code Base under browse screens. */
              w4( 1,2,"name" );
              g4field( -1,2, f4ref("name") );

              w4( 1,24, "Company" );
              g4field( -1,4, f4ref("company") );

           /* The window reference number of the defined window is
           returned */
              return( w4select(-1) );
           }

           main(){
              d4use("customer");
              i4open("name");

              b4browse(browse_setup, 0);

              d4close_all();
              w4exit(0);
           }

                                 -16-

b4call

Использование    void b4call( int (*call_routine)(int,int) )

Описание   'b4call' определяет  функцию, которую 'b4edit' и 'b4browse'
           будут вызывать  перед выводом  или записью модифицированной
           записи на диск.

           Вызываемая  функция   может  выполнять,   например,   вывод
           посчитанных данных.

           Вызываемая функция  имеет два  целых параметра и возвращает
           целое.  Первый   параметр  -   это  ссылочный   номер  окна
           просмотра/редактирования. Ее  второй параметр - это строка,
           в которой будет отображаться запись. В окне редактирования,
           этот второй параметр всегда ноль. Вызываемая функция должна
           возвращать ноль.

Пример     #include 
           #include 
           +++++++++
           long a_ref, b_ref;

           static int setup(void){
           int w_ref;
              w_ref=bquick_browse();
           /* Like all browse setup routines, 'b4quick_browse'
           activates the browse window. Consequently, it is safe to
           call 'w4' to display an extra title. */
              w4( 1,40, "total" );
              return( w_ref );
           }

           static int calc( int w_ref, int row ){
              w4double( row,40,
                   F4DOUBLE(A_REF) + F4DOUBLE(B_REF),10,2 );
           }

           main(){
              d4use("DATA");
              a_ref=f4ref("a_value");
              b_ref=f4ref("b_value");

           /* Call 'b4call' anytime before calling 'b4browse' */
              b4call( calc );

              b4browse( setup, 0);
              d4close_all();
              w4exit(0);
           }

                                 -17-

b4edit

Использование    int b4edit( int (*browse_define)(void),
                           int (*edit_define)(void) )

Описание   'b4edit'  создает  и  активирует  окно  радактирования  для
           текущей  базы.   Заметим,  что   оба  параметра,  идентичны
           параметрам  'b4browse',   с  тем   отличием,  что  'b4edit'
           начинает работать  с экрана  редактирования, а 'b4browse' с
           экрана просмотра.

           Следующий пример находится в поддиректории 'BROWSE' и может
           использоваться как заготовка.

Параметры

         Наименование  Использование

         browse_define Указатель  на   функцию,  которая  обеспечивает
                       поддержку экрана  просмотра. Если этот параметр
                       (null), то экран просмотра недоступен.

                       См. фунцию 'b4browse'.

         edit_define   Указатель  на   функцию,  которая  обеспечивает
                       поддержку экрана редактирования.

                       См. пример ниже.

Возврат    Возвращение  '(int)-1'  свидетельствует  о  ошибке.  Иначе,
           возвращает '(int)0'.

Блокировки Текущая база  и все ее индексные файлы разблокируются перед
           ожиданием   любого    ввода   пользователя.    Они    также
           разблокируются  перед возвратом.

                                 -18-

Пример     #include 
           #include 

           static int edit_setup(void);
           static int edit_setup(){
           /* The first lines of the edit setup routine define an
           appropriate window. */
              w4define( 1,0,24,79 );
              w4border( SINGLE, F_WTITE );
              w4title( 0,-1, "Editing Customer Database ", F_WHITE );

           /* Next three routine calls must be present in every edit
           routine. */
              w4memory();
              w4activate(-1);
              g4release(0);

           /* Now the screen layout is defined. Note that any 'Get'
           routine except 'g4read' can be called. refer to the 'Get
           Routines' chapter. */

              w4( 1,2, "Name" );
              g4field( 1,12, f4ref("name") );

              w4( 3,2, "Company ");
              g4field( 3,12, f4ref("company") );

              return( w4select(-1) );
           }

           main(){
              d4use( "customer" );
              i4open( "name");

              b4edit( 0, edit_setup );

              d4close_all();
              w4exit(0);
           }

                                 -19-

b4margin

Использование    void b4margin( int tom_margin, int bottom_margin )

Описание   'b4margin'  устанавливает  верхнюю  и  нижнюю  границу  для
           функции 'b4browse'.

           Часто требуется  наличие некоторого  пространства сверху  и
           снизу окна.  По умолчанию  'b4browse' не  выводит записи на
           верхние  три   строки  и  на  последнюю.  Вызов  'b4margin'
           позволяет изменить значения по умолчанию.



Параметры

         Наименование  Использование

         top_margim    Это число линий сверху окна, на которые функция
                       'b4browse' не будет выводить записи.

         bottom_margin Это число  линий снизу окна, на которые функция
                       'b4browse' не будет выводить записи.



Пример     b4margin( 2,4 );

                                 -20-

b4quick_browse

Использование    int b4quick_browse(void)

Описание   'b4quick_browse'  это   установочная   функция   просмотра,
           которая работает  для любой  базы данных. Она не вызывается
           непосредственно. Вместо  этого, она передается как параметр
           в функции 'b4edit' или 'b4browse'.

Пример     b4browse( b4quick_browse, 0 );






b4quick_edit

Использование

                 int b4quick_edit(void)

Описание   'b4quick_edit'  это  установочная  функция  редактирования,
           которая работает  для любой  базы данных. Она не вызывается
           непосредственно. Вместо  этого, она передается как параметр
           в функции 'b4edit' или 'b4browse'.

Пример     b4edit( 0, b4quick_edit );

                                 -21-

b4verify

Использование    void b4verify( int (*verify_routine)(int) )

Описание   'b4verify' задает  функцию вызываемую 'b4edit' и 'b4browse'
           для проверки вводимых данных.

           Если эта  функция проверки  данных возвращает  не ноль,  то
           запись  не   записывается  и   ввод  данных   продолжается.
           Параметры функции  проверки данных является ссылочный номер
           окна, в котором производилось просмотр/редактирование.

Пример     #include 
           #include 

           long a_ref, b_ref;

           static int check();
           static int check( int w_ref ){
              if( f4double(a_ref) < 0.0 || f4double(b_ref) < 0.0){
                   w4display("Entry Error",
                            "All values must be positive",
                            (char *)0 );
                   return(-1);
              }
              return(0);
           }

           main(){
              d4use("data");
              a_ref=f4ref("a_value");
              b_ref=f4ref("b_value");

           /* Call 'b4verify' anytime before calling 'b4browse'. */
              b4verify( check );
              b4browse( b4quick_browse, b4quick_edit );
              d4close_all();
              w4exit(0);
           }

                                 -22-

Функции преобразования формата

Функции преобразования изменяют формат информации.





c4atod

Использование    Double c4atod ((char *) str, (int) len_str)

Описание   Функция c4atod  преобразует строку ASCII определенной длины
           в  '(double)'.   Строка  не  обязательно  должна  кончаться
           нулевым символом,  так как  заданная длина определяет число
           преобразуемых символов строки.

Возврат    Преобразованный результат.

Пример     double f(){
           /* This Function returns '(double) 67.3' */
           double d;

           /* Only the First five characters are used */
              d=c4atod(" 67.37 Grabage", 5);

              return(d);
           }

                                  -23-

c4atoi

Использование    int c4atoi((char *) str, (int) len_str)

Описание   Функция   c4atoi    преобразует   строку   символов   ASCII
           определенной длины  в целое  число. Строка  не  обязательно
           должна кончаться  нулевым символом,  так как заданная длина
           определяет число преобразуемых символов строки.

Возврат    Преобразованный результат - целое число.

Пример     /*'f4int' uses 'c4atoi' because database fields data is not
           null terminated. */

           #include 

           int f4int( f_ref )
           long f_ref;
           {
           /* Convert the field data into an 'int' */
              return( c4atoi( f4ptr(f_ref), f4width(f_ref)) );
           }

                                 -24-

c4atol

Использование    int c4atol((char *) str, (int) len_str)

Описание   Функция c4atol  преобразует  строку  символов  определенной
           длины в  длинное целое  число. Строка не обязательно должна
           кончаться  нулевым   символом,  так   как  заданная   длина
           определяет число преобразуемых символов строки.

Возврат    Преобразованный результат - длинное целое число.

Пример 1   #include 

           main(){
           long l, val_ref;

              d4use("values");
              val_ref=f4ref("value");

              d4go(1L);
              l=c4atol(f4ptr(val_ref), f4width(val_ref));

              printf("\n Value: %ld",l);
              exit(0);
           }

Пример 2   /* 'long_rezult' will be '3' as it only convert the 2
           characters as specified by the second parameter> */

           long_rezult=c4atol(" 3547",2);

                                 -25-

c4dtoa

Использование    char * c4dtoa (double doub_value, int len,
                           (int) dec)

Описание   Функция 'c4dtoa'  преобразует '(double)' в строку символов.
           Эта  строка   будет  отформатирована   в   соответствии   с
           определенной длиной и количеством десятичных позиций.  Если
           имеется переполнение,  строка будет  заполнена  звездочками
           (*). Если необходимо, '(double)' число будет округлено.

           Пример:

           /* ' 2' is displayed& This value is rounded up. */
           w4out( c4dtoa( 1.5, 3,0);

Возврат    Возвращает  указатель   на  внутренний  статический  буфер,
           содержащий преобразованную строку.

Внимание   Если  'c4dtoa'   вызывается  более   одного  раза,   первый
           результат преобразования будет затерт последующим. 'c4atod'
           всегда возвращает  указатель на  один и  тот же  внутренний
           буфер.

           Некоторые   функции    Code   Base    вызывают    'c4dtoa'.
           Следовательно, результат  возвращенный этой  функцией  надо
           использовать немедленно.

Прмер      void w4double( row,column, double_value, len, dec)
           int row, column, len,dec;
           double double_value;
           {
              char *ptr;

              ptr=c4dtoa( double_value, len, dec );
              w4num( row, column, ptr, len );
           }

                                 -26-

c4dt_format

Использование    char * c4dt_format((char *) str_date,
                           (char *) picture)

Описание   Преобразование формата  даты базы  данных в  другие форматы
           даты.

Параметры

         Наименование  Использование

         str_date      Это дата  базы данных, которая является строкой
                       ASCII длиной  в 8  байт  в  формате  "CCYYMMDD"
                       (век, год, месяц, день).

         picture       Определяет, как дата будет отформатирована.

                       Примеры:

                         YY.MM.DD
                         CCYY.MM.DD
                         MM/DD/YY
                         DD-MM/CCYY
                         MMM DD/YY

                       Символы 'Y',  'M' и 'D' определяют год, месяц и
                       день, соответственно.  Если имеется больше двух
                       символов    'M',     возвращается    символьное
                       представление месяца.

Возврат    Возвращается указатель  на  внутренний  статический  буфер,
           содержащий   преобразованный    результат.   Если   функция
           вызывается дважды, новый результат затирает старый.

Пример     #include 

           void f(){
           char *rezult_ptr;

              rezult_ptr=c4dt_format("19880130",
                   "MMM DD/CCYY");

           /* 'Jan 30/1988' is displayed. */
              w4out( rezult_ptr );
           }

                                 -27-

c4dt_julian

Использование    int c4dt_julian( char *str_date,
                           double *julian_date)

Описание   'c4dt_julian'  функция   противоположная  'c4dt_str'.  Дата
           преобразуется из  формата базы  данных в Юлиановский формат
           представляющий '(double)'.

Параметры

         Наименование  Использованние

         str_date      Указатель  на   преобразуемую  строку.   Формат
                       строки: "CCYYMMDD" ( век, год, месяц, день).

         julian_date   Указатель на  '(double)' число, в которое будет
                       занесен полученный результат.

Возврат

         Величина      Значение

         0             Успех

         -1            Неверная дата (Ошибка не показывается)

         -2            Нулевая дата (Пустая информация)

Пример     #include 
           #include 

           /* Compute the number of days between two datas. */

           long c4dt_subtract( str1, str2 )
           char *str1, *str2;
           {
              double d1,d2;

              c4dt_julian( str1, &d1);
              c4dt_julian( str2, &d2);

              return( (long) (d2-d1) );
           }

           main(){
              d4init();

              w4long( 0,0, c4dt_subtract("19600204",
                   "19890204"), 6);

              w4exit(0);
           }

                                 -28-

c4dt_str

Использование    void c4dt_str( char *str_date,
                           double *julian_date)

Описание   Code Base  представляет дату  как строку  символов или  как
           '(double)' число.  Функция 'c4dt_str'  преобразует дату  из
           '(double)' представления в строковое представление.

           Формат строковой  даты "CCYYMMDD" ( век, год, месяц, день).
           Соответственно, строковая  дата занимает 8 байт памяти. Так
           дата хранится в буфере базы данных.

           Значением '(double)' даты является Юлианский день.

Параметры

         Наименование  Использование

         str_date      Указатель на  область память (8 байт) где будет
                       размещена полученная строковая дата.

         julian_date   Указатель   на   'double'   число,   содержащее
                       Юлиановскую дату.

Пример     #include 
           #include 
           char start_date[9]="19891206";
           char date_plus_seven[8];

           main(){
           double d;

              d4init();
              w4clear(-1);

              w4(0,0, "Today Date:" );
              w4out( start_date );

              c4dt_julian(start_date, &d );
              d+=7.0; /* Add seven day to the date */

           /* Note that no null is appended by 'c4dt_str'. */
              c4dt_str( date_plus_seven, &d );
              w4( w4row()+1, 0,
                   "Todays Date plus SEven Days: ");
              w4num( w4row(), w4col(), date_plus_seven, 8);
              w4exit(0);
           }

                                 -29-

c4dt_unformat

Использование    char * c4dt_unformat(char * date_data,
                           char * picture)

Описание   Эта функция  выполняет преобразование даты из определенного
           формата в  формат базы  данных.   Если указываемая  дата не
           содержит полной  информации по  дате, то принимается век по
           умолчанию -  '1900', год  по умолчанию  -  '80',  месяц  по
           умолчанию 'январь', день месяца по умолчанию '01'.

           Форматом базы данных является "CCYYMMDD".

Параметры

         Наименование  Использование

         date_data     Эта информация о дате

         picture       Определяет формат данных даты.

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

Внимане    Если 'c4dt_unformat'  вызывается дважды,  то  в  результате
           внутренний  статический   буфер  будет   затерт   последним
           результатом преобразования.

См. также  Функция c4dt_format.

Пример     #include 
           #incluide 

           void f(){
           char *ptr;

              ptr=c4dt_unformat("Jan 15, 1989",
                   "MMM DD, CCYY");

           /* Displays '19890115' */
              w4num( 0,0, ptr, 8);
           }

                                 -30-

c4encode

Использование    void c4encode ((char *) to, (char *) from,
                           (char *) t_to, (char *) t_from)

Описание   Символы  перемещаются  из  строки  'from'  в  строку  'to'.
           Формат  результата  в  строке  'to'  определяется  шаблоном
           't_to. Формат  исходной строки 'from' определяется шаблоном
           't_from.

           Предопределенных  символов  форматирования  не  существует.
           Однако, если символ в шаблоне 't_from' совпадает с символом
           в шаблоне  't_to', соответствующий  символ в  строке 'from'
           перемещается в соответствующую позицию в строке 'to'.

Параметры

         Наименование  Использование

         to            Адрес преобразованной информации

         from          Информация, подлежащая преобразованию

         t_to          Шаблон для итогового формата

         t_from        Шаблон для исходной информации

Замечание  Как показано  в примере,  все  символы  в  шаблоне  't_to',
           которые  не  соответствуют  символам  в  шаблоне  't_from',
           копируются в соответствующие позиции в строку 'to'.

Пример     /* Результат, помещенный в 'to', будет "3 2 1" */
           c4encode (to, "123", "C B A", "ABC");

           /* The result put into 'to' whill be "C B A" */
           c4encode( to, "ABC", "3 2 1", "123" );

           /* The result put into 'to' will be "A&B&C" */
           c4encode( to, "ABC", "1&2&3", "123" );

           /* The result put into 'to' will be "19901230" */
           c4encode( to, "30-12/1990", "789A4512", "123456789A");

           /* The result put into 'to' will be "12/30/90" */
           c4encode( to, "19901230", "EF/GH/CD", "ABCDEFGH" );

                                 -31-

c4ltoa

Использование    char * c4ltoa ((long) long_value,
                           (char *) result_ptr,
                           (int) result_len)

Описание   Данная функция  преобразует (long) в символьный формат так,
           как определяется  параметром длины.  Полученная  символьная
           величина  выравнивается   по  правому   краю   в   пределах
           выделенной области.

Параметры

         Наименование  Использование

         long_value    Величина, которая будет преобразована.

         result_ptr    Указатель на то, где будет возвращен результат.
                       Вызывающая программа  должна выделить область в
                       памяти   размером,    по   меньшей    мере,   в
                       'result_len'.

         result_len    Это длина  получающейся строки. Если result_len
                       будет  меньше   нуля,  то   все  предшествующие
                       символы заполняются нулями.

Возврат    Возвращает  параметр   'result_ptr',  который  представляет
           собой указатель (char *) на результат.

Подсказка  Другие  типы   числовых  данных  могут  быть  преобразованы
           функцией c4ltoa посредством их приведения к типу (long).

Замечание  Пустой конечный  символ не  помещается в  конец  результата
           преобразования. Изменяется только 'result_len' символов.

Пример     /* A 'long' is put into the Code Base record buffer. */

           void copy_data( f_ref, l_value )
           long f_ref;
           long l_value;
           {
              c4ltoa( l_value, f4ptr(f_ref), f4width(f_ref));
           }

                                 -32-

c4trim_n

Использование    void c4trim_n ((char *) str, (int) n_ch)

Описание   Функция c4trim_n  "отрезает" пробелы  от  строки  'str'.  В
           последний байт в строке помещается пустой символ.

Параметры

         Наименование  Использование

         str           Указатель на строку.

         n_ch          Количество байт памяти, определенных для строки

Пример     void disp( ptr )
           char *ptr;
           {
              char buf[80];

              strncpy( buf, ptr, sizeof(buf) );

           /* A null will be placed in 80th byte of 'buf' to guaranee
           that it is null terminated. */
              c4trim_n( ptr, sizeof(buf) );
              printf( "Display Rezult: %s", ptr);
           }

                                 -33-

Функции управления базой данных

Функции управления базой данных соответствуют высокоуровневым командам
dBASE.  Они   используются  для   хранения  (запоминания)   и  выборки
информации из файлов базы данных.

Функции управления  базой  данных  используют  неявно  выбранную  базу
данных. Выбранной базой данных является последняя открытая база данных
или же  база данных,  которая в  последний раз  была выбрана  функцией
'd4select'.  Следовательно,   одновременно  можно   держать  открытыми
несколько баз данных.

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

Различные функции  помещения (изменения  положения) записи,  например,
функции 'd4bottom'  или 'd4go', считывают новую текущую запись в буфер
записи. Функции  'd4write' и  'd4append' записывают  или дописывают  в
конец  файла   буфер  записи.   Доступ  и   изменение  буфера   записи
осуществляется при помощи функций управления полями.

Работа с несколькими файлами

Для работы с несколькими базами данных, сохраните номер указателя базы
данных,  возвращаемый  функцией  'd4use'.  Затем  используйте  функцию
'd4select' для  выбора между  базами  данных,  причем  соответствующий
номер указателя  (ссылки) базы  данных служит в качестве параметра для
этой  функции.  Аналогично,  номер  указателя,  возвращенный  функцией
'i4open', может быть использован функцией 'i4select'.

                                 -34-

d4append

Использование    int d4append()

Описание   Буфер записи добавляется в конец базы данных.

Возврат

         Величина      Значение

         0             Успех

         -1            Ошибка

         -2            Байты  подсчета  записей  не  блокировались,  и
                       выставлен флаг вернуться немедленно.

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

                       По      умолчанию,      внешняя      переменная
                       'v4unique_error' установлена  в '(int)1'.  Если
                       эту переменную  установить в  '(int)0', функция
                       'd4write' никогда  не вернет '(int)-3'. Взамен,
                       запись  будет   записана,  индексный   файл  не
                       изменится, и будет возвращено '(int)0'.

Блокировка Байты запись и индексный файл блокируются.

Внимание!  Не забывайте  закрывать базу  данных, иначе  dBASE может не
           распознать дабавленные  записи. Это  происходит потому, что
           Code Base  вычисляет число  записей из длины файла, а dBASE
           следит за счетчиком записей.

Пример     #include 

           main(){
           long ref;

              d4use("info");
              ref=f4ref("name");

              d4go( 1L ); /* Take a copy of Record 1 */
              f4r_str( ref, "ALFREF" ); /* Change the name */

              d4append(); /* Append the changed record */
              exit(0);
           }

                                 -35-

d4append_blank

Использование    int d4append_blank()

Описание   Пустая запись добавляется в конец файла.

Блокировка Байты подсчета записей и индексный файл блокируются.

См. также  'd4write', 'd4append'

Внимание!  Не забывайте  закрывать базу  данных иначе  dBASE может  не
           распознать дабавленные  записи. Это  потому, что  Code Base
           вычисляет число  записей из  длины файла  а dBASE следит за
           счетчиком записей.

Пример     #include 
           #include 

           main(){
           int j;

              d4use("TEST_B");

           /* Append a Blank Record */
              d4append_blank();

           /* Edit the new Record */
              for( j=1; j<=f4num_fields(); j++)
                   g4field( j,0, f4j_ref() );

              g4read();
              d4write(d4recno());

              w4exit(0);
           }

                                 -36-

d4bof

Использование    int d4bof()

Описание   'd4bof' возвращает  истину (не  ноль), если сделана попытка
           выйти за  начало базы  данных посредством  функций 'd4skip'
           или 'x4skip'.  Если однажды установилось в истину состояние
           начало файла, то оно сохранится до следующего перемещения в
           базе. Перемещения  в базе вызывают такие функции как 'd4go'
           или 'd4top',  которые изменяют  или записывают буфер записи
           базы данных.

Замечание  Невозможно переместиться назад к записи 0.

См. также  'd4eof', 'd4skip'

Пример     #include 

           main(){

              d4use("names");

              d4top(); /* To Record 1 */
              d4skip(-1L); /* Generate bof condition */
              if( d4bof() ){
                   print("\n Always True !");

                   if( d4recno() == 1L )
                        printf("\n Alse  Always True !");
              }
              exit(0);
           }

                                 -37-

d4bottom

Использование    int d4bottom()

Описание   Функция d4bottom  выполняет переход  ко дну  (в конец) базы
           данных, используя  выбраный индексный  файл.  Если никакого
           индексного файла  не выбрано,  переходит к последней записи
           базы данных.

Возврат

         Величина      Значение

         0             Успешное выполнение

         3             Конец файла

         -1            Ошибка

Блокировка Если используется  индексный  файл,  он  блокируется.  Если
           новая  (нижняя)   запись   не   блокирована,   то   текущая
           разблокируется. В  конечном итоге, новая запись блокирована
           и прочитана.

Пример     #include 

           long total_ref;

           main(){
           int rc;

              d4use("base");
              total_ref=f4ref("total");
              i4open("base");

              rc=d4botttom();
              if(rc==3) printf("\n Index has no record.");

              printf("The Last Total is: %s",
                   f4str(total_ref);
              exit(0);
           }

                                 -38-

d4buf_init

Использование    long d4buf_init( long start_try, long end_try,
                           long ch_try )

Описание   'd4buf_init' размещает  'huge' блок памяти для буферизации,
           переиндексации,  сортировки,   упаковки  и   удаления  базы
           данных. Все  эти  процессы  интенсивно  используют  память.
           Большой объем памяти может ускорить эти опереции.

           Code Base  может запросить памяти больше чем есть. Если нет
           возможность узнать  заранее, сколько памяти будет доступно,
           'd4buf_init'  будет   пробовать  несколько  раз  разместить
           память, постепенно  уменьшая запрашиваемый  размер  до  тех
           пор, пока  память не  будет размещена либо, будет достигнут
           минимальный заданный обьем памяти.

           'd4buf_init' может быть вызвана более одного раза для того,
           чтобы сделать  доступными различные  порции памяти в разное
           время.  Например.   'd4buf_init'  может  быть  вызвана  для
           размещения большого объема памяти перед вызовом 'i4reindex'
           и после этого вызвана снова для освобождения памяти.

           По умолчанию, 'd4init' вызывает 'd4buf_init' для размещения
           64K памяти.

Параметры

         Наименование  Использование

         start_try     Начальное   количество    байт   для    попытки
                       размещения.

         end_try       Конечное   количество    байт    для    попытки
                       размещения.

         ch_try        Число байт,  на которое будет изменен запрос на
                       размещение памяти. Всегда неотрицательно.

Возврат

         Величина      Значение

         -2            Нет памяти

         -1            Ошибка

         >=0           Число размещенных байт

См. также  'd4init',   'd4initialize',   'd4buf_total',   d4buf_unit',
           'd4flush'

                                 -39-

Пример     #include 

           main(){
           long mem, t1, t2;

              d4use("test");
              i4open("test");

              for( mem=0x1000000; mem>0; mem -=0x100000 ){
                   f(d4buf_init( mem, mem, 0L) <0L)
                        continue;
                   time( &t1 );
                   i4reindex(-1);
                   time( &t2 );

                   printf("\n Memory: %ld, Seconds: %ld",
                        mem, t2-t1);
              }
              exit(0);
           }

                                 -40-

d4buf_total

Использование    int d4buf_total( long n_recs,
                           int max_buffres,
                           int may_lend )

Описание   Часть  общей   памяти,  распределенной  'd4buf_init',  под-
           распределяется для текущей базы.

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

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

           Наилучшая стратегия  буферизации базы основана на следующих
           принципах:

         1.            Каждое обращение  к диску занимает относительно
                       много времени.

         2.            Code Base  пишет и  читает один  буфер за  один
                       раз.

         3.            Code Base  отслеживает изменения базы данных от
                       буфера к  буферу.  Соответственно,  если  буфер
                       изменен и  сбрасывается  на  диск,  весь  буфер
                       будет записан на диск.

         4.            Чтение или  запись большого  буфера дольше  чем
                       маленького если размер буфера более 1К. Однако,
                       чтение/запись   24К    два    раза    несколько
                       продолжительнее чтения/записи 48К за один раз.

           Как  результат   перечисленных  факторов,   можно   сделать
           следующие заключения:

         1.            Если       производится        последовательное
                       чтение/запись, используйте один большой буфер.

         2.            Если производится  беспорядочная чтение/запись,
                       буфер должен быть небольшим.

                       Это особенно  верно, когда встречается запись и
                       сброс.

         3.            Если размер  буфера заведомо больше базы данных
                       и база данных не велика, имеет смысл иметь один
                       большой буфер.

Параметры

                                 -41-

         Наименование  Использование

         n_recs        Общее число записей в буфере.

                       Значение '0L'  запрещает  буферизацию  базы.  В
                       этом  случае,   'd4buf_unit'  не   должен  быть
                       вызван.

                       Значение  'n_recs'   равное   '-1L'   оставляет
                       прежнее значение  'n_recs'.  Это  предполагает,
                       что, 'd4buf_total'  уже была  вызвана для  этой
                       базы данных.

         max_buffers   Максимальное число  буфферов для  базы  данных.
                       Здесь превышение  на 12  байтов, умноженное  на
                       'max_buffers'.

                       Число    используемых     буферов    использует
                       посредством деления общего числа буферизованных
                       записей ('n_recs')  на число  записей в буфере.
                       Если     полученный     результат     превышает
                       'max_buffers', то берется 'max_buffers'.

                       Заметим,   что    число   записей    в   буфере
                       устанавливается функцией 'n4buf_unit'.

                       Значение   'max_buffers'    равное    '(int)-1'
                       оставляет значение  максимального числа буферов
                       без изменения.

         may_lend      Если 'may_lend'  истина (не  ноль), память  для
                       буферизации, под-распределенная для базы, будет
                       "заниматься" для  функций интенсивной  работы с
                       памятью.   Это   функции   'd4pack',   'd4zap',
                       'i4index',   'i4reindex'    и   'x4sort'.   Это
                       позволяет этим  функциям выполняться  быстрее и
                       помогает избежать превышения памяти.

                       Значение 'истина'  параметра  'may_lend'  также
                       обозначает,  что   когда   вызываются   функции
                       интенсивной работы  с памятью,  изменения  базы
                       данных сбрасываются  на  диск.  В  этом  случае
                       память     временно  используют   с   функциями
                       интенсивной работы  с памятью.  Это может иметь
                       эфект  на   производительность   'фильтров'   и
                       'связей', выполняемых в процессе работы функций
                       интенсивной работы с памятью.

                       Значение   'may_lend'    '(int)-1'    оставляет
                       'may_lend' без изменения.

Возврат

         Величина      Значение

         0             Успех

         -1            Ошибка
 
                                 -42-

         1             Память не  может  быть  распределена  для  всех
                       буферов.

Внимание!  В  процессе   многопользовательской  работы,  когда  записи
           блокируются  и   затем   разблокируются,   буферизация   не
           увеличивает производительности.  Это происходит в следствие
           того, что,  как только  запись  разблокирована,  она  может
           сразу же быть изменена другим пользователем. Следовательно,
           информация сбросится на диск.

Пример     #include 
           #include 

           main(){

              d4init(); /* Calls' 'd4init_buf' */

              d4use_excl("base");
              i4open("base");

           /* 500 records, 25 buffer maximum */
              d4buf_total(500L, 25, 1);

           /* 20 record in each of 25 buffers */
              d4buf_unit(20L);

           /* List the database using the index file */
              x4list();

           /* Free the buffer memory */
              d4buf_total( 0L, 0, 0);

              do_other_work();

              w4exit(0);
           }

                                 -43-

d4buf_unit

Использование    int d4buf_unit( long n_recs )

Описание   Память   берется    из   пула,   распределенного   функцией
           'd4buf_total'.  Эта  память  используется  для  буферизации
           записей текущей базы данных.

           'd4buf_unit' может  выть вызвана более одного раза для базы
           данных.  Вызов  'd4buf_unit'  повторно  изменяет  стратегию
           буферизации.

           Смотри 'd4buf_total'.

Параметры

         Наименование  Использование

         n_recs        Число записей в каждом буфере.

Возврат

         Величина      Назначение

         -1            Ошибка

         0             Успех

         1             Память не  была распределена  'd4buf_total' или
                       запрошено более 64К для одного буфера.

Внимание!  Если программа  заканчивается без  сброса или  закрытия баз
           данных, изменения информации могут не записаться на диск.

См. также  'd4buf_total', 'd4buf_init'

                                 -44-

Пример     #include 
           #include 

           main(){
           long rec, ref;

              d4init();

              d4use_excl("base");
              ref=f4ref"num_fld");

           /* 100 Records, 20 Buffer Max */
              d4buf_total( 100L, 20, 1);

           /* 100 Records in 1 Buffer */
              d4buf_unit(100L);

           /* Efficiently append 1000 records; 1Disk Write will occurs
           every 100 records */
              for( rec=100L; rec <= 1000L rec++){
                   d4append_blank();
                   f4r_double( ref, (double) rec );
              }
           /* 5 Record in each of 20 buffers */
              d4buf_unit( 5L );

           /* Now to randomly read the database ... */

              d4close_all();
              w4exit(0);
           }

                                 -45-

d4close

Использование    int d4close ()

Описание   Функция 'd4close'  закрывает выбранную базу данных и все ее
           индексные файлы.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            При закрытии одного из файлов произошла ошибка

Пример     #include 
           include 

           main( argc, argv )
           int argc;
           char *argv[2];
           {
              d4init();

              if(argc >=2 ){
                   if( d4use(argv[1]<0 )
                        w4exit(1);
                   x4list();

                   d4close();
                   w4exit(0);
              }
              w4exit(1);
           }

                                 -46-

d4close_all

Использование    int d4close_all()

Описание   Функция 'd4close_all'  закрывает все  открытые  файлы  базы
           данных, индексные файлы и файлы примечаний.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            При закрытии одного из файлов произошла ошибка

Блокировка Разблокирует базы данных и индексные файлы.

Пример     #include 
           #include 

           main(){

              .
              .

              d4close_all();
              w4exit(0);
           }

                                 -47-

d4create

Использование    int d4create ((char *) name, (int) n_fields
                           (FIELD *) fields, (int) satefy)

Описание   Данная функция  создает, открывает  и выбирает базу данных.
           Если база  данных уже  открыта и установка SAFEFY выключена
           (OFF), база  данных  будет  закрыта,  уничтожена,  а  затем
           создана заново, в соответствии с определенными параметрами.

Параметры

         Наименование  Использование

         name          Имя базы, которая будет создана

         num_fields    Количество полей в базе данных

         fields        Указатель на  массив,  определяющий  поля  базы
                       данных.   В этом  массиве имеются  'num_fields'
                       элементов.   Часть   'offset'   описания   поля
                       вычисляется функцией 'd4use'. Смотри пример.

         satefy        Логическая величина (int), определяющая, должен
                       ли  быть  удален  имеющийся  файл  с  таким  же
                       именем.

                       0 - Удалить существующий файл.

                       1 - Возврат ошибки, если этот файл существует

Замечание  Как показано  в примере,  можно  создавать  базы  данных  с
           шестью различными типами полей:

         Код типа поля Значение

         С             Символьное поле.  Количество десятичных позиций
                       всегда  равно  нулю.  Максимальная  длина  поля
                       dBase равна  255. Однако, если длина поля будет
                       превышать 255  и достигать  32К, то  поле будет
                       совместимо с Clipper.

         N             Числовое поле. Максимальная длина (размер) поля
                       этого  типа   равняется  17.   Если  количество
                       десятичных позиций  больше нуля,  то оно должно
                       быть, как  минимум, на  два меньше,  чем  длина
                       поля.

         F             Поле   с    плавающей   запятой.    Code   Base
                       рассматривает такой тип поля как числовой.

         D             Поле даты. Его длина всегда равняется 8.

         L             Логическое поле.  Длина логического поля всегда
                       равна 1. Оно может иметь либо величину истинно,
                       либо величину ложно.

         M             Поле памяти (примечания). Длина поля примечания
                       всегда  составляет   10.  Если  в  базе  данных

                                 -48-

                       имеется одно  или несколько  полей  примечаний,
                       создается  отдельный   файл  примечаний.   Поля
                       примечаний  для   хранения  текста   переменной
                       длины. Смотри модуль файла примечаний.

Возврат

         Величина      Значение

         >=0           Номер указателя  базы  данных,  соответствующий
                       базе данных

         -1            Ошибка

Блокировка Не блокируется до окончания выполнения 'd4create'.

Пример     #include 

           static FIELD fields[] =
           {
           /*Имя поля       Тип,    Длина,  Десятичн.       Смещен.*/
            {"FIRST_NAME",  'C' 25, 0,  0},
            {"BIRTH_DATE",  'D' 8,  0,  0},
            {"AMOUNT    ",  'N' 12, 2,  0},
            {"FLOAT_VAL ",  'F' 14, 4,  0},
            {"TRUE_FALSE",  'L' 1,  0,  0},
            {"MEMO_INFO ",  'M' 10  0   0},
           };

           int create_base(){
              return (d4create("BASE.DBF", 6, fields, 1));
           }

                                 -49-

d4delete

Использование    int d4delete(long record_number)

Описание   Функция 'd4delete'  помечает указанную запись для удаления.
           Запись  читается,   флаг  удаления   изменяется  на  символ
           звездочки (*) и запись записывается.

Возврат

         Величина      Значение

         1             Запись не существует

         0             Успешное выполнение

         -1            Ошибка

Блокировка Запись блокируется

Подсказка  Если запись  уже была  считана в  буфер записи,  это  более
           эффективно,  чем   непосредственное  удаление  записи.  Это
           осуществляется посредством  изменения первого  байта буфера
           записи на  символ звездочки  (*). Затем запись записывается
           на диск:

           /* Считать с диска в буфер записи */
           d4go(record_no);

           if(test_condition() ){
           /* ark the record for deletion. 'f4record' returns a
           pointer to the record buffer. The first byte of this buffer
           is the deletion flag */
              *f4record()='*';

              /* Write the record to disk */
              d4write( record_no );
           }

Пример     d4delete(1L) ; /* Пометить запись 1 на удаление */

                                 -50-

d4deleted

Использование    int d4deleted()

Описание   Функция 'd4deleted'  определяет, помечена ли текущая запись
           на удаление.  Если текущей  записи  не  имеется,  результат
           будет неопределен.

Возврат

         Величина      Значение

         0             Запись не помечена на удаление

         1             Запись помечена на удаление

Блокировка Блокировки нет.

Пример     if (d4deleted()) delete_work();
           /* Код, приведенный выше, эквивалентен:
              if (*(char *)f4record() == '*' ) delete_work();
           */

                                 -51-

d4eof

Использование    int d4eof()

Описание   Если вы  передвигаетесь за  последнюю  запись  базы  данных
           посредством 'd4skip' или 'x4skip', тогда 'd4eof' возвращает
           истину (не  ноль). К  тому же,  если 'd4seek'  или 'x4seek'
           возвращают состояние  конец  файла,  то  'd4eof'  возвратит
           'истину'.

См. также  'd4bof', 'd4skip'

Пример     #include 
           #include 

           main(){
           long last, first;

              d4use("names");
              last=f4ref("last_name");
              first=f4ref("first_name");
              i4open("last");

              w4clear(-1);
              w4handle(4); /* Printer Output */
              w4(0,0, "names");

              for( d4top(); !d4eof(); d4skip(1l) ){
                   w4num( w4row()+1,0, f4ptr(last),
                        f4width(last) );
                   w4num(w4row(), w4col()+2,
                        f4ptr(first, f4width(first) );
              }

              w4position( w4row()+1,0);
              w4exit(0);
           }

                                 -52-

d4fields

Использование    FIELDS *d4fields()

Описание   Возвращает указатель  на  структуру  'FIELD'  текущей  базы
           данных. Это  позволяет легко  создать другую базу данных со
           структурой идентичной текущей базы.

Пример     #include 

           /* Create s database with the same structure as the
           currently selected database */

           int copy_structure_to( char *new_base ){
              return( d4create( new_base,
                   f4num_fields(), d4fields(), 1) );
           }

                                 -53-

d4flush

Использование    long d4flush( int base_ref )

Описание   Буферизованная информация базы данных сбрасывается на диск.
           Code  Base   буферизует  информацию   только  тогда   когда
           использовались 'd4buf_total' и 'd4buf_unit'.

Параметры  'base_ref'  указывает   базу,  которая  сбрасывается.  Если
           'base_ref' отрицательна все базы сбрасываются.

Пример     #include 
           #include 

           main(){
           int test_ref; long k, f_ref;

              test_ref=d4use("test" );
              d4lock( -1L, 1);
              f_ref=f4ref("field_name");

              d4buf_total( 100,1,1 );
              d4buf_unit( 100 );

           /* Append some record */
              for( k=1L; k<=500L; k++ ){
                   d4append_blank();
                   f4r_long( f_ref, k);
              }

           /* Flush the append records to disk */
              d4flush( test_ref );

              x4list();
              d4close_all();
              w4exit(0);
           }

                                 -54-

d4go

Использование    int d4go(long record_number)

Описание   Функция 'd4go'  считывает указанную  запись в буфер записи.
           Указанный номер  записи становится  текущим номером записи.
           Если запись  не существует,  буфер записи  инициализируется
           пробелами.

Возврат

         Величина      Значение

         1             Записи не существует

         0             Успешное выполнение

         -1            Ошибка

Блокировка Запись блокируется

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

Пример     #include 

           main(){
           long ref, rec, count;
           double tot;

              d4use_excl("base");
              ref=f4ref("amount");
              count=d4reccount();
              tot=0.0;

              for(rec=1L; rec <= count; rec++){
                   d4go(rec);
                   tot+=f4double(ref);
              }
              printf("\n The total is : f", tot);
              exit(0);
           }

                                 -55-

d4init

Использование    int d4init()

Описание   Функция 'd4init'  инициализирует различные  переменные Code
           Base.  При  необходимости,  функции  'd4use'  и  'd4create'
           автоматически вызовут функцию 'd4init'.

Замечание  Когда функция  'd4init' или  'w4define' вызывается в первый
           раз, она  определяет окно  по умолчанию.  Это окно, которое
           содержит весь  экран  целиком,  используется  функцией  '--
           'u4error' для показа сообщений об ошибках.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Нет памяти

См. также  'd4initialize', 'd4buf_init', 'd4init_undo'

Пример     #include 

           main(){
              d4init(); /* Инициализировать структуры памяти*/

              exit 0;
           }

                                 -56-

d4initialize

Использование    int d4initialize( int num_base,
                           int num_index, int num_blocks,
                           int eval_space, long buf_bytes )

Описание   'd4initialize'  может   использоваться   вместо   'd4init'.
           Используйте   'd4initialize'    непосредственного   задания
           распределения памяти.

Параметры  Параметры 'num_base'  и 'num_index'  не ограничены. Однако,
           если указано точное число индексных файлов и баз данных, не
           будет потерь памяти и будет уменьшена фрагментация памяти.

         Наименование  Использование

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

         num_index     Число  индексных   файлов,  под  которые  будет
                       распределена память.

         num_blocks    Число   блоков   памяти,   распределяемых   под
                       индексный   файл.    Блоки   используются   для
                       буферизации информации  индексных файлов.  Если
                       вызываются функции  'i4reindex' или  'i4index',
                       'numblocks' не должен быть менее '(int)10'.

                       Для достижения максимальной скорости, это число
                       должно быть более '(int)100', если используются
                       dBASE  индексные   файлы,  и   '(int)50',  если
                       используются Clipper  индексные файлы. Заметим,
                       что большие значения этого параметра достижимы,
                       только если  используется  компактная,  большая
                       или огромная модель памяти.

         eval_space    Этот  параметр   задает  число   байт   памяти,
                       распределяемой под функции оценки выражений. По
                       умолчанию 3К  достаточно для  довольно  полного
                       обеспечения  dBASE-выражений.   Модуль   оценки
                       выражений выдает  сообщение об ошибке, если ему
                       слишком мало памяти.

         buf_bytes     Число байт, распределяемых для 'huge' огромного
                       блока памяти. Этот блок памяти используется для
                       увеличения      скорости,       переиндексации,
                       сортировки, упаковки  и удаления.  К тому же он
                       может использоваться  для  буферизации  записей
                       базы данных.

                       'd4buf_init'  вызывается  с  этим  значением  в
                       качестве параметра.  Эта  величина  может  быть
                       '0L'.

Возврат

         Величина      Значение

         0             Успех

                                 -57-

         -1            Превышение   памяти.    Если    'u4erron'    не
                       модифициравано -  это критическая ошибка и (-1)
                       не возвращается.

См. также  'd4init', 'd4buf_init', 'd4init_undo'

Пример     /* These are the defaults supplied by 'd4init' */
           #include 

           d4init(){
              return(d4initialize( 10,10, 12, 3000, 0xFC00L));
           }

                                 -58-

d4init_undo

Использование    int d4init_undo()

Описание   'd4init_undo' освобождает память, распределенную Code Base.
           В процессе  выполнения функции,  все открытые  базы данных,
           файлы примечаний и индексные закрываются.

           После вызова  'd4init_undo', для  использования  Code  Base
           необходимо вызвать 'd4init' снова.

Возврат

         Величина      Значение

         0             Успех

         -1            Ошибка

См. также  'w4init_undo'

                                 -59-

d4lock

Использование    int d4lock (long lock_code, int do_wait)

Описание   Функция d4lock  используется для  блокировки указанной базы
           данных. Может блокироваться весь файл, определенная запись,
           или байты подсчета записей. Если какая-либо запись уже была
           блокирована,   блокировка   другой   записи   автоматически
           разблокирует первую запись.

           Если вы  уже заблокировали  заданную часть  базы данных, то
           функция 'd4lock'  обнаружит это  и сразу  же возвратится  с
           успешным возвратом.  Кроме того,  если величина 'do_wait' -
           FALSE /Ложно/,  подпрограмма d4lock  сразу же  возвратится;
           если же  величина 'do_wait'  - TRUE  (не  ноль)  /Истинно/,
           функция 'd4lock'  ожидает,  пока  определенная  часть  базы
           данных станет  доступной, блокирует  ее,  и  затем  успешно
           возвратится. Например,  если заблокирован  весь файл, любой
           вызов функции 'd4lock' даст успешный возврат.

Параметры

               Наименование            Величина   Значение

               lock_code   >0          Блокирует определенную запись

                           -1          Блокирует весь файл

                           0           Блокирует байты подсчета записи

               do_wait     0           Не ожидать

                           1           Ожидать блокировки

Возврат

         Величина      Значение

         0             Успешное выполнение

         1             Запись не существует

         -1            Ошибка

         -2            Блокировано другим  пользователем  и  'do_wait'
                       равно нулю

Пример     /* Ожидать блокировки всего файла целиком */
           rc = d4lock (-1L, 1);

                                 -60-

d4locked

Использование    int d4locked( rec_code )

Описание   Возвращает текущую информацию блокирования.

Параметры

         Величина      Значение

         >0            Запись блокирована ?

         -1            Файл блокирован ?

         0             Байты подсчета записей блокированы ?

Возврат

         Величина      Значение

         0             Не блокировано.

         1             Блокировано.

                                 -61-

d4lock_all

Использование    int d4lock_all( int do_wait,
                           int free_buffers )

Описание   Блокируется текущая база данных и все ее индексные файлы.

Параметры

               Наименование            Величина   Значение

               do_wait     0           Без ожидания

                           1           Ожидать блокирования.

               free_buffers            0     Ничего не делать

                           1           Все  буфера   индексных  файлов
                                       текущей       базы       данных
                                       сбрасываются   на   диск.   Это
                                       необходимо  для   использования
                                       индексных файлов. (Используется
                                       как  внутренняя   функция  Code
                                       Base,       однако        может
                                       использоваться                и
                                       непосредственно.)

Возврат

         Величина      Значение

         0             Успех

         -1            Ошибка

         -2            Блокировано  другим   пользователем,   и   флаг
                       'do_wait' равен 0.

Пример     rc=d4lock_all(1,0); /* Lock Everything. */

                                 -62-

d4lock_code

Использование    int d4lock_code( int lock_code )

Описание   Основная цель  этой  функции  обеспечить  'грязное  чтение'
           ('dirty read'). Это позволяет одному пользователю прочитать
           запись несмотря  на то,  что эта  запись блокирована другим
           пользователам.

           По умолчанию  это значение  влияет на  блокирование  такими
           функциями Code Base как 'd4go', 'd4seek', 'd4skip', 'x4go',
           'x4seek' и 'x4skip'.

Параметры

         Величина      Значение

         2             Ничего  не  блокировать.  Это  опция  'грязного
                       чтения'.

         1             Блокировать необходимые записи. (По умолчанию)

         -1            Блокировать содержимое файла.

         -2            Не  изменять   текущее  значение   'lock_code'.
                       Позволяет     получить     текущее     значение
                       'lock_code'.

Возврат    Предыдущее значение 'lock_code'.

                                 -63-

d4lock_wait

Использование    int d4lock_wait( int do_wait )

Описание   По умолчанию, Code Base ожидает блокирования файлов.

           'd4lock_wait'  изменяет   эту  опцию   в  соответствие   со
           следующей таблицей:

Параметры

         Величина      Значение

         -1            Не  изменять   кода  ожидания.  Просто  вернуть
                       текущее значение.

         0             Не  ожидать.  Вернуться  с  кодом  ошибки  если
                       блокирование неуспешно.

         1             Ожидать пока  завершится операция блокирования.
                       Это значение по умолчанию.

Возврат    Предыдущее значение 'lock_code'.

                                 -64-

d4lseek

Использование    int d4seek( long record_number )

Описание   Функция 'd4seek'  вызывает функцию  выполнения 'lseek'  для
           позиционирования на указанную запись базы данных. Code Base
           использует эту  функцию внутри  себя перед  вызовом функций
           'read' и 'write' нижнего уровня.






d4pack

Использование    int d4pack()

Описание   Функция 'd4pack'  удаляет все  записи в  определенной  базе
           данных, которые были помечены на удаление.

           После выполнения  'd4pack', буфер записи пустой. Необходимо
           вызвать  функцию   Code  Base   такую   как   'd4top'   для
           позиционирования на желаемою запись.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Ошибка

         -2            База или  один из индексных файлов блокирован и
                       установлен флаг вернуться немедленно.

Блокировка База данных  и ее  индексные  файлы  блокируются  во  время
           упаковки, а затем разблокируются.

Переносимость Так как 'd4pack' использует 'chsize', используйте 'x4pack'
           для достижения максимальной переносимости.

См. также  'd4delete', 'd4recall', 'x4pack'

Пример     d4delete (2L);
           d4pack();

                                 -65-

d4ptr

Использование    BASE * d4ptr()

Описание   Функция 'd4ptr'  возвращает  указатель  на  структуру  базы
           данных,  которая  описывает  выбранную  базу  данных.  Если
           открытой базы данных нет, возвращается '(BASE *) 0'.

Внимание!  Если был  сделан  вызов  функции  'd4use',  'd4close',  или
           'd4close_all', то данный указатель становится 'устаревшим',
           и функция 'd4ptr' должна быть вызвана заново. Использование
           этой функции  требует знания  внутреннего  устройства  Code
           Base. К  тому же,  полученные  коды  могут  не  работать  с
           последующими версиями Code Base

Пример     #include

           /* Прочитать длину записи выбранной базы данных */
           int buffer_len(){

              return (d4ptr()->buffer_len);

           }

                                 -66-

d4recall

Использование    void d4recall (long record_number)

Описание   Если определенная  запись помечена на удаление, эта отметка
           удаляется. Запись считывается в буфер записи, флаг удаления
           меняется на пустой символ, и запись записывается снова.

Возврат

         Величина      Значение

         1             Записи не существует

         0             Успешное выполнение

         -1            Ошибка при чтении или записи в базу данных

Блокировка Запись блокируется

См. также  Функции 'd4delete', 'd4pack'.

Пример     d4recall (2L);

                                 -67-

d4reccount

Использование    long d4reccount()

Описание   Возвращается  колличество   записей  в   базе  данных.  Эта
           величина   определяется   на   основании   размера   файла.
           Следовательно, для выполнения данной операции, Code Base не
           нужно выполнять никакой блокировки.

           Если  байты   подсчета  записей   блокированы,  то   другие
           пользователи не могут изменить число записей в базе данных.
           В этом случае, Code Base запоминает внутри. Это увеличивает
           скорости работы,  так как Code Base не приходится сохранять
           результаты  определения   числа  записей   в  базе  данных.
           Заметим, что  если файл  блокирован, то также блокированы и
           байты подсчета записей.

Возврат

         Величина      Значение

         >=0           Количество записей в базе данных

         -1            Никакой базы данных не выбрано

Блокировка Нет.

Пример     /* Сбросить содержимое базы данных в текущее окно */
           for ( rec = 1L; rec <= d4reccount(); rec++ )
              w4( w4row()+1,0, f4record());

                                 -68-

d4recno

Использование    long d4recno()

Описание   Функция 'd4recno' возвращает номер текущей записи.

Возврат

         Величина      Значение

         >=1           Текущий номер записи

         0             Текущего номера записи не существует

Пример     /* Прочитать следующую запись */
              d4go (d4recno() + 1L);



d4ref

Использование    int d4ref ( char * name)

Описание   Функция 'd4ref'  возвращает целый указатель на определенную
           базу данных.  Если расширение файла не указано, принимается
           расширение '.DBF'.  Это тот  же номер  указателя  (ссылки),
           который был  возвращен,  когда  база  данных  была  сначала
           открыта.

Возврат

         Величина      Значение

         >=0           Номер указателя базы данных

         -1            База данных не открыта

Пример     d4select (d4ref( "ACCOUNT.DBF"));

                                 -69-

d4seek_double

Использование    int d4seek_double( double d )

Описание   'd4seek_double'  осуществляет   поиск,  используя   текущий
           выбранный индексный  файл. Если  нет выбранного  индексного
           файла, то  используется последний  открытый. Если  'double'
           число обнаружено, то вызывается 'd4go' для позиционирования
           на найденную запись.

Параметры  Для индексного файла с 'числовым' ключем, 'double' параметр
           должен содержать  искомую  величину.  Если  индексный  файл
           имеет ключ  типа 'дата',  то 'double'  должна  представлять
           собой Юлиановскую дату. Если индексный файл имеет ключ типа
           'символ', эта функция не должна использоваться.

Возврат

         Величина      Значение

         0             Значение найдено

         2             На следующей  записи. Если  искомое значение не
                       найдено, будет прочитана запись непосредственно
                       за ключем и будет возвращено '(int'2'.

         3             Конец файла.  Если искомое больше всех значений
                       в индексном файле, будет возвращено '(int)3'.

         -1            Ошибка

Блокировка Используемый индексный  файл  блокируется.  Разблокирование
           происходит, если  новая запись  не  блокирована.  В  конце,
           новая запись блокирована и прочитана.

Пример     void double_search_examples(){
           double d;


           /* Numeric Key Search */
              i4select( i4ref("numeric" ) );
              d=c4atod("83.4", 4);
              d4seek_double(d);

              i4select( i4ref("dt_index") ); /* Date Search */
              c4dt_julian("19840730", &d);
              d4seek_double(d);
           }

                                 -70-

d4seek_str

Использование    int d4seek_str( char *str )

Описание   'd4seek_str'   осуществляет    поиск,   используя   текущий
           выбранный индексный  файл. Если  нет выбранного  индексного
           файла, то  используется последний  открытый. Если  значение
           обнаружено, то  вызывается 'd4go'  для позиционирования  на
           найденную запись.

           Параметром поиска  может быть  любая строка  символов. Если
           индексный файл  имеет тип 'дата', то дата для поиска должна
           быть в формате "CCYYMMDD" (век, год, месяц, день).

           Если   индексный    файл    типа    'число',    используйте
           'd4seek_double'.

Возврат

         Величина      Значение

         0             Значение найдено

         1             Найдена часть;  если искомая  величина найдена,
                       но  в   ключе  индексного   файла  имеются  еще
                       символы, возвращается '(int)1'.

                       Пример:

                       Если "Jackson" значение ключа индексного файла.
                       d4seek_str("Jack") позиционирует  на "Jackson",
                       но возвратит '(int)1' вместо '(int)0'.

                       Это  значение   никогда  не   возвращается  для
                       числовых и ключей даты.

         2             На следующей  записи. Если  искомое значение не
                       найдено, будет прочитана запись непосредственно
                       за ключем и будет возвращено '(int)2'.

         3             Конец файла.  Если искомое больше всех значений
                       в индексном файле, будет возвращено '(int)3'.

         -1            Ошибка

Блокировка Если  используется   индексный  файл,  то  он  блокируется.
           Разблокирование   происходит,    если   новая   запись   не
           блокирована. В конце, новая запись блокирована и прочитана.

                                 -71-

Пример     void string_search_examples(){
           int rc;
           /* Search for a Character String. The index file key
           expression could be "UPPER(NAME)". Using the 'UPPER'
           funttion makes the search case insensivitive */
              i4select( i4ref("name") );
              rc=d4seek_str("JACK");
           /* Search for Last Name plus First Name. In this example,
           the index file key expression is "last+first". LAST is a 15
           character field and FIRST is a 10 character field. The
           complete search key is provided. Consequently,
           'd4search_str' will return with an exact find if the record
           is located. */
              i4select( i4ref("full_nam"));
              rc=d4seek_str("(SMITH         JOHN      ");
           /* Date Key Search */
              i4select( i4ref("DATE"));
              rc=d4seek_str("19900228");
           }

                                 -72-

d4select

Использование    int d4select( int base_ref);

Описание   Функция 'd4select'  выбирает базу  данных, с  которой будут
           работать другие функции.

Параметр   'base_ref' -  это  номер  указателя,  который  возвращается
           функциями 'd4use',  'd4create'  и  'd4ref'.  Если  величина
           'base_ref' равна '(int) -1', никакого выбора не происходит.
           Функция  'd4select'  возвращает  номер  ссылки  (указателя)
           выбранной до этого базы данных.

Возврат

         Величина      Значение

         >=0           Номер ссылки выбранной до этого базы данных

         -1            Никакой базы данных до этого выбрано не было

Пример     /* Инициализировать некоторые переменные */
           invoice_ref = d4use ("INVOICE");
           invoice_name = f4ref ("NAME");

           customer_ref = d4use ("CUSTOMER");
           name_index_ref = i4open("CUS_NAME");

           /* Переместится в начало файла "INVOICE.DBF". Сохранить
           текущий номер указателя базы данных. */

           prev_ref = d4select(invoice_ref)
           d4top();

           /* Найти поле "NAME" из файла "INVOICE.DBF" в индексном
           файле "CUS_NAME.NDX" базы данных "CUSTOMER.DBF". */

           d4select(customer_ref);
           i4select(name_index_ref);
           d4seek(f4str(invoice_name));

           /* Выбрать предыдущую базу данных */
           d4select (prev_ref);

                                 -73-

d4skip

Использование    int d4skip(long num_records)

Описание   Функция 'd4skip' пропускает ("перепрыгивает") 'num_records'
           записей  от   текущего  номера   записи.  При   этом  будет
           использован  выбранный   индексный  файл.   Если   никакого
           индексного файла выбрано не было, будет использован порядок
           номеров записей.

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

Возврат

         Величина      Значение

         0             Успешное выполнение

         1             Пропуск до верхней записи файла

         3             Пропуск до конца файла

         -1            Ошибка

         -2            База данных или индексный файл уже блокирован и
                       стоит флаг 'вернуться немедленно'.

         -3            Нет записи  в индексном  файле  соответствующей
                       текущей записи.

Блокировка Если  используется   индексный  файл,  то  он  блокируется.
           Разблокирование   происходит,    если   новая   запись   не
           блокирована. В конце, новая запись блокирована и прочитана.

Замечание  Возможно перейти на одну запись за последней в базе данных.
           В этом случае, запись очищается. Однако, невозможно перейти
           на запись выше (до) первой в базе данных.

Пример     #include 
           #include 

           main(){

              d4use("base");
              i4open("index");

           /* Display the database is reverse order */
              for( d4bottom(); !d4bof(); d4skip(-1L) )
                   w4num(w4row()+1,0,f4record(),
                        f4record_width() );

              w4exit(0);
           }

                                 -74-

d4top

Использование    int d4top()

Описание   Функция 'd4top'  читает верхнюю запись в файле базы данных.
           Если никакого  индексного файла  выбрано не  было,  то  это
           будет запись один.

Возврат

         Величина      Значение

         0             Успешное выполнение

         3             Конец файла (База данных пуста)

         -1            Ошибка

Блокировка Если  используется   индексный  файл,  то  он  блокируется.
           Разблокирование   происходит,    если   новая   запись   не
           блокирована. В конце, новая запись блокирована и прочитана.

Пример     #include 
           #include 

           main(){
           double sum, average;
           long height_ref;
           int rc;

              d4use_excl("heights");
              height_ref=f4ref("height");

              sum=0.0;
              for(rc=d4top(); rc!=3; rc=d4skip(1L) )
                   sum += f4double(height_ref );

              w4clear(-1);
              w4out("The Average Height: ");
              w4double( w4row(),w4col(), sum/d4reccount(),
                   6,2 );

              w4exit(0);
           }

                                 -75-

d4unlock

Использование    int d4unlock( long lock_code)

Описание   Функция 'd4unlock'  удаляет блокировки на текущей выбранной
           базе данных,  как  определено  параметром.  Если  указанные
           блокировки не  существуют, функция  'd4unlock' не выполняет
           никаких действий и возвращает 'успешное выполнение'.

Параметры

         Величина      Значение

         1             Если определенная запись блокирована, она будет
                       разблокирована.

         -1            Разблокирует   все    блокировки   на   текущей
                       выбранной базе данных и все ее индексные файлы

         0             Разблокирует только байты подсчета записей.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Ошибка

Пример     /* Разблокировать выбранную базу данных и ее индексные
           файлы */
              d4unlock (-1L);

                                 -76-

d4use

Использование    int d4use(char * name)

Описание   Функция 'd4use' открывает и выбирает указанную базу данных.
           Если  расширения   файла   не   определяется,   принимается
           расширение по умолчанию '.DBF'.

           После   выполнения    'd4use',   буфер    записи    пустой.
           Соответственно, необходимо  вызвать функцию  Code Base типа
           'd4top' для позиционирования на требуемую запись.

Возврат

         Величина      Значение

         >=0           Номер указателя  базы  данных,  соответствующий
                       базе данных.  Этот номер может быть использован
                       как параметр для функции 'd4select'.

         -1            Ошибка

         -2            База данных, блокирована другим пользователем и
                       выставлен флаг 'вернуться немедленно'.

Блокировка Разблокирование по завершению.

Пример     account_ref = d4use ("ACCOUNT.DBF");

           /* Заметьте, что две наклонных черты влево рассматриваются
           компилятором Си как один символ (\). */

           cust_ref = d4use("C:\\data\\customer");






d4use_excl

Использование    int d4use_excl(char * name)

Описание   Функция  'd4use_excl'   идентична   функции   'd4use',   за
           исключением того,  что она  блокирует базу  данных после ее
           открытия.

Подсказка  Если Вы  создаете прикладную программу одного пользователя,
           то  лучше   использовать  вместо   функции  d4use   функцию
           d4use_excl.  Программа   тогда  будет   работать  несколько
           быстрее.

                                 -77-

Пример     d4use_excl(name)

           char *name;

           {

           int rc;

              if((rc = d4use(name)) < 0) retunt -1;
              if (d4lock( -1L,1) < 0) return -1;
              return(rc);

           }

                                 -78-

d4write

Использование    int d4write(long record_number)

Описание   Функция 'd4write'  записывает буфер  памяти в  определенный
           номер записи. Поддерживаются открытые индексные файлы.

Параметр   Номер существующей записи. Иначе используйте 'd4append'.

Подсказка  Не  всегда   необходимо  непосредственно  вызывать  функцию
           'd4write'.  Если  запись  модифицируется  функциями  замены
           полей,   запись    будет   автоматически   записана   перед
           перемещением,  поиском   или  закрытием.   Это   становится
           возможным, так  как Code  Base помнит, был ли модифицирован
           буфер записи с последнего его чтения.

           Однако  возможно   непосредственное  использование  функций
           'd4write' и  'd4append'. В  этом случае  Code Base не будет
           автоматически обновлять  оригинальную запись,  потому,  что
           запись непосредственно записывается на диск.

           Если номер  записи -  'record_number' -  0L или больше, чем
           колличество   записей   в   базе   данных,   буфер   записи
           прибавляется к базе данных.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Ошибка

         -2            Запись  блокирована   другим  пользователем   и
                       выставлен флаг вернуться немедленно.

         -3            Уникальный   ключ    индексного   файла   имеет
                       дубликат.   Следовательно,   запись   не   была
                       записана.

                       По      умолчанию,      внешняя      переменная
                       'v4unique_error' устанавливается  как '(int)1'.
                       Если эта  переменная  изменяется  на  '(int)0',
                       функция 'd4write' никогда не возвратит величину
                       '(int)-3'. Вместо  записывания записи, никакого
                       ввода в  индексный  файл  с  уникальным  ключом
                       сделано не  будет, и функция возвратит величину
                       '(int) 0'.

Блокировка Запись и индексный файл базы данных блокируются.

См. также  'd4append', 'd4append_blank'

                                 -79-

Пример     #include 

           /* Insert a Blank Record at Record 1 */

           main(){
           long i_rec, count;

              d4use_excl("Data");
              d4append_blank();

              for(i_rec=d4reccount(); i_rec>=2L; i_rec--){
                   d4go(i_rec-1L);
                   d4write(i_rec );
              }

              d4blank();
              d4write(1L);

              exit(0);
           }

                                 -80-

d4zap

Использование    int d4zap(long start_rec, long end_rec)

Описание   Функция  'd4zap'   удаляет  указанный   интервал   записей.
           Интервал  всегда  указывается,  используя  порядок  номеров
           записей. Соответственно, если величина параметра 'endf_rec'
           будет меньше,  чем величина  'start_rec',  то  удаления  не
           произойдет. После  удаления записи  все открытые  индексные
           файлы соответствующей базы данных переиндексируются.

           После   выполнения    'd4zap',   буфер    записи    пустой.
           Соответственно необходимо  вызвать функцию  Code Base  типа
           'd4top' для позиционирования на требуемую запись.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Ошибка

         -2            Файл блокирован  другим пользователем  и  стоит
                       флаг 'вернуться немедленно'.

Блокировка Во время  выполнения функции  d4zap база данных и индексные
           файлы блокируются;  после  завершения  работы  функции  они
           снова разблокируются.

Внимание!  При  использовании   данной  функции  необходимо  соблюдать
           чрезвычайную осторожность,  так  как  она  может  сразу  же
           удалить большое колличество записей.

Пример     /* Удалить всю базу данных */

           d4zap (1L, d4reccount());

                                 -81-

Функции оценки выражений

Представляется  необходимым   оценивать  выражения   dBASE.  Например,
функции 'i4index'  выражение dBASE  передается как параметр. Подробное
описание выражений  dBASE  содержится  в  приложениях  по  функциям  и
выражениям.

В Code  Base процесс  оценки выражений  состоит из  двух  этапов.  Во-
первых,      выражение       псевдо-компилируется.      Затем      это
псевдокомпилированное выражение  выполняется и возвращается результат.
Этот способ  эффективен при  повторяющейся оценке  выражений, так  как
псевдо-откомпилированную форму  выражения  нужно  генерировать  только
один раз.

Если  вы   хотите  оценить   выражение  только  один  раз,  Вы  можете
использовать функцию  'e4eval'. В  противном случае,  вызовите функцию
'e4parse' для  псевдо-компиляции выражения,  а затем  вызовите функцию
'e4exec' или 'e4string' для его выполнения (интерпретации).

ПОДСКАЗКА:

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

e4eval

Использование    void * e4eval( (char *) expr-ptr )

Описание   Функция 'e4eval'  оценивает выражение  dBASE  и  возвращает
           указатель  на   внутренний  статический  буфер,  содержащий
           результат.   Соответственно,    если   функция   вызывается
           несколько   раз,   то   первый   результат   будет   затерт
           последующим.

Параметр   'expr-ptr' является  указателем  на  выражение  dBASE.  Это
           выражение может содержать имена полей, функции, операторы и
           ссылки на другие базы данных.

           Более подробная  информация  содержится  в  приложениях  по
           выражениям.

Возврат    Результат  может   находиться  в   различном   формате,   в
           зависимости от его типа.

         Тип           Формат

         Дата          CCYYMMDD (Век, Год, Месяц, День)

         Символ        Строка ASCII

         Числовое      Двойное (double)

         Логическое    Целое (int), 0 -  для /Ложно/, другие -

                       для /Истинно/

                                 -82-

         (void *) 0    Ошибка

Примечание Тип результата  может  быть  определен  посредством  вызова
           функции 'e4type'.

Пример     /* AMOUNT - A numeric field of the selected database */
           /* CENTS - Anumeric field of BASE.DBF */

           #include 

           void test(){
           double *d_ptr;
              d_ptr=e4eval( "amount*(100+base->cents)" );
              printf("\n Expression Result: %f", *d_ptr );
           }

                                 -83-

e4exec

Использование    void * e4exec( (char *) compile_ptr )

Описание   Функция       'e4exec'       интерпретирует       выражение
           псевдокомпилированное из  функции  'e4parse'  и  возвращает
           указатель  на   внутренний  статический  буфер,  содержащий
           результат.

Параметры  'compile_ptr'    является     указателем     на     псевдо-
           откомпилированную форму выражения.

Возврат    Аналогичен возврату для функции 'e4eval'.

Пример     #include 
           void exec_amount()
           {
              char * compile_ptr ;
              char * result_ptr ;
              e4parse( "AMOUNT", &compile_ptr ) ;
              esult_ptr = e4exec( compile_ptr ) ;


           /* Проверить тип *result_ptr */
              if ( e4type() == 'N' )
                   printf( "\n Числовой результат: %f",
                        *( (double *) result_ptr) ) ;
              if ( e4type() == 'C' )
                   printf( "\n Символьный результат: %s",
                        (char *) result_ptr ) ;
           /* Освободить память, выделенную для e4parse */
              free( compile_ptr ) ;
           }

                                 -84-

e4length

Использование    int e4length()

Возврат    Возвращает длину последнего выражения оцененного функциями:
           'e4exec', 'e4eval', или 'e4string'.

Пример     #include 

           int length_espression( char *expr){
              if( e4eval(expr) == (char *0) ) return -1;
              return( e4length() );
           }

e4parse

Использование    int e4parse( (char *) expr_ptr,
                           (char **) compile_ptr)

Описание   Функция e4parse  псевдо-компилирует  выражение  dBASE,  для
           того, чтобы оно могло быть быстро интерпретировано функцией
           e4exec.

           При   помощи    'h4alloc'   для   псевдо-откомпилированного
           выражения распределяется память. Следовательно, после того,
           как откомпилированное выражение станет ненужным, необходимо
           освободить   выделенную    память   при    помощи    вызова
           'h4free_memory'.

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

Возврат

         Величина      Значение

         >= 0          Количество байт в

                       псевдооткомпилированном выражении

         -1            Ошибка

                                 -85-

e4string

Использование    char *e4string( char * compile_ptr )

Описание   'e4string'   аналогична    'e4exec'   исключая    то,   что
           возвращаемый результат  всегда имеет  символьный формат. Не
           используйте   'e4string',    если   выражение    возвращает
           логический результат.

           Для  числовых   строк,  которым  не  предшествуют  пробелы,
           используется  лидирующий  ноль.  Для  отрицательных  чисел,
           число 0x5E вычитается из каждого символа.

Замечание  'e4string'  используется   для  'i4reindex',  так  как  она
           требует  ASCII   сортировки.  Сравнение   чисел   несколько
           медленнее на многих компьютерах.

Пример     #include 
           #include 

           main( argc, argv )
           int argc:
           char *argv[];
           {
              char *expr_ptr;

              d4init(); /* Init Code Base */
              w4clear(-1);

              if( argc < 4){
                   w4(0,0, "display database, recno, expr" );
                   w4exit(1);
              }

              if(d4use( argv[1] <0) w4exit(1);
              if( d4go(c4atod( argv[2],strlen(argv[2])))<0)
                   w4exit(1);
              if( e4parse( argv[3], &expr_ptr) < 0) w4exit(1);

              w4display("Result:", e4string( expr_ptr),
                    (char *)0);
              w4exit(0);
           }

                                 -86-

e4type

Использование    char e4type()

Описание   Функция  'e4type'   возвращает  тип  последнего  выражения,
           оцененного функциями  'e4exec' или  'e4eval', 'e4vary'  или
           'e4string'.

Возврат    Величина   Значение

           'C'          Символьное

           'N'          Числовое в виде double

           'n'          Числовое в виде строки

           'D'          Даты в виде строки (CCYYMMDD)

           'd'          Даты в виде Юлиановской double

           'L'          Логическое

                                 -87-

Функции для работы с полями

Функции для  работы с  полями выполняют  операции над буфером записи и
возвращают информацию  о полях.  Заметьте, что  на базу данных имеется
ТОЛЬКО один буфер записи, и что функции управления базой данных читают
и записывают этот буфер.

Для совершения  операций над  буфером записи  имеется два способа. Во-
первых, с  номерами указателей  на поля  могут быть использованы такие
функции, как,  например, 'f4r_double' и 'f4double'. Преимущество этого
метода заключается  в том,  что выполнимая  программа может безупречно
работать после  добавления, удаления  или изменения полей. Кроме этого
программисту не  нужно понимать  внутренний формат  буфера записи базы
данных и не надо вызывать 'd4write'.

Если  программист  понимает  внутренний  формат  буферов  записи  (см.
приложение Внутреннее  устройство Code Base), он может непосредственно
(напрямую) манипулировать буфером записи Code Base. Наилучшим способом
является использование  'f4record' для  присвоения указателю структуры
значения указателя  начала внутреннего  буфера записи. Члены структуры
будут соответствовать различным полям базы данных.

Некоторые функции заменяющие значение полей:
           'f4r_double', 'f4r_int', 'f4r_long', 'f4r_char'
           'f4r_str'


После  использования   этих  функций   нет  необходимости   записывать
содержимое  буфера   базы  данных   на  диск.   Буфер   записи   будет
автоматически записан  в текущую  запись базы. Содержимое буфера будет
записано, как только будет вызвана функция базы, изменяющая содержимое
буфера записи.  Это следующие  функции:  'd4flush',  'd4go',  'd4top',
'd4bottom',  d4seek_double',   'd4seek_str'   и   'd4close'.   Функции
расширения также  автоматически записывают  изменения буфера записи на
диск.

Пример:
           #include 

           main(){
              d4use("test");
              d4go(1L);

           /* It is not necessary to explicitly write the change. */
              d4close_all();
              exit(0);
           }


Однако, возможно  непосредственно записать  содержимое записи  на диск
посредством вызова  'd4write' или  'd4append'.  В  этом  случае  буфер
записи будет записан в запись с указанным номером или в конец файла.

Пример:

                                 -88-

           #include 

           main(){
              d4use("test");
              d4go(1l);

              f4r_str(f4ref("name"), "john" );
           /* In this case, 'd4append' is called so that the changed
           record is written to the end of the database. */
              d4append();
              d4close_all();
              exit(0);
           }

Подсказка  Если используются  номера  указателей  полей,  этот  способ
           будет вполне  применим для  открытия баз  данных  в  начале
           программы и  для непосредственного присвоения длинным целым
           переменным  величин   указателей  полей.   Если  переменные
           указателей полей  будут определены  как глобальные,  то они
           могут быть  использованы из любой функции! Кроме того, Code
           Base знает,  какой номер  указателя поля  какой базе данных
           соответствует. Следовательно, при использовании функций для
           работы с полями не имеет значения, какая именно база данных
           выбрана.

Внимание!  Не думайте,  что номер  указателя (ссылки) поля для первого
           поля равен  нулю, а  для  второго  поля  этот  номер  равен
           единице ...  Это  верно  только  в  отношении  первой  базы
           данных, которая  открыта,  и  может  оказаться  неверным  в
           последующих  версиях   Code  Base.  Для  получения  номеров
           указателей на поля вызовите функции 'f4ref' или 'f4j_ref'.

                                 -89-

f4char

Использование    char f4char( long field_ref )

Описание   возвращает первый символ содержимого поля.

См. также  'f4r_char'

Пример     #include 

           void disp_sex( f_ref )
           long f_ref;
           {
              if( f4char(f_ref) == 'M' )
                   printf("\n The Sex is Male");
              else
                   printf("\n The Sex is Female");
           }

                                 -90-

f4decimals

Использование    int f4decimals( (long) field )

Описание   Если параметр  'field_ref'  соответствует  числовому  полю,
           функция  'f4decimals'   возвращает  количество   десятичных
           позиций в поле. В противном случае величиной возврата будет
           ноль.

Возврат

         Величина      Значение

         >=0           Количество десятичных позиций

         -1            Неверный параметр

Пример     #include 
           #include 

           void disp_structure( int base_ref ){
           int j, prev_ref;
           long f_ref;
           char fld_type[2] = " ";

              prev_ref=d4select(base_ref);

              w4(0,0, "name"); w4(0,15, "type");
              w4(0,25, "width"); w4(0,35, "decimals");

              for(j=1; j<=f4num_fields(); j++){
                   f_ref=f4j_ref(j);
                   fld_type[0]=f4type(f_ref);

                   w4( w4row()+1,0, f4name(f_ref) );
                   w4( w4row(), 17, fld_type );
                   w4int( w4row(),27, f4width(f_ref), 2);
                   w4int( w4row(), 38, f4decimals(f_ref), 2);
              }
              g4char();
              d4select( prev_ref);
           }

                                 -91-

f4double

Использование    double f4double( long field_ref )

Описание   Возвращаемое значение  зависит от  содержимого  и  от  типа
           поля. Если  поле типа дата, то будет возвращена Юлиановская
           дата. Иначе,  'f4double' будет  считать, что  поле содержит
           число  и  возвратит  значение  как  double.  Соответственно
           'f4double'  работает   с  символьными  полями,  содержащими
           числовые значения.

Пример     #include 

           main(){
           long amount;

              d4use_excl( "totals" );
              amount = f4ref( "amount" );

              d4bottom();
              printf( "The last amount: %f", f4double(amount));
              exit(0);
           }

f4int

Использование    int f4int( long field_ref )

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

См. также  'f4r_int'

Пример     #include 

           main(){
           long age_ref;
           int max_age;

              d4use_excl("people");
              age_ref=f4ref("age");
              max_age=0;
              for( d4top(); !d4eof(); d4skip(1L) )
                   if( f4int(age_ref) > max_age )
                        max_age=f4int(age_ref);
              printf("The oldest person is %d years old",
                   max_age);
              exit(0);
           }

                                 -92-

f4j_ref

Использование    long f4j_ref( (int) j_field )

Описание   Функция f4j_ref  возвращает номер  указателя поля,  который
           соответствует jму  полю базы  данных. Номер  указателя поля
           будет дан для выбранной базы данных.

Возврат

         Величина        Значение

         >=0             Номер указателя поля

         -1              Неверный параметр

Замечание  Величина параметра  'j_field' должна находиться в диапазоне
           между единицей и количеством полей.

           (то есть: 1 <= j_field <= f4num_fields()).

Подсказка  Номера указателей  полей даются в последовательном порядке.
           Следовательно, f4j_ref(j)+1 равно f4j_ref(j+1), если только
           база данных имеет бльше, чем 'j' полей.

Внимание!  Номер указателя  поля верен только в том случае, когда база
           данных  открыта.   Если  база   данных  закрыта,   а  потом
           открывается снова,  функция  f4j_ref  должна  быть  вызвана
           заново для получения номера указателя поля.

Пример     #include 
           #include 

           /* Returns the field reference number of the first memo
           field. */

           long first_memo_ref(){
           int j;

              for(j=1; j<=f4num_fields(); j++)
                   if(f4type(f4j_ref(j)) == 'M' )
                        return( f4j_ref(j) );

              return(-1L);
           }

                                 -93-

f4long

Использование    int f4long( long field_ref )

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

См. также  'f4r_long'

Пример     #include 

           long tot_field( f_ref )
           long f_ref;
           {
              long tot = 0L;
              for( d4top(); !d4eof(); d4skip(1L) )
                   tot += f4long( f_ref );
              retirn( tot );
           }
f4name

Использование    char * f4name( (long) field_ref )

Описание   Функция f4name возвращает имя поля по указателю. Если номер
           указателя поля неверен, возвращается пустой указатель.

Пример     #include 
           #include 

           void display_field_name( f_ref )
           long f_ref;
           {
              w4display( "The Fields Name ", f4name( f_ref ),
                   (char *) 0);
           }

                                 -94-

f4ncpy

Использование    int f4ncpy( long field_ref, char *mem_ptr,
                           int n)

Описание   Содержимое  поля  копируется  в  область  памяти  указанную
           'mem_ptr'.  Максимально   копируется  'n'   символов.  Если
           область памяти  больше ширины поля, то скопированные данные
           будут ограничены нулем.

Возврат    Возвращается число скопированных символов. Это число всегда
           меньше или равно параметру 'n'.

Пример     #include 

           main(){
           char first_name[25];
           long name_ref;
              d4use_excl( "names" );
              i4open( "last_nam" );
              name_ref = f4ref("last_name");
              d4top();
              f4ncpy( name_ref, first_name,
                   (int)sizeof(first_name) );
              .
              .
           }

f4num_fields

Использование    int f4num_fields()

Описание   Функция  'f4num_fields'   возвращает  количество   полей  в
           текущей выбранной  базе данных. Если никакой базы данных не
           выбрано, возвращается величина -1.

Пример     #include 

           main(){

              d4use("test.dbf");
              printf("Test.dbf hase %d fields",f4num_fields());
              d4close_all();
              exit(0);
           }

                                 -95-

f4ptr

Использование    char * f4ptr( (long) field_ref )

Описание   Функция 'f4ptr'  возвращает указатель в буфере базы данных,
           на определенное  поле. Для  эффективного использования этой
           подпрограммы,  необходимо   знать  формат   буфера  записи.
           Смотрите  раздел   Формат  буфера   записи   в   приложении
           Внутренняя организация Code Base.

           Возврат нулевого указателя обозначает неверный параметр.

           Так как  указатель указывает  непосредственно на данные, он
           не оканчивается на нуль. За данными поля немедленно следуют
           данные следующего  поля. Таким  образом можно  вывести  всю
           запись, начиная с указанного поля.

Внимание!  Если соответствующая  база данных  закрыта, а  потом  снова
           открывается, указатель необходимо назначить заново.

           Если буфер  записи модифицировался, используя 'f4ptr', а не
           функциями    замещения     ('f4r_*'),     то     необходимо
           непосредственно вызвать  'd4write' или  'd4append'. В  этом
           случае Code  Base не  знает, что  буфер  записи  изменен  и
           соответственно не запишет его автоматически.

Замечание  Все данные  в буфере  записи хранятся  как  символы  ASCII.
           Числовые поля  форматируются в  соответствии с  их длиной и
           десятичными позициями.  Логические поля  содержат 'T', 't',
           'Y' или  'y' для представления величины TRUE (Истинно), или
           содержат 'F',  'f', 'N'  или 'n' для представления величины
           FALSE (Ложно).  Наконец, поля  даты имеют формат "CCYYMMOD"
           (Век, Год, Месяц, День). Например, буфер для числового поля
           с шириной  пять и двумя десятичными позициями будет хранить
           '(double) 3.4'  как '3.40';  дата 15  марта 1988 года будет
           хранится как "19880315".

Пример     #include 

           int f4char( f_ref )
           long f_ref;
           {
              /* Return the first character of the field */
              return( *f4ptr(f_ref) );
           }

                                 -96-

f4record

Использование    void * f4record()

Описание   Функция 'f4record'  возвращает указатель  на начало  буфера
           записи.

           Возвращаемый  указатель   может  быть   присвоен  указателю
           структуры 'C'  для прямого  доступа к  данным. Так  как все
           поля базы  данных внутренне  хранятся в  формате ASCII, все
           члены структуры C будут иметь тип 'char' или будут массивом
           типа 'char'.  Члены структуры  соответствуют,  по  порядку,
           полям базы  данных. Кроме  того, количество  элементов типа
           'char'    массива    каждого    члена    структуры    будет
           соответствовать длине каждого поля базы данных.

Замечание  Как оъясняется  в приложении  'Внутреннее  Устройство  Code
           Base' к данному руководству, формат буфера записи Code Base
           идентичен тому,  как dBASE  хранит свои  данные  записи  на
           диске. Все  данные находятся в формате ASCII и между полями
           нет разделителей.

           Первым байтом буфера записи является флаг удаления, который
           представляет  собой   символ  звездочки  (*),  если  запись
           помечена на удаление, в противном случае он пустой.

Внимание!  Если соответствующая  база данных  закрыта, а  потом  снова
           открывается, указатель необходимо назначить заново.

Пример 1   typedef struct
           {
              char deleted ; /*флаг удаления*/
              char last_name[30] ; /*Поле 1.Длина 30*/
              char first_name[20] ;/*Поле 2.Длина 20*/
           } NAME ;

           /* Эта функция непосредственно изменяет внутренний буфер
           записи Code Base  и затем записывает его*/

           void append_record()
           {
              NAME *name_ptr ;
           /* 'name_ptr' будет указывать на
           внутренний буфер записи Code Base */
              name_ptr = (NAME *) f4record() ;

           /*Инициализировать запись*/
              memset(name_ptr,(int) '', sizeof(NAME));
           /*Скопировать данные*/
              memcpy(name_ptr->last_name, "JONES", 5);
              memcpy(name_ptr->first_name, "FRED", 4);
              d4append(); /*Добавить новую запись*/
           }

                                 -97-

Пример 2   /* Copy records from one database to another. */
           #include 

           main(){
           int from_ref, to_ref;
           char *from_ptr, *to_ptr;
           long i_rec;

              from_ref=d4use("from");
              from_ptr=f4rocord();
           /* Data base 'TO' hase an identical database structure as
           database 'FROM' */
              to_ref=d4use("to");
              to_ptr=f4rocord();

              d4select( from_ref );

              for( i_rec=1L; i_rec<=d4reccount(); t_rec++){
           /* Read the database record */
                   d4go(i_rec);
           /* Copy database buffer */
                   memcpy(to_ptr,from_ptr,f4record_width() );
           /* Append the databse record */
                   d4select( to_ref );
                   d4append();
                   d4select( from_ref );
              }
           }

                                 -98-

f4record_width

Использование    int f4record_width()

Возврат    Функция 'f4record_width'  возвращает общее число символов в
           буфере записи. Эта величина равняется сумме длин полей плюс
           единица, соответствующая флагу удаления.

Пример     #include 

           int check_base_width( base_ref )
           int base_ref;
           {
              int sum,j;

              d4select( base_ref );

           /* Initilize 'sum' to one for the Deletion Flag */
              for( sum=1, j=1; j<= f4num_fields(); j++)
                   sum += f4width(f4j_ref(j));

              if( sum==f4record_width() ){
           /* This always happens. */
                   printf("\n Record Width is Correct !!");
                   return(0);
              else{
                   printf("\n Error. ");
                   return(-1);
              }
           }

                                 -99-

f4ref

Использование    long f4ref( (char *) field_name)

Описание   Функция   'f4ref'    возвращает   номер   указателя   поля,
           соответствующий имени  поля, которое определено параметром.
           Имя поля  может содержать  символы  в  верхнем  или  нижнем
           регистре. Кроме  того, оно  может оканчиваться пробелом или
           нулем.

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

Возврат

         Величина        Значение

         >= 0            Номер указателя поля

         -1              Неверное имя поля

                        (Ошибки не показывается)

Внимание!  Номер указателя  поля верен только в том случае, когда база
           данных открыта.  Если база  данных закрыта, а потом открыта
           снова,  необходимо   заново  вызвать  функцию  'f4ref'  для
           получения номера  ссылки для  поля. Кроме того, база данных
           поля должна  быть выбрана  перед  тем,  как  будет  вызвана
           функция 'f4ref'.

Подсказка  Вызовите функцию 'f4ref' один раз для определенного поля, а
           затем присвойте  переменной результат.  Затем доступ к полю
           можно  получать,   просто  используя   эту  переменную  как
           указатель  на   поле.  Если   переменные   используются   в
           нескольких файлах  исходного  кода,  установите  включающий
           файл (файл  include) для определения всех переменных ссылок
           на поля как внешних.

Пример     #include 
           /*Глобальные переменные*/
           long m_name, m_address ;
           /*Главная программа*/
           main()
           {
              d4use( "MAILING" ) ;
              m_name = f4ref( "NAME" ) ;
              m_address = f4ref( "ADDRESS" ) ;
              f4replace( m_name, "JOHN SMITH" ) ;
              do_work();
           }

                                -100-

f4r_char

Использование    void f4r_char( long f_ref, char ch )

Описание   Содержимое   указанного   поля   заменяется   на   значение
           символьного параметра  'ch'.  В  основном,  операция  имеет
           смысл для  логических и символьных полей. Остальные символы
           поля заполняются пробелами.

См. также  'f4char'

Пример     #include 

           main(){
           long is_male_ref, sex_ref;

              d4use_excl( "people" );
              is_male_ref=f4ref("is_male");
              sex_ref=f4ref("sex");

           /* Update the new field 'SEX' from the old field 'is_male'
           */

              for(d4top(); !d4eof(); d4skip(1l) )
                   if( f4true(is_male_ref))
                        f4r_char(sex_ref, 'M' );
                   else
                        f4r_char(sex_ref, 'F' );

              d4close_all();
              exit(0);
           }

                                -101-

f4r_double

Использование    void f4r_double( long f_ref, double d )

Описание   Содержимое поля  заменяется величиной  указанной параметром
           'd'. Не важен тип поля  числивой, плавающий или символьный.
           Однако,  если   тип  поля  символьный,  то  значение  будет
           отформатировано без  десятичных знаков. Если поле имеет тип
           Дата, то  параметр 'd'  должен содержать  Юлиановскую дату.
           Поле не может иметь Логический тип.

См. также  'f4double'

Пример     #include 

           main(){
              long f_amount, s_amount;

              d4use("first");
              f_amount=f4ref("amount");

              d4use("second");
              s_amount=f4ref("amount");

              d4use("final");

           /* Replace field 'amount' in database 'second' with field
           'amount' of database 'first'. Note that neither  database
           is selected. */

              f4r_double( s_amount, f4double(f_amount) );

              d4close_all();
              exit(0);
           }

                                -102-

f4r_int

Использование    void f4r_int( long f_ref, int i_val )

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

См. также  'f4int'

Пример     #include 

           void zero_fields( base_ref )
           int base_ref;
           {
              long f_ref;
              long old_ref;
              int i;
              old_ref=d4select( base_ref );
              for(i=1; i<=f4num_fields(); i++){
                   f_ref=f4j_ref(i);
                   if(f4type(f_ref) == 'N' ||
                             f4type(f_ref) == 'F')
                        f4r_int(f_ref, 0);
              }
              d4select( old_ref );
           }
f4r_long

Использование    void f4r_long( long f_ref, long l_val )

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

См. также  'f4long'

Пример     #include 

           void add_record(){
              long new_no, f_ref;
              f_ref=f4ref("invoice_no");
              d4go(d4reccount() );
              new_no=f4long(f_ref)+1;
              d4append_blank();
              f4r_long(f_ref, new_no);
           }

                                -103-

f4r_str

Использование    void f4r_str( long f_ref, char *str )

Описание   Содержимое поля  заменяется величиной  указанной параметром
           'str'. Если  ширина поля  больше длины указанной строки, то
           остаток поля  заполняется пробелами.  В  противном  случае,
           если длина  строки больше  длины поля, то лишние символы не
           копируются.

См. также  'f4cpy'

Пример     #include 

           main(){
              long name_ref, birth_ref;

              d4use_excl("people");
              name_ref=f4ref("name");
              birth_ref=f4ref("birth");
              d4go(1l);

           /* Blank the Character 'name' field. */
              f4r_str( name_ref, "" );

           /* Set the Date field. */
              f4r_str( birth_ref, "19601012" );

              d4go(2l);
              f4r_str( name_ref, "AL" );

              d4close_all();
              exit(0);
           }

                                -104-

f4str

Использование    char * f4str( (long) field_ref )

Описание   Функция 'f4str'  копирует  содержимое  поля  во  внутренний
           статический буфер  и возвращает  указатель на  этот  буфер.
           Строка будет оканчиваться пустым символом.

Внимание!  Каждый раз,  когда вызывается  функция 'f4str', статический
           буфер перегружается  данными из нового поля. Следовательно,
           если значение  поля должно  быть сохранено,  то  необходимо
           скопировать  его   в  память  объявленную  пользовательской
           задачей.

           Пример:

           printf( "Field One %s Field Two %s",
              f4str( f4j_ref(1) ),
              f4str( f4jref(2) ) );

           В этом  примере, 'f4str'  вызывается дважды  в одном вызове
           'printf'. Так  как 'f4str'  всегда возвращает один и тот же
           указатель  на   внутренний  статический  буфер,  то  вместо
           значения двух  полей будет  выведено значение  одного поля,
           причем  какое   поле  будет  выводится,  будет  определятся
           порядком указания номеров полей.

           Другая общая  ошибкаэто многократное использование значения
           возвращаемого 'f4str'  в качестве  параметра в функции меню
           'n4'. В этом случае, все пункты меню будут одинаковы.

Возврат    Возвращается   указатель    на   величину    поля.   Ошибка
           обозначается нулевым NULL возвратом ((char *) 0).

Подсказка  Данная  функция  применима,  когда  Вам  необходимо,  чтобы
           величина поля оканчивалась пустым символом.

Пример     #include 
           #include 

           void say_field( field_name )
           char * field_name ;
           {
              char * ptr ;
              ptr = f4str( f4ref( field_name ) ) ;
              w4( w4row()+1, 0, ptr ) ;
           }

                                -105-

f4true

Использование    int f4true( (long) field_ref )

Описание   Функция  'f4true'   используется  для   определения   того,
           является ли величина логического поля истинной или ложной.

Возврат

         Величина        Значение

         1               Поле истинно

         0               Поле ложно

         -1              Ошибка

Пример     #include 

           f4true( field_ref)
           long field_ref;
           {
              char char_value;
              char_value= *f4ptr(field_ref);
              if(char_value=='Y' || char_value=='y' ||
                   char_value=='T' || char_value=='t' )
                   return(1);
              else
                   return(0);
           }

f4type

Использование    char type( (long) field_ref )

Описание   Функция 'f4type' возвращает тип указанного поля. Поле может
           иметь следующий тип: символьное, числовое, поле с плавающей
           запятой, поле  даты или  логическое поле.  Поля с плавающей
           запятой рассматриваются  как числовые поля. Для того, чтобы
           поддержать совместимость  с dBASE,  избегайте  использовать
           поля с плавающей запятой.

Возврат

         Величина        Значение

         'C'             Символьное

         'N'             Числовое

         'F'             Поле с плавающей запятой

         'D'             Поле даты

         'L'             Логическое

         'M'             Поле примечаний

         '\0'            Ошибка

                                -107-

f4width

Использование    int f4width ( (long) field_ref )

Описание   Все поля  имеют фиксированную  длину в  байтах  (символах).
           Функция f4width возвращает длину (размер) указанного поля.

Возврат

         Величина        Значение

         >= 0            Длина (размер) поля.

         -1              Ошибка

Пример     #include 
           #include 

           void field_to_field( to_ref, from_ref )
           long to_ref, from_ref;
           {
              int w;

              w=f4width( from_ref );
              if( f4width( to_ref ) 

           char info[]="default Information";

           main(){
              w4init( 2,1,0 ); /* 2 windows, 1 entry area. */
              w4clear(-1);

              w4define( 10,20, 14,42);
              w4border( SINGLE, F_BLUE );
              w4title( 0,-1,"Enter New Information", B_RED );

              g4(1,1,info);

              w4activate( w4select(-1) );
              g4read();

              w4display( "Result: ", info, (char *)0 );
              w4exit(1);
           }

                                -110-

g4alloc

Использование    GET * g4alloc( int row, int column,
                           void *data_ptr, char type)

Описание   Это функция  низкого уровня, которая используется функциями
           инициализации чтения более высокого уровня.

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         data_ptr      Указатель на  величину  по  умолчанию,  которая
                       начально  показывается  в  области  ввода.  Эта
                       величина  по   умолчанию  будет   заменена   на
                       окончательный результат.

         type          Для указания  типа  вводимых  данных.  Возможны
                       следующие коды:

                       Код    Значение
                       'C'    Символьный
                       'D'    Дата
                       'L'    Логический
                       'N'    Числовой
                       'd'    Двойное(double)
                       'l'    Длинное(long)
                       'i'    Целое(integer)

Возврат    Возвращается  указатель  на  структуру  данных  'GET'.  Эта
           структура  используется   для  хранения   различных  частей
           информации,  определенной  функцией  инициализации  чтения,
           функциями пре- и пост-модификации.

           Возвращает '(GET  *)0', если  памяти  не  осталось  и  если
           'u4error' была изменена для возврата по этой ошибке.


                                -111-

g4attribute

Использование    long g4attribute( long attribute )

Категория  Пре-модификатор.

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

Параметры  Новый символ атрибута представлен, как целое между '(int)0'
           и  '(int)0xFF'.   Если  параметр  'attribute'  не  является
           правильным  символом   атрибута,  текущий   атрибут  чтения
           изменен не будет.

Возврат    Текущий символ атрибута.

См. также  Смотрите 'w4attribute' для большей информации об атрибутах.


g4bell

Использование    void g4bell()

Описание   Вызывает звучание сигнала компьютера.

Замечание  Вначале  должна   быть  вызвана  функция  'g4bell_set'  для
           установки переключателя сигнала в положение включен.


g4bell_set

Использование    void g4bell_set( int switch )

Описание   'g4bell_set' включает или выключает переключатель звукового
           сигнала. Если  сигнал включен,  то функция 'g4bell' вызовет
           его звучание,  а 'g4read'  вызовет звучание  сигнала  после
           заполнения области ввода.

Параметры  Нулевой 'switch'  выключает  переключатель,  и  не  нулевой
           включает.

                                -112-

g4call

Использование    void g4call( GET_ROUTINE *routine, int call_data )

Категория  Пост-модификатор.

Описание   Основное  назначение   'функции   вызова'   заключается   в
           разрешении ввода данных, посредством меню, в области ввода.
           В Code  Base для  этой цели имеются две функции: 'g4menu' и
           'g4menu_help'. Смотри также функцию 'n4get_call'.

           Представляется  возможным,   хотя   и   трудным,   написать
           специализпрованную  функцию  вызова  или  изменить  функции
           'g4menu' и  'g4menu_help'.  Для  этого  необходимо  изучить
           способ  работы  функции  'g4read',  при  помощи  отладчика.
           Функцию вызова определяет следующая информация:

           Функция  'g4call'   определяет   функцию,   соответствующую
           области ввода, которую 'g4read' вызывает перед тем, как она
           запрашивает пользовательский ввод с клавиатуры. Эта функция
           вызывается только тогда, когда функция 'g4read' находится в
           области ввода, которая была только что определена.

           Определенная   пользователем    функция    вызова    должна
           принадлежать  к   типу  'GET_ROUTINE'.  Это  означает,  что
           функция отвечает следующему условию вызова:

           int call_routine( (GET *)get_ptr,
                   (char *)data_buffer, int call_data)

           Параметр 'get_ptr' указывает на структуру типа 'GET'. Эта
           структура содержит информацию об определенной области
           ввода.

           Параметр 'data_buffer' указывает на текущую введенную
           информацию. Вне зависимости от типа вводимых данных,
           'data_buffer' всегда содержит символы ASCII.

           Параметр 'call_data' является целым числом, передаваемым в
           вызове функции 'g4call'. Цель определения этого параметра
           определить различия для функции вызова.

           В зависимости от значения, возвращаемого функцией, функция
           'g4read' выполняет различные действия:

         Значение      Действие

         >0            Функция 'g4read' берет эту величину как входные
                       данные, точно  так же,  как если  бы  она  была
                       считана с клавиатуры.

         0             Функция  'g4read'   читает   следующий   символ
                       клавиатуры как обычные входные данные.

         -1            Функция 'g4read' вызывает данную функцию снова,
                       не  получая   никаких  данных   клавиатуры   от
                       пользователя.

                                -113-

Внимание!  Не вызывайте функций инициализации ввода из функции вызова.
           В противном случае первый параметр функции вызова 'get_ptr'
           изменяется   и   становится   непригодным   к   дальнейшему
           использованию.

                                -114-

g4char

Использование    int g4char()

Возврат    Считывает символ  с клавиатуры  и возвращает  его как целое
           число.

           Имеется специальный файл заголовка - 'g4char.h' - в котором
           определены все  клавишные  коды  специального  расширенного
           набора символов.  Например, F1 определяется как 0x3B00. Это
           именно та  величина, которая возвращается функцией 'g4char'
           при нажатии функциональной клавиши F1.


g4date

Использование    void g4date( int row, int column,
                           char * date_ptr )

Описание   Определяет область ввода для чтения даты. При использовании
           формата по  умолчанию для  даты шаблон - 'MMM/DD/YY', месяц
           вводится как три символа (например 'jan' - январь).

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         date_ptr      Указатель    на    дату,    которая    начально
                       показывается  в  области  ввода.  Эта  дата,  в
                       формате   'CCYYMMDD',    будет   заменена    на
                       окончательный результат.

                                -115-

g4delimiter

Использование    char *g4delimiter( char *delimiter )

Категория  Пре-модификатор.

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

Параметры  'delemiter' указывает  на строку,  состоящую из  двух  (как
           максимум) символов  разделителей. Эти  два символа появятся
           на каждой  стороне соответствующей  области ввода,  как они
           указаны в  строке. Если  строка содержит один символ, то он
           будет использован  для  ограничения  обеих  сторон  области
           ввода.

Возврат    Возвращает указатель  на два  текущих символа разделителей.
           Эта строка НЕ ОКАНЧИВАЕТСЯ нулем.

                               -116-

g4display

Использование    void g4display()

Описание   Показывает все  величины чтения  в  своих  областях  ввода,
           используя текущий атрибут чтения.


g4double

Использование    void g4double( int row, int column,
                           double * double_ptr)

Категория  Функция инициализации.

Описание   Определяет область  ввода для чтения числа двойной точности
           (double). По умолчанию, формат этой области ввода имеет две
           десятичные позиции и общую длину (размер), равный восьми.

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         double_prt    Указатель на  число двойной  точности (double),
                       которое начально  показывается в области ввода.
                       Это  число   двойной  точности  (double)  будет
                       заменено на окончательный результат.

Замечание  Функция  'g4picture'  изменяет  формат  считываемого  числа
           двойной точности.

Пример     g4double( 5,5, &value );
           g4picture( "######.###" );
           g4read();

                                -117-

g4field

Использование    void g4field( int row, int column,
                           long field_ref )

Категория  Функция инициализации.

Описание   Определяет область ввода для чтения поля базы данных.

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         field_ref     Номер  указателя   поля  базы  данных,  который
                       соответствует вводимому полю.

Пример     g4field( ++r, c, f4ref( "last_name" );
           g4read();

                                -118-

g4int

Использование    void g4int( int row, int column,
                           int * int_ptr )

Категория  Функция инициализации.

Описание   Определяет  область  ввода  для  чтения  целого  числа.  По
           умолчанию, формат  области ввода  будет иметь длину, равную
           четырем.

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         int_ptr       Указатель  на   целое  число  которое  начально
                       показывается в  области ввода.  Это целое число
                       будет заменено на окончательный результат.

Пример     g4int( r,c, &i_value );
           g4picture( "######" ); /* Change the format */
           g4read();

                                -119-

g4logical

Использование    void g4logical( int row, int column,
                           int * logical_ptr )

Категория  Функция инициализации.

Описание   Определяет область  ввода  для  чтения  символа  логической
           величины: 'T','t','F','f','Y','y','N' или 'n'.

           Логическая величина  хранится как  целое  число,  где  ноль
           соответствует 'FALSE' (ложь)('F','f','N','n'), а не-нулевая
           представляет 'TRUE' (истина) ('T','t','Y','y').

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         logical_ptr   Указатель на логическую величину представленную
                       как  целое   число.  Данная  величина  начально
                       показывается в  области ввода.  Это целое число
                       будет заменено на окончательный результат.

Подсказка  Единственными  верными   символами  шаблона  которые  могут
           использоваться с  функцией  'g4logical'  являются  'L'-  по
           умолчанию и 'Y'.

           Для   получения    результирующего   логического   символа,
           используйте функцию 'g4' с соответствующим шаблоном.

                                -120-

g4long

Использование    void g4long( int row, int column,
                           int * long_ptr )

Категория  Функция инициализации.

Описание   Определяет область  ввода для чтения длинного целого числа.
           По умолчанию,  формат  области  ввода  будет  иметь  длину,
           равную восьми.

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         long_ptr      Указатель  на   длинное  целое   число  которое
                       начально  показывается  в  области  ввода.  Это
                       длинное   целое   число   будет   заменено   на
                       окончательный результат.



Пример     #include 

           long val=0L; /* Default Value */

           main(){
              w4init(); /* Create a default window. */
              w4clear(-1);

              w4( 2,2, "Enter Long Integer : " );
              g4long( w4row(), w4col(), &val );
              g4read();

              w4( w4row()+1,2, "The Value is :" );
              w4long( w4row(), w4col(), val, 8);

              w4exit(0);
           }

                                -121-

g4menu

Использование    int g4menu( GET * get_ptr,
                           char * buffer, int window_ref )

Описание   Если функция  'g4menu' определена  как функция  вызова  для
           области ввода,  то меню используется для ввода информации в
           область  ввода.  Единственными  возможностями  ввода  будут
           текстовые описания различных пунктов меню.

           Функция 'g4menu'  не вызывается непосредственно (напрямую).
           Она используется как параметр для функции 'g4call':

           g4call( g4menu, window_ref );

           Параметр 'window_ref'  представляет собой  номер  указателя
           окна, соответствующего меню.

           Функция 'g4menu' используется следующим образом.

           1. Активируется  меню при  помощи  функции  'n4activate'  и
           номера указателя  окна 'window_ref',  который был  сохранен
           функцией 'g4call'.

           2. Передается текст из выбранного пункта меню во внутренний
           буфер 'buffer'  Code Base.  Функция 'g4menu'  знает  формат
           буфера, на  основании информации  в структуре,  на  которую
           указывает переданая ссылка 'get_ptr'.

См. также  Для того,  чтобы узнать,  как  можно  создать  меню  ввода,
           обратитель к функциям меню и 'n4get_calc'.

Возврат    Существуют некоторые  клавишные  символы:  SHIFT_TAB,  TAB,
           CTRL_HOME, ESC  и CTRL_C  которуе обычно заставляют функцию
           'g4read'   осуществить переход  между областями  ввода  или
           вернуться. Если  эти клавиши нажимаются во время нахождения
           в  меню   ввода,  функция   'n4activate'   возвращает   эту
           информацию  функции   'g4read'.  Затем   функция   'g4menu'
           распознает эти  символы  как  команды  функции  'g4read'  и
           передает  их,   не  выполняя  никаких  других  действий.  В
           противном  случае,   выбираются  данные   ввода  и  функция
           'g4menu' возвращает RETURN для сообщении функции 'g4read' о
           перемещении к следующей зоне ввода.

                                -122-

g4menu_help

Использование    int g4menu_help( GET * get_ptr,
                           char * buffer, int window_ref )

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

           Особенность, 'g4menu_help'  читает все данные с клавиатуры,
           ожидаю  нажатия  функциональной  клавиши  F1.  Если  нажата
           клавиша F1, функция 'g4menu_help' вызывает функцию 'g4menu'
           таким образом, что данные могут вводится при помощи меню. В
           противном   случае,    даннве   введенные    с   клавиатуры
           возвращаются  функции   'g4read'  таким  образом,  что  они
           используются далее как обычно.

См. также  'g4message_do'

                                -123-

g4message

Использование    void g4message( (char *) message )

Категория  Пост-модификатор.

Описание   Определяет  сообщение,   соответствующее   области   ввода,
           которая только что была создана.

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

См. также  'g4messge_do'

                                -124-

g4message_do

Использование    void g4message_do( (char *) message )

Описание   Функция  вызывается  функцией  'g4read'  для  показа  строк
           сообщений, определенных функцией 'g4message'.

           Функция 'g4message_do'  немедленно выводит  строку текста в
           абсолютных  координатах   дисплея,   которые   определяются
           внутренними целыми  переменными 'v4get_row'  и 'v4get_col'.
           По умолчанию  эти переменные  равны '(int)24'  и  '(int)0',
           соответственно. Если  длина строки  меньше длины  экрана, в
           нее  добавляются   дополнительные  символы  пробелов.  Если
           указатель  'message'  равен  '(char  *)0',  ряд  начиная  с
           позиции 'v4get_col', будет заполнен пробелами.

Параметры

         'message' указатель на строку сообщения.


                                -125-

g4numeric

Использование    void g4numeric( int row, int column,
                           char * num_str )

Категория  Функция инициализации.

Описание   Определяет область ввода для чтения числа в виде строка.

           Длина числа  и число десятичных знаков обределены величиной
           по умолчанию или шаблоном ввода.

Параметры

         Наименование  Использование

         row           Строка области ввода.

         column        Столбец области ввода.

         num_str       Указатель   на    строку    которая    начально
                       показывается в  области ввода. Эта строка будет
                       заменена на окончательный результат.

                                -126-

g4picture

Использование    void g4picture( char * picture )

Категория  Пост-модификатор.

Описание   Функция 'g4picture'  определяет шаблон  ввода  для  области
           ввода определенной  доетого  вункцией  инициализации.  Этот
           шаблон  ввода   определяет  какие  символы  ввода  являются
           допустимыми для какой позиции ввода.

Параметры

         Символы в строке 'picture' имеют специальные значения:

         Символ        Значение

         !             Преобразовывает в верхний регистр.

         9             0-9

         #             +,-,<пробел>, илит 0-9

         A             Только буквы ( A-Z или a-z)

         L             y,Y,n,N,t,T,f или F; преобразует в T и F

         N             Только цифры или буквы.

         X             Любой символ.

         Y             Только y,Y,n или N; преобразует в Y и N

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

           Ввод даты требует применения других символов.

         Символ        Значение

         C             Вторая цифра века.

         CC            Первые две цифры века.

         YY            Первые две цифры года.

         DD            Числовое представление дня.

         MM            Числовое представление месяца.

         MMM до

         MMMMMMMMM     Символьное представление месяца.

                                -127-

Пример     /* Get a Telephone Number */
           п4( 8,10, telephone_string );
           g4picture( "999-999-9999" );

           /* Get a Date */
           g4( 9,10, date_value );
           g4oicture( "MM/DD/CCYY"); /* Ex. 01/30/1989 */
           g4read();

                                -128-

g4read

Использование    int g4read()

Описание   Функция   'g4read'       осуществляет    взаимодействие   с
           пользователем   с    целью   ввода   данных,   при   помощи
           предварительного определения  областей ввода.  Эти  области
           ввода должны быть до этого определены для выбранного окна.

           Пользователь   может   нажимать   следующие   клавиши   для
           выполнения определенных акций:

         Клавиша       Действие

          или

                  Передвижение к  следующей области  ввода.  Если
                       следующей нет то чтение завершается.

            Прередвижение к  предыдущей области ввода, если
                       она существует.

         <Левая

         стрелка>      Передвигает курсор на одну позицию влево.

         <Правая

         стрелка>      Передвигает курсор на одну позицию вправо.

                  Пререключение  режимов   вставки  и  замены.  В
                       режиме вставки размер курсора несколько больше.

                  Стирает символ под курсором.

           Стирает символ влево от курсора.

                  Экстренно зовершает  чтение.  Функция  'g4read'
                       немедленно возвращается.

                 Перемещает  курсор  в  первую  позицию  текущей
                       области ввода.

                  Перемещает курсор в конец введенной информации.

            Перемещает курсор к первой области ввода.

             Перемещение курсора к последней области ввода.

         

         

         

         

                                -129-

           Все эти  клавиши завершают  выполнение  чтения,
                       если функция проверки для текущей области ввода
                       возвращает ненулевое значение.

Возврат    Код  нажатого   управляющего  символа   вызывает  выход  из
           экранного   редактора.   Если   радактирование   окончилось
           вследствие  введения   максимального   количества   данных.
           Возвращается код '(int)13' (символ возврата каретки).

Подсказка  В зависимости от символа выхода, прикладная программа может
           выполнять различные действия.

                                -130-

g4release

Использование    void g4release( int do_release )

Описание   Функция 'g4release'  устанавливает может  ли 'g4read'  быть
           вызвана несколько  раз в строке. По умолчанию, после вызова
           функции  'g4read',  вся  информация  чтения  освобождается.
           Однако, эта установка по умолчанию может быль изменена.

Параметры  Если 'do_release'  истина (не  ноль),  вся  сохраненная  до
           этого информация  чтения  немедленно  освобождается.  Кроме
           того, функция  'g4read' освободит  информацию чтения  перед
           тем как возвратится.

           В противном  случае, если  величина параметра  'do_release'
           ложь (ноль),  подпрограмма 'g4read' не освободит информацию
           чтения перед тем, как возвратится.

Пример     d4learn_append(){
           int row, i, rc;

              if( d4use( "d4learn.dbf" ) <0) return(-1);

              row=5;

           /* Set 'get' information */
           for( i=1; i <= f4num_fields(); i++)
              g4field( row++; 20, f4j_ref(i) );

              g4release( 0 ); /* Do not Release */

           /* Append until  (27) is pressad */
              while( g4read() != 27 )
                   d4write( 0L );

           /* Release the 'get' information */
              g4release( 1 );

              return(0);
           }

                                -131-

g4upper

Использование    void g4upper()

Категория  Пост-модификатор.

Описание   Все   символы,    определенной   области    ввода,    будут
           преобразованы в верхний регистр.


g4valid

Использование    void g4valid( (*routine)() )

Категория  Пост-модификатор.

Описание   Определяет   функцию    оценки   для   предыдущей   функции
           инициализации чтения.  Функция  'g4read'  вызывает  функцию
           оценки (проверки) после того как информация будет введена в
           область  ввода.  Функции  оценки  передается  указатель  на
           структуру GET области ввода.

           Если функция  оценки возвращает  '(int)0', то  это означает
           возможность введенной  величины.  Если  она  возвращает  не
           нулевую  величину,  функция  'g4read'  остается  в  той  же
           области  ввода.  Именно  функция  оценки  (проверки)  несет
           ответственность  за   показ  на   экране   соответствующего
           сообщения об ошибке.

Подсказка  Вам следует изучить примеры в файле 'w4example.c'.

Внимание!  Не  вызывайте  функций  инициализации  непосредственно  или
           косвенно из  функции проверки.  Это может привести к потере
           параметров функцией проверки.

                                -132-

Пример     #include 

           int check_entry( get_ptr )
           GET *get_ptr
           {
           int *result_ptr;

              result_ptr= (int *)get_ptr->data;

              if( *result_ptr != -1 && *result_ptr != 1 ){
                   w4( 0,0, "Enter -1 or 1 (Press a key)" );
                   g4char();
                   w4repeat( 0,0, (int)' ', 80);
                   return -1; /* Not Valid */
              }
              return(1); /* Valid */
           }

           void valid_test(){
           int i_data;

              i_data=1;

              g4int( 10,10, &i_data );
              g4valid check_entry );
              g4read();

              w4( 12,10, "The result is:" );
              w4int( 12, w4col(), i_data );
           }

                                -133-

g4width

Использование    void g4width( int width_str,
                           int width_screen )

Категория  Пост-модификатор.

Описание   Функция 'g4width'  явно  определяет  размер  данных  (длину
           строки) и размер (длину) области ввода.

           Когда вводятся  символьные данные, в том случае если размер
           данных превышает  размер области  ввода,  то  за  один  раз
           показывается только  часть строки.  (При вводе строка будет
           скроллироваться.)

Параметры

         Наименование  Использование

         width_str     Эта величина  определяет количество  символов в
                       строке  определенной   функцией   инициализации
                       чтения 'g4'.

                       Длина   данных    фиксированна   для    функций
                       'g4double', 'g4numeric',  и  'g4long'.  В  этих
                       случаях, величина  параметра 'width_str' должна
                       быть равна '(int)0'.

         width_screen  Этот  параметр  соответствует  размеру  (длине)
                       области ввода, определенной предыдущей функцией
                       инициализации чтения.

                                -134-

Функции управления памятью

Этот модуль  обеспечивает управление  памятью  в  Code  Base  для  баз
данных, индексных  файлов, блоков,  окон, меню  и размещения  в памяти
структур.  Лимит   открытых  баз   данных  и   индексных  файлов,  при
использовании управления  памяти Code Base, не зависит от используемых
функций  и   определяется  только  доступной  памятью.  В  дополнение,
небольшие блоки  могут  быть  размещены  и  освобождены  с  небольшими
накладными расходами.

Два первых  целых числа  в блоке  размещенной памяти резервируются как
указатели.  Эти  указатели  используются  в  дальнейшем  для  создания
двусвязного списка блоков памяти.

                                -135-

h4add

Использование    int h4add( char ** ptr_ref_prt, int mem_ref,
                           int add_ref,
                           int add_before );

Описание   Функция 'h4add'  добавляет в  двусвязный список размещенный
           блок памяти. Этот блок не должен быть перед этим в списке.

Параметры

         Наименование  Применение

         ptr_ref_ptr   Указатель на  указатель базы  памяти. Это то же
                       значение, которое  первоначально  передается  в
                       функцию 'h4create'.

         mem_ref       Целое число, служащее ссылкой на блок памяти.

         add_ref       Число, служащее ссылкой на блок памяти, который
                       который  будет  вставлен  в  двусвязный  список
                       перед или после 'mem_ref'.

         add_before    Имеет значение  '(int)1'  (истина),  если  блок
                       памяти перед  'mem_ref' и '(int)0' (ложь) когда
                       блок  памяти   вставляется   в   список   после
                       'mem_ref'.

Возврат    Значение, которое было в параметре 'add_ref'

См. также  'h4remove'

                                -136-

h4alloc

Использование    char * h4alloc( (unsigned int) num_bytes )

Описание   'h4alloc'  размещает   'num_bytes'  памяти   и   возвращает
           указатель на  размещенную  память.  Вся  вновь  размещенная
           память инициируется в ноль.

Возврат    Обычно, если нет доступной памяти, функция 'u4error' выдает
           сообщение об  ошибке и  заканчивает программу. Однако, если
           'u4error' модифицированна  так, что не осуществляет выхода,
           то 'h4alloc'  при отсутствии  свободной  памяти  возвращает
           значение '(char *)0'.

                                -137-

h4create

Использование    int n4create( char **ptr_ref_ref,
                           int units, int size, int expand_units )

Описание   Функция 'h4create'  инициализирует  структуру  используемое
           Code Base как канал памяти (memory handler).

Параметры

         Наименование  Применение

         ptr_ref_ptr   Указатель  на   указатель   базы   памяти   для
                       структуры памяти.

         unit          Количество блоков для начального размещения.

         size          Чмсло байт в структуре памяти.

         expand_unit   Число блоков для размещения структуры когда нет
                       свободных блоков.

Возврат    Значение '(int)-1' сигнализирует, что запрошенная память не
           доступна.  Эта   ошибка  возникает   если,  только  функция
           'u4error'  изменяет  и  не  осуществляет  выход  по  ошибке
           отсутствия свободной памяти.

                                -138-

h4free

Использование    int h4free( char **ptr_ref_ptr, int mem_ref )

Описание   Возвращает блок памяти в область свободной памяти.

Параметры

         Наименование  Применение

         ptr_ref_ptr   Указатель на  указатель базы  памяти. Это то же
                       значение,  которое   первоначально   передается
                       функции 'h4create'.

         mem_ref       Целое число  - ссылка  на освобождаемую память.
                       Это тоже число, что возвращает функция 'h4get'.

Возврат    Целую ссылку  на предыдущий  блок памяти.  Если  предыдущий
           блок не  существует, возвращается ссылка на следующий блок.
           Если нет  следующего блока  памяти, то возвращается '(int)-
           1'.

                                -139-

h4free_chain

Использование    void h4free_chain( char **ptr_ref_ptr,
                           int mem_ref )

Описание   'h4free_chain' обращается  несколько раз к функции 'h4free'
           для освобождения  всего списка  памяти.  Следующая  функция
           может быть использована как пример функции 'h4free_chain'.

Пример     /* Source for 'h4free_chain */

           void h4free_chain( char **ptr_ref_ptr,
                   int mem_ref ){
              while( mem_ref >= 0)
                   mem_ref = h4free( ptr_ref_ptr, mem_ref );
           }

h4free_memory

Использование    void h4free_memory( void * ptr )

Описание   Эта функция работает полностью как библиотечная 'free'. Она
           необходима,  т.к.  'free'  не  доступна  в  текущей  версии
           Microsoft Windows.

                                -140-

h4get

Использование    int h4get( char **ptr_ref_ptr, int mem_ref )

Описание   Размещает блок памяти.

Параметры

         Наименование  Применение

         ptr_ref_ptr   Указатель на  указатель базы  памяти. Это  тоже
                       значение  которое  первоначально  передается  в
                       функцию 'h4create'.

         mem_ref       Размещаемый блок  памяти помещается в связанный
                       двойной список  сразу за  блоком имеющим  номер
                       ссылки 'mem_ref'.  Если 'mem_ref' равна '(int)-
                       1',  то   создается  новый  двусвязный  список.
                       Иначе, 'mem_ref'  должна иметь  значение, ранее
                       выданное функцией 'h4get'.

Возврат    Целочисленый номер  ссылки на размещенный блок памяти. Этот
           номер может быть 0 или больше.

           Возвращение   значения    '(int)-1'   означает   отсутствие
           доступной  памяти.   Эта  ошибка  возникает,  если  функция
           'u4error'  была   изменена  так,   что  возвращает   ошибку
           отсутствия свободной памяти.

                                -141-

h4remove

Использование    int h4remove( char **ptr_ref_ptr,
                            int mem_ref )

Описание   Функция 'h4remove'  удаляет блок  памяти из цепочки списка,
           но не освобождает его.

           Этой функцией  нужно  использовать  вместе  с  'h4add'  для
           перемещения блоков  памяти из  одного списка  в другой. Она
           может  применятся   дла  изменения   порядка  элементов   в
           связанном списке.

Параметры

         Наименование  Прменение

         ptr_ref_ptr   Указатель на  указатель  базы  памяти.  Это  же
                       значение  первоначально  передается  в  функцию
                       'h4create'.

         mem_ref       Целочисленная ссылка на блок памяти.

Возврат    Как функция  'h4free', возвращает ссылку на предыдущий блок
           памяти. Если он не существует, то возвращается целочисленая
           ссылка на следующий блок. Если нет следующего блока памяти,
           то функция возвращает '(int)-1'.

                                -142-

Пример работы с памятью

           void mem_test(){
           struct test{
              int next prev;
              char name[20];
              char city[25];
           } *test_ptr;

           int chain_one, chain_two;

              h4create( (char **)&test_ptr, 10,
                   sizeof( struct test), 5);

              /* Allocate a chunk for 'chain_one' */
              chain_one=h4get( &test_ptr, -1 );

              /* Allocate another chunk for 'chain_one' */
              chain_one=h4get( &test_ptr, chain_one );

              /* Assign some data */
              strcpy( test_ptr[chain_one].name, "JACKSON" );
              strcpy( test_ptr[chain_one].city, "LONDON" );

              /* Allocate a chunk for 'chain_two' */
              chain_two=h4get( &test_ptr, -1 );

              /* Free the most recently allocated chank of 'chain_one'
           */
              chain_one = h4free( &test_ptr, chain_one );

           }

                                -143-

Функции работы с индексными файлами

Индексные файлы  используются для  быстрого и  эффективного доступа  в
отсортированной последовательности к файлам баз данных. Индексный файл
содержит ключевую  запись  и  номер  соответствующей  записи.  Ключ  в
индексном файле соответствует выражению dBASE, которое указывается при
создании индексного файла.

Все функции  данного раздела  используют 'index_ref' как параметр. Это
номер ссылки  индексного  файла,  который  используется  для  указания
индексного файла.

Многое из  функций работы  с  индексами  используются  непосредственно
функциями  работы   с  базой.   Однако,  функции  'i4open'  'i4close',
'i4index',  'i4reindex',   'i4select',   и   'i4unlock'   используются
непосредственно.

Для  каждого   индексного  файла   существует  внутренний   указатель,
установленный на  текущую комбинацию  ключ/номер  записи  в  индексном
файле. Структура,  содержащая эту  комбинацию  ключ/номер  может  быть
доступна обращением  к  функции  'b4key'.  Этот  внутренний  указатель
управляется функциями  'i4top', 'i4bottom',  'i4go' и  'i4seek'. Кроме
того,  'i4skip'  передвигает  внутренний  указатель  относительно  его
текущего положения.

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

Подсказка:

Следующие функции  обычно не  требуются  для  программистов  создающих
прикладные системы: 'i4add', 'i4bottom', 'i4go', 'i4remove', 'i4seek',
'i4skip', 'i4top', и 'i4type'. Они вызываются функциями более высокого
уровня.

                               -144-

i4add

Использование    int i4add( int index_ref, char *key_ptr,
                           long rec_num)

Описание   Добавляет ключ  и соответствующий  номер записи в индексный
           файл.

Параметры

         Наименование  Применение

         index_ref     Номер ссылающийся на индексный файл.

         key_ptr       Добавляемый ключ

         rec_num       Номер записи соответствующий ключу.

Возврат

         Величина      Значение

         0             Успех

         1             Ключ уже  существует, а  индексный файл  должен
                       иметь уникальные ключи. (см. 'i4index')

         2             Номер записи  уже существует. Заметьте, 'i4add'
                       не всегда определяет дублирование номеров.

         3             Содержимое  отфильтровано  функцией  фильтровки
                       индекса. Ключ не будет добавлен.

         -1            Ошибка

         -2            Индексный файл  блокирован другим пользователем
                       и стоит ключ 'вернутся немедленно'.

См. также  'i4index', 'i4filter'

Блокировка Если индексный файл разблокирован, он блокируется.

                                -145-

i4bottom

Использование    int i4bottom( int index_ref )

Описание   Перемещает  внутренний   указатель  индексного   файла   на
           последнюю позицию.

Возврат

         Величина      Значение

         0             Успех

         3             Конец файла.  ( Возникает  при пустом индексном
                       файле ).

         -1            Ошибка

         -2            Индексный файл  блокирован другим пользователем
                       и стоит ключ 'вернутся немедленно'.

Блокировка Если индексный файл разблокирован, он блокируется.

                               -146-

i4check

Использование    long i4check( int index_ref )

Описание   Проверяет правильность  индексного файла.  Применяется  как
           средство отладки.

           Иногда, при  корректировке  базы  данных,  открыты  не  все
           индексные  файлы.  Соответственно,  не  открутые  индексные
           файлы становятся  устаревшими. Функция  'i4check' позволяет
           проконтролировать эту ситуацию.

Возврат

         Величина      Значение

         0             Успех, индексный файл правильный.

         >0            Нет ключей для такого числа записей.

         -1            Ошибка

         -2            Боза данных или индекс уже блокированы.

         -3            Запись на  которую ссулается  индексный файл не
                       существует.

         -4            Две ссылки индексного файла на одны запись

         -5            Ключ индекса определенной записи устарел.

         -6            Ключи  в   индексном  файле   в   беспорядочной
                       последовательности.

         -7            'i4check' работает только с базами менее 512000
                       записей. Иначе,  не хватает памяти для проверки
                       индексного файла.

Блокировка Индексный файл и соответствующая база данных блокируется.

Пример     #include 

           main(){
              d4use("tst_base");
              i4open( "index_a");
              i4open( "index_b");

              if( i4check(-1) == 0 )
                   printf( "Index_a and index_b are correct.");
              else
                   printf("index_a and index_b are INCORRECT.");

              exit(0);
           }

                                -147-

i4close

Использование    int i4close( int index_ref )

Описание   Закрывает указанный индексный файл.

Возврат

         Величина      Значение

         0             Успех.

         -1            Ошибка

Пример     #include 

           main(){
           int temp_ref;

              d4use( "PEOPLE");
              temp_ref=i4index("TEMP", "AGE", 0,0 );

              x4list();
              i4close(temp_ref);
              .
              .
           }

                                -148-

i4eval

Использование    char * i4eval( int index_ref )

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

           При использовании  опции CLIPPER,  результат  форматируется
           как символьная  строка. Для dBASE - результат форматируется
           по-разному, в зависимости от типа индексного выражения:

         Тип выражения Формат результата

         Символьный    Символьная строка

         Дата          Число  с   плавающей   точкой   соответствующее
                       Юлианской дате.

         Число         Число с плавающей точкой

         Логическое    Логическое выражение не используется в качестве
                       ключа сортировки

Возврат    Возвращает  указатель   на  результат.   В  случае   ошибки
           возвращает указатель на ноль.

                                -149-

i4filter

Использование    void i4filter( int (*filter_routine)() )

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

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

         Возвращаемая

         фильтром

         величина      Значение

         1             Запись отфильтровывается.

         0             Запись используется.

         -1            Ошибка.

Подсказка: Использование фильтров  индексов  может  быть  черезвычайно
           эфективным     способом      позволяющим     манипулировать
           отсортированным подмножеством базы данных.

           Для  достижения  эфекта,  функция  фильтра  задается  путем
           вызова 'i4filter' после открытия индексного файла.

Пример     #include 

           main(){

              d4use( "client" );

           /* Filter Deleted Record */
              i4open("name");
              i4filter( d4deleted );

              i4open( "company" );
              i4filter( d4deleted );

           /* to turn off the filter, pass a null routine. Make shure
            has been included so thet the prptotype is
           defined7 Otherwise, the zero parameter is interpreted as an
           integer. */

              i4filter(0);

                                -150-

i4free

Использование    int i4free( int index_ref )

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

Подсказка: Если вы  не собираетесь  в  дальнейшем  испльзовать  данный
           индексный файл, лучше вызвать функцию 'i4free'.

Возврат

         Величина      Значение

         0             Успех.

         -1            Ошибка.

                                -151-

i4go

Использование    int i4go( int index_ref, char *key_ptr,
                           long record_number )

Описание   Устанавливает  внутренний  указатель  индексного  файла  на
           указанную комбинацию  ключ - номер записи.

Параметры

         Наименование  Применение

         index_ref     Ссылочный номер индексного файла.

         key_ptr       Указатель на значение ключа.

         record_number Номер записи, соответствующий ключу.

Возврат

         Величина      Значение

         0             Успех.

         1             Ключ  найден,   а  номер   записи  не   найден.
                       Внутренний указатель  будет указывать  на ключ,
                       расположенный сразу после указанного.

         2             Ключ  не  найден.  Внутренний  указатель  будет
                       указывать на  ключ  расположенный  сразу  после
                       указанного.

         3             Ключ  не   найден  и   достигнут  конец  файла.
                       Внутренний указатель  будет указывать  на конец
                       файла.

         4             Ключ найден,  но достигнут  конец файла прежде,
                       чем был найден требуемый номер записи.

         -1            Ошибка.

         -2            Индексный файл  блокирован другим пользователем
                       и выставлен флаг 'вернуться немедленно'.

Блокировка Индексный файл блокируется.

Подсказка: Функция полезна  для поиска  определенного номера  записи в
           базе  данных   и,   затем,   переходу   к   следующей,   по
           отсортированному порядку.

                                -152-

i4index

Использование    int i4index( char *name, char *expr,
                           int unique, int safety )

Описание   Создается,  открывается   и  выбирается  рабочим  указанный
           индексный файл.  Этот файл  создается для  текущей  рабочей
           базы данных.  Если параметр  'safety' установлен  в 'лож' и
           файл уже  открыт, то он закрывается, удаляется, и создается
           заново в соответствие с указанными параметрами.

           Если  расширение  не  указано,  то  добавляется  расширение
           '.NDX' к имени индексного файла.

Параметры

         Наименование  Применение

         name          Имя нового индексного файла

         expr          Выражение в  форме dBASE  определяющее  порядок
                       сортировки. См. приложение по выражениям.

         unique        Указывает  должен   ли  быть   каждый  ключ   в
                       индексном файле уникальным

                       1-Уникальные; иначе не уникальные.

         safety        Указывает   должен    ли   быть    удален   уже
                       существующий индексный файл.

                       1- Не удалять существующий. Вернуть ошибку если
                       такой файл существует.

                       0- Удалить файл с таким же именем.

Возврат

         Величина      Значение

         >=0           Ссылочный номер индексного файла.

         -1            Ошибка

         -2            Индексный файл  блокирован другим пользователем
                       и установлен флаг 'вернуться немедленно'.

Блокировка Индексный файл не блокируется.

                                -153-

Пример     #include 

           static FIELD fields[]=
           {
           /* Field Name,   Type,   Width,  Dec,    Offset */
              {"cust_no",   'N',    6   ,   0  ,    0},
              {"f_name",    'C',    15   ,  0  ,    0},
              {"l_name",    'C',    15   ,  0  ,    0},
              {"purchased", 'D',    8   ,   0  ,    0},
              {"amount",    'N',    12   ,  2  ,    0},
           };

           main(){
           /* Create the database */
              d4create( "name", 6, fields, 1);

           /* Create the index files */
              i4index( "cust_no", "cust_no", 1,0 );
              i4index( "name", "l_name + f_name", 0,0);
              i4index( "purchas", "ctos(purchased)+l_name",
                   0,0);

              d4close_all();
              exit(0);

           }

                                -154-

i4index_filter

Использование    int i4index_filter( char *name, char *expr
                           int unique, int safety,
                           int (*filter_routine)(void) )

Описание   'i4index_filter' аналогична 'i4index_filter' за исключением
           одного входного  параметра: 'filter_routine'. Этот параметр
           позволяет вам  задать функцию  фильтрации индексного  файла
           которая будет использоваться в процессе создания индексного
           файла. Функция  фильтрации  аналогична  функции  фильтрации
           задаваемой функцией 'i4filter'.

Подсказка: При индексации,  отношения баз  данных не  выполняются. Это
           позволяет достигнуть  большой скорости и малого размера EXE
           файла. Однако,  возможно включить  связь (отношение) файлов
           задав  функцию   'x4relate_do'   как   функцию   фильтрации
           индексного файла.

           Функции  связанные   с  индексами  будут  вызывать  функцию
           фильтрации 'x4relate_do' перед вычислением выражения ключа.
           Это приведет к тому, что связанная база будет автоматически
           позиционироваться  к  нужным  записям.  В  этом  случае,  в
           действительности фукнция фильтрации будет отсутствовать.

           Пример:

           /* CON_FLD is a field of the database being indexed.
           REF_BASE is the related database */

           i4index_filter( "CONTROL",
              "CON_FLD+REL_BASE->FLD,
              1,1, x4relate_do );

См. также  'i4index', 'i4filter'.

Пример 1   #include 

           /* Filter all deleted records. */

           void create_index(){
              i4index_filter( "i_name", "fld_name", 1,1,
                   d4deleted );
           }

Пример 2   /* This produces the same rusult as in Example 1 exept thet
           it is at least twice as slow. */

           void create_index2(){
           int ref;

              ref=i4index("i_name", "fld_name", 1,1 );
              i4filter( d4deleted );
              i4reindex( ref );
           }

                                -155-

i4key

Использование    KEY *i4key( int index_ref )

Описание   Возвращает  указатель   на  текущий   ключ  текущего  блока
           указанного индексного  файла. Структура  'KEY' определена в
           файле заголовка 'd4base.h' следующим образом:

           typedef struct{
              long file_block;
              long rec_num;
              char value[512-3*sizeof(long) ];
           } KEY;

           Член структуры  'rec_num' представляет  собой текущий номер
           записи, а член структуры 'value' представляет собой тукущее
           значение ключа.  Для символьных  ключей, это  всегда ASCII.
           Для числовых  и ключей  даты  формат зависит от того, какой
           индексный файл - Clipper .NTX или dBASE .NDX.

           Число  байтов,   занятое  под  значение  ключа  зависит  от
           выражения ключа индексного файла.

Внимание   Использование   этой   функции   может   привести   к   не-
           совместимости с будущими версиями Code Base.

Возврат    Если  возвращается   '(KEY  *)0',  это  означает,  что  нет
           текущего ключа.

                                -156-

i4lock

Использование    int i4lock( int index_ref, int do_wait )

Описание   Если файл уже заблокирован, значение успех (0) возвращается
           немедленно. Иначе,  делается попытка  блокировать индексный
           файл. Если  переменная 'do_wait'  равна FALSE  (0), и  файл
           блокирован другим  пользователем,  возвращается  '(int)-2'.
           Однако, если  параметр 'do_wait' имеет значение 'TRUE' (1),
           функция 'i4lock'  делает попытки  заблокировать файл  (один
           раз в секунду) пока не достигнет успеха.

Возврат

         Величина      Значение

         0             Успех.

         -1            Ошибка.

         -2            Блокирован другим пользователем.

Пример     #include 
           #include 

           main(){
           int i_ref;

              d4init();
              w4clear(-1);

              d4use( "base" );
              i_ref=i4open( "base" );

              if( d4lock( -1l, 0) ==0)
                   if( i4lock( i_ref, 0 )==0){
                        x4list();
                        w4exit(0);
                   }
              w4display("Files were already locked." );
              w4exit(1);
           }

                                -157-

i4open

Использование    int i4open( char * file_name )

Описание   'i4open'   открывает и  выбирает  индексный  файл  рабочим.
           Соответствующая база данных должна быть выбрана тоже.

Возврат

         Величина      Значение

         >=0           Номер  индексного   файла,  который   будет   в
                       дальнейшем использоваться  в качестве ссылки на
                       данный индексный файл.

         -1            Ошибка.

Пример     #include 

           /* Declare externaly so they can be accessed from other
           source files. */

           int student_ref, st_name_ref;
           int prof_ref, pr_name_ref, pr_class_ref;

           main(){
              student_ref=d4use("student");
              st_name_ref=i4open("st_name");

              prof_ref=d4use("professo");
              pr_name_ref=i4open("pr_name");
              pr_class_ref=i4open("pr_class");

              do_work();

              exit(0);
           }

                                -158-

i4ref

Использование    int i4ref( char * name )

Описание   Функция 'i4ref'  возвращает ссылочный  номер предварительно
           открытого индексного  файла.  Это  тот  же  номер,  который
           возвращается при открытии индексного файла.

           Если имя  файла  указано  без  расширения,  то  добавляется
           расширение '.NDX' ( .NTX для Clipper).

Возвращает

         Величина      Значение

         >=0           Ссылочный номер индексного файла.

         -1            Ошибка; индексный файл не открылся.

Пример     #include 

           int select_index( char *file_name ){
           int i_ref;

              i_ref=i4ref( file_name );
              i4select( i_ref );
              return( i_ref );
           }

                                -159-

i4reindex

Использование    int i4reindex( int index_ref )

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

           После вызова  'i4reindex', буфер  записи становится пустым.
           Следовалельно, необходимо  вызвать функцию  Code Base  типа
           'd4top' для позиционирования на необходимую запись.

Возврат

         Величина      Значение

         0             Успех

         -1            Ошибка

         -2            База  или   один   из   индексных   файлов   не
                       блокируется.

См. также  'i4filter', 'd4lock_wait'.

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

Замечание

Пример     #include 

           main(){
              d4use( "parts" );
              i4open( "part_no" );

              i4reindex( -1 );

              d4close_all();
              exit(0);
           }

                                -160-

i4remove

Использование    int i4remove( int index_ref, char *key_ptr,
                           long rec_num )

Описание   Функция 'i4remove'  удаляет комбинацию ключ/номер записи из
           индексного файла.

Параметры

         Наименование  Применение

         index_ref     Номер для ссылки на индексный файл.

         key_ptr       Значение ключа

         rec_num       Номер записи, соответствующий ключу.

Возврат

         Величина      Значение

         1             Ключ не  найден и, следовательно, не может быть
                       удален.

         0             Успех

         -1            Ошибка

         -2            Индексный файл блокирован другим пользователем,
                       и  выставлен   флаг   'вернуться   немедленно'.
                       (Смотри функция 'd4lock_wait'.

Блокировка Индексный файл блокинуется.

                                -161-

i4seek

Использование    int i4seek( int index_ref, void * key_ptr )

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

Параметры

         Наименование  Применение

         index_ref     Ссылочный номер индексного файла.

         key_ptr       Значение ключа.

Возврат    Функция  может  сделать  несколько  различных  возвращений,
           которые  указывают   на  результат   поиска.  Для   полного
           обьяснения  следующих   возвращаемых   значений,   смотрите
           функцию 'd4seek'.

         Величина      Значение

         0             Полное соответствие найдено.

         1             В соответствии найдено.

         2             Указатель на ключе после.

         3             Конец файла.

         -1            Ошибка

         -2            Индексный файл  блокирован другим пользователем
                       и вуставлен флаг 'вернуться немедленно'.

Блокировка Индексный файл блокируется.

См. также  'b4key'

                               -162-

i4seek_ref

Использование    int       i4seek_ref()

Описание   Возвращает  ссылочный   номер  индексного   файла,  который
           используется  функцией   'd4seek'.   Обычно   это   текущий
           индексный  файл.   Однако,  если  нет  текущего  выбранного
           индексного файла,  вместо него  будет использован последний
           открытый индексный  файл. Если  не было  открытых индексных
           файлов базы данных, возвращается '(int)-1'.

                                -163-

i4select

Использование    int i4select( int index_ref )

Описание   Функция  'i4select'  делает  текущим  (выбирает)  указанный
           индексный  файл.   Следовательно,   функции   базы   данных
           'd4seek',  'd4top',   и  'd4bottom',  используют  выбранный
           индексный файл для логического позиционирования внутреннего
           указателя. Если  'index_ref'  равна  '(int)-1',  выбирается
           последовательность записей  в котором  они храняться в базе
           данных.

Параметры

         Величина      Значение

         >=0           Номер предыдущего выбранного индексного файла.

         -1            Нет ранее выбранных индексных файлов. Ранее был
                       порядок, соответствующий номерам записей.

Блокировка Предидущий выбранный индексный файл разблокируется.

Пример     #include 

           main(){
              int type_ref, name_ref;

              d4use("planets");
              type_ref=i4open("p_type");
              name_ref=i4open("p_name");

              i4select( type_ref );
              .
              .
           }

                                -164-

i4skip

Использование    long i4skip( int index_ref, long n )

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

           Если нет  текущей позиции  (например  файл  разблокирован),
           передвижение идет  в логическом  порядке, начиная  с первой
           выбранного индексного файла.

           При передвижении  указателя от  начала или  конца файла, он
           передвигается   от    первой    или    последней    записи,
           соответственно.

Параметры

         Наименование  Применение

         index_ref     Ссылочный номер индекса.

         n             Количество записей для продвижения.

Возврат    Функция 'i4skip'  возвращает количество записей, на которое
           фактически  переместился  указатель.  Если  это  количество
           меньше чем  указанное  число  записей,  это  означает,  что
           достигнут конец или начало файла.

           При возникновении  ошибки  -  возвращается  значение  '-n'.
           Функция 'i4skip'  выполняется сразу и возвращает '(long)0',
           если запрошено  перемещение на ноль записей. Следовательно,
           при обращении  с нулевым  параметром, ошибка  возникнуть не
           может.

Блокировка Индексный файл блокируется.

                                -165-

i4top

Использование    int i4top( int index_ref )

Описание   Внутренний указатель  индексного  файла  устанавливается  в
           верхнее положение.

Возврат

         Величина      Значение

         0             Успех

         3             Конец файла (Индексный файл пуст)

         -1            Ошибка

         -2            Индексный файл  блокирован другим пользователем
                       и вуставлен флаг 'вернуться немедленно'.

Блокировка Индексный файл блокируется.

i4type

Использование    char i4type( int index_ref )

Описание   Возвращает тип  индексного файла (тип ключа индекса) в виде
           символа.

Возврат

         Величина      Значение

         C             Символьный тип

         D             Тип дата

         N             Числовой тип

Пример     if ( i4type( i_ref ) == 'C' ) do_true();

                                -166-

i4unlock

Использование    int i4unlock( (int) index_ref );

Описание   Если функции  передается параметр  'index_ref' со значением
           '(int)  -1',   то  все   индексные  файлы,  соответствующие
           выбранной базе данных, разблокируются. Иначе разблокируются
           только один файл с номером 'index_ref'.

Возвращает

         Величина      Значение

         0             Успех

         -1            Ошибка

Блокиравка

         Индексные файлы разблокируются, как описано выше.

i4unselect

Использование    void i4unselect()

Описание   Выбирается    последовательность    записей    в    порядке
           расположения их в файле базы данных.

Блокиравка

         Если индексный файл выбирается, то он разблокируется.

Возвращает

         Функция 'i4unselect()' всегда возвращает '(int) 0'.

                                -167-

Функции работы с полями памяти.

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

Code Base  имеет два набора функций для работы с полями памяти. Первый
набор функций,  как описано  в данном  разделе,  имеет  имена  функций
начинающиеся с 'm4'. Другой набор функций - с именами, начинающимися с
'm3'.Для обеспечения  совместимости файлов  памяти (memo) с dBASE III,
dBASE III Plus и Clipper используются функции именами, начинающимися с
'm3'. Напротив,  функции с  именами 'm4'  совместимы с  файлами памяти
(memo), применяющимися в dBASE IV.

С  точки   зрения  выполнения,   функции  обоих   наборов   идентичны.
Следовательно, документация  по функциям  'm4'  применима  к  функциям
'm3'. Однако,  функции для  dBASE IV  работают  более  разумно,  перед
перезаписью файла на диск всегда проверяют наличие доступного места на
диске.

Специальная функция  'm4convert' позволяет  производить преобразование
файлов памяти  из формата  dBASE III  в формат, используемый функциями
набора  'm4'.  Другая  функция  -  'm4renamed'  -  используется  после
переименования файла  памяти dBASE  IV. Однажды конвертированный, файл
памяти может  обрабатываться функциями набора 'm4', и для функций 'm3'
он больше  не доступен.  До  конвертирования  файл  памяти  необходимо
обрабатывать функциями 'm3', и он не может считываться функциями 'm4'.

Все файлы памяти блокируются автоматически.
Предупреждение:


Пользователи dBASE IV не должны создавать файлы памяти, имеющие размер
блоков отличный  от 512  байт. Это  потому, что dBASE IV имеет ошибки,
которые  немедленно  возникают  при  использовании  файлов  памяти,  с
размером блока больше 512, после переименования файлов командами ДОСа.
По этим  причинам,  помните,  что  функция  'd4create'  создает  файлы
памяти, с  размером блока,  используемым  по  умолчанию,  и,  поэтому,
необходимо сделать явное конвертирование файла функциями 'm4convert' и
'm4renamed' после переименования файла памяти.

                                -168-

m4check

Использование    (long *) m4check( (long) field_ref)

Описание   Функция  'm4check'  анализирует  содержимое  файла  памяти,
           чтобы определить,  как данные  были сохранены  в файле. Для
           понимания возвращаемого знечения, необходимо знать, что при
           освобождении  места   в  файле   памяти,  свободное   место
           помещается  в   список  свободного   места.  Затем,   когда
           требуется  добавочное  пространство  для  данных  в  файле,
           используется  освобожденное   ранее  место,  и,  после  его
           заполнения, пространство в конце файла.

           Вызовите функцию  'm4check' с  помощью 'd4learn'. Вероятно,
           нет необходимости обращаться к 'm4check' из ваших программ.

Возвращает Нулевой  указатель  показывает  существование  проблем  для
           файла памяти, определенного параметром 'field_ref'. Причины
           проблем   могут    быть   следующие:    неверный   параметр
           'field_ref', файл памяти несуществует, файл памяти испорчен
           или нет доступной памяти для проверки.

            Иначе возвращает указатель на массив из пяти целых длинных
           (long) чисел.  Каждое число указывает на определенный факт,
           соответственно:

         Номер числа   Означает

         0             Количество свободных  мест.  Это  число  должно
                       быть как можно меньшим.

         1             Общее количество  свободных блоков  (512 байт в
                       блоке). Может быть больше свободных блоков, чем
                       свободных мест,  так как каждое свободное место
                       может иметь один или несколько блоков.

         2             Количество  смежных  участков.  Это  количество
                       должно быть  маленьким, насколько это возможно,
                       и  лучше   иметь  один   большой  участок,  чем
                       несколько маленьких смежных участков.

         3             Количество потерянных блоков. Это участки файла
                       памяти, которые  не используются  и не учтены в
                       списке свободного места.

         4             Количество используемых блоков.

                                -169-

m4convert

Использование    int m4convert( char * file_name)

Описание   Функция  'm4convert'   помещает  в  файл  памяти  некоторую
           информацию, которая делает вазможным обработку файла памяти
           dBASE III функциями набора 'm4'. Она не испортит информацию
           в файле  при преобразовании файл памяти dBASE III или dBASE
           IV с размером блока отличным от 512.

Возвращает

         Величина      Значение

         0             Успех

         -1            Ошибка

Смотрите также           Функции работы с полями памяти.

                                -170-

m4edit

Использование    int m4edit( long field_ref, long rec_num,
                           char * editor_name, int max_size )

Описание   Данные из  файла памяти  копируются  во  временный  файл  и
           выполняется прграмма  редактирования с  именем этого  файла
           как параметр.  Затем, содержимое  файла копируются  назад в
           файл памяти.  Первые четыре  символа имени временного файла
           'MEMO' и  последнии четыре символа изменяются так, чтобы не
           было дублирования с существующими файлами.

           Таким образом,  любой редактор,  воспринимающий имя файла в
           командной  строке  может  применяться  для  изменения  поля
           памяти.

Параметры

         Наименование  Применение

         field_ref     Определяет файл памяти.

         rec_num       Номер записи базы данных.

         editor_name   Имя программы, принимающей имя файла в качестве
                       параметра.

         max_size      Максимальный размер поля памяти. Это количество
                       памяти  временно   запрашивается  для  хранения
                       содержимого поля памяти.

Возвращает

         Величина      Значение

         0             Успех

         1             Нет доступной  памяти. Сообщение  об ошибках не
                       выводится.

         -1            Ошибка

         -2            Запись в  базе данных или файл пмяти блокирован
                       и выставлен флаг 'вернуться немедленно'.

Блокировка Запись  с   номером  'rec_num'   блокируется.  Файл  памяти
           блокируется  и   разблокируется  автоматически.   Так   как
           временный файл  создается в  текущем каталоге,  эта функция
           работат  во   многопользовательском   режиме,   обеспечивая
           каждому пользователю свой рабочий каталог.

Переносимость           Функция не работает под Unix/Xenix.

Пример     m4edit( f4ref("MEMO_FLD"), 2L, "C:\\PROG", 5000);

                                -171-

m4exist

Использование    int m4exist( (long) field_ref)

Описание   Функция 'm4exist'  определяет существование поля памяти без
           чтения файла памяти.

Возвращает

         Величина      Значение

         0             Поле памяти для данной записи не существует.

         1             Поле памяти существует.

Замечание  Используются данные из текущего буфера записи.

Пример     #include 
            #include 

            main() {
            int m_ref ;
              w4clear (-1) ;
              d4use ("INFO") ;
              m_ref = f4ref( "MEMO_FIELD" ) ;
              d4go(1L) ;
              if ( m4exist(m_ref) )
                   w4display( "Memo field data is present." ) ;
              else
                   w4display( "There is no memo field data" ) ;
           }

                                -172-

m4read

Использование    int m4read( long field_ref, long rec_num, char * str,
                           int str_len)

Описание   Функция 'm4read'  читает содержимое  поля памяти  в  строку
           'str'.  Считывается   'str_len'  символов.   Строка   'str'
           оканчивается нулем.  В добавление,  функция 'd4go' вызывает
           для чтения запись с номером 'rec_num' в буфер записи.

Параметры

         Наименование  Применение

         field_ref     Номер для ссылки на поле памяти.

         rec_num       Номер записи.

         str           Указатель на место, куда будет помещен текст.

         str_len       Количество байт, отведенных под строку 'str'.

Возвращает

         Величина      Значение

         >=0           Количество реально считанных символов.

         -1            Ошибка.

         -2            Запись в  базе данных или файл пмяти блокирован
                       и выставлен флаг 'вернуться немедленно'.

Блокиравка Запись  с   номером  'rec_num'   блокируется.  Файл  памяти
           блокируется и разблокируется автоматически.

Предупреждение:    Текущее содержимое буфера записи переписывается.

Пример     #include 
           #define MAX_LEN 500

           main(){
           char *ptr ;
           int comment_ref, len ;

              d4use ( "TEST_DAT" ) ;
              i4open ( "ORDER" ) ;

              ptr = malloc ( MAX_LEN ) ;
              if ( ptr == (char *) 0) exit (0) ;
              comment_ref = m4ref ( "COMMENT" ) ;
              d4top () ;
              len = m4read ( comment_ref, d4recno (),
                    ptr, max_len ) ;
              printf ("%d Bytes Read", len ) ;
              exit (0);
           }

                                -173-

m4renamed

Использование     int m4renamed ( (char *) file_name);

Описание   Функция 'm4renamed'  вызивается после того, как файл памяти
           dBASE IV выл переименован командой ДОСа. При переименовании
           файла   памяти    важно   переименовать    одновременно   и
           соответствующий файл  базы данных. Файл памяти должен иметь
           тоже имя,  что и  соответствующий файл  базы данных,  но  с
           расширением '.DBT'.

Параметры

         file_name     Имя файла памяти который будет переименован.

Возвращает

         Величина      Значение

         0             Успех

         -1            Ошибка

                                -174-

m4write

Использование    int m4write( long field_ref, long rec_num, char *
                           str, int str_len)

Описание   Информация,  записывается   в  поле   памяти   определенное
           параметром  'field_ref'.   В  процессе   записи  вызывается
           функция    'd4go'    для    чтения    содержимого    записи
           'rec_num',затем вызывается функция 'd4write' для сохранения
           измененных данных.

Параметры

         Наименование  Применение

         field_ref     Номер для ссылки на поле памяти.

         rec_num       Номер записи.

         str           Записываемая строка

         str_len       Количество символов для записи

Возвращает

         Величина      Значение

          >=0          Количество записанных символов.

          -1           Ошибка.

          -2           Запись в  базе данных или файл пмяти блокирован
                       и выставлен флаг 'вернуться немедленно'.

Блокиравка Запись  с   номером  'rec_num'   блокируется.  Файл  памяти
           блокируется и разблокируется автоматически.

Предупреждение:   Текущее содержимое буфера записи переписывается.

Пример     #include 

           static test_data[] = "This is some memo data>" ;

           main(){
           int desc_ref ;

              d4use ( "PARTS" );
              desc_ref = f4ref( "DESC" ) ;

           /* Record four should already exist. */
              m4write( desc_ref, 4L, test_data,
                   strlen ( test_data ) ;

           /* Blank the record buffer so that the 10 byte memo file
           reference does not get written to another record. */

              d4blank ();
           }

                                -175-

Функции работы с меню

С помощью  функций работы с меню системы Code Base можно строить почти
все типы  меню. В  частности, могут  быть созданы следующие типы меню:
опускающееся   (pulldown),    всплывающее    (popup),    вертикальное,
горизонтальное и типа 'Lotus'.

Любому меню  Code Base соответствует определенное окно. Характеристики
окна меню,  например, размеры  определяются самим  меню.  Каждое  меню
имеет определенный  набор разделов.  Эти  разделы  меню  соответствыют
возможным выборам из меню. Меню 'Спускающееся' и 'Lotus' фактически не
простые меню,  соответствующие структуре,  определенной в системе меню
Code Base. Они реально состоят из главного и нескольких подменю.

Следующие функции  обеспечивают установки для меню в текущем выбранном
окне:
       Функция             Краткое описание

       n4attribute         Устанавливает  атрибуты,   используемые  по
                           умолчанию, для разделов меню.

       n4horizontal        Определяет горизонтальное меню.

       n4item_width        Определяет    отступ     между    разделами
                           горизонтального меню.


Следующие функции применяются для определения разделов меню:
       Функция             Краткое описание

       n4attribute_item    Устанавливает атрибуты для разделов меню.

       n4message           Определяет сообщение для раздела меню

       n4key               Устанавливает  определенную   клавишу   для
                           активизации раздела меню.

       n4skip_over         Определяет: может  ли  быть  выбран  раздел
                           меню.


Каждый раздел  меню  имеет  соответствующую  функцию  'активизации'  и
функцию 'реакции'.  Если раздел  меню имеет  функцию 'активизации', то
она вызывается при активизации данного раздела меню. Функция 'реакции'
вызывается при перемещении указателя разделов меню на данный раздел

                                -176-

n4

Использование    int n4( char *label )

Описание   Функция 'n4'  определяет один раздел меню. Либо все разделы
           меню для данного меню должны быть определены функцией 'n4',
           либо все  разделы меню  нужно указывать  функцией 'n4item'.
           Если  расположение   разделов  меню  определяется  функцией
           'n4item', то  их позиции  должны указываться  явно. Однако,
           при использовании  функции 'n4', расположение разделов меню
           вычисляется и,  поэтому, возможен  скролинг разделов  меню.
           Скролинг разделов  происходит, когда  в окне  не помещаются
           все разделы.

Параметры

         label         Указатель  на   текст  раздела   меню,  который
                       выводится как  часть меню.  Лучше  использовать
                       указатель на постоянную область памяти, а не на
                       временную, т.к.  функция 'n4'  сохраняет только
                       копию  указателя.   Если  текст   по  указателю
                       'label' изменился,  то и  выводимый текст  тоже
                       изменится.

Возврат    Номер раздела меню для ссылки на созданный раздел меню.

Пример     #include 
           main(){
              w4init(2,0,5);
              w4clear(-1);

              w4define(0,0,4,8);
              w4border( DOUBLE, F_WHITE);

              n4("One");
              n4("Two");
              n4("Three");

              w4display(" Choice: ",
                   n4item_text( n4activate(-1) ),
                   (char *)0 );

              w4exit(0);
           }

                                -177-

n4action

Использование             void n4action( (ACTION *)action_routine )

Описание   Функция  'n4action'   определяет  функцию  активизации  для
           раздела меню,  который был  только что создан функцией 'n4'
           или  'n4item'.   'n4action'  вызывается   при   перемещении
           указателя разделов меню на этот раздел.

           Всякая 'n4action' и 'n4reaction' функция возвращает целое и
           имеет  целое   как  параметр.   Значение  этого   параметра
           устанавливается  функцией   'n4parm'.  Если   'n4parm'   не
           вызывалась,  параметром   будет   число   равное   значению
           указателя соответствующего элемента меню.

           Функции 'n4action' и 'n4reaction' возвращают целое, которое
           инструктирует функцию  'n4activate'  производить  следующие
           действия:

         Значение      Действие

         < 0           Вернуться  из  функции  'n4action'  с  этим  же
                       возвращаемым значением

         == 0          Считать символ команды с клавиатуры.

         > 0           Интерпретировать значение  как командный символ
                       введенный с клавиатуры.

См. также  'n4sub_menu' 'n4reaction'

                                -178-

Пример     #include 
           /*
           Эти функции определяются пользователем
           */
           do_entry( int item_ref );
           do_report( int item_ref );

           main(){
              w4define(5,10,8,25);
              w4border(DOUBLE, F_WHITE);
              w4clear(-1);

              n4("Data Entry");
              n4action( do_entry );

              n4( "Print Report" );
              n4action( do_report );

              n4activate(-1);
              w4exit(0);
           }

           do_entry( int item_ref ){
              /* ... */
              return(0);
           }

           do_report( int item_ref ){
              /* ... */
              return(0);
           }

                                -179-

n4activate

Использование    int n4activate( int window_ref )

Описание   'n4activate'  активизирует   меню.   В   результате   этого
           активизируется     подсоединенное     (связанное)     окно.
           'n4activate' - это наиболее важная функция меню. Все другие
           функции   меню    вызываются,   чтобы   подготовить   вызов
           'n4activate'.

           Перед завершением  'n4activate' оконное меню деактивируется
           и выбирается предыдущее окно.

Параметры

         window_ref -  ссылочный  номер   активизируемого  окна.  Если
                       параметр равен (int)-1, активизируется меню для
                       текущего окна.

Возврат    'n4activate'   возвращает   отрицательный   код   переданый
           'n4action' или  'n4reaction' функцией.  Если раздел меню не
           имеет 'n4action'  или 'n4reaction'  функции то возвращается
           целое  число,   задаваемое  'n4parm'.   Если  'n4parm'   не
           вызывалось, то  возвращается значение  ссылки раздела меню.

           Некоторые символы,  которые вводятся с клавиатуры, вызывают
           завершение 'n4activate'.  Эти символы определяются функцией
           'n4key_special'.  К   примеру,  для   горизонтального  меню
           клавиши управления  вверх/вниз  могут  вызывать  завершение
           'n4activate'. Напротив, для вертикального меню к завершению
           может   привести    нажатие   клавиш    право/лево.    (см.
           'n4arrow_exit').

           Положительные   значения    возвращенные   'n4action'   или
           'n4reaction'   трактуются    функцией   'n4activate'    как
           клавиатурный ввод.  Следовательно, возврат  из 'n4activate'
           может вызвать  как символ  введенный с  клавиатуры,  так  и
           символы,    возвращаемые     функциями    'n4action'    или
           'n4reaction'.  В   этом  случае   'n4activate'   возвращает
           символьную        величину,         вызвавшую        выход.

           Наконец, 'n4activate' возвращает 0, если в окне нет пунктов
           меню или окно слишком мало.

См. также  Введение в главу 'Описание функций меню', 'n4key_special'

                                -180-

n4arrow_exit

Использование    void n4arrow_exit()

Описание   Обычно   клавиши    вверх/вниз   в    горизонтальном   меню
           игнорируются.   Клавиши    влево/вправо   игнорируются    в
           вертикальных  меню.  Вызов  'n4arrow_exit'  устраняет  этот
           недостаток для  меню текущего выбранного окна. Когда нажата
           клавиша   управления    курсором,   которая    может   быть
           проигнорирована   в   одном   из   перечисленных   случаев,
           'n4activate' возвращает код клавиши.

Замечание  Такая возможность необходима для организаци вложенных меню.
           Когда используются  вложенные меню,  то при нажатии клавиши
           влево/вправо курсор  должен возвращаться  в  верхний  пункт
           горизонтального меню.

                                -181-

n4attribute

Использование    void n4attribute( long attribute, long
                           attribute_prompt )

Описание   Устанавливает атрибуты для пунктов меню текущего выбранного
           окна.

Параметры

         attribute     Это   атрибут   символов   для   соответственно
                       описанных пунктов меню. Атрибут для какого-либо
                       отдельного пункта  меню может  быть  установлен
                       путем использования функции 'n4attribute_item'.
                       Если эта  функция не  вызывается,  атрибут  по-
                       умолчанию установлен F_WHITE.

         attribute_prompt     При взаимодействии  с  меню,  выделенный
                       пункт  меню   (на  котором   находится  курсор)
                       находится  в  положении  ON.  Этот  пункт  меню
                       всегда  отображается   с  различным  атрибутом,
                       отличным    от     других     пунктов     меню.
                       attribute_prompt      специфицируется       как
                       специальный   атрибут    для   меню    текущего
                       выбранного   окна.    Если   эта   функция   не
                       вызывается, то  пункт меню,  на  котором  стоит
                       курсор, имеет атрибут F_WHITE.

См. также  n4attribute_item()

Пример     #include 

           main(){
              w4define(0,0,3,4);
              w4border( DOUBLE_TOP, _WHITE );
              n4attribute( F_BLUE, B_BLUE );
              n4("A");
              n4("B");
              w4display( n4item_text(
                   n4activate(-1) ), (char *) 0);
              w4exit(0);
           }

                                -182-

n4attribute_item

Использование     void n4attribute_item(int item_ref, long attribute )

Описание   присваивает атрибут указанному пункту меню.

Параметры

         item_ref      ссылочный номер пункта меню.

         attribute     атрибут, присваемый пункту меню.

Возврат    item_ref=n4item(2,2, "Choice One);
           n4attribute_item( item_ref, F_BLUE );
Пример

                                -183-

n4calc

Использование    void n4calc( int w_ref,
                           int start_row, int start_col )

Описание   Устанавливает размеры специфицированного окна. Размеры окна
           будут несколько больше его оконного меню.

           Ктомуже 'n4calc'  делает окно-меню  всплывающим (popup)   и
           присваевает ему  SINGLE бордюр. Для изменения типа бордюра,
           надо вызвать 'w4border' после 'n4calc'.

           Если 'n4calc'  обнаруживает  каие-либо  подменю,  она  сама
           устанавливает размеры  окон  подменю.  Окна  подменю  также
           становятся всплывающими, и им присваивается SINGLE бордюр.

Параметры

         Имя           Использование

         w_ref         ссылочный номер окна.

         start_row     начальная строка оконного меню.

         start_col     начальная  колонка  оконного  меню.  Она  может
                       изменена  функцией   'n4calc'  исли   указанное
                       значение так  велико, что меню не помещается на
                       экране.

Внимани    Если  вы   хотите,  чтобы   меню  было  как  можно  больше,
           установите параметр start_col равным (int)79.

           'n4pulldown', 'n4lotus'  и 'n4calc'  позволяют программисту
           быстро создавать хорошо выглядящие меню.

См. также  'n4pulldown', 'n4lotus'

Пример     #include 

           main(){
           int w_ref;
           /* n4calc will fill in the windows
           dimension */
              w_ref=w4define(-1,-1,-1,-1);

              n4("First Choice");
              n4("Second Choice");

              n4calc( w_ref, 10,20);

           /*replace the single line border set by 'n4calc' with a
           double line border */
              w4border( DOUBLE, F_BLUE );
              n4activate( w_ref );

              w4exit(0);
           }

                                -184-

n4char_routine

Использование    void n4char_routine( int (*ptr)(void) )

Описание   'n4char_routine'   задает   функцию   ввода,   используемую
           'n4activate'. Если  'n4char_routine' не  вызывалась, то  по
           умолчанию функцией ввода будет 'g4char'.

           Подобно 'g4char',  функция  ввода  не  имеет  параметров  и
           возвращает целый код введенного символа. Если функция ввода
           возвращает ноль,  'n4activate' ничего не делает и повторяет
           вызов функции ввода опять.

           Функция  ввода   обычно  вызывает  'g4char'  для  получения
           клавиатурного ввода.  Эта функция  распознает  определенные
           символы как  специальные команды и тогда возвращает всех их
           через другие символы ввода.

Пример     #include 
           #include 

           static int char_entry(){
           int rc;
              rc=g4char();
              if(rc==F1){
                   w4display(" Help ", " This is help            infor
           mation.", (char *)0 );
                   return(0);
              }
              return(rc);
           }

           main(){
           int w_ref;

           /* n4calc wil fill in the window dimensions. */
              w_ref=w4define(0,0,3,6);
              w4border( DOUBLE, B_WHITE );

              n4("One");
              n4("Two");

              n4char_routine( char_entry );
              n4activate( w_ref );
              w4exit(0);
           }

                                -185-

n4get_calc

Использование    void n4get_calc( int w_ref );

Описание   Позволяет вводить  данные из  меню в  GET поля. Эта функция
           используется 'g4menu' и 'g4menu_help'.

           Когда  меню   используется  для  этих  целей,  'n4get_calc'
           вычисляет размеры и расположение меню.

           Размеры окон  должны быть  инициированы как (int)-1 так как
           'n4get_calc' сама вычисляет подходящие размеры.

Параметры

         w_ref         cсылка на окно содержащее 'get' области ввода.

См. также  'n4calc',  'n4pulldown',   'n4lotus'  используют  такой  же
           подход, но  вычисляют положение и размеры для других целей.
           'g4menu', 'g4menu_help'.

Пример     #include 
           static char last_name[20];

           main(){
           int get_ref, menu_ref;
              menu_ref=w4define(-1,-1,-1,-1);
              w4clear(-1);
              n4("Tim Jones");
              n4("Fred Calvert");
              n4("Kennet Powers");

              get_ref = w4define(10,15,14,65);
              w4activate( get_ref );
              w4(1,5, "Enter last name: " );

              g4(1,w4col(), last_name );
              g4width( (int)siziof(last_name),
                   (int)siziof(last_name) );
              g4call( g4menu_help, menu_ref );
              g4message( "Press  for Help");

           /* 'g4call' saves the pointer to routine
           'g4menu_help' and the menu reference number menu_ref.
           Routine 'n4get_calc' looks at all of the 'gets' sheduled
           for window 'get_ref'. It recognizes the address of call
           routine 'g4menu_help' and knows the saved parameter
           'menu_ref' must be a window reference number. Then if
           calculates appropriate window dimensions and an appropriate
           position for the menu window identified by 'menu_ref'. */

              n4get_calc( get_ref );
              g4read();
              w4exit(0);
           }

                                -186-

n4horizontal

Использование    void n4horizontal()

Описание   По    умолчанию     меню    предпологается    вертикальным.
           'n4horizontal' устанавливает  горизонтальное меню. Различия
           между горизонтальным и вертикальным меню заключается в том,
           что  клавиши   со  стрелками   вверх/вниз  используются   в
           вертикальном меню,  а клавиши вправо/влево в горизонтальном
           меню.

                                -187-

n4int_get

Использование    int n4int_get( int item_ref )

Описание   'n4int_get' возвращает  целое, которое ранее было сохранено
           функцией 'n4int_save'.  Если число  не  было  сохранено  то
           функция 'n4int_get' возвращает ноль.

Параметры

         'item_ref'    Номер     пункта     меню,     соответствующего
                       возвращаемому целому.

См. также  'n4int_save', 'n4ptr_save', 'n4ptr_get'

Пример     #include 
           #include 

           int display_info( int );
           int display_info( int item_ref ){
           int saved_value;
           char buf[80];

              saved_value = n4int_get( item_ref );
              c4ltoa( (long) saved_value, buf, 6 );
              buf[6] = '\0';

              w4display( "Information",
                   "Text Value:",
                   n4item_text( item_ref ),
                   "Corresponding Number:",
                   buf, (char *)0 );
              return 0;
           }

           main(){
           int w_ref;

              w_ref=w4define( 4,10, 7,18 );
              w4clear(-1);

              n4("Three");
              n4action( display_info );
              n4int_save( 3 );

              n4("Five");
              n4action( display_info );
              n4int_save( 5 );

              n4("Eight");
              n4action( display_info );
              n4int_save( 8 );

              n4activate( w_ref );
              w4exit( 0 );
           }

                                -188-

n4int_save

Использование    void n4int_save( int save_value )

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

См. также  'n4int_get', 'n4ptr_get', 'n4ptr_save'.

                                -189-

n4item

Использование    int n4item( int row, int column, char *label )

Описание   'n4item' определяет положение пунктов меню в пределах окна.
           Функция идентична  функции 'n4',  за исключением  того, что
           два    параметра   'row'   и   'column'  определяют,    где
           пункт   меню    будет   расположен    в   пределах    окна.

           Для того,  чтобы успешно  использовать 'n4item', все пункты
           меню должны  быть определены  с помощью этой функции. Кроме
           того, каждый  вызов 'n4item' для окна должен сопровождаться
           положительными параметрами 'row' и 'column'.

Параметры

         row           строка в  пределах выбранного  окна, в  которой
                       разместится пункт меню.

         column        столбец  внутри   выбранного  окна,  начиная  с
                       которого распологается пункт меню.

         label         адрес текста  выдаваемого на  экран в  качестве
                       пункта меню.

Возврат    Номер раздела меню для ссылки на созданный раздел меню.

Замечание  Функция  'n4'  вызывает  функцию  'n4item',  с  параметрами
           row=column=(int)-1.

Пример     #include 

           main(){
              w4define(2,2,12,40);
              w4border( DOUBLE, F_WHITE );
              w4clear(-1);
              n4item( 3,4, "First Choice");
              n4item(6,4, "Second Choice");

              w4display( "The Choice was ...",
                   n4item_text( n4activate(-1) ),
                   (char *)0 );
              w4exit(0);
           }

                                -190-

n4item_text

Использование    char * n4item_text( int item_ref )

Описание   'n4item_text' возвращает адрес строки текста, принадмежащей
           пункту меню, определенному через параметр 'item_ref'.


n4item_width

Использование    void n4item_width( int width )

Описание   'n4item_width'  помогает   определить  внешний   вид  меню,
           заданного в  текущем окне.  Это уместно только тогда, когда
           для определения пунктов меню используется функция 'n4' а не
           'n4item'.

           'n4item_width'    главным     образом,     чтобы     задать
           горизонтальному меню  точно позицию-столбец.  По  умолчанию
           имеется  только   один  столбец  для  меню.  Следовательно,
           необходимо вызвать 'n4item_width' для горизонтального меню,
           чтобы CodeBase  вычислил позиции пунктов меню. Кроме этого,
           посредством использования 'n4item_width' возможно иметь для
           меню отдельные столбцы и/или строки.

Параметры

         width         задает число  символов в  одном  столбце  меню.
                       Полное   число   столбцов   меню   может   быть
                       определено  путем   деления  ширины   окна   на
                       значение параметра 'width'

Пример     main(){
           int w_ref;
           /* Define a Horizontal Menu with 4 columns. (There are 80
           columns and the number of characters per item is 20.) */

              w_ref=w4define( 0,0, 1,79 );
              n4horizontal();
              n4item_width( 20 );
              n4("One");
              .
              .
           }

                                -191-

n4key

Использование    void n4key( int chr, int activate,
                           int highlight_pos )

Описание   По умолчанию  можно активизировать  пункт меню  посредством
           нажатия клавиши,  соответствующей первому  символу описания
           этого  пункта.  Кроме  того,  когда  показывается  описание
           пункта меню, этот символ выводится с атрибутом F_INTENCE.

           Функция 'n4key' изменяет описанные установки.

Параметры

         chr           Нажатие клавиши с символом перемещает подсказку
                       к пункту  меню. Если  величина этого  параметра
                       равна    нулю,    пункту    меню    не    будет
                       соответствовать никакого символа.

         activate      Если  величина   этого  параметра   -  TRUE   -
                       'Истинно'  (не   ноль),  нажатие  клавиши  меню
                       активирует  соответствыющий  пункт  меню.  Если
                       этот параметр  равен FALSE - 'Ложно' (не ноль),
                       нажатие клавиши меню передвигает подсказку меню
                       к пункту меню.

         highlight_pos Это число  определяет,  какой  символ  описания
                       меню будет  показан с  атрибутом  интенсивности
                       F_INTENCE. Ноль  соответствует первому символу,
                       единица второму и т.д. Если этот параметр имеет
                       величину '(int)-1', не будет выделенно никакого
                       символа.

                                -192-

n4key_set

Использование    void n4key_set( int set_code,
                           int ignore_case )

Описание   Функция 'n4key_set'  определяет  некоторые  опции  ввода  с
           клавиатуры. Эти  опции относятся к текущему выбранному окну
           меню.

Параметры

               Наименова   Величина    Применение

               set_code    0           Игнорировать   все    вводы   с
                                       клавиатуры,   за    исключением
                                       клавиш  со   стрелками,  клавиш
                                       ,    ,    ,
                                       ,     и  специальных
                                       клавиш, установленных  функцией
                                       'n4key_special'.

                           1           Это  величина   по   умолчанию.
                                       Передвигает подсказку  меню  на
                                       первый  пункт   меню,   который
                                       соответствует нажатой  клавише.
                                       Смотри функцию 'n4key'

                           2           Пользователю  разрешено   вести
                                       поиск пункта  меню  посредством
                                       ввода искомой  строки символов.
                                       В этом  случае  подсказка  меню
                                       передвигается  к  пункту  меню,
                                       который соответствует введенной
                                       строке  символов.   Совпадающие
                                       символов             выделяются
                                       интенсивностью и миганием.

               ignore_case 0           FALSE     (ложно).      Регистр
                                       учитывается.

                           1           TRUE (истина)  поумолчанию. Все
                                       символы считаются  символами  в
                                       верхнем регистре  для сравнения
                                       при поиске.

                                -193-

n4key_special

Использование    void n4key_special( int up_key,
                           int exit_key, int return_start,
                           int return_end )

Описание   Функция  'n4key_special'   определяет   некоторые   символы
           клавиатуры,  которые   при   вводе   'заставляют'   функцию
           'n4activate'   выполнять    специальные    действия.    Это
           специальные символы  действуют с  определенными после этого
           окнами меню.  Следовательно, каждое  окно меню  может иметь
           свой собственный набор специальных символов.

Параметры

         Наименование  Применение

         up_key        Эта  клавиша   вызывает  возврат   из   функции
                       'n4activate'.   Однако,    если    'n4activate'
                       вызывала  себя   рекурсивно,  создав   подменю,
                       возвращается только  подменю низшего уровня. По
                       умолчанию это клавиша .

         exit_key      Эта  клавиша   вызывает  возврат   из   функции
                       'n4activate'.   Однако,    если    'n4activate'
                       вызывала себя  рекурсивно, создав  подменю, все
                       функции 'n4activate' будут возвращать введенную
                       клавишу 'exit_key'.  По умолчанию  это  клавиша
                       . В меню типа Lotus это клавиша '/'.

         return_start

         return_end    Это диапазон  клавиш, которые  вызывают возврат
                       возврат из  функции 'n4activate'.  Эти  клавиши
                       мало отличаются  от клавиши  'up_key', так  как
                       они работают  только тогда,  когда  клавиша  не
                       выполняет никаких других действий.

                       Это  средство   может   быть   использовано   в
                       спускающихся  меню,   когда   набор   символов,
                       например,  клавиши  ,  может  потенциально
                       активировать    пункты     меню    в    верхнем
                       горизонтальном меню.

Подсказка  Числовая величина  специальных  клавиш  находится  в  файле
           'g4char.h'. Например,  'ALT_A'  определена  как  0x1e00,  а
           'ALT_Q' определяется  как 0x1000.  Заметьте,  что  ALT_Q  <
           ALT_A !  Следовательно,  диапазон  от  ALT_A  до  ALT_Z  не
           включает ALT_Q. (Разработчики IBM PC назначили эти коды вне
           порядка.)

                                -194-

n4lotus

Использование    void n4lotus( int window_ref )

Описание   Если были  определены  пункты  меню  из  меню  типа  Lotus,
           функция 'n4lotus'  может быть  использована для  вычисления
           позиции окна  и его  размеров. Она  также  определяет  окна
           всплывающих меню  и изменяет  положение, в  котором выводит
           сообщения функция 'n4message_do'.

           Если начальная позиция (строка, столбец) окна главного меню
           Lotus была  определена при помощи функции 'w4define', будут
           использоваться  эти   значения.  Это  переместит  все  меню
           относительно нового начального положения.

Параметры

         Наименование  Применение

         window_ref    Этот параметр  является номером  указателя  для
                       главного меню Lotus.

                                -195-

Пример     #include 
           #include 

           main(){
           int main_ref, one_ref;

              w4clear(-1);

           /* Position the lotus menu at the bottom of the screen. ie
           (23,0) */
              main_ref=w4define(23,0,-1,-1);
              n4("One");
              n4message("Sub Choice 1 Sub  \ Choice 2");
              n4action( n4sub_menu );
              n4ptr_save( &one_ref );
           /* Routine 'two_action' is executed if 'Two' is chosen. */
              n4("Two");
              n4message("Two Action");
              n4action( two_action );
           /* Define the sub_menu which is displayed if main menu
           choice 'One' is chosen */
              one_ref=w4define(-1,-1,-1,-1);
              n4("Sub Choice 1");
              n4action( sub_choice_1 );

              n4( "Sub Choice 2" );
              n4action( sub_choice_2 );
           /* Turn the menus into a 'Lotus' menu */
              n4lotus( main_ref );
           /* Activate the menuing system */
              while( n4activate( main_ref )
                   == (int)'/');
              w4exit(0);
           }
           int two_action( int item_ref ){
              /* ... */
              return(0);
           }
           int sub_choice_1( int item_ref ){
              /* ... */
              return(0);
           }
           int sub_choice_2( int item_ref ){
              /* ... */
              return(0);
           }

                                -196-

n4message

Использование    void n4message( char * message )

Описание   Функция 'n4message'  определяет сообщение,  соответствующее
           пункту меню,  который только  что  был  создан  при  помощи
           функции 'n4' или функции 'n4item'.

Параметры

         Наименование  Применение

         message       Это    сообщение    соответствует    последнему
                       определенному пункту  меню. Это сообщение будет
                       показано автоматически,  когда  указатель  меню
                       передвигается к пункту меню.

См. также  Функция 'n4message_do'. Пример дан в функции 'n4lotus'.

n4message_do

Использование    void n4message_do( char * message )

Описание   Функция 'n4message_do' вызывается функцией 'n4activate' для
           показа строк сообщения, определенного функцией 'n4message'.

           Функция  'n4message_do'   непосредственно  выводит   строку
           текста в  абсолютные координаты экрана, определенные целыми
           переменными 'v4menu_row'  и 'v4menu_col'. По умолчанию, эти
           переменные имеют  величины 24  и  0,  соответственно.  Если
           строка не  доходит до  края  экрана,  она  будет  дополнена
           пробелами. Если  величина указателя  'message' равна '(char
           *)0', то  строка 'v4menu_row'  начиная с 'v4menu_col' будет
           заполнена пробелами.

Параметры

         message       Это указатель на строку сообщения

                                -197-

n4parm

Использование    void n4parm( int new_parm_data )

Описание   'n4parm'  переустанавливает   целочисленный   параметр   по
           умолчанию передаваемый функции 'n4action' или 'n4reaction'.

           Иначе, если  нет 'action' или 'reaction' функции, 'n4param'
           устанавливает значение  которое будет  возвращено  функцией
           'n4activate' в случае выбора соответствыющего пункта меню.

           Целая  величина   'new_parm_data'   будет   соответствовать
           последнему пункту  меню определенному  функциями  'n4'  или
           'n4item'. По  умолчанию это  значение равно  номеру  ссылки
           пункта меню для последнего определенного пункта меню.

Пример     #include 

           static char *menu_data[2] = { "One", "Two" };

           main(){
           int i;

              w4define( 3,3, 6,10 );
              w4border( DOUBLE, F_WHITE );

              w4clear( -1 );

              for( i=0; i<2; i++){
                   n4( menu_data[i] );
                   n4parm( i );
              }

              i=n4activate( -1 );
              w4display( "Selected Item", menu_data[i],
                   (char *)0 );

              w4exit( 0 );
           }

                                -198-

n4ptr_get

Использование    void * n4ptr_get( int item_ref )

Описание   'n4ptr_get' возвращает  ссылку которая ранее была сохранена
           функцией 'n4ptr_save'.  Если ссылка  не была  сохранена  то
           функция 'n4ptr_get' возвращает ссылку на ноль.

Параметры

         'item_ref'    Номер     пункта     меню,     соответствующего
                       возвращаемому целому.

См. также  'n4ptr_save', 'n4int_save', 'n4int_get'.

Пример     #include 

           struct quizz{
              char question[25];
              char answer[20];
           } quizz_dat[] =
           {
              { "Seven plus five ?", "Twelve"}
              { "Six times Seven ?", "Forty Two"}
              { "Forty divided by ten ?", "Four"}
           };

           int answer( int );
           int answer( int item_ref){
           struct quizz *saved_ptr;
              saved_ptr=n4ptr_get( item_ref );

              w4display( "Quizz Rezult", "Question:",
                   saved_ptr->question,
                   "Ansver:", saved_ptr->answer, (char *)0 );
              return 0;
           }

           main(){
           int w_ref, i;

              w_ref= w4define( -1,-1, -1,-1 );
              w4border( PANEL, F_GREEN );
              w4clear( -1 );

              for ( i=0; i<3; i++){
                   n4( quizz_dat[i].question );
                   n4action( answer );
                   n4ptr_save( &quizz_dat[i] );
              }

              n4calc( w_ref, 4,8 ); n4activate( w_ref );

              w4exit(0);
           }

                                -199-

n4ptr_save

Использование    void n4ptr_save( void *save_ptr )

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

См. также  'n4ptr_get', 'n4int_save', 'n4int_get'






n4pulldown

Использование    n4pulldown( int windows_ref )

Описание   Если для  системы спускающихся  меню были определены окна и
           пункты меню,  функция 'n4pulldown'  может быть использована
           для вычисления  размеров  и  положения  окон.  Кроме  того,
           функция   'n4pulldown'    присваивает   границы    (рамки),
           определяет всплывающие  меню, определяет  главное меню  как
           горизонтальное  и  назначает  специальные  клавиши,  обычно
           определяемые при помощи функции 'n4key_special'.

           Если начальная  позиция (строка столбец) окна главного меню
           была  определена   при  помощи   функции  'w4define',   эти
           координаты соответствуют верхнему левому углу спускающегося
           меню. В  противном случае спускающееся меню будет находится
           в координатах (0,0).

Параметры

         window_ref    это номер  указателя  окна  для  горизонтальной
                       полосы спускающегося меню.

                                -200-

Пример     #include "w4.h"
           #include "d4base.h"

           static int do_command(int), do_display( int item_ref );

           main(){
           int horizontal_ref, sub_one, sub_two;
           char no_flds[8];

              w4clear(-1);

           /* Open the database */
              if( d4use("d4learn.dbf")<0)
                   w4exit(1);

           /* Calculate some display information */
              c4ltoa( (long)f4num_fields(),
                   no_flds, 6);
              no_flds[6]='\0';

           /* Define the horizontal menu bar */
              hurizontal_ref=w4define(-1,-1, -1,-1);

           /* Define the main menu item */
              n4( "Position Database");
              n4reaction( n4sub_menu );

              n4ptr_save( &sub_one );

              n4("Display");
              n4reaction( n4sub_menu );
              n4ptr_save( &sub_two );

           /* Define the 'Position Database' sub-menu */
              sub_one=w4define(-1,-1,-1,-1);
              n4("First Record");
              n4action( do_command );

              n4("Last Record");
              n4action( do_command );

              n4("Next Record");
              n4action( do_command );

           /* Define the 'display' sub-menu */
              sub_two = w4define(-1,-1,-1,-1);

              n4("Database Record");
              n4action( do_display );
              n4ptr_save( f4record() );

              n4("Number of Fields");
              n4action( do_display );
              n4ptr_save( no_flds );

           /* Turn the menus into a pulldown menu. */
              n4pulldown( horizontal_ref );

           /* Activate the menuing pulldown system */

                                -201-

              w4cursor(-1,-1);
              n4activate( horizontal_ref );
              w4cursor(-23,0);

              w4close( horizontal_ref);
              w4close( sub_one );
              w4close( sub_two );
              w4exit(0);
           }

           int do_command( int item_ref ){
              switch( *n4item_text(item_ref) ){
                   case 'F':
                        d4top();
                        break;
                   case 'L':
                        d4bottom();
                        break;
                   case 'N':
                        d4skip(1L);
                        break;
              }
              return(0);
           }

           int do_display( int item_ref ){
              w4display( n4ptr_get(item_ref), (char *)0 );
              return(0);
           }

                                -202-

n4reaction

Использование    void n4reaction( (ACTION *)reaction_routine )

Описание   Функция 'n4reaction'  определяет функцию реакции для пункта
           меню, который  только что  был определен при помощи функции
           'n4'   или функции  'n4item'. Функция  реакции выполняется,
           когда подсказка  меню переходит  к соответствующему  пункту
           меню -  посредством нажатия клавиш со стрелками или нажатия
           клавиши с  соответствующим символом.  Функция  'n4activate'
           используется  как   функция  реакции   для  автоматического
           активирования спускающейся части системы спускающихся меню.

           Функция  'n4reaction'   отличается  от  функции  'n4action'
           только тем,  что она  определяет функцию  'реакции',  а  не
           функцию 'действия'.

См. также  Введение в главу 'Описание функций меню', 'n4action'

Пример     n4("Menu Option With a Reaction Routine");
           n4reaction( reaction_routine_name );

n4refresh

Использование    void n4refresh( int window_ref )

Описание   Функция  'n4refresh'   вызывается  функцией  'реакции'  или
           функией 'действия', при изменении атрибута показа или метки
           пункта меню.  Данная  функция  меню  'приказывает'  функции
           'n4activate' обновить  окно возврата  функции  реакции  или
           функции действия.

Параметры

         window_ref    Идентификатор обновляемого окна.

                                -203-

n4search

Использование    int n4search( char * descr_ptr )

Описание   Выполняет поиск указанного описания пункта меню в выбранном
           окне.

Параметры

         descr_ptr     Указатель  на  описание  пункта  меню.  Функция
                       'n4search' ищет  этот пункт  меню  в  выбранном
                       окне.

Возврат    Величина     Значение

           -1           Описание не обнаружено.

           >=0          Номер  указателя  пункта  меню,  чъе  описание
           совпадает с 'descr_ptr'.

Замечание  Функция  'n4search'   вызывается  функцией  'g4menu'  таким
           образом, что  начально активный  пункт  меню  соответствует
           первоначальному содержимому области ввода.

           После  вызова   функции   'n4search'   возвращенный   номер
           указателя  пункта   меню  часто   используется  в  качестве
           параметра для функции 'n4start_item'.

                                -204-

n4skip_over

Использование    int n4skip_over( int menu_ref, int flag )

Описание   Функция 'n4skip_over'  определяет, может  ли подсказка меню
           быть  перемещена   к   определенному   пункту   меню.   Это
           применяется для  тех  пунктов  меню,  которые  являются  не
           выбором,   а   просто   текстом.   Данная   функция   также
           используется для временного выключения пункта меню.

Параметры

         Наименование  Применение

         menu_ref      Номер указателя пункта меню.

         flag          TRUE -  Истина (не ноль), если нужно пропустить
                       указанный пункт  меню, и  FALSE -  Лож  (ноль),
                       если необходимо  использовать  указанный  пункт
                       меню.

Возврат    Возвращается установленная до этого величина флага.

n4start_item

Использование    void n4start_item( int start_item_ref )

Описание   По умолчанию,  подсказка меню  начинается на  первом пункта
           меню. Функция  'n4start_item'  используется  для  изменения
           этой  установки   по   умолчанию,   то   есть   она   может
           устанавливать подсказку меню на любом пункте меню.

           Так как  Code Base  знает, какое  окно соответствует номеру
           указателя пункта  меню, не имеет значения какое именно окно
           выбрано.

Параметры

         start_menu_ref  номер пункта  меню на  котором  высвечивается
                       первоначальная подсказка меню.

                                -205-

n4sub_menu

Использование    int n4sub_menu( int item_ref )

Описание   'n4sub_menu' используется  как и  'action'  или  'reaction'
           функции для того, чтобы помочь вам построить под-меню.

           Если 'n4sub_menu'  вызвана функцией  'n4activate' программа
           выполняется следующим образом:

         1.            Пользователь    вызывает    'n4activate'    для
                       активирования главного меню.

         2.            'n4sub_menu' выполняется,  как только указатель
                       меню передвинется (reaction) на соответствующий
                       пункт меню или когда он выбирается.

         3.            'n4sub_menu' вызывает 'n4ptr_get' для получения
                       указателя,  сохраненного   пользователем.  Этот
                       указатель    должен    ссылаться    на    целое
                       соответствующее номеру указателя окна под-меню.

                       'n4sub_menu' использует  вызов  'n4activate'  с
                       номером указателя окна в качестве параметра.

                       Это активирует под-меню.

Пример     #include 

           main(){
           int sub_ref, main_ref, rc;

              main_ref=w4define( 2,2, 5,15 );
              w4border( DOUBLE, F_WHITE );
              w4clear( -1 );

              n4("Sub Menu");
              n4action( n4sub_menu );
              n4ptr_save( &sub_ref );

              n4("Number Two");
              n4parm( 2 );

              sub_ref=w4define( 4,4, 6,16 );
              w4border( SINGLE, F_WHITE );
              n4( "Menu One" );
              n4parm(-1);
              rc=n4activate( main_ref );
              .
              .
              .
           }

                                -206-

Сервисные функции

Сервисные  функции   представляют  собой   универсальные  подпрограммы
низкого уровня.

u4error

Использование    int u4error( int error_num, char * string1,
                           char * string2, ...,
                           char * stringN, char * 0)

Описание   Функция  'u4error'   вызывается  всегда,  когда  происходит
           ошибка. Как правило, информация об ошибке посылается в окно
           по умолчанию. Однако, если функция была перекомпилирована с
           переключателем   'NOIO',   информация   об   ошибке   будет
           выдаваться  на  стандартный  выход.  Информация  об  ошибке
           включает в  себя номер  ошибки, информацию, соответствующую
           данному  номеру   ошибки  и   все   дополнительные   строки
           параметров.

           Более подробная информация по обработке ошибок содержится в
           приложении 'Сообщения об ошибках'

Параметры

         Необходим только  параметр 'error_num'  и последний  параметр
                       '(char  *)0'.   Имеется  необязательный  список
                       строк описания  ошибки.  Параметр  '(char  *)0'
                       является    указателем    на    конец    списка
                       дополнительных параметров.

Возврат    В  случае   возникновения   критических   ошибок,   функция
           'u4error'  выходит   в  операционную   систему.  Для  менее
           серьезных ошибок  функция 'u4error' ожидает нажатия клавиши
           и возвращает код нажатой клавиши.

                                -207-

u4file_first

Использование    int u4file_first( char * pattern,
                           char * first_match )

Описание   Функция 'u4file_first'  работает с  функцией  'u4file_next'
           для   получения   списка   имен   файлов,   соответствующих
           определенной спецификации  файлов со специальными символами
           'DOS'. При  использовании специальных символов, специальный
           символ '*' соответствует любой последовательности символов,
           а специальный  символ '?'  соответствует любому  одиночному
           символу  названия  файла.  Более  подробная  информация  по
           спецификации файлов  со специальными символами содержится в
           руководстве по 'DOS' (команда dir).

           Функция 'u4file_first'  используется для  получения первого
           совпадающего имени  файла.  Последующие  совпадающие  имена
           файлов   могут    быть   получены    при   помощи   функции
           'u4file_next'.

Параметры

         Наименование  Применение

         pattern       Шаблон(образец)   DOS   файла   который   может
                       содержать специальные символы. Версия Code Base
                       для Unix/Xenix  в  настоящее  время  игнорирует
                       параметр 'pattern'.

         first_match   указатель  на   как  минимут  14-ти  символьный
                       массив. Функция  'u4file_first' копирует первое
                       совпадающее имя файла в этот массив.

Возврат    Функции 'u4file_first'  и 'u4file_next'  соблюдают  правила
           возврата для прерывания DOS 0x21, типа 0x4E и 0x4F.

           Величина     Значение

           0            Успешное выполнение

           2            Неправильная спецификация файла

           18           Совпадающих файлов нет

Переносимость           Эта подпрограмма не поддерживается для UNIX.

Пример     for( rc=u4file_first("*.*", ptr); rc==0;
                   rc=u4file_next(ptr) ){
              w4( w4row()+1, 0, ptr); /* Display file name */
           }

                                -208-

u4file_next

Использование    int u4file_next( char *next_match )

Описание   Функция 'u4file_next'  используется вместе с 'u4file_first'
           для нахождения  следующего, совпадающего  с шаблоном, имени
           файла.

Параметры

         next_match    указатель  -   как  минимум,  14-ти  символьный
                       массив.   Следующее   совпадающее   имя   файла
                       копируется в эту область данных.

Переносимость           Эта подпрограмма не поддерживается для UNIX.

Возврат    Величина     Значение

           0            Успешное выполнение

           18           Совпадающих файлов больше нет

                                -209-

u4lock

Использование    int u4lock( int dos_file, long offset,
                           long num_bytes, int do_wait )

Описание   Функция  'u4lock'  блокирует  сегмент  любого  файла.  Если
           величина параметра  'do_wait' -  TRUE (истина)  (не  ноль),
           функция ожидает  блокировки информации.  В противном случае
           функция завершается сразу же.

Параметры

         Наименование  Применение

         dos_file      handle блокируемого файла.

         off_set       Номер байта,  от начала файла, где нужно начать
                       блокирование.   Смещение,    равное   '(int)0',
                       соответствует первому байту файла.

         num_bytes     Количество байт, которые будут блокированы.

         do_wait       Ожидать  блокирования,   если  величина   этого
                       параметра не ноль /TRUE/.

Возврат

         Величина      Значение

         0             Успешное  выполнение  или  однопользовательская
                       среда

         -1            Ошибка

         -2            Информация блокирована другим пользователем

                                -210-

u4name_char

Использование    int u4name_char( char test_char )

Описание   Функция  'u4name_char'   возвращает  TRUE   (истино),  если
           тестовый символ  является  правильным  символом  для  имени
           файла. В  противном случае  данная функция возвращает FALSE
           (ложно).

Возврат    Ноль   соответствуе    FALSE   (лож),    другие    величины
           соответствуют TRUE (истина).

Пример     if( ! u4name_char( name_chr ) )
           printf("\n Illegal Name Chr: %c",
           name_chr );

                                -211-

u4name_full

Использование    void u4name_full( char * result, char *name,
                           char * extension )

Описание   Добавляет к  имени файла  расширение по умолчанию. Если имя
           уже имеет расширение, Функция возвращает начальное имя.

Параметры

         Наименование  Примечание

         result        Имя файла,  дополненное расширением, копируется
                       в   'result'.   Для   этого   параметра   может
                       потребоваться до 68 байт памяти.

         name          Это оканчивающееся нулем строка, представляющая
                       собой первоначальное имя файла.

         extension     Расширение  имени   файла,  состоящее  из  трех
                       символов. Перед  ним может стоять точка (но это
                       не обязательно).

Пример     n4name_full( name, "C:\\FIRST", ".EXT" );

                                -212-

u4name_part

Использование    void u4name_part( char * result, char * name,
                           int give_dir, int give_ext )

Описание   Функция берет имя файла и удаляет его часть - каталог и/или
           расширение.

Параметры

         Наименование  Применение

         result        Этот параметр указывает на область  памяти, где
                       должно быть помещено полученное имя файла.

         name          Начальное имя файла.

         give_dir      Величина этого  параметра равна TRUE (не ноль),
                       если каталог  должен входить в получающееся имя
                       файла.  В   противном  случае   величина  этого
                       параметра должна быть FALSE (ноль).

         give_ext      Величина этого  параметра равна TRUE (не ноль),
                       если расширение  имени файла  должно входить  в
                       получающееся  имя  файла.  В  противном  случае
                       величиной этого  параметра  должно  быть  FALSE
                       (ноль).

                                -213-

u4open

Использование    int u4open( char * file_name, int code )

Описание   Функция 'u4open' открывает файл.

Параметры

         Наименование  Применение

         file_name     Имя открываемого файла.

         code          Этот код определяет способ открытия файла

         0             Открыть: Файл уже должен существовать.

         1             Создать: Файла еще не должно существовать.

         2             Создать: Существующий ранее файл уничтожается.

         4             Исключительное  открытие:  Другие  программы  и
                       пользователи не могут открыть этот файл.

                       Вы можете добавить 8 к этим кодам для получения
                       эквивалентных кодов  исключающик  ошибки.  Если
                       произойдет ошибка,  и если  к этим  кодам  было
                       добавлено 8,  то 'u4error'  не будет вызываться
                       для сообщения  об ошибке. Заметим, что -1 будет
                       возвращено  функцией   если  произошла  ошибка.
                       Например,  код   9  создать  файл  если  он  не
                       существует.

Возврат    Величина     Значение

           >=0          handle  открытого файла.

           -1           ошибка.

Пример     #include 

           int main(){
           int h;
              h=u4open("new_file", 2);
           }

                                -214-

u4unlock

Использование    int u4unlock( int dos_file, long offset, long
                           num_bytes )

Описание   разблокирует сенмент  любого  файла.  Этот  сегмент  должен
           предварительно заблокирован.

Параметры

         Наименование  Применение

         dos_file      handle  соответствующий   файлу  который  будет
                       разблокирован

         off_set       Номер байта  от начала  файла, где нужно начать
                       разблокирование.  Смещение,   равное  '(int)0',
                       соответствует первому байту файла.

         num_bytes     Количество байт, которые будут разблокированы.

Возврат    Величина     Значение

           0            Успешное выполнение

           -1           Ошибка.

Замечание  Функция   всегда    возвращает   успешное    выполнение   в
           однопользовательской среде.

                                -215-

Функции работы с окнами

Функции работы  с окнами используются для вывода и ввода информации на
и  с  экрана  дисплея.  Эти  функции  используются  также  для  вывода
информации на  каналы вывода  (handl). Функции  работы с  окнами часто
используются функциями чтения и функциями работы с меню.

Экранные окна  имеют обозначенную  прямоугольную область  на экране  и
символ атрибута.  Окна могут  также иметь границы (рамки) и заголовки.
Они могут  быть всплывающими  и могут  иметь  в  памяти  копию  своего
содержимого для  восстановления.  Все  окна  имеют  текущее  положение
(строка:столбец).

Функции работы  с окнами  позволяют удобно выводить поля базы данных и
различные типы  данных Си:  (long), (double),  (int) и (char). Имеются
также  функции   для  манипуляции  курсором,  центрирования  текста  и
очищения окон.

Одновременно может  быть выбрано  только  одно  окно.  Многие  функции
работы с окнами, например функция 'w4popup', определяют характеристики
выбранного окна.  Кроме того, функции ввода, например, функция 'w4int'
используют выбранное окно.

Несмотря на  то, что  можно посылать  вывод в окно после того, как оно
выбрано, обычно лучше всего сначала вызывать функцию 'w4activate'. Это
позволяет работать  со всплывающими  окнами,  автоматически  создавать
рамки и деактивировать окна.

При записи  в окно, верхний ряд (строка) и крайний левый столбец имеют
номер ноль.

На  дискете  с  примерами,  в  файле  'w4example.c'  содержится  много
примеров работы программ управления окнами.

                                -216-

Некоторые сведения об окнах.


Как  правило,  пользователь  показывает  информацию  в  окне,  которое
последним было активированно при помощи функции 'w4activate'.

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

Code Base  запоминает порядок,  в котором  активизируются окна.  Можно
заново активизировать  окно при  помощи фунуции  'w4activate', без его
деактивации.  Когда   окно  активизируется   заново,  оно   становится
последним активным  окном. Если последнее активное окно является окном
памяти (см.  функция 'w4memory'), его содержимое сохраняется в памяти,
когда активизируется  или переактивизируется  заново (повторно) другое
окно. Следовательно,  окно может  быть восстановлено  из памяти,  если
окно активизируется заново (повторно) некоторое время спустя.

Когда  деактивируется   всплывающее  окно,   основной  текст  под  ним
восстанавливается.   В   противном   случае   Code   Base   попытается
восстановить экран  посредством повторной активиции всех активных окон
в том  порядке, в  котором они первоначально активировались. Это будет
должным образом  работать только  в том  случае, если все активируемые
окна будут являться окнами памяти.

Замечания:

1. Несколько окон могут быть активны одновременно. Окно активизируется
функцией 'w4activate'.

2. Имеется  только одно  'последнее  активизированное'  окно.  Обычно,
программист выводит информацию на 'последнее активизированное' окно.

3. Имеется  только  одно  выбранное  окно.  Окно  выбирается  функцией
'w4select'.

4. Выбранное окно не обязательно должно быть активным окном. Оно может
быть любым окном.

                                -217-

Пример использования функций управления окнами.

           #include 

           main(){
           int window_ref;

           /*Define the window */
              window_ref=w4define(10,30, 14,50 );

           /* set window's attribute and border */
              w4attribute( B_BLINK | F_WHITE );
              w4border( DOUBLE, F_BLUE );

           /* Activate the window */
              w4activate( window_ref );

           /* Centre the output on row 1 */
              w4centre( 1, "Hello World" );

           /* Wait for a character to be pressed */
              g4char();

           /* Deactivate the window */
              w4deactivate( window_ref );

           /* Free the window's allocated memory */
              w4close( window_ref );
              w4exit(0);
           }

                                -218-

w4

Использование    void w4( int row, int column, char * str )

Описание   выводит   строку    заканчивающуюся   нулем   в   указанных
           координатах (стровка, столбец).

Параметры

         Наименование  Применение

         row           Строка вывода

         column        Столбец вывода

         str           Выводимая строка

Пример     #include 

           main(){
           int w_ref;

              w_ref=w4define( 5,10, 11,40 );
              w4border( SINGLE );
              w4activate(w_ref);

           w4( 1,1, "Display at row one and column one!");
           w4( 2,1, "Press a key to continue ...");
              g4char();

              w4exit(0);
           }

                                -219-

w4activate

Использование    void w4activate( int window_ref )

Описание   Если  окно  является  текущим  активным  окном,  ничего  не
           происходит.

           В противном  случае функция  'w4activate' веберет и покажет
           окно. Если  окно до  этого было активизировано и копия окна
           была сохранена  в памяти  (см функцию 'w4memory'), то будет
           востановлена эта  копия из  памяти. Кроме  того, если  окно
           является всплывающим  окном, базовая  информация (текст под
           окном) экрана будет сохранена.

           Если окно  не было до этого активировано, или если это окно
           не является окном памяти, оно очищается.

Параметры

         window_ref    номер окна, которое активируется.

Пример     w4activate( w4define( 5,10, 20,70 ) );

                                -220-

w4attribute

Использование    w4attribute( long attribute )

Описание   Каждый раз,  когда вывод  посылается непосредственно в окно
           вывода на  IBM PC  или совместимом  компьютере, этот  вывод
           имеет    соответствующий    атрибут    символов.    Функция
           'w4attribute'   устанавливает    какой   атрибут   символов
           используется дла  выбранного окна.  Атрибут символов  имеет
           следующий формат:

           Номер бита   Значение

           0            Цвет символа голубой

           1            Цвет символа зеленый

           2            Цвет символа красный

           3            Цвет символа интенсивный

           4            Задний фон голубой

           5            Задний фон зеленый

           6            Задний фон красный

           7            Задний фон мигающий

           Файл заголовка  'w4.h' определяет  атрибуты для стандартных
           цветов F_BLUE,  F_GREEN, F_RED, F_INTENSE, F_WHITE, B_BLUE,
           B_GREEN, B_RED, B_BLINK и B_WHITE.

Пример     w4attribute( F_WHITE | F_INTENSE ); /* Intense White */

                                -221-

w4border

Использование    void w4border( char * box_chars,
                           long attribute )

Описание   Граници   текущего   окна   устанавливается   определенными
           символами рамки. Эта рамка показывается внутри границ окна.
           Нулевым рядом  окна становится ряд находящийся сразу же под
           верхним рядом  рамки, а  нулевым стобцом становится столбец
           расположенный правее левого столбца рамки.

Параметры

         Наименование  Применение

         box_char      Восьми-смвольная   строка,   которая   образует
                       символы рамки. Они идут в следующем порядке:

                       Вершина
                       Дно
                       Левая сторона
                       Правая сторона
                       Верхний левый угол
                       Верхний правый угол
                       Нижний левый угол
                       Нижний правый угол

                       Code  Base   сохраняет  указатель   на   строку
                       'box_char'. Следовательно,  параметр 'box_char'
                       должен  быть   статической  переменной  памяти,
                       константой  или   быть  объявленным   в  'main'
                       подпрограмме.

         attribute     Атрибут символов бордюра.

Замечание  Файл  заголовка  'w4.h'  определяет  некоторые  строки  для
           обычных рамок:  SINGLE, DOUBLE,  DOUBLE_TOP и PANEL. В этом
           файле определены также некоторые атрибуты.

Пример     w_ref = w4define( 0,0, 24,79 );
           w4border( SINGLE, F_WHITE );
           w4activate( w_ref );

                                -222-

w4box

Использование    void w4box( char * box_chars,
                           int start_row, int start_col,
                           int end_row, int end_col )

Описание   Функция 'w4box' рисует рамку в выбранном окне. Используются
           атрибуты символов окна.

Параметры

         box_chars     См. функцию 'w4border'.

         start_row

         start_col

         end_row

         end_col       Указывают размеры окна.

Пример     /* Outline the complete screen with a box*/
           w_ref=w4define(0,0, 24,79);
           w4box( SINGLE, 0,0, 24,79);
           w4close(w_ref);

w4centre

Использование    void w4centre( int row, char *str )

Описание   Выводит строкы в центре указанной строки выбранного окна.

Параметры

         Наименование  Применение

         row           Строка вывода

         str           Выводимая строка

                                -223-

w4clear

Использование    void w4clear( int row )

Описание   Очищает выбранное  окно начиная  с указанной  строки. Кроме
           того,  текущая  позиция  (строка,  столбец)  изменяется  на
           (строка, 0).

           Если величина 'row' равна '(inr)-1', очищается весь экран а
           текущая позиция (строка, столбец) не изменяется.


w4close

Использование    void w4close( int window_ref )

Описание   Освобождает всю  память, выделенную  для  окна.  Если  окно
           закрывается, его  больше не  существует. Закрытие  окна  не
           влияет на экран. Если необходимо, можно деактивировать окно
           перед его закрытием.

           Если  закрываемое   окно  было   до   этого   выбрано,   то
           автоматически  выбирается  последнее  активированное  окно.
           Если последнего  активированого окна  нет,  выбранное  окно
           должно быть  определено при  помощи другой функции работы с
           окнами, например 'w4select'.

Параметры

         window_ref    Номер указателя закрываемого окна.


w4col

Использование    int w4col()

Описание   Возвращает текущий столбец.

                                -224-

w4cursor

Использование    void w4cursor( int row, int col)

Описание   Курсор перемещается  в указанную  позицию выбранного  окна.
           Если величина одного параметра отрицательна курсор изчезает
           с экрана.

           Вызов 'w4cursor'  не влияет  та текущее  положение (строка,
           столбец) внутри выбранного окна.

Внимание!  Некоторые компьютеры  'зависают', если  курсор не находится
           на экране перед тем, как программа выходит. Смотри 'w4exit'
           и пример приводимый ниже.

Пример     /* Folowing is the source code for 'w4exit()' */
           w4exit( int rc ){
              w4select( v4default_window );
              w4cursor(23,0);
              exit(rc);
           }

w4cursor_size

Использование    void w4cursor_size( int start_size, int end_size )

Описание   Устанавливает размер курсора.

Параметры

         Наименование  Применение

         start_size    Верхняя  граница   изображения   курсора.   Эта
                       величина находится в диапазоне 0 и 'end_size'.

         end_size      Нижняя   граница   изображения   курсора.   Эта
                       величина находится в диапазоне 0 и 7.

Внимание!  Эта функция специфична для IBM PC и свместимых с ними.

                                -225-

w4deactivate

Использование    void w4deactivate( int window_ref )

Описание   Если окно является активным выбранным всплывающим окном, то
           оно изчезает  с экрана  и восстанавливается  основной текст
           (под ним).

           В противном  случае,  экран  восстанавливается  посредством
           повторной активизации  других окон.  Функция 'w4deactivate'
           использует  тот   факт,  что,  посредством  вызова  функции
           'w4memory', окна могут сохранять копию своего содержимого в
           памяти. Любое  активированное до этого окно, чье содержимое
           было сохранено,  будет активированно заново (повторно). Эти
           окна будут  повторно активированны в том порядке, в котором
           они  изначально  активировались.  Если  имеются  измененные
           окна, для  которых копий  в памяти не было, то экран нельзя
           будет восстановить.

           После деактивации  окна, автоматически выбирается последнее
           активированое окно.

Параметры

         window_ref    Номер указателя окна, которое деактивируется.

Пример     /* Define a bordered, popup window for the screen's left
           side */
           w_ref= w4define(0,13, 24,79);
           w4border( DOUBLE, F_WHITE );
           w4popup();
           w4activate(w_ref);
           .
           .
           w4deactivate(w_ref);
           w4close(w_ref);

                                -226-

w4define

Использование    int w4define( int top_row, int left_columd,
                           int bottom_row, int right_column)

Описание   Функция  'w4define'   создает  окно.   Вызов  этой  функции
           необходимо сделать  перед вызовом  почти всех  программ  из
           модулей 'чтение', 'окно' или 'меню'.

           После того, как окно создано, оно становится выбраным.

           Параметры  определяют  размеры  окна.  Координаты  являются
           относительными к  верхней и  левой стороне экрана. Строка 0
           является верхней  строкой  экрана,  а  столбец  0  является
           крайним левым столбцом экрана.

           Функция возвращает новер указателя нового окна.

Замечание 1 Функция 'd4init' вызывает функцию 'w4define' для создания
           окна по умолчанию с номером указателя окна, который
           содержится во внешней целой переменной 'v4default_window'.
           Это окно занимает весь экран. Если функция 'w4init' не была
           вызвана, фынкция 'w4define' создаст окна по умолчанию.

Пример     #include 

           main(){
           int error_window, main_window, top_window, bottom_window;

           error_window=w4define( 11,25,16,55 );
           w4popup();
           w4border( DUOBLE, F_RED );
           w4attribute( F_RED | B_BLINK );

           main_window=w4define(0,0, 24,79);
           w4memory();

           top_window=w4define(0,0, 12,79);
           w4memory();
           w4border( SINGLE, F_WHITE );

           bottom_window=w4define(13,79, 24,79);
           w4memory();
           w4border( SINGLE, F_WHITE );
           /* and so on ...*/

                                -227-

w4display

Использование    int w4display( char * title,
                           char * m1, ..., char * 0)

Описание   Функция 'w4display' создает всплывающее окно и показывает в
           нем строки  сообщения. Окно создается такого размера, чтобы
           можно было красиво разместить в нем сообщение. Когда строки
           сообщения  будут   показаны,  функция  'w4display'  ожидает
           нажатия клавиши пользователем. Затем всплывающее окно будет
           деактивировано и закрыто.

Параметры

         Наименование  Применение

         title         Заголовок окна.  Если  этот  параметр  является
                       единственным, заголовок  будет показан в центре
                       окна.

         m1,m2,...     Неопределенное  количество   строк   сообщений,
                       которые будут показываться.

         (char *)0     Необходимый  параметр   указывающий  на   конец
                       списка параметров.

Возврат    Код нажатой клавиши.

Пример     rc=w4display("Entry Error:",
              "Only Blanks were Entered",
              "",
              "Continue (Y/N) ?",
              (char *)0 );

           if(rc == (int) 'n' || rc == (int) 'N')
              w4exit(1);

                                -228-

w4double

Использование    void w4double( int row, int column,
                           double double_value,
                           int len, int dec )

Описание   Функция 'w4double' выводит 'double' величину.

Параметры

         Наименование  Применение

         row           строка вывода

         column        столбец вывода

         double_value  выводимая величина

         len           длина вывода

         dec           количество показываемых десятичных позиций

w4eject

Использование    void w4eject()

Описание   Функция  'w4eject'  посылает  символ  перевода  страницы  в
           текущий канал  (handle) вывода  окна. Кроме  того,  текущее
           положение (строка, столбец) устанавливается как (0,0).

                                -229-

w4exit

Использование    void w4exit( int exit_rc )

Описание   Функция помещает  курсор в положение (23,0) и затем выходит
           при помощи вызова стандартной функции выхода 'exit' с кодом
           возврата 'exit_rc'.

           Функция 'w4exit'  необходима, так  как некоторые компьютеры
           не обрабатывают выход, когда при выходе программы курсор не
           находится на экране.

Внимание!  Не используйте  функцию  'w4exit',  если  размеры  окна  по
           умолчанию  были   изменены,  или  если  окно  по  умолчанию
           закрыто.

w4field

Использование    void w4field( int row, int column, long field_ref )

Описание   Функция 'w4field' показывает содержимое поля базы данных.

Параметры

         Наименование  Применение

         row           Строка вывода

         column        Столбец вывода

         field_ref     Номер указателя показываемого поля

                                -230-

w4handle

Использование    int w4handle( int hand )

Описание   Функция  'w4handle'   определяет  канал,   который   должен
           соответствовать  выбранному   окну.  Последующий  вывод  от
           функций управления  окнами будет зависываться в этот канал.
           Если канал  соответствует файлу, проверьте, чтобы этот файл
           был открыт в двоичном режиме.

           Ввод данных и ввод посредством меню разрешен только в таком
           окне, которому соответствует выходной канал '(int)-1'.

Параметры

         Параметр 'hand' может принемать следующие значения:

         Величина      Значение

         -2            Не изменять  канал. Просто  возвратить значение
                       текущего канала.

         -1            Послать выход непосредственно в видео-память.

         0             Стандартный канал ввода.

         1             Стандартный канал вывода.

         2             Стандартный канал вывода ошибки.

         3             Стандартный вспомогательный (auxiliary) канал.

         4             Стандартный принтер

         >=5           Эти  каналы   обычно   соответствуют   открытым
                       файлам.

Примечание Если выдача  направляется на  файловое устройство,  текущая
           строка может  стать больше  32667. Однако  когда  выводится
           большое число  строк без  вызова 'w4eject' или 'w4position'
           для  переустановки  текущего  номера  строки,  принимая  во
           внимание вызов  'w4position_set'.  Это  приведет  к  ошибке
           переполнения целого после выдачи 32667 строк.

           Code Base  считает, что  ширина окна  совпадает  с  шириной
           устройства выдачи.  Если длина  выдаваемой строки  превысит
           ширину окна,  то текущий  столбец вывода  будет занулен,  а
           строка увеличина  на  единицу.  Для  предотвращения  этого,
           сделайте ширину окна достаточно большой.

Возврат    Величину предидущего канала вывода.

См. также  'w4position', 'w4position_set'

                                -231-

w4heigh

Использование    int w4heigh( int new_height )

Описание   устанавливаем и  возвращает количество  строк  в  выбранном
           окне.

           Вызов функции  'w4heigh' не влияет на то, что было показано
           на экране.  Однако, вся  память для  всплывающего окна  или
           сохраненного экрана  будет освобождена  и перераспределена.
           Следовательно, лучше  избегать изменения высоты окна, когда
           выбранное окно является активным.

           Новая высота определяет только строки внутри бордюра окна.

Параметры  Если параметр  'new_heigh' имеет  величину больше  нуля, то
           эта величина  становится новым  количеством строк  в  окне.
           Иначе высота  окна не меняется Вызов 'w4heigh' с параметром
           (int)-1 хороший способ определения высоты текущего окна.

Возврат    Возвращает высоту текущего окна.

                                -232-

w4int

Использование    int w4init( int num_window, int num_get,
                           int num_menu )

Описание   Если эта функция не вызывается непосредственно то она будет
           автоматически  вызвана  функциями  'd4init',  'w4define'  и
           'w4clear'. Следовательно,  если 'w4init' вызывается явно то
           она должна  быть вызвана  перед вызовом других функций Code
           Base.

           Посредством  вызова   функции  'w4init'   для   определения
           количества  окон,  областей  ввода  (чтения)  и  количества
           пунктов   меню    достигается   уменьшение    расходов   на
           использование  памяти   и  ее   фрагментацию.   Даже   если
           вызывается  функция  'w4init',  Code  Base  все-таки  будет
           распределять лишнюю  дополнительную память  для  добавочных
           окон, областей ввода или пунктов меню, как требуется.

           Количество  одновременно   используемых  окон  'num_window'
           равняется количеству  раз,  которое  вызывается  'w4define'
           минус количество раз, которое вызывается функция 'w4close',
           плюс одно окно по умолчанию.

           Количество  одновременно  используемых  областей  'num_get'
           ввода    определяется    количеством    вызовов    программ
           инициализации  ввода   (Get  Initialize  routines).  Память
           области ввода обычно освобождается автоматически при помощи
           функции 'g4read'.

           Аналогични, количество  одновременно  используемых  пунктов
           меню 'num_menu' зависит от количества вызовов функций 'n4',
           'n4item'.  Память,  выделенная  для  пунктов  меню,  обычно
           освобождается при закрытии окна.

           По умолчанию  функция 'd4init' вызывает функцию 'w4init' со
           следующими параметрами: w4init( 5, 0, 0 );

           По  умолчанию   функции  'w4define'  и  'w4clear'  вызывают
           функцию 'w4init'  со следующими параметрами: w4init( 10, 0,
           0 );

Возврат

         Величину      Значение

         0             Успешное выполнение.

         -1            Нет памяти.  Если только  функция 'u4error'  не
                       была изменена,  эта критическая ошибка приводит
                       к завершению программы.

                                -233-

w4int

Использование    void w4int( int row, int column,
                           int int_value, int len )

Описание   Выводит целое число.

Параметры

         Наименование  Применение

         row           Строка вывода

         column        Столбец вывода

         int_value     Выводимое число

         len           Длина вывода

Пример     w4( w4row()+1, 2, "Amount:" );
           w4int( w4row(), w4col(), i_amount, 6);

w4long

Использование    void w4long( int row, int column,
                           long long_value, int len )

Описание   Выводит длинное целое число.

Параметры

         Наименование  Применение

         row           Строка вывода

         column        Столбец вывода

         int_value     Выводимое число

         len           Длина вывода

Пример     w4long( ++r, c, l_value, 8);

                               -234-

w4memory

Использование    void w4memory()

Описание   Функция 'w4memory'  сохраняет в памяти копию текущего окна.
           Следовательно,  когда   окно  повторно  активированно,  его
           изображение может  быть  восстановленно  из  памяти.  Кроме
           того, если  на выбранное  окно накладывается  другое  окно,
           которое затем  деактивируется, содержимое  выбранного  окна
           может быть показанно заново (повторно).

Подсказка  Когда активируются  (в случайном  порядке) раэличные  окна,
           имеющие разные  размеры, то  будет лучше всего использовать
           функцию  'w4memory',   чтобы  можно   было  восстанавливать
           предыдущее содержимое окон.

См. также  w4deactivate()


w4num

Использование    void w4num( int row, int column,
                           char * str, int num)

Описание   Выводит строку указанной длины.

Параметры

         Наименование  Применение

         row           Строка вывода

         column        Столбец вывода

         str           Выводимая строка

         num           Число выводимых символов.

Пример     /* Output five characters */
           w4num( r,c, str, 5 );

                                -235-

w4num_att

Использование    void w4num_att( int row, int column,
                           char *str, int num,
                           long attribute )

Описание   Функция  аналогична   'w4num',  за  исключением  того,  что
           функция 'w4num_att'  имеет  дополнительный  параметр.  Этот
           параметр  -  'attribute'  определяет  атрибут  показываемой
           строки.

Пример     w4attribute()


w4out

Использование    void w4out( char * str )

Описание   Выводит строку  'str' в  текущую позицию  (строка, столбец)
           окна.

w4popup

Использование    void w4popup()

Описание   Функция 'w4popup'  превращает выбранное  окно в всплывающее
           окно. Это  означает, что,  когда окно  активируется а затем
           деактивируется, текст под окном восстанавливается.

Замечание  Вызовы  функций   'n4lotus',   'n4pulldown',   'n4calc'   и
           'n4get_calc' автоматически  превращают соответствующие окна
           в всплывающие.

                                -236-

w4position

Использование    void w4position( int row, int column )

Описание   Устанавливает текущее положение (строка, столбец).

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

           Функция 'w4position' не влияет на положение курсора.

Параметры

         Наименование  Применение

         row           Новое положение строки вывода.

         column        Новое положение столбца вывода.

См. также  'w4handle', 'w4position_set'


w4position_set

Использование    void w4position_set( int row, int column )

Описание   Устанавливает  текущую  позицию  (строка  столбец).  Ничего
           другого не делает.

Параметры

         Название      Использование

         row           Новая текущая строка

         column        Новое значение текущего столбца

См. также  'w4handle', 'w4position'

Пример     #include 

           void line_skip( int n ){
           /* Assume the current window's output handle is to a file
           or to a printer. */
              w4position_set(0,0);
              w4position( n, 0 );
           }

                                -237-

w4read

Использование    void w4read( int row, int column,
                           char *char_buffer, int len_data)

Описание   Считывает  информацию   из  видео  памяти.  Эта  информация
           находится в формате видео-памяти - (символ, атрибут).

Параметры

         Наименование  Применение

         row           Строка  экрана   относительно   верхней   части
                       экрана.

         column        Столбец  экрана   относительно  левой   стороны
                       экрана.

         data_buffer   Указатель на буфер в который помещаются данные.

         len_data      Количество байт,  которые  будут  считаны.  Эта
                       величина равна  удвоенному колличествы читаемых
                       с экрана  символов, так  как атрибуты  символов
                       тоже читаются.

Переносимость Данная функция недоступна в версии Code Base для
           Unix/Xenix.

Пример     static char scr_data[25*80*2]

           char *read_screen(){
           /* Read the entire screen */
              w4read( 0,0, scr_data, sizeof( scr_data) );
              return(scr_data);
           }

                                -238-

w4read_window

Использование    void w4read_window( int window_ref,
                           char *ptr )

Описание   Читает символьную  информацию, из  видео памяти  в пределах
           указанного окна. Эта информация читается в формате (символ,
           атрибут).  Если  окно  имеет  рамку,  информация  рамки  на
           считывается.
Параметры

         Наименование  Применение

         window_ref    Номер указателя окна, которое читается.

         prt           Указатель на  область памяти где будет хранится
                       считанная   информация.    Проверьте    наличие
                       достаточного места.

Переносимость           Функция недоступна в версии Code Base для 
           Unix/Xenix.

Пример     static char window_info[200];

           read_example_one(){
           int w_ref;
              w_ref=w4define( 2,2, 11,11 );
           /* REad the 200 bytes of window information */
           /* Note: (11-2+1)*(11-2+1) is 100
           characters. This become 200 bytes at 2 bytes per character
           */
              w4read_window( w_ref, window_info );
              w4close(w_ref);
           }

           read_example_two(){
           int w_ref;

              w_ref-w4define( 1,1, 12,12 );
              w4border( SINGLE, F_WHITE );
           /* Read the sane 200 bytes of window information as in
           'save_example_one'. The border information is not read. */
              w4read_window( W_ref, window_info);
              w4close(w_ref);
           }

                                -239-

w4repeat

Использование    void w4repeat( int row, int column,
                           char chr, int num_repeat )

Описание   Выводит указанное число раз указанный символ.

Параметры

         Наименование  Применение

         row           Строка вывода

         column        Столбец вывода

         chr           Выводимый символ

         num_repeat    Количество повторение символа 'chr'.

w4row

Использование    int w4row()

Описание   Возвращает текущую позицию строки.






w4scroll

Использование    void w4scroll( int num_lines )

Описание   Выполняет скроллинг  окна вниз или вверх на указанное число
           строк.

Параметры

         Наименование  Применение

         num_lines     Определяет число строк прокрутки окна. Если > 0
                       прокручивается вверх.  Если <  0 прокручивается
                       вниз.

Переносимость           В UNIXе эта подпрограмма не работает для окон с
                        бордюрами.

                             -240-

w4select

Использование    int w4select( int window_ref )

Описание   Делает  указанное   окно  текущим   выбранном  окном.  Если
           величина  параметра   'window_ref'  меньше   нуля,  текущее
           выбранное окно не изменяется.

Возврат    Функция 'w4select' возвращает номер указателя вубранного до
           этого окна.

Пример 1   previos_ref=w4select( new_ref );
           w4centre( 1, "Output Window" );
           w4select( previos_ref );

Пример 2   /* Find the current window reference number */
           current_ref = w4select( -1 );

w4title

Использование    int w4title( int row, int col,
                           char *title, int attribute )

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

Параметры

         Наименование  Применение

         row           Строка вывода.

         col           Столбец вывода.

         title         Указатель на строку заголовка.

         attribute     Атрибут показа для строки заголовка 'title'.

Внимание!  Code Base  сохраняет только  указатель на строку заголовка.
           Следовательно, указатель  'title' не  должен  указывать  на
           временную (рабочую)  память. Если изменяется информация, на
           которую указывает 'title', то изменяется заголовок окна.

Пример     w_ref=w4define( 5,10, 10,20);
           w4border( DOUBLE, F_WHITE );
           /* Define a title to be centred over the top border row */
           w4title( 0,-1, "Data Entry Window ", B_WHITE );

                                -241-

w4width

Использование    int w4width( int new_width )

Описание   Устанавливает    и     возвращает    количество  столбцов в
           строке  текущего  окна.

           Вызов функции 'w4width' не влияет на то, что было показанно
           на экране.  Однако, вся  память для  всплывающего окна  или
           сохраненого  окна  будет  освобождена  и  перераспределена.
           Следовательно,  следует  избегать  изменения  ширины  окна,
           когда выбранное окно является активным.

           Новая ширина  определяет только  те ряды  (строки), которые
           находятся внутри границ (бордюра) окна.

Параметры  Если параметр  'new_width' имеет  величину больше  нуля, он
           становится новым  количеством столбцов  в  строка  текущего
           окна.

Возврат    Функция 'w4width' возвращает текущую ширину окна.

Пример     void shrink_window( w_ref ){
           int prev_ref;

              prev_ref=w4select( w_ref );

              w4width( w4width(-1) -1 );
              w4height( w4height(-1) -1 );

              w4select( prev_ref );
           }

                                -242-

w4write

Использование    void w4write( int row, int col,
                           char *data_ptr, int len_data )

Описание   Записывает информацию  из буфера  памяти непосредственно  в
           видео-память. Информация в буфере памяти должна находится в
           формате видео-памяти - (символ, атрибут).

Параметры

         Наименование  Применение

         row           Строка экрана относительно ферхней строки.

         col           Столбец экрана относительно левого столбца.

         data_ptr      Указатель  на   буфер  памяти,   который  будет
                       записан.

         len_data      Количество байт,  которые будут  записаны.  Эта
                       величина    равна     удвоенному     количеству
                       записываемых   символов    экрана,   так    как
                       записывается также и атрибуты.

Замечание  Функция 'w4write'  противоположна функции 'w4read'. Обе эти
           функции являются  низко-уровневыми, и,  следовательно,  они
           используются другими фукциями управления окон Code Base.

Переносимость Данная функция 'w4write' недоступна в версии Code Base
           для операционных систем Unix/Xenix.

                                -243-

w4write_att

Использование    void w4write_att( int row, int col,
                           char *data_ptr,
                           int len_data, long attribute )

Описание   Аналогична функции  'w4write',  за  исключением  того,  что
           буфер данных data_buffer содержит только символьные данные.
           Все данные показываются с заданным символом атрибута.

Параметры

         Наименование  Применение

         row           Строка экрана относительно верхней строки.

         col           Столбец экрана относительно левого столбца.

         data_ptr      Указатель  на   буфер  памяти,   который  будет
                       записан.

         len_data      Количество  символов   данных,  которые   будут
                       записаны.  Эта   величина  таже   самая  что  и
                       количество байт данных.

         attribute     Это атрибут всех символов, которые выводятся.

Переносимость Функция 'w4write_att' недоступна в версии Code Base для
           операционных систем Unix/Xenix.

                               -244-

w4write_window

Использование    void w4write_window( window_ref, char *ptr )

Описание   Используется для  показа информации,  прочитанной  функцией
           'w4read_window'. Предполагается,  что размер  окна  не  был
           изменен. Кроме того, предполагается, что окно не получало и
           не изменяло рамку (границу).

Параметры

         Наименование  Применение

         window_ref    Номер указателя окна, которое будет показано.

         ptr           Указатель  на   область  памяти   где  хранится
                       выводимая информация. Должно иметься достаточно
                       пар (символ, атрибут) для заполнения всего окна
                       целиком.

Переносимость Данная функция недоступна в версии Code Base для
           операционных систам UNIX/Xenix.

Пример     #include 

           void copy_window(){
           int w_ref;
           char window_data[400];
              w_ref=w4define( 0,0, 9,19 );
              w4read_window( w_ref, window_data );
              w4close( w_ref );

           /* Display the information at row 15 */
              w_ref = w4define( 15,0, 24,19 );
              w4write_window( w_ref, window_data );
              w4close( w_ref );
           }

                                -245-

Расширенные Функции.

Расширенные функции  принадлежат к высокоуровневым программам работа с
базами данных. Эти функции могут служить в качестве примеров Code Base
более низкого  уровня. В  частности, 'x4sum',  'x4replace', 'x4list' и
'x4edit'. Другие расширенные функции могут служить примерами для более
опытных пользователей.

Функции 'x4seek,  'x4skip', 'x4top',  'x4go' и  'x4bottom'  используют
фильтрацию  и   отношения,  установленные   функциями   'x4relate'   и
'x4filter'.





x4blank

Использование    int x4blank()

Описание   Функция 'x4blank'  определяет, является  ли текущая  запись
           чистой   (пустой).   Данная   функция   является   примером
           программы,  которая может работать с функцией 'x4filter'.

Возвращает

         Величина      Значение

         1             Запись пустая.

         0             Запись не пустая.

Смотрмте также           'x4filter'

x4bottom

Использование    int x4bottom()

Описание   Данная функция анологична функции 'd4bottom', но, в отличие
           от последней, использует фильтрацию и отношение

                                -246-

x4copy

Использование    int x4copy ( char * new_base, long start_rec, int
                           safety )

Описание   Функция 'x4copy'  копирует базу данных в другую базу данных
           с   такой    же   структурой.   Она   использует   фильтры,
           установленные 'x4filter'.

Параметры

         Наименование  Использование

         new_base      Имя  новой   базы  данных.   Эта  база   данных
                       создается и в нее копируются записи.

         start_record  Записи с первой по 'start_rec-1' и текущей базе
                       данных  будут  игнорироваться.  Эти  записи  не
                       будут копироваться в новую базу данных.

         safety        Если  'safety'   не  ноль,  и  новая  база  уже
                       существует   функция   ничего   не   делает   и
                       возврашает код ошибки.

Возврат

         Значение      Значение

         >=0           Номер ссылки новой базы данных.

         -1            Ошибка

         -2            Какая-то из баз данных или один из их индексных
                       файлов  блокирован   и  стоит  флаг  'вернуться
                       немедленно'.

Dнимание!  Функция 'x4copy'  не поддерживает  файлы памяти.  Если база
           данных имеет поле памяти, не используйте с ней эту функцию.

Пример     rc=x4copy("new.dbf", 1L, 0);

                                -247-




x4filter

Использование    int x4filter( (*filter_routine() )

Описание   Функция 'x4filter' работает с функциями 'x4seek', 'x4skip',
           'x4top' и 'x4bottom' и ваыполняет отфильтровывание записей.

           К примеру  функция 'x4top' вызывает функцию 'd4top' и затем
           последовательно пропускает  базу данных  используя  функцию
           'x4skip', пока  не  будет  обнаружена  запись,  которая  не
           должна быть отфильтрована.

           Когда  вызывается  функция  'x4filter',  указанная  функция
           фильтрации  добавляется   в  список   функций   фильтрации,
           принадлежащих   текущей   базе   данных.   Каждая   функция
           фильтрации должна возвращать логическое целое число 'int' в
           соответствие со следующими правилами:

         Возвращает    Значение

         1             Отфильтровать запись.

         0             Использовать запись.

         -1            Ошибка

Параметры  Параметром является функция фильтрации.

Возврат    Величина  '(int)-1'  возвращается,  есл  нет  памяти.  Если
           функция 'u4error'  не была изменена, эта критическая ошибка
           не должна происходить.

Внимание!  Не читайте  условие возврата функций фильтрации Code Base в
           обратном порядке.  Не оставляйте  скобки, как  в 'x4filter(
           d4deleted())'.

Пример     /* Filter all deleted and blank records */
           x4filter( d4deleted ) ;
           x4filter( x4blank ) ;

           /* Remove the 'x4blank' filtering */
           x4filter_pop() ;

           /*Remove all of the filtering */
           x4filter_reset() ;

                               -248-

x4filter_do

Использование    int x4filter_do()

Описание   Функция 'x4filter_do' оценивает все функциии фильтрации для
           текущей  базы   данных,  определяя   ,   должна   ли   быть
           отфильтрована запись текущей базы данных

           Функция 'x4filter_do'  использует текущую  запись,  которая
           находится в буфере базы данных.

Возврат

         Возвращает    Значение

         1             Отфильтровать запись

         0             Использовать запись

         -1            Ошибка


x4filter_reset

Использование    void x4filter_reset()

Описание   Функция 'x4filter_reset'  удаляет  из  списка  все  функции
           фильтрации, принадлежащие текущей базе данных.

См. также  'x4filter'

                                -249-

x4filter_pop

Использование    int x4filter_pop ()

Описание   Функция  'x4filter_pop'   удаляет  (выталкивает)  последнюю
           определенную   функцию   фильтрации   из   списка   функций
           фильтрации, принадлежащих  текущей базе  данных. Если нужно
           удалить   несколько   функций   из   списка,   то   функция
           'x4filter_pop' может быть вызвана несколько раз.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            В текущей базе данных нет функций фильтрации


x4go

Использование    int x4go( long rec_num )

Описание   Данная функция  анологична функции  'd4go', за  исключением
           того, что в первой используются отношения.


                                -250-

x4insert

Использование    int x4insert( long rec_num )

Описание   Запись в  буфере записи  становится записью  'rec_num'. Все
           предыдущие записи  от записи 'rec_num' до конца базы данных
           копируются вперед  на одну  запись,  чтобы  вставить  новую
           запись.

Блокировка База данных блокируется.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Ошибка

Внимание!  Для больших баз данных, время выполнения функции может быть
           велико.

x4list

Использование    int x4list()

Описание   Функция  'x4list'  записывает  содержимое  базы  данных  на
           текущее   устройство    вывода.   мспользуется   фильтрация
           определенная 'x4filter'.

Возврат

         Величина      Значение

         0             Успешное выполнение

         -1            Ошибка

                                -251-

x4pack

Использование    int x4pack ( int safety )

Описание   'x4pack'  упаковывает   базу   данных   используя   фильтр,
           указанный функцией 'x4filter'.

           Используется следующий алгоритм:

           1. Вызывается  'x4copy' для копирования во временный файл с
           темже именем  как у текущей базы данных, а расширение файла
           с '.DBF' заменяется на '.BAK'.

           2. Текущая база данных удаляется.

           3.  Временная   база  данных  переименовывается  обратно  к
           исходному имени.

           4. Все индексные файлы базы переиндексируются.

Параметры  Етси 'safety'  равна истине,  функция возвращает  ошибку  в
           сучае когда временный файл уже существует.

Возврат

         Величина      Значение

         >=0           Номер указателя новой базы данных.

         -1            Ошибка

         -2            Какая-то база  данных или ее индексный файл был
                       ранее блокирован,  и выставлен  флаг 'вернуться
                       немедленно'.

Внимание!  Хорошо  сделать   копию  базы  данных  перед  вызовом  этой
           функции.

См. также  'x4filter', 'x4filter_reset', d4pack'

Пример     x4filter_reset() ;
           x4filter( d4deleted () ) ;

           /* In this case  'x4pack90' does the some thing as
              'd4pack' would. This is becouse the filtering
              is on 'deleted' records
           */
           rc = x4pack( 1 ) ;

                               -252-

x4relate

Использование    int x4relate( char *expt, int base_ref,
                           int index_ref, long miss_code )

Описание   Функция  'x4relate'  создает  отнашение  между  управляющей
           базой данных  и относящейся  к ней  базе данных.  Выбранная
           база  данных   становится  управляющей   базой  данных,   a
           определенная база данных становится связанной базой данных.
           После того, как управляющая база данных переразмещается при
           помощи расширенных  функций, таких, например, как 'x4seek',
           'x4top',  все   связанные   с   ней   базы   данных   будут
           переразмещены автоматически.

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

           Code Base  поддерживает рекурсивные  отношения. К  примеру,
           база A связана с базой B которая в свою очередь связывается
           с базой С. В результате, позиционирование базы данных A при
           помощи    функции     расширения    'x4go'    приведет    к
           позиционированию  в   базе  B   а  то   в  свою  очередь  к
           позиционированию в C.

Внимание   Если А  связана с  B и  B связана  с  A,  Code  Base  может
           зациклится, выполняя отношения.

Параметры

         Наименование  Использование

         expr          Выражение,  определяющее   либо  ключ,  который
                       ищется в индексном файле, либо номер записи.

         base_ref      Номер указателя  базы  данных,  соответствующий
                       связанной базе данных.

         index_ref     Номер     указателя      индексного      файла,
                       соответствующий индексному файлу связанной базы
                       данных. Если  'expr' определяет  номер  записи,
                       этот параметр должен быть '(int) 0'.

         miss_code     Этот код  определяет действие,  если запись  не
                       обнаружена:

                       Величина кода    Значение

                         0              Использовать чистую
                              (пустую) запись.

                         -1             Выдать сообщение об
                              ошибке.

                                -253-

                         >=1            Номер записи по
                              умолчанию.

Возврат

         Величина      Значение

         0             Устешное выполнение.

         -1            Ошибка.

x4relate_do

Использование    int x4relate_do()

Описание   Функция  'x4relate_do'   обрабатывает  все   отношения  для
           текущей базы данных.

Возврат

         Величина      Значение

         0             Успешное выполнение.

         -1            Ошибка.

См. также        x4relate

                               -254-

x4relate_reset

Использование    void x4relate_reset()

Описание   Функция 'x4relate_reset'  удаляет все отношения для текущей
           базы данных.

Возврат

         Величина      Значение

         0             Успешное выполнение.

         -1            Ошибка.

x4seek_double

Использование    x4seek_double (double d)

Описание   Функция 'x4seek_double' аналогична функции 'd4seek_double',
           но использует фильтрацию и отношения.






x4seek_str

Использование    x4seek_str (char *search_string)

Описание   Функция 'x4seek_str'  аналогична функции  'd4seek_str',  но
           использует фильтрацию и отношения.

                                -255-

x4skip

Использование    int x4skip( long num_records)

Описание   Функция 'x4skip' аналогична функции 'd4skip', но использует
           фильтрацию и отношения.

x4sort

Использование    int x4sort( char *new_base, char *expr,   long
                           start_rec int safety )

Описание   Функция 'x4sort' сортирует базу данных в другую базу данных
           с такой  же структурой.  В процессе сортировки используются
           имеющиеся фильтры и отношения.

Параметры

         Название      Использование

         new_base      Имя  новой   базы  данных.   База  создается  и
                       отсортированные записи записываются в нее.

         expr          Выражение по  которомы сортируется  новая  база
                       данных.

         stsrt_rec     Записи  с  первой  по  'start_rec-1'  не  будут
                       копироваться в новую базу.

         safety        Если 'safety'  не ноль,  и база  с именем новой
                       базы уже  существует, функция  ничего не делает
                       только возвращает код ошибки.

Возврат

         Величина      Значение

         >=0           Номер указателя новой базы данных

         -1            Ошибка

         -2            Кокаято база  или один  из ее  индексных файлов
                       уже  блокирован  и  выставлен  флаг  'вернуться
                       немедленно'.

Внимание!  Функция 'x4sort'  не поддерживает  поля памяти.  Если  база
           данных имеет поле памяти, не используйте эту функцию.

Пример     rc = x4sort( "PEOPLE.DBF", "LAST_NAME", 1L, 0);

                                -256-

x4sum

Использование    double x4sum (long field_ref)

Описание   Функция  'x4sum'   суммирует  поле,   определенное  номером
           указателя  поля.   Для  определения   того   какие   записи
           используются в суммировании, применяется фильтрация.

Возврат    Величина  суммирования   возвращается  как   двойное  число
           (double). Если происходит ошибка функция 'x4sum' возвращает
           '(double) 0.0'.

                                -257-

x4top

Использование    int x4top ()

Описание   Функция 'x4top'  анологична функции  'd4top', но использует
           фильтрацию и отношения.

                                -258-

                 Работа в многопользовательской среде



При паботе  с Code  Base в  однопользовательской среде,  вы можете  не
учитывать многопользовательские  аспекты функционирования  Code Base с
операционной систамой  OS/2 или  в сети  с несколькими  сеансами,  Вам
необходимо изучить средства поддержки многопользовательской среды Code
Base.

Если совместимисть  индексных файлов с DBASE не имеет значения, то для
много  пользовательских   прикладных  программ   будет   лучше   всего
использовать опцию  CLIPPER.  Это  обусловленно  тем,  что  Code  Base
работает быстрее с NTX файлами, если индексные файлы разблокируются, а
затем блокируются снова.

Code Base также совместима с протоколом блокирования и разблокирования
Clipper. Следовательно,  если прикладные программы Clipper и Code Base
выполняются в  сети  одновременно,  они  будут  'понимать'  блокировку
файлов и записей друг друга.

                                -259-

Блокирование и разблокирование

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

Выделение  (закрепление)  дисковой  информации  на  один  сеанс  носит
название 'блокирование'  (locking), а освобождение дисковой информации
для общего использования называется 'разблокированием' (unlocking).

Функции Code  Base регистрируют,  какие файлы  или части  файлов  были
блокированны   или    разблокированны.   Дисковая   информация   будет
автоматически блокирована Code Base перед тем как она записывается или
считывается.

Это  означает,   что  пользователю   Code   Base   необходимо   только
разблокировать  файлы   в   нужное   время.   Это   позволяет   другим
пользователям получать доступ к заблокированным до этого областям.

Заметим, что  Cobe Base  может блокировать одну запись базы данных или
всю  базу  целиком.  Эсли  необходимо  блокировать  несколько  записей
одновременно,   используйте    функцию   'd4lock'   для   блокирования
содержимого базы данных.


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

Байты подсчета записей

Байты подсчета записей определяют, сколько записей имеется в настоящее
время  в   базе  данных.   Эти  байты   могут  быть   блокированны   и
разблокированны подобно  обыкновенной записи  базы данных. Однако, так
как Code  Base блокирует и разблокирует байты подсчета записей, обычно
нет  необходимости  выполнять  блокирование  и  разблокирование  их  в
прикладных программах.

Code Base  подсчитывает количество  записей в базе данных на основании
длины файла.  Следовательно, байты  подсчета записей используются Code
Base только  тогда, когда  они обновляются  после изменения количества
записей базы данных.

Тупиковая ситуация

Необходимо избегать  возможности возникновения тупиковой ситуации. Эта
ситуация возникает  тогда, когда  два  сеанса  находятся  в  состоянии
взаимного неопределенного ожидания.

Вот  пример   такой  ситуации:  Сеанс  1  ожидает  файл  'A',  который
заблокирован  сеансом   2  и   сеанс  2   ожидает  файл  'B',  которые
заблокирован сеансом  1. Так как сеансы находятся в состоянии ожидания
друг друга, никаких действий произойти не может.

Простой способ, позволяющий избежать тупиковой ситуации, заключается в
том, чтобы все сеансы выполняли блокировки в одном и том же порядке. В
приведенном  примере   тупиковой  ситуации,   файл  'A'  может  всегда
блокироваться перед  файлом 'B'.  Тогда Сеанс  2 разблокирует файл 'B'
перед  попыткой   заблокировать  файл   'A'.  Сеанс   1  затем  сможет
заблокировать  файл   'B',  выполнить  необходимые  действия  и  затем
разблокировать файл для Сеанса 2.


Подсказка  Представляется важным  либо явно  разблокировать  индексные
           файлы, либо  выполнить разблокирование  при помощи  функции
           'd4unlock(-1)'.

                                -261-

                              Приложение



Приложение A - Внутренняя организация Code Base

Для того, чтобы понимать способ функционирования Code Base, необходимо
иметь представление  о внутренней  организации Code  Base. Однако, для
практического использования  этот аспект  не имеет  большого значения.
Понимание  внутренней   организации  Code  Base  поможет  Вам  изучить
исходный код  Code Base  и/или писать  свои собственные  программы для
библиотеки Code Base.

Формат буфера записей


Буфер записей  Code Base  использует  такой  же  формат  для  хранения
записей, что  dBASE для  хранения записей  на диске.  Они начинаются с
односимвольного флаго  удаления записи. Этот флаг, как правило, пустой
' ',  а звездочкой  '*' он  заполняется  в  том  случае,  если  запись
помечена на  удаление. За  флагом удаления идут все поля базы данных в
последовательном порядке. Специальных символов разграничивающих данные
полей, не имеется. К примеру, если первое поле базы данных имеет длину
3, онобудет  содержаться со  второго по четвертый байт буфера записей.
Второе поле будет хранится сразу же за первым полем.

Все типы  полей хранятся  как код  ASCII. Например,  числовое  поле  с
длиной 5  и 2-мя  десятичными  позициями  может  содержать  код  ASCII
'5.70'. Это будет расшифровано как пять целых семь десятых.


       Тип поля            Формат хранения

       Числовое            Выравненный по правому краю код ASCII.

       Число с плавающей

       запятой             То же, что и числовое поле.

       Поле даты           CCYYMMDD       (например:       '19811231')
                           (век, год, месяц, день).

       Логическое          'T', 't',  'Y' и  'y'  для  TRUE  (истинно)
                           'F', 'f', 'N' и 'n' для FALSE (дщжно).

       Поле примечаний     Десять    символов     в    коде     ASCII,
                           представляющих положение  в соответствующем
                           файле примечаний.


Номер указателя записи


Структура базы  данных типа  'BASE', содержит  член, который  является
указателем  на   массив  структуры  типа  '(FIELD  *)'.  Этот  массив,
определенный функцией  'd4use', содержит  всю информацию  по полям для
соответствующей  базы   данных.  Структура   поля  'FIELD'  определена
следующим образом:

                                -262-


           typedef struct
           {
              char name[11]; /* имя поля */
              int type; /* тип поля */
              char width; /* длина поля */
              int decimal; /* число десятичных позиций */
              int offset; /* смещение в буфере записи */
           } FIELD;


Номер  указателя   записи  представляет  собой  длинное  целое  число,
разбитое на  две части.  Два старших  байта содержат  номер  указателя
соответствующей базы  данных, а  два младших байта являются индексом в
массиве структур  '(FIELD *)'. Следовательно, исходный код для функции
'f4j_ref' выглядит следующим образом:


           long f4j_ref( j_ref )
           int j_ref;
           {
              if( j_ref >> f4num_fields() || j_ref<<1)
                   return( -1L );
              else
                   return( (long)v4cur_base << 16 |
                            (long) (j_ref-1) );
           }


Использование памяти Code Base


Все имена  внешних переменных  Code Base  начинаются с  'v4'.  Имеются
некоторые важные  переменные, которые  указывают на  массивы структур:
v4base, v4index,  v4block, v4window,  v4menu и  v4get. Каждая  из этих
структур  соответствует   базе  данных,   индексному  файлу,   вершине
двоичного дерева  B+ индексного  файла, окну,  пункту меню или области
ввода (чтения), соответственно.

Каждый из  массивов структур  Code Base управляется при помощи функций
обработки памяти  Code Base.  Это означает,  что, в том случае, если в
массиве  структур   будет  недостаточно  места  для  обработки  вызова
определенной функции, этот массив структур перераспределяется в памяти
большего объема. Как следствие этого, Code Base может использоваться с
неограниченным количеством  баз данных, индексных файлов, окон, меню и
областей  ввода.   Отметьте,  что   перераспределение   памяти   будет
происходить довольно-таки редко.

Функции обработки памяти Сode Base также поддерживают набор двусвязных
списков  для   кахдой  структуры   памяти.  Кроме  двусвязного  списка
неиспользованных элементов  массива структур,  каждый массив  структур
поддерживает следующие двусвязные списки:

                              -263-

       Массив структур     Использование двусвязного списка

       v4base              Использует двусвязный  список открытых  баз
                           данных. Номер  указателя  базы  данных  для
                           последней открытой  базы данных  содержится
                           во внешней  целой переменной 'v4last_base'.
                           Аналогично,  номер  указателя  для  текущей
                           выбранной базы данных содержится во внешней
                           целой переменной 'v4cur_base'.

       v4index             Для каждой  открытой базы  данных,  которая
                           имеет один  или несколько индексных файлов,
                           поддерживается двусвязный  список  открытых
                           индексных    файлов.     Номер    указателя
                           индексного файла,  для каждого дву связного
                           списка, сохраняется.  Этот номер  указателя
                           содержится в соответствующей структуре базы
                           данных.   Аналогично,    номер    указателя
                           текущего выбранного  индексного файла также
                           сохраняется. Смотри структуры типа 'BASE' и
                           'INDEX',  которые   определяются  в   файле
                           заголовка 'd4base.h'.

       v4block             Для  каждого   индексного   файла   имеется
                           двусвязный список  вершин двоичного  дерева
                           индексного  файла.   Номер  указателя   для
                           каждого   из    этих   двусвязных   списков
                           содержится  в   соответствующей   структуре
                           индексного файла.

       v4window            Имеется один двусвязный список определенных
                           окон.   Номера   указателей   для   первого
                           определенного, последнего  определенного  и
                           текущего  выбранного   окна  содержатся  во
                           внешних целых  переменных 'v4first_window',
                           'v4last_window'      и      'v4cur_window',
                           соответственно.   По    мере   того,    как
                           активируются  окна,   порядок  в  связанном
                           списке меняется:  он становится порядком, в
                           котором активируются окна.

       v4menu              Для каждого  окна, которое  содержит  меню,
                           имеется  двусвязный  список  пунктов  меню.
                           Номера указателей  на  первый  и  последний
                           определенный пункт  меню,  для  меню  окна,
                           содержатся  в   соответствующей   структуре
                           окна. Смотри файл заголовка 'w4.h'.

       v4get               Для каждого  окна, в  котором имеется  одна
                           или  несколько   областей  ввода  (чтения),
                           имеется двусвязный  список структур  чтения
                           (структур   get).    Номер   указателя   на
                           последнюю определенную  область ввода,  для
                           окна,    содержится    в    соответствующей
                           структуре  окна.   Смотри  файл   заголовка
                           'w4.h'.

                                -264-

Все  номера  указателей,  кроме  номеров  указателей  полей,  являются
индексами в  соответсвующих массивах структур. Например, когда функция
'd4use' вызывается  первый раз,  она возвращает  номер указателя  базы
данных '(int)0'.  Это  означает,  что  элемент  структуры  'v4base[0]'
содержит  информацию   об  этой  базе  данных.  Исходный  код  функции
'd4recno'  помогает   понять,  каким   образом   используются   номера
указателей (ссылок):


           long recno()
           {
           /* 'v4cur_base' is the currently selected database
           reference number */
              if( v4base[ v4cur_base ].rec_num <= 0 )
                   return( 0L );
              else
                   return(  v4base[ v4cur_base ].rec_num );
           }


Двусвязные списки,  о которых  было  рассказано  выше,  поддерживаются
посредством определения  первых двух  членов каждого  массива структур
как следующего и предыдущего номера указателя, соответственно. Так как
номера ссылок  являются целыми  числами,  двусвязные  списки  остаются
неизменными при  перераспределении структуры  памяти. Кроме того, если
копии структур  памяти  записываются  на  диск,  а  затем  считываются
обратно, то  двусвязные  списки  также  поддерживаются.  Это  свойство
используется редактором dBEditor, созданным компанией Sequter.

Номер  указателя  '(int)-1'  означает,  что  элемента  структуры  нет.
Например, если  переменная 'v4last_base'  равна '(int)-1', то открытых
баз данных  нет. Аналогично,  если имеется  одна открытая база данных,
'v4base[v4last_base].prev' равна  '(int)-1', так как двусвязный список
открытых баз данных будет иметь только один элемент.

                                -265-

Приложение B - Сообщения об ошибках

Code Base  посылает все сообщения об ошибках при помощи одной функции,
-  'u4error'   -  которая   записывает  сообщения   об  ошибках  затем
устанавливает глобальный код ошибки: 'extern int v4error'.

Следовательно, Вы  можете легко  отладить свою  собственную  программу
обработки ошибок посредством изменения функции Code Base 'u4error'

Всегда,  когда   происходит  ошибка,   Code  Base    вызывает  функцию
'u4error'. Как правило, возврат из функции обработки ошибки происходит
всегда,  хотя   некоторые  критические  ошибки,  вызывают  немедленную
остановку Code Base.

Далее приводится полный список сообщений об ошибках. Ошибки приводятся
в порядке возрастания номеров.

Общие ошибки доступа к диску

         100           Создание Файла ( Creating File )

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

         120           Открытие Файла ( Opening File )

                       Данная  проблема,   как   правило,   вызывается
                       попыткой открыть  не существующий  файл. Другая
                       возможная причина  состоит  в  попытке  открыть
                       больше    файлов,    чем    может    обработать
                       операционная система. Если в файле конфигурации
                       'config.sys'    определена  строка  'files=20',
                       операционная система  DOS  сможет  поддерживать
                       обработку до 20 открытых файлов.

         140           Чтение из файла ( Reading File )

                       Ошибка при  чтении  файла  может  быть  вызвана
                       сбоем на диске.

         000           Поиск позиции в файле

         160           Запись в файл ( Writing File )

                       Эта  ошибка  происходит,  когда  на  диске  нет
                       свободного места

         180           Закрытие файла ( Closing File )

                       Ошибка произошла при попытке закрыть файл

         190           Удаление файла ( Removing File )

                       Ошибка произошла  при удалении файла. Например,
                       в 'x4pack',  файл копируется  в новый, оригинал

                                -266-

                       удаляется, а  новый переименовывается обратно в
                       имя оригинального файла.

Ошибки, связанные с базой данных

         200           Файл    не   есть     база  данных ( File not a
                       Database )

                       Данная ошибка  происходит когда функция 'd4use'
                       пытается  открыть  файл,  который  не  является
                       базой данных.

         240           Нет открытой базы данных ( No Open Database )

                       Откройте  базу   данных  при   помощи   функций
                       'd4create' или  'd4use' перед тем, как вызывать
                       функцию управления базой данных.

         260           Длина записи  слишком велика ( Record Length is
                       Too Lage )

                       Максимальная длина записи равна 32666 байт.

         270           Неизвестное поле ( Unrecognized Field Name )

                       База  данных   не  содержит  специфицированного
                       имени поля.

         300           Создание индексного файл  ( Building Index File
                       )

                       Либо не  хватает памяти,  либо  в  базе  данных
                       находится слишком много записей для индексации.
                       Попробуйте использовать большую модель памяти.

         310           Закрытие индексного  файла ( Closing Index File
                       )

                       Эта ошибка  означает, что функции 'i4close' был
                       передан неправильный номер указателя индексного
                       файла, или то, что этот индексный файл не может
                       быть закрыт.

         320           Файл не индексный ( File is not an Index File)

                       Данная   ошибка   происходит,   когда   функция
                       'i4open'  пытается  открыть  файл,  который  не
                       является  допустимым   индексным   файлом   для
                       соответствующей базы данных.

         330           В индексном  файле нет  ключа для  существующей
                       записи (Index File is out of Date )

                       Ключ    индексного    файла,    соответствующий
                       существующей записи базы данных, отсутствует.

                                -267-

         335           Нет записи  указанной в индексном файле ( Index
                       File Record does not Exist )

                       Индексный файл  указывает на запись которой нет
                       в базе данных. Требуется перестройка индексного
                       файла.

         340           Ключ не уникален (  Key is not Unique )

                       Когда создается  индексный  файл  с  включенным
                       флагом  уникальности   'Unique',  все  ключи  в
                       индексном файле  должны быть уникальны. попытка
                       добавить  второй   ключ  с   той  же  величиной
                       приводит к появлению этой ошибки.

                       Это   сообщение   можно   подавить,   установив
                       переменную 'v4unique_error',  как '(int)0)'.  В
                       этом  случае   индексные  файлы  с  уникальными
                       ключами  будут   создаваться  и  поддерживаться
                       только с одной версией каждого ключа.

         350           Ключ оценен  как  логический  результат  (  Key
                       Evaluates to Logical Result )

                       Для   индексных    файлов   допустимы    только
                       символьные, числовые и ключи даты.

         360           Изменился тип  ключа или  его длина (Key Length
                       or Type has Changed )

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

         370           Длина ключа  более 100  символов (   Key Length
                       over 100 Characters )

                       Максималькая длина  ключа для  индексного файла
                       ограничена  100   символами.  Эта  длина  ключа
                       определяется выражением, соответствующему ключу
                       индексного файла.

         380           Поиск в  базе без  индексного файла  (  Seek on
                       Database with no Index File )

                       Функция 'd4seek'  может работать только с базой
                       донных, которая имеет соответствующий индексный
                       файл.

                       Функции 'i4select'  был передан номер указателя
                       , который  не соответствует никакому индексному
                       файлу.

         000           Ошибочное количество  параметров в  выражении (
                       Wrong Number of Parameters in Expression )

                                -268-

Ошибки, связанные с работой в многопользовательской среде

         400           Блокировка файла ( Locking a File )

                       Проблема возникла  при  блокировки  файла  базы
                       данных или индексного файла.

         450           Разблокировка файла ( Unlocking a File )

                       Проблема  возникла  при  разблокировании  файла
                       базы данных или индексного файла.


Ошибки, связанные с оценкой выражений

         500           База  данных  не  обнаружена  во  время  оценки
                       выражения  (   Database   not   Located   while
                       Evaluating Expression )

                       Не  обнаружена   база   данных,   указанная   в
                       выражении.

         510           Выполнение пустого  выражения (  Executing Null
                       Expression )

                       Функции  'e4exec'  был  передан  пустой  (null)
                       указатель, который  должен был  быть указателем
                       на псевдо-компилированное выражение.

         515           Неправильная дата ( Illegal Date )

                       При  поиске   или  оценке  величины  даты  была
                       обнаружена неверная дата.

         520           При оценке  выражения ожидалось  ',' или  ')' (
                       Expecting   ','   or   ')'   while   Evaluating
                       Expression )

                       В выражении,  вероятно, отсутствует запятая или
                       правая круглая скобка.

         530           Выражение неполно  ( Expression is not Complete
                       )

                       Выражение не может быть оценено, так как оно не
                       является законченным выражением dBASE.

         540           Переполнение при  оценке выражения  (  Overflow
                       while Evaluating Expression )

                       Выраженгие слишком  большое или слишком сложное
                       для Code Base. Если происходит эта ошибка, Code
                       Base останавливает программу.

         550           Параметр или  оператор  имеет  неверный  тип  (
                       Parameter or Operator has the Wrong Type )

                       Такое сообщение  об  ошибке  даст,  к  примеру,
                       выражение  3+"A".   Оператор   '+'   не   может

                                -269-

                       прибавить три  к букве  "A", так  как последнее
                       принадлежит к типу символ, а не число.

                       Выражение 'substr(33,1,4)' также вызовет данное
                       сообщение об ошибке. В этом случае, параметр 33
                       имеет неверный  тип. Первым  параметром функции
                       'substr' должен быть символ.

         560           В выражении  отсутствует правая  скобка ( Right
                       Bracket Missing in Expression )

                       Проверьте   наличие   достаточного   количества
                       правых скобок в выражении.

         570           Неизвесная функция  в выражении  ( Unrecognized
                       Function in Expression )

                       Попытка  использовать   функцию,   которая   не
                       поддерживается Code  Base.  См.  Приложение  по
                       функциям.  Тщательно   проверьте   правильность
                       написания функции.

         575           Неизвестный оператор в выражении ( Unrecognized
                       Operator in Expression )

                       Code   Base    поддерживает   ряд   операторов,
                       например, '+' и '/'. Вы попытались использовать
                       оператор, который не поддерживается Code Base.

         580           Неизвестная величина в выражении ( Unrecognized
                       Value in Expression )

                       В  выражении   имеется  величина,   которая  не
                       является  полем,  строкой.  числом,  логической
                       величиной или функцией.

         590           Неоконченная строка  в выражении ( Unterminated
                       String in Expression )

                       Для  левых   кавычек  в   строке  символов  нет
                       соответствующего числа правых кавычек.

         595           Неверное количество  параметров в  выражении  (
                       Wrong Number of Parameters in Expression )

                       Функция или  оператор использована  с  неверным
                       количеством параметров.


Ошибки, связанные с файлами примечаний

         600           Редактирование примечаний  при помощи редактора
                       ( Editing Memo File with Editor )

                       Либо    отсутствует     указанная     программа
                       редактирования, либо  в памяти  нет  достаточно
                       места.

                                -270-

         620           Несоответствие имени  файла примечаний  (  Memo
                       File Name Inconsistency )

                       Либо Вы переименовали файл примечаний  dBASE IV
                       без вызова  функции 'm4renamen', либо функциями
                       управления  файлами  примечаний  dBASE  IV  был
                       использован файл примечаний не dBASE IV. Смотри
                       функцию 'm4convert'.

         640           Размер файла  примечаний превышает 32767 байт (
                       Memo File Entry is over 32767 Byte )

                       Максимальный  размер   файла  примечаний  равен
                       32767 байт.


Ошибки, связанные с окнами и меню

         700           Неправильный номер  указателя  окна  (  Illegal
                       Window Reference Number )

                       Неправильный номер  указателя окна  был передан
                       функции 'n4pulldown', 'n4calc', или 'n4lotus'.
Ошибки, связанные с отношениями

         800           Неправильная связанная  база данных  (  Illegal
                       Related Database )

                       При  определении   отношения  баз   данных,   в
                       качестве     соотносящейася  базы  данных  была
                       определена управляющая база данных.

         820           Отсутствует  управляющая   база  данных   (  No
                       Controlling Database )

                       При определении  отношения баз  данных, не была
                       определена правильная управляющая база данных.

         800           Связанные базы данных ( Relating Databases )

                       Ошибка     произошла     при     автоматическом
                       позиционировании соотносящейся базы данных.


Критические ошибки

         900           Нет памяти ( Out of Memory )

                       Сделана попытка распределить больше памяти, чем
                       возможно.

         920           Ошибка распределения памяти ( Memory Allocation
                       Error )

                       Сделана попытка распределить за один раз больше
                       чем 0xFFE0  байт памяти.  Причиной этой  ошибки
                       может  быть  открытие  черезмерного  количества

                                -271-

                       файлов или наличие слишком большого числа окон,
                       областей ввода или блоков индексных файлов.



         950           Затертая память ( Overwritten Memory )

                       Сбои  при   проведении  Code   Base  внутренней
                       проверки.   Эта    ошибка   произошла,    когда
                       прикладная программа  затерла  память,  которую
                       использует Code Base.

         980           Нет окна вывода ошибок ( No Error Window )

                       Когда   фукнция    'd4init'   или    'w4define'
                       вызываются  впервые,   определяется   окно   по
                       умолчанию.  Данная   ошибка  происходит  в  том
                       случае, когда была вызвана функция 'u4error', а
                       окна по умолчанию еще не было определено.


Ошибки, связанные с сортировкой

         1000          Нет памяти  для сортировки  ( Not Enough Memory
                       to Sort )

                       Суммарная память  распределенная для сортировки
                       не достаточна. Смотри 'd4buf_init'.

         1010          Слишком много  сортируемых записей  ( Too  Many
                       Records in Sort )

                       Число   сортируемых      записеи   больше   чем
                       указывалось вначале.

                                -272-

Приложение D - Выражения Code Base

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

Общая информация о выражений


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

Одной из обычных форм выражения является имя поля. В данном случае тип
выражения совпадает с типом поля.

Имена полей,  константы и  функции могут  быть использованы  как части
выражения.  Эти  части  могут  быть  объеденены  с  другими  функциями
посредством операторов.

Константы выражений


Выражения могут содержать числовые, символьные и логические константы.
Однако, выражения,  являющиеся константами,  обычно  бывают  не  очень
полезны.  Константы,   как  правило,  испрользыются  в  более  сложном
выражении.

Числовая  константа   представляет  собой   число.  Примером  числовых
констант могут быть 5, 7.3 и -18.

Символьные константы  представляются буквами  заключенными в  кавычки.
Примером символьных  констант могут  быть: "This  is data",  'This  is
data' и "John Smith". Если вы хотите определить символьную константу с
одинарными  или   двойными  кавычками   внутри  нее,  используйте  для
обозначения  этой   константы,  другие   кавычки,  чем   те,   которые
встречаются внутри символьной константы, например: '"OK"' или "Man's".

Единственными допустимыми  логическими константами  являются .TRUE.  и
.FALSE. допустимы сокращения - .T. и .F..

Операторы выражений


Для  манипулирования  константами  и  полями  используются  операторы,
например '+','*'  или '<'.  Примером выражения,  где оператор сложения
действует  над  двумя  числовыми  константами  и  возвращает  числовую
величину 11, является выражение 3+8.

Величины, над  которыми выполняет действия оператор, должны иметь тип,
соответствующий  этому   оператору.  Например   оператор  деления  (/)
совершает действия над двумя числовыми величинами.

Приоритет


Операторы обладают  приоритетом,  который  определяет  порядок  оценки
операторов. Приоритет  каждого  оператора  определяется  в  приводимых
далее  таблицах,  которые  описывают  различные  операторы.  Чем  выше

                                -273-

приоритет данного  оператора, тем раньше будет выполнен этот оператор.
К примеру,  оператор деления  имеет приоритет  6, а  оператор сложения
обладает приоритетом 5, это означает, что оператор деления оценивается
прежде оператора сложения. Следовательно, 1+4/2 равняется 3.

Порядок оценки  может быть  установлен явно  при помощи  использования
скобок. Например, 1+2*3 возвращает 7, а (1+2)*3 возвращает 9.

Числовые операторы

               Оператор    Символ      Приоритет

               Сложение    +           5

               Вычитание   -           5

               Умножение   *           6

               Деление     /           6

               Возведение

               в степень   ** или ^    7


Символьные операторы


Существует два  символьных оператора,  которые называются 'Объединение
I' и  'Объединение II',  они обединяют  две символьные  строки в одну.
Символьные операторы  отличаются от  числовых  операторов  сложения  и
вычитания типми величин, которыми они оперируют.
               Оператор    Символ      Приоритет

               Объеди-

               нение I     +           5

               Объеди-

               нение II    -           5


Примеры:

       "John   " + "Smith" становится "John   Smith"

       "ABC"+"DEF" становится "ABCDEF"

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

Примеры:

       "John   "-"Smith" становится "JohnSmith   "

       "ABC"-"DEF" становится "ABCDEF"

                                -274-

       "A  "-"D  " становится "AD    "

Операторы отношения


Операторами   отношения   являются   операторы,   которые   возвращают
логический результат (истина или ложь). Все операторы, кроме оператора
'Содержит', оперируют  числовыми, символьными  или данными  типа дата.
Оператор 'Содержит'  оперирует двумя  величинами  символьного  типа  и
возвращает TRUE (истина), если первая величина содержится во второй.


               Оператор    Символ      Приоритет

               Равно       =           4

               Не равно    <> или #    4

               Меньше      <           4

               Больше      >           4

               Меньше

               или =       <=          4

               Больше

               или =       >=          4

               Содержит    $           4


Пример:

       "CD"$"ABCD"     возвращает истинно (true)

       8<7     возвращает ложно (false)

Логические операторы


Логические  операторы  возвращают  логический  результат  и  совершают
операции над двумя логическими величинами.


               Оператор    Символ      Приоритет

               Нет         .NOT.       3

               Или         .AND.       2

               И           .OR.        1


Пример:

       .not. .t.       возвращает ложно

                                -275-

       .t. .and. .f.   возвращает ложно

Функции в выражениях


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

Внимание!

Это не  функции Си, которые вызываются непосредственно из программ Си.
Это функции  dBASE,  которые  распознаются  модулем  оценки  выражений
dBASE.

                                -276-

Список функций



CTOD( Char_Value )


Эта функция преобразует символьную величину в дату

       ctod( "19881130"  ) символьное  представление даты всегда имеет
формат "CCYYMMDD". Для использования другого представления используйте
функцию 'stod'.


DATE()


Возвращает системную дату.


DAY( Date_Value )


Возвращает число соответствующее дню заданной даты

Пример: day( date() ) Вернет 30 если день в дате тридцатое.


DEL()


Возвращает "*",  если текущая  запись базы  помечена  на  удаление.  В
противном случае возвращает " ".


DELETED()


Возвращает .TRUE. если текущая запись базы помечена на удаление.


DTOC( Date_Value )


Преобразует  величину   типа  дата   в  сивольный  эквивалент.  Формат
результата "MM/DD/YY"

dtoc( date() ) возвратит "05/30/87" если текущая дата 30 мая 1987.


DTOS( Date_Value )


Преобразует  величину   типа  дата   в  строковый  эквивалент.  Формат
результата "CCYYMMDD"

dtoc( date() ) возвратит "19870530" если текущая дата 30 мая 1987.

                                -277-

IIF( Log_Value, True_Result, False_Result )


Если Log_Value  равно  .TRUE.,  то  функция  IIF  возвращает  величину
True_Rezult иначе возвращается величина False_Rezult.

Пример:

       iif( value <0, 'Less then zero', 'Great then zero' )

       iif( name = 'John', 'The name is John', 'Not John' )


MONTH( Date_Value )


Возвращается числовое значение месяца заданной даты.

Пример:

       month( dt_field  ) возвратит 12 если в дате поля dt_field месяц
декабрь.


RECCOUNT()


Данная функция возвращает общее число записей в базе данных.

       reccount()      возвращает 10 если в текущей базе 10 записей.


RECNO()


Возвращает номер текущей записи текущей базы данных.


STOD( Char_Value )


Преобразует символьное представление даты в значение типа дата.

       stod( '19881130'  ) Символьное  представление даты должно иметь
формат "CCYYMMDD".


STR( Numbel, Length, Decimals )


Данная  функция   преобразует  числовую   величину  в   ее  символьное
отображение.  'Length'   определяет  количество  символов  в  выходной
строке,  включая  десятичный  знак.  'Decimal'  обозначает  количество
десятичных позиций  в новой  строке. Если это число слишком велико для
выделенного места, происходит заполнение строки символами (*).

Пример:

       str( 5.7, 4,2)  возвращает '5.70'

                                -278-

       str( 5.7, 3,2)  возвращает '***'

Число 5.7  не может  поместиться в  строке   длиной 3,  если в  строке
имеются две  десятичные позиции,  следовательно, возвращаются  символы
звездочки (*).


SUBSTR( Char_Value, Start_Position, Num_Chars )


Возвращает подстроку  заданной строки.  Возвращаемая  подстрока  будет
начинаться с 'Start_Posirtion'  и иметь длину 'Num_Char'.

Примеры:

       substr("ABCDE", 2,3) возвращает "BCD"

       substr("Mr. Smith", 5,1) возвращает "S"


TIME()


Данная функция  возвращает текущее  системное время  в виде символьной
строки. Строка имеет формат: 'HH:MM:SS'.

Примеры:

       time()  возвращает 12:00:00 если полдень

       time()  возвращает 13:30:00 если пол-второго


UPPER( Char_Value )


Преобразует строку символов в верхний регистр и возвращает результат.


VAL( Char_Value )


Преобразует строку в число.

Примеры:

       val( "10" )     возвращает 10

       val( "-8.7" )   возвращает -8.7


YEAR( Date_Value )


Возвращается числовое значение года заданной даты.

Примеры:

       year( date() )  возвращает 1990 если текущий год 1990.

                                 -279-

Приложение D - Построение библиотек

Файлы используемые  для построения  Code Base  библиотек содержаться в
соответствующих директириях библиотек.

Компилятор     Имя директории

Turbo C        TC

Microsoft C    MSC

Quick C        MSC

Zortech C++    ZORTECH

Watcom C 386   WATCOM

Для Watcom  C 386  и Zortech C++ имеется дополнительная документация о
том как  построить библиотеку  в файлах 'watcom.doc' и 'zortech.doc' в
соответствующих директориях.

Для Turbo C и Microsoft C используются следующие файлы:
       Файл                Назначение

       T4.bat              для   компиляции    файлов   и   построения
                           совместимой с Turbo C библиотеки 'T4.LIB'

       M4.bat              для   компиляции    файлов   и   построения
                           совместимой  с   Microsoft  C   и  Quick  C
                           библиотеки 'M4.LIB'

       M4                  Входной  файл   для  программы   построения
                           библиотек 'lib.exe'. Этот файл используется
                           командным файлом 'M4.bat'.


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

1. Сотрите все имеющиеся об`ектные модули Code Base:

       erase ?4*.obj

2.  Скопируйте   исходные  файлы   Code  Base  с  исходной  дискеты  в
соответствующий каталог вашего жесткого диска.

Файлы 'w4asm.obj' и 'w4asm.asm' также копируются. 'w4asm.obj' содержит
коды управления для CGA дисплейного адаптера.

       copy a:\source\*.* c:\c

3. Скопируйте файлы заголовка на свой винчестер.

       copy a:\h\*.h c:\c\include

4. Скопируйте  соответствующие командные файлы. Эти файлы находятся на
библиотечных дискетах  Code Base.  Заметьте, что  готовые  библиотеки,
которые используются  как для  Quick C  так и  для Microsoft  C,  были

                                -280-

получены  при   помощи  оптимизирующего   компилятора  Microsoft  C  с
использованием полной оптимизации.

       copy a:\tc\t4.bat c:\c

       или

       copy a:\msc\m4.bat c:\c

       copy a:\msc\m4 c:\c

5.  Установите   опции  компилятора.  Опции  Quick  C  и  Microsoft  C
определяются в  файле 'm4.bat'.  Опции компиляции Turbo C определены в
файле  'turboc.cfg'.   Для  компиляции   с  использованием   Quick  C,
необходимо  изменить   файл  'm4.bat'  таким  образом,  чтобы  работал
компилятор 'QCL.EXE' а не компилятор Microsoft C 'CL.EXE'.

Более подробно, смотрите документацию по вашему компилятору.

6. Начанайте компиляцию и построение библиотек:

       t4 (выполнить t4.bat)

       или

       m4 (выполнить m4.bat)

7. Удалите полученные объектные файлы.

Переключатели компиляции Code Base


Code Base  имеет  три  категории  переключателей  компиляции.  Первая:
переключатели которые  изменяют исходный  код, настраивая Code Base на
на  соответствующий  поддерживаемый  Sequiter  компилятор.  Тогда  как
некоторые переключатели  конфигурируют Code  Base в  некотором  другом
направлении. И  последние, это  те переключатели, которые используются
для учета основных различий между компиляторами.

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

По умолчанию  Code Base совместима с dBASE файлами и DOS (версия 2.0 и
выше). Если  вы используете  Microsoft C,  Turbo C,  Zortech  C++  или
Watcom C, или UNIX, определите соответствующий переключатель:

                                -281-

Переключатели учета Компилятора


         Переключатель Действие

         MSC           Используйте этот  переключатель с  Microsoft C;
                       он используется  для уменьшения предупреждающих
                       сообщений.

         TURBO         Этот переключатель делает Code Base совместимым
                       с Turbo  C. Это необходимо в связи с некоторыми
                       различиями между  библиотеками выполнения Turbo
                       C  и   Microsoft  C.   Если  использован   этот
                       переключатель,   то   переключатель   'DO_LOCK'
                       определяется автоматически.

         UNIX          Этот ключ используется для UNIX компиляторов. В
                       основном используется  для указания  Code  Base
                       использовать  вызовы  'Curses'  для  управления
                       экраном. Кроме  того,  следующие  переключатели
                       определяются    автоматически:     'NO_CHSIZE',
                       'NO_POW',     'NO_SPAWNL',     'NO_FILELENGTH',
                       'NO_KBHIT',      'NO_REMOVE',      'NO_STRUPR',
                       'NO_STRLWR',     'NO_STRNICMP',      'VARARGS',
                       'PORTABLE'. Пользователи  операционной  системы
                       отличной  от   DOS  или   OS/2  должны   купить
                       специальную версию Code Base.

         WATCOM        Этот переключатель  используют, когда Code Base
                       компилируют Watcom C 386. Если использован этот
                       переключатель,   то   следующие   переключатели
                       определяется      автоматически:      'IS_386',
                       'NO_HUGE',  'NO_CHSIZE',   'NO_FILELENGTH',   и
                       'DO_LOCK'.

         ZORTECH       Этот переключатель  используют, когда Code Base
                       компилируют Zortech  C++. Если использован этот
                       переключатель,   то   следующие   переключатели
                       определяется     автоматически:      'NO_HUGE',
                       'NO_CHSIZE', 'NO_LOCK' и 'NO_STRNICMP'.

                                -282-

Переключатели конфигурирующие Code Base


         Переключатель Действие

         CLIPPER       Этот перключатель  используется для того, чтобы
                       сделать  Code  Base  совместимым  с  индексными
                       файлами NTX  Cliipper. Вне зависимости от того,
                       как установлен  этот переключатель,  Code  Base
                       будет совместимым с файлами данных как Clipper,
                       так и dBASE.

                       Когда  используются  индексные  файлы  Clipper,
                       функеции 'i4seek',  'i4go' 'i4add' и 'i4remove'
                       ожидают,    что     числовые    ключи     будут
                       отформатированы как  ASCII с начальными нулями.
                       Однако,  функции   высокого  уровня  управления
                       базой работают  идентично. Для  прямого  вызова
                       функций   'i4seek',    'i4go',   'i4add'    или
                       'i4remove', сначала  вызовите функцию  'c4dtok'
                       для  преобразования   'double'   в   правильный
                       формат.

         IS_386        Этот        переключатель         автоматически
                       устанавливается когда  Code Base используется с
                       WATCOM компилятором.

         LANGUAGE      Этот переключатель  используется для  поддержки
                       не-латинского алфавита.  Перед компиляцией Code
                       Base,  вам   необходимо  изменить   статический
                       символьный массив  'month' который  определен в
                       начале  файла   'c4.c'.  Это   список  названий
                       месяцев. К  тому же,  вы можете изменить массив
                       целых чисел  'v4map' который  определен в файле
                       'p4misc.c'.     Этот      массив     определяет
                       относительный  порядок   ASCII   символов.   По
                       умолчанию,    когда    'LANGUAGE'    определен,
                       используются  Германские  месяца  и  алфавитный
                       порядок.

         NO_HUGE       Code Base  может  использовать  ключевое  слово
                       'huge' применяя  буферизацию базы  и индексацию
                       больших индексных  файлов.  Этот  переключатель
                       запрещает   использование   'huge'.   'NO_HUGE'
                       автоматически устанавливается  когда Code  Base
                       используется с Watcom C 386 или Zortech C++. Он
                       должен также  использоваться с  Microsoft  C  и
                       Turbo C  когда используется  малая или  средняя
                       модель памяти.

         NOIO          Этот переключатель  удаляет из  Code  Base  все
                       указатели на функции управления экраном. Вместо
                       этого, стандартная библиотечная функция 'write'
                       посылает   вывод    на   стандартное   выходное
                       устройство. влияет  только на  функции в файлах
                       'u4error.c', 'd4init.c', и 'd4init_u.c'.

         OS2           Этот  ключ   используется  в  файлах  'w4.c'  и
                       'g4.c', так  что Code  Base  использует  вызовы

                                -283-

                       видео ввода/вывода  системы OS/2,  а не  вызовы
                       библиотечной функции 'int86'.

         SMALL         Из Code  Base удаляются  все ссылки  на функции
                       управления индексными  файлами.  Это  позволяет
                       создавать   прикладные    программы   с   очень
                       маленькими  файлами   EXE.  Если   выбран  этот
                       перектючатель,  нельзя   использовать   функции
                       работы  с   индексными   файлами,   расширенные
                       функции, и  следующие программы работы с базой:
                       'd4bottom', 'd4seek', 'd4skip', и 'd4top'.

         WINDOWS_L     Этот   переключатель   позволяет   использовать
                       функции управления  базой данных  Code Base для
                       средней или  малой модели  в Microsoft  Window.
                       Этот  переключатель   используется   в   модуле
                       распределения памяти  и в функции 'u4reeor'. Не
                       используйте   этот   переключатель   вместе   с
                       переключателем    'NOIO'.     Собирайте    свою
                       библиотеку с  дополнительными  ключами  которые
                       указаны в SDK.

         WINDOWS_G     Этот   переключатель   позволяет   использовать
                       функции управления  базой данных  Code Base для
                       большой компактной или огромной (huge) модели в
                       Microsoft Window.
Основные переключатели конфигурации

Вы  можете  изменить  использование  Code  Base  библиотечных  функций
поменяв файл  'p4misc.h'; это  смешанный файл заголовка переносимости.
Например, почти все Основные переключатели конфигурации определаются в
'p4misc.h' если определен переключатель компиляции 'UNIX'.

Программы,  заменяюшие  используемые  Code  Base,  находятся  в  файле
'p4misc.c'.  Эти   заменяющие  программы   определяются  только  когда
устанавливается соответствующий  переключатель компиляции,  такой  как
'NO_STRNICMP'.


         Переключатель Действие

         DO_LOCK       Программы  Code   Base  'u4lock'  и  'u4unlock'
                       вызывают  программы   'lock'  и   'unlock'   из
                       библиотеки  компилятора,   для   блокировки   и
                       разблокирования части файла.

         DO_LOCKING    Этот переключатель  автоматически  определяется
                       если  какой-либо   из  ключей   -'NO_LOCK'  или
                       'DO_LOCK'  -  определен.  Программы  Code  Base
                       'u4lock' и 'u4unlock' вызывают программы 'lock'
                       и  'unlock'   из  библиотеки  компилятора,  для
                       блокировки и разблокирования части файла.

         NO_CHSIZE     Code  Base   не  будет  использовань  программу
                       'chsize'. Соответственно, программы 'd4pack', и
                       'd4zap' будут  недоступными. Взамен используйте
                       программу  'x4pack'.   К  тому  же,  вам  лучше

                                -284-

                       использовать программу  'i4index'  пересоздавая
                       индексный файл, чем переиндексировать используя
                       'i4reindex'.

         NO_FILELENGTH Code Base  будет использовать  вызов  программы
                       'fstat'  dvtcnj   'filelength'  для   получения
                       размера файла.

         NO_LOCK       Code  Base   программы  'u4lock'  и  'u4unlock'
                       ничего не  делают и всегда возвращают ноль. Это
                       фактически   исключает    многопользовательские
                       возможности Code Base.

         NO_MEMMOVE    Code Base сама определяет программу 'memmove'

         NO_POW        Code  Base   не  использует   программу  'pow'.
                       Соответственно, модоль  оценки  выражений  Code
                       Base не распознает оператор dBASE '**' или '^'.

         NO_REMOVE     Code Base будет использовать программу 'unlink'
                       вместо программы 'erase' для удаления файлов.

         NO_SPAWNL     Code Base  не  использует  программу  'spawnl'.
                       Соответственно, Code  Base программы 'm4edit' и
                       'm3edit' будут недоступными.

         NO_STRLWR     Программа 'strlwr' определяется Code Base

         NO_STRUPR     Программа 'strupr' определяется CCode Base

         NO_STRNICMP   Программа 'strnicmp' определяется CCode Base

         PORTABLE      Некоторые устройства требуют чтобы long integer
                       были  выравнены   по  4   байта,  double   были
                       выравнены по  8 байт и так далее. В этом случае
                       вы должны компилировать с этим переключателем.

         VARARGS       По  умолчанию,   Code  Base  использует  ANSI C
                       соглашение   для    определения   программ    с
                       неопределенным  (variable)  числом  параметров.
                       Когда установлен  переключатель 'VARARGS', Code
                       Base использует Unix Sistem V соглашение.
Примеры:

Компиляция с Microsoft C и OS/2 используя большую модель памяти:

       cl -zl -DOS2 -AL -c ?4*.c

Переключатели '-Ox'  и '-Zl'  определяют  максимальную  оптимизацию  и
отсутствие информации, относящейся к автоматической загрузке библиотек
в получаемых объектных модулях. Эта информация не является необходимой
в библиотеке  Code Base,  так как  она будет  содержаться в  объектном
модуле прикладной программы.

Компиляция Microsoft C используя опцию Clipper.

       cl -Zl -DCLIPPER -AL -c ?4*.c

                                -285-

Для компиляции  с Turbo  C, используя  большую  модель  памяти,  опцию
совместимости Clipper  и логику  переполнения стека, файл конфигурации
'turboc.cfg' должен содержать следующее:

       -LC:\tc\lib -Ic:\tc\include -ml -c -DTURBO -DCLIPPER -N

Это предполагает,  что библиотечные файлы Turbo C находятся в каталоге
'c:\tc\lib',  а   файлы  заголовков   Turbo  C  находятся  в  каталоге
'c:\tc\include'.

                                -286-



 .Begin Table C.
 Изучение Code Base........................................1
    Основные термины.......................................1
    Понятие о базе данных..................................4
    Начало работы..........................................4
        Информация о компиляторах..........................5
        Установка Code Base ...............................7
        Запуск программы 'd4learn'.........................8
        Создание прикладных программ с использованием
                средств Code Base..........................8
    Общие проблемы.........................................9
    Список функций по категориям..........................11
        Управление базой..................................11
        Управление экраном................................12
 Описание подпрограмм.....................................14
    Функции Модификации/Редактирования (BROWSE/EDIT)......15
    Функции преобразования формата........................24
    Функции управления базой данных.......................35
    Работа с несколькими файлами..........................35
    Функции оценки выражений .............................83
    Функции для работы с полями...........................89
    Функции чтения.......................................110
    Функции управления памятью...........................136
    Функции работы с индексными файлами..................145
    Функции работы с полями памяти.......................169
    Функции работы с меню................................179
    Сервисные функции....................................210
    Функции работы с окнами..............................219
        Некоторые сведения об окнах......................220
        Пример использования функций управления окнами...221
    Расширенные Функции..................................249
 Работа в многопользовательской среде....................262
    Блокирование и разблокирование.......................263
    Байты подсчета записей...............................264
    Тупиковая ситуация...................................264
 Приложение..............................................265
    Приложение A - Внутренняя организация Code Base......265
        Формат буфера записей............................265
        Номер указателя записи...........................265
        Использование памяти Code Base...................266
    Приложение B - Сообщения об ошибках..................269
        Общие ошибки доступа к диску.....................269
        Ошибки, связанные с базой данных.................270
        Ошибки, связанные с работой в
                многопользовательской среде..............272
        Ошибки, связанные с оценкой выражений............272
        Ошибки, связанные с файлами примечаний...........274
        Ошибки, связанные с окнами и меню................274
        Ошибки, связанные с отношениями..................274
        Критические ошибки...............................275
        Ошибки, связанные с сортировкой..................275
    Приложение D - Выражения Code Base...................277
        Общая информация о выражений.....................277
        Константы выражений..............................277
        Операторы выражений..............................277
        Приоритет........................................277
        Числовые операторы...............................278

                                -287-

        Символьные операторы.............................278
        Операторы отношения..............................279
        Логические операторы.............................279
        Функции в выражениях.............................280
        Список функций...................................281
    Приложение D - Построение библиотек..................285
        Переключатели компиляции Code Base...............286

 .End Table C.



?????? ???????????