Dec 192017
SoftC library V2.0 A library of C functions which allow creation, manipulation , and access to dBase compatable files. Very useful and well documented shareware library supporting MS C and Turbo C. | |||
---|---|---|---|
File Name | File Size | Zip Size | Zip Type |
CLIPPER.C | 6925 | 2225 | deflated |
DBASE.C | 6860 | 2224 | deflated |
FOXBASE.C | 6892 | 2232 | deflated |
LICENSE.DOC | 9054 | 3100 | deflated |
MANUAL.DOC | 350940 | 55056 | deflated |
ORDER.DOC | 2545 | 765 | deflated |
SCDBL200.NG | 149424 | 28990 | deflated |
SCDMC50S.LIB | 138713 | 47473 | deflated |
SCDMC60S.LIB | 132057 | 46626 | deflated |
SCDTC20S.LIB | 158720 | 49976 | deflated |
SC_BASE.H | 24546 | 3162 | deflated |
SC_CLOCK.H | 8530 | 1271 | deflated |
SOFTC.H | 4877 | 1438 | deflated |
Download File SOFTC2.ZIP Here
Contents of the MANUAL.DOC file
SoftC Database Library
Reference Manual
Version 2.0
Manual and Software Copyright 1988, 1989, 1990
by
SoftC, Ltd.
16820 Third Street North East
Ham Lake, Minnesota 55304
Telephone (612) 434-6968 Fax (612) 780-8728
ALL RIGHTS RESERVED
This document describes version 2.0 of the SoftC Database
Library, released in July, 1990.
SoftC Database Library License Agreement
This License Agreement (Agreement) is between you (the
Customer) and SoftC, Ltd. (SoftC). The Agreement pertains
to the SoftC Database Library, including the object code
libraries, sample programs, source code (if provided), and
modifications and/or recompilations of the source code (the
Product), and the documentation.
In exchange for the non-exclusive right to use the Product,
the Customer agrees to the following terms.
OWNERSHIP AND LIMITED LICENSE: The Product is owned by SoftC
and is protected by applicable copyright laws and
international treaty provisions. Licensed GTDA. The
Customer is granted a non-exclusive license to use the
Product on a single computer system (i.e., with a single
CPU) or network node at a time.
COPYING AND USE: The Customer may make backup copies of the
Product, but may install and use the Product (including
modifications and/or recompilations of the software) on only
one computer or network node at a time. This means that the
Product may be used by any number of people and may be
freely moved from one computer location to another, so long
as there is no possibility of it being used at one location
while it is being used at another.
PRODUCT CODE AND DERIVATIVE WORKS: In exchange for the
benefit from having access to the Product the Customer
agrees to protect the copyright and other proprietary rights
of SoftC. Such protection includes, but is not limited to,
a) the Customer not disclosing the code (object and/or
source) and the way it functions to any party not bound by
this Agreement, b) the Customer not allowing any party not
bound by this Agreement to copy or use the Product or
documentation in violation of this Agreement and c) the
Customer may not disclose, allow disclosure, transmit, or
allow transmission, either directly or indirectly, of the
source code to any third party without the prior written
consent of SoftC. The Customer may modify and/or re-compile
the Product source code solely for the Customer's use. Such
modified and/or re-compiled versions, regardless of the
extent of the modifications or the compiler versions,
operating systems, or computer systems used, are part of the
same Product under this Agreement and shall remain the
property of SoftC subject to the same limitations upon
transfer or use as the original Product. The Customer may
reproduce and distribute application programs created using
the Product without additional licenses or fees. Any
2
modification of the Product source code resulting in an
application or derivative work intended for distribution
requires prior written permission from SoftC and may require
additional terms and fees.
TRANSFER: The Customer may transfer this Agreement and
Product along with all originals, any copies, and the
documentation to another party provided that such party
agrees in writing to be legally bound by these terms. The
Customer's rights shall terminate upon transfer and the
Customer agrees to discontinue immediately the use of and
destroy any and all retained copies of the Product upon
transfer. The software source code if provided under the
license is not transferrable.
LIMITED WARRANTY: The physical diskette(s) and physical
documentation are warranted to be free of defects in
materials and workmanship for a period of sixty (60) days
from the date of original purchase. For the same period,
the software is warranted against significant errors that
make it unusable for the operating system and compiler
version originally provided by SoftC. If the Customer
notifies SoftC within this 60 day period, SoftC will replace
any defective diskette and/or documentation. SoftC will
attempt to correct or help the Customer to avoid errors in
the software with efforts that SoftC believes suitable to
the problem, or at SoftC's option, authorize a refund of the
Customer's license fee. OTHER THAN THE FOREGOING
WARRANTIES, SOFTC, LTD. MAKES NO WARRANTIES, EXPRESS OR
IMPLIED, AND SPECIFICALLY DISCLAIMS ANY IMPLIED WARRANTIES
OF MERCHANTABILITY OR FITNESS FOR ANY PARTICULAR PURPOSE.
SoftC, Ltd. FURTHER RESERVES THE RIGHT TO MAKE CHANGES TO
THE SPECIFICATIONS OF THE PRODUCT WITHOUT OBLIGATION TO
NOTIFY ANY PERSON OR ORGANIZATION OF SUCH CHANGES.
LIMITATION OF LIABILITY: The Customer's sole remedies are
set forth in the warranty clause above. SoftC's liability
for damages shall not exceed SoftC's suggested retail price
for the Product. In no event will SoftC be liable for any
special, incidental or consequential damages even if SoftC
has been advised of the possibility of the same.
SUPPORT: Product support, updates, fixes, enhancements, if
and as they become available, may be offered for a separate
charge, but SoftC has no obligation to provide any such
support, updates, fixes, or enhancements to the Product.
SoftC may at its sole discretion provide or discontinue
support to specific customers on separate terms determined
solely by SoftC.
3
EXPORT: The Customer agrees not to allow the Product or
applications created using the Product to be sent to or used
in any other country except in compliance with applicable
U.S. laws and regulations. If the Customer needs advice on
such export laws and regulations, the Customer shall contact
the U.S. Department of Commerce, Export Division,
Washington, DC 20230, U.S.A. for clarification.
LICENSE TERMINATION: This Agreement shall terminate upon
the transfer of the Product or upon breach of any term of
this Agreement by the Customer. The Customer shall cease
use of the Product upon termination. In the event that
Customer has received source code for the Product, upon
written request by SoftC, Customer shall provide written
certification by an officer of Customer that all copies of
the source code have been returned or destroyed.
GOVERNING LAW: This Agreement shall be governed by the laws
of the State of Minnesota. If any provision of this
Agreement is found void, invalid, or unenforceable, it will
not affect the validity of the balance of the Agreement,
which shall remain valid and enforceable according to its
terms. In the event any remedy herein is determined to have
failed of its essential purpose, all limitations of
liability and exclusion of damages set forth herein shall
remain in full force and effect. This Agreement may be
modified only in writing by the Customer and an authorized
representative of SoftC. Reasonable attorneys' fees and
court costs shall be awarded to the prevailing party in any
action brought in connection with an alleged breach of the
terms of this Agreement.
U.S. GOVERNMENT RESTRICTED RIGHTS: The software and
documentation are provided with RESTRICTED RIGHTS. Use,
duplication, or disclosure by the Government is subject to
restrictions as set forth in subparagraph (c)(1)(ii) of the
Rights in Technical Data and Computer Software clause at
52.227-7013. Contractor/manufacturer is SoftC, Ltd.
ACCEPTANCE OF AGREEMENT: The licensed use of the Product is
expressly conditioned upon the Customer's acceptance of
these terms. The Customer may accept these terms only by
signing and returning the Registration Form. SoftC's
acceptance of these terms is represented by shipment of the
Product.
4
Table Of Contents
Chapter 1 Introduction..........................................1
Registration.................................................1
Shareware....................................................2
Typographic Conventions......................................2
Trademarks...................................................3
Support and Updates..........................................3
Chapter 2 Before You Begin......................................4
The READ.ME File.............................................4
Library Files................................................4
Installing SoftC on Your System..............................6
SoftC Applications...........................................6
Compiling with Turbo C.......................................7
Compiling with Microsoft C...................................8
Compiling with Quick C.......................................8
Recompiling the Database Libraries...........................8
Function Naming Conventions..................................9
Chapter 3 A Database Tutorial..................................10
Sequential Files............................................10
Random Access Files.........................................10
Keys........................................................11
ISAM........................................................11
Binary Trees................................................11
B- and B+ Trees.............................................11
Chapter 4 Database Functions...................................13
dBASE Data File Functions...................................13
dBASE Data Record I/O.......................................14
dBASE Data Field I/O........................................15
File Sharing Functions......................................15
dBASEIII Memo File Functions................................16
dBASE Index File Functions..................................16
dBASE Index Page Functions..................................17
dBASE Index Key Functions...................................17
Clipper Index Functions.....................................18
FoxBASE+ Index Functions....................................18
Chapter 5 Clock & Calendar Functions...........................19
Conversion to String........................................19
Conversion to Integers......................................19
Conversion to Long Integer..................................19
Day of Week Conversions.....................................20
Month Conversions...........................................20
Date String Calculations....................................20
Date Validation and Testing.................................20
Get Current Date from DOS...................................20
Time String to Numeric Conversion...........................20
Time Numeric to String Conversion...........................20
Time String Calculations....................................21
v
TABLE OF CONTENTS
Time Validation.............................................21
Get Current Time from DOS...................................21
Chapter 6 Miscellaneous Functions..............................22
Program Initialization......................................22
Program Termination.........................................22
Library Version.............................................22
Default Date String Format..................................22
Errors and Warnings.........................................22
Chapter 7 Sharing Files on a LAN...............................24
Updating a Data Record......................................24
Adding or Removing a Data Record............................25
Chapter 8 The SoftC Database Library...........................27
sccdi2l.....................................................29
sccdi2s.....................................................30
sccdiget....................................................31
sccdileap...................................................32
sccdiperm...................................................33
sccdl2dow...................................................34
sccdl2i.....................................................35
sccdl2sx....................................................36
sccds2day...................................................37
sccds2dow...................................................38
sccds2i.....................................................39
sccds2lx....................................................40
sccds2mon...................................................41
sccds2s.....................................................42
sccdsday....................................................43
sccdsdiff...................................................44
sccdsget....................................................45
sccdsleap...................................................46
sccdsmonth..................................................47
sccdsperm...................................................48
sccdsvalid..................................................49
sccti2s.....................................................50
scctiget....................................................51
sccts2i.....................................................52
scctsdiff...................................................53
scctsget....................................................54
scctsvalid..................................................55
scdcbfrsz...................................................56
scdcclose...................................................58
scdccreate..................................................59
scdcexpr....................................................61
scdcflush...................................................63
scdcindex...................................................65
scdcinfo....................................................66
scdckadd....................................................68
scdckbot....................................................70
vi
TABLE OF CONTENTS
scdckcur....................................................72
scdckdel....................................................74
scdckfind...................................................76
scdckmake...................................................78
scdcknext...................................................81
scdckprev...................................................83
scdcktop....................................................85
scdcopenx...................................................87
scddbfrsz...................................................89
scddbof.....................................................91
scddclose...................................................92
scddcreate..................................................93
scddeof.....................................................96
scddfget....................................................97
scddfgets...................................................99
scddfinfo..................................................101
scddflush..................................................103
scddfnam2no................................................104
scddfput...................................................105
scddfputs..................................................107
scddinfo...................................................109
scddlock...................................................111
scddlud....................................................113
scddopenx..................................................114
scddpack...................................................116
scddrclear.................................................117
scddrdel...................................................118
scddrget...................................................119
scddrinfo..................................................120
scddrlock..................................................121
scddrnum...................................................123
scddrput...................................................124
scddrstat..................................................126
scddrundel.................................................127
scddsize...................................................128
scddunlock.................................................129
scdibfrsz..................................................131
scdiclose..................................................133
scdicreate.................................................134
scdiexpr...................................................136
scdiflush..................................................138
scdiindex..................................................140
scdiinfo...................................................141
scdikadd...................................................143
scdikbot...................................................145
scdikcur...................................................147
scdikdate..................................................149
scdikdel...................................................151
scdikfind..................................................153
scdikmake..................................................155
scdiknext..................................................158
vii
TABLE OF CONTENTS
scdiknum...................................................160
scdikprev..................................................161
scdiktop...................................................163
scdinit....................................................165
scdiopenx..................................................167
scdnbfrsz..................................................169
scdnclose..................................................171
scdncreate.................................................172
scdnexpr...................................................174
scdnflush..................................................176
scdnindex..................................................178
scdninfo...................................................179
scdnkadd...................................................181
scdnkbot...................................................183
scdnkcur...................................................185
scdnkdate..................................................187
scdnkdel...................................................188
scdnkfind..................................................190
scdnkmake..................................................192
scdnknext..................................................195
scdnkprev..................................................197
scdnktop...................................................199
scdnopenx..................................................201
scdtclose..................................................203
scdtcreate.................................................204
scdterm....................................................205
scdtinfo...................................................206
scdtopenx..................................................207
scdtpack...................................................209
scdtrget...................................................210
scdtrput...................................................212
sceclr.....................................................214
scemsg.....................................................215
Appendix A Result Codes and Messages..........................216
Warning Codes and Messages.................................216
Error Codes and Messages...................................217
Other Messages.............................................224
Appendix B Diskette TOC Demo Program..........................225
Index.........................................................227
viii
Chapter 1
Introduction
C is generally considered to be a "bare-bones" language. A
way to put some flesh on those bones is to develop
generalized functions (extensions) which may be reused in
many programs. The presence of these functions can make
programming a quick and simple task. The absence of these
language extensions can mean many hours lost "re-inventing
the wheel".
Few programmers have the time required to develop and debug
such a library of functions. This is where the SoftC
Database Library comes in. This library is a collection of
functions designed to make your applications quicker and
easier to code and test. With the library you can spend time
on your application not on developing tools.
The SoftC Database Library adds powerful capabilities to
your function library:
- data, memo, and index file access functions for:
dBASE III, Clipper, FoxBASE+
- dBASEIV data file functions
- date and time manipulation and calculation
The SoftC Database Library is intended for use as a
supplement to your compiler's object libraries. It contains
120 user functions. The primary purpose of the library is to
provide completely compatible access to dBASE data, memo,
and index files. The clock/calendar functions have been
added to enhance the core dBASE routines. The library is
currently available for Microsoft C 5.x and 6.0, Quick C
1.0/2.0, and Turbo C 2.0. These routines are written
entirely in C.
Registration
If you find this library useful, you are encouraged to
register. Refer to ORDER.DOC for registration fees. To
register, read the license agreement, print the file
1
CHAPTER 1, INTRODUCTION
ORDER.DOC, and mail the completed form and appropriate fees
to:
SoftC, Ltd.
16820 Third Street N.E.
Ham Lake, MN 55304-4703 USA
Shareware
This library is "shareware" (user supported software) NOT
"public domain", which means that the SoftC Database
Library (including the demonstration programs - SOFTC200.EXE
and SOFTC200.ZIP) are the copyrighted property of SoftC,
Ltd. Registered users are legally bound by the terms and
conditions set forth in the license agreement. Everyone is
granted the right to make copies and to freely share the
UNMODIFIED demonstration programs.
The shareware concept is an attempt to provide useful
software at low cost. The expense of offering a new product
by conventional means is quite high and thus discourages
many independent authors and small companies from developing
and promoting their ideas. Shareware is an attempt to
develop a new marketing channel where products can be
introduced at minimum cost.
Everyone will benefit if shareware works. The user benefits
by having quality products at low cost, and by being able to
test software thoroughly before purchasing it. The author
benefits by being able to enter the commercial software
market without the need of large amounts of venture capital.
But it can only work with your support. If you obtain a user
supported product from a friend or coworker, and are still
using it after a few weeks, then it is obviously worth
something to you and you should register it.
Typographic Conventions
[] Square brackets enclose optional data.
Boldface SoftC Database Library function names (such
as scdinit) and structure names when they
appear in text (but not in program examples).
Underline indicate variable name "identifiers" which
appear in text.
2
CHAPTER 1, INTRODUCTION
Trademarks
Clipper is a registered trademark of Nantucket Software.
dBASE, dBASEIII, and dBASEIV are registered trademarks of
Ashton-Tate.
FoxBASE+ is a registered trademark of Fox Software.
Microsoft is a registered trademark of Microsoft
Corporation.
R&R Relational Report Writer is a registered trademark of
Concentric Data.
SoftC is a trademark of SoftC, Ltd.
Turbo C is a registered trademark of Borland International.
Support and Updates
Technical advice and technical support will be offered to
registered users only. Registered users will also be
notified when updates and new products are available.
We can be contacted by:
mail SoftC, Ltd.
16820 Third Street N.E.
Ham Lake, MN 55304-4703 USA
telephone (612) 434-6968
after 6pm Central Time
modem at above number (use voice first so that we
can set up the modem).
GEnie "K.SCHUMANN"
CompuServ 73667,3420.
3
Chapter 2
Before You Begin
This chapter supplies instructions for installing the
library on your hard disk and compiling the source.
The READ.ME File
For last minute update information not contained in this
documentation, and/or a brief description of what's new with
this release please read the READ.ME file.
Library Files
The SoftC Database Library is distributed in several archive
files. The demonstration package (SOFTC200.EXE or
SOFTC200.ZIP) contains twelve (12) files (you are encouraged
to freely share this completely unmodified program with
others):
CLIPPER.C DBASE.C FOXBASE.C
LICENSE.DOC MANUAL.DOC ORDER.DOC
SC_BASE.H SC_CLOCK.H SOFTC.H
SCDMC50S.LIB SCDMC60S.LIB SCDTC20S.LIB
The source code archive (SOURCE.EXE), for users registered
at that level, contains 125 files:
CBFRSZ.C CCREATE.C CDI2L.C
CDI2S.C CDIGET.C CDILEAP.C
CDIPERM.C CDL2DOW.C CDL2I.C
CDL2S.C CDS2DAY.C CDS2DOW.C
CDS2I.C CDS2L.C CDS2MON.C
CDS2S.C CDSDAY.C CDSDIFF.C
CDSGET.C CDSLEAP.C CDSMONTH.C
CDSPERM.C CDSVALID.C CEXPR.C
CFLUSH.C CINDEX.C CINFO.C
CKADD.C CKBOT.C CKCUR.C
CKDEL.C CKFIND.C CKMAKE.C
CKNEXT.C CKPREV.C CKTOP.C
COPEN.C CPGET.C CPPUT.C
4
CHAPTER 2, BEFORE YOU BEGIN
CTI2S.C CTIGET.C CTS2I.C
CTSDIFF.C CTSGET.C CTSVALID.C
DBFRSZ.C DBOF.C DCREATE.C
DEOF.C DFGET.C DFINFO.C
DFLUSH.C DFNAM2NO.C DFPUT.C
DINFO.C DLOCK.C DLUD.C
DOPEN.C DPACK.C DRCLEAR.C
DRGET.C DRINFO.C DRNUM.C
DRPUT.C DRSTAT.C DSIZE.C
EMSG.C HCREATE.C HEOF.C
HERASE.C HFLUSH.C HLEN.C
HLOCK.C HREAD.C HRENAME.C
HSEEK.C HSIZE.C HTELL.C
HWRITE.C IBFRSZ.C ICREATE.C
IEXPR.C IFLUSH.C IINDEX.C
IINFO.C IKADD.C IKBOT.C
IKCUR.C IKDATE.C IKDEL.C
IKFIND.C IKMAKE.C IKNEXT.C
IKPREV.C IKTOP.C INIT.C
IOPEN.C IPGET.C IPPUT.C
NBFRSZ.C NCREATE.C NEXPR.C
NFLUSH.C NINDEX.C NINFO.C
NKADD.C NKBOT.C NKCUR.C
NKDATE.C NKDEL.C NKFIND.C
NKMAKE.C NKNEXT.C NKPREV.C
NKTOP.C NOPEN.C NPGET.C
NPPUT.C TCREATE.C TINFO.C
TOPEN.C TPACK.C TRGET.C
TRPUT.C SC_BASE.NTL
The Turbo C object code library archive (TC2LIBS.EXE)
contains the following eleven (11) files:
CLIPPER.C DBASE.C FOXBASE.C
SC_BASE.H SC_CLOCK.H SOFTC.H
SCDTC20S.LIB SCDTC20M.LIB SCDTC20C.LIB
SCDTC20L.LIB SCDTC20H.LIB
The Microsoft C 5.x object code library archive
(MSC5LIBS.EXE) contains the following eleven (11) files:
CLIPPER.C DBASE.C FOXBASE.C
SC_BASE.H SC_CLOCK.H SOFTC.H
SCDMC50S.LIB SCDMC50M.LIB SCDMC50C.LIB
SCDMC50L.LIB SCDMC50H.LIB
5
CHAPTER 2, BEFORE YOU BEGIN
The Microsoft C 6.0 object code library archive
(MSC6LIBS.EXE) contains the following eleven (11) files:
CLIPPER.C DBASE.C FOXBASE.C
SC_BASE.H SC_CLOCK.H SOFTC.H
SCDMC60S.LIB SCDMC60M.LIB SCDMC60C.LIB
SCDMC60L.LIB SCDMC60H.LIB
Installing SoftC on Your System
The SoftC Database Library source code is compatible with
all of the compilers which we support. The object code
provided is for a specific C compiler.
Many compiler manufacturers suggest a certain directory
setup to enable the compiler to find the header, object, and
library files. Rather than trying to explain the various
manufacturers suggested directory setups, we will explain
what files are required and where they are often located.
The library header files need to be placed where they can be
found by your compiler. In many cases this is in a special
"INCLUDE" directory. Other times they are placed where your
source code is found. We would suggest that they be placed
where the header files for your compiler are located.
Your linker will need to be able to find the SoftC object
code libraries. It is suggested that these be placed where
the run-time libraries for your compiler are found.
The name of the library defines the compiler manufacturer
and version, and the memory model for which it was compiled.
All library names begin with "SCD". The next few characters
specify the compiler manufacturer and version. The last
character defines the memory model.
For example SCDTC20S.LIB is the small memory model library
for Borland's Turbo C compiler (version 2.0x).
SoftC Applications
A typical application skeleton has the following form:
6
CHAPTER 2, BEFORE YOU BEGIN
#include
/* global declarations */
void main()
{
/* local declarations */
scdinit(15,0);
.
.
.
/* body of application */
.
.
.
scdterm();
}
The scdinit function must be the first function called in
your application and IT MUST BE CALLED ONLY ONCE. The last
function should be scdterm. This is not a requirement but it
is good programming practice. This function should also be
called only once. See the descriptions of these functions in
the library reference section of this manual.
Compiling with Turbo C
Turbo C provides two ways of compiling programs: the
integrated environment and the command line version. In
order to use the SoftC Database Library with the integrated
environment a project file must be created and the
appropriate library must be specified in that file:
myprog /* your program name */
scdtc20s.lib /* the desired SoftC Database library */
To use the library with the command line compiler simply
include the library name in the file name list:
tcc -ms -I
scdtc20s.lib
7
CHAPTER 2, BEFORE YOU BEGIN
Compiling with Microsoft C
To use the library with Microsoft's command line compiler
simply include the library name in the file name list:
cl /AS /Zp myprog scdmc50s.lib
The above example used the small memory model for C 5.x. Use
SCDMC60S.LIB for C 6.0.
Compiling with Quick C
To use the library with Quick C's command line compiler
simply include the library name in the file name list:
qcl /AS /Zp myprog /link scdmc50s.lib
Recompiling the Database Libraries
If you modify a SoftC Database Library source module, then
that module and any related modules (if any) must be
recompiled and replaced in the libraries. The library source
code is compiled just like any other program.
Turbo C command line:
tcc -c -ms -I
Microsoft C command line:
cl /AS /c /Zp /W3 *.c
8
CHAPTER 2, BEFORE YOU BEGIN
Quick C command line:
qcl /AS /c /Zp /W3 *.c
Refer to your compiler documentation for instructions for
replacing modules in libraries.
Function Naming Conventions
All of the SoftC Database Library functions begin with the
letters "sc". This is to differentiate them from the
standard library functions.
"scc" clock/calendar functions
"sccd" date or calendar functions
"scct" time functions
"scd" database file functions
"scdc" Clipper index file functions (open, close, etc.)
"scdck" Clipper index key functions (add, delete, etc.)
"scdd" dBASE data file functions (open, close, etc.)
"scddf" dBASE data field functions
"scddr" dBASE data record functions (write, read,
delete, etc.)
"scdi" FoxBASE+ index file functions (open, close, etc.)
"scdik" FoxBASE+ index key functions (add, delete, etc.)
"scdn" dBASE index file functions (open, close, etc.)
"scdnk" dBASE index key functions (add, delete, etc.)
"scdt" memo file functions (open, close, etc.)
9
Chapter 3
A Database Tutorial
Most applications need to do some file I/O operations. Your
C compiler provides you with basic functions to do general
file I/O. But many cases will arise when you need to use a
database within your application. The SoftC Database Library
provides functions to enable you to integrate your program
and dBASEIII/Clipper/FoxBASE+ compatible data, memo, and
index files, and dBASEIV compatible data files.
For those of you who may be unfamiliar with databases, think
of a filing cabinet filled with folders of invoices ordered
alphabetically by company name. If we wish to put this
information "on computer" we have two choices for data file
I/O: a simple sequential file, or a random access file.
Sequential Files
The concept of using a sequential file to store invoice data
by company name is very simple. Just enter the data as it's
found in the filing cabinet. To access the information just
begin reading at the start of the file and continue until
finished. As you can see the time required to find a
specific record greatly increases as more and more records
are added to the file. Also the act of adding information to
the file while trying to keep it in alphabetical order
becomes very time consuming due to the fact that many
existing records will have to be moved in order to make room
for the new record.
Random Access Files
By using random access techniques it becomes much easier to
access any particular data record. All that is required is
the desired record number and you can seek to the proper
location within the data file. But how do you know which
record number to use? And what about adding records in the
middle of the data file? dBASE uses keys and an indexed
lookup system called ISAM to solve both of these problems.
10
CHAPTER 3, A DATABASE TUTORIAL
Keys
Keys are generally comprised of one or more pieces of
information (data fields) found in a data record. In our
example the company name could be used as a key. Each key
would point to one or more records found in the data file.
When many keys are grouped together they form an index file.
A technique called ISAM is used to access the underlying
binary tree structure of the index files.
ISAM
The relationship between a key and the data file record
number is established via a "key item". Many key items are
found on an "index page". Many index pages are combined to
form an "index file". The method used to navigate through
the index file is called "Indexed Sequential Access Method"
or ISAM. The underlying structure used in ISAM is the binary
tree (or decision tree).
Binary Trees
Binary trees are composed of nodes. Each node contains a key
item (key value, data reference, and pointers to left and
right subtrees). The node that begins the tree is known as
the root, and leaf nodes are found at the end of the tree.
To find a particular data reference, the binary tree is
traversed from the root node. At each node, the desired key
is compared with the node's key; if they don't match, one
branch of the node's subtree or the other is selected based
on whether the desired key is less than or greater than the
node's key. This process continues until a match is found or
an empty subtree is encountered.
Binary trees can get quite unbalanced causing erratic tree
traversal times. There are two variations of the binary tree
commonly used to create balanced trees: B- and B+.
B- and B+ Trees
Generally speaking B- trees allow more than one key item to
be stored in a node (now called pages), and all the branches
of the tree are of identical length. The B- tree offers
significant speed advantages over binary trees, but the
maintenance of a B- tree is correspondingly more complex.
11
CHAPTER 3, A DATABASE TUTORIAL
Adding, modifying, or deleting a key value may result in the
splitting or merging of a page, which in turns forces
additional operations on the tree to rebalance it.
A B+ tree is a specialized form of the B- tree that has two
types of pages: internal, which only point to other pages
(do not contain data reference field), and external, which
contain the actual data reference (do not contain subtree
fields). The advantage of the B+ tree is that the internal
pages can hold more decision values than the intermediate
pages of a B- tree, so that the fan out of the tree is
faster and the average length of the branch is shorter. This
makes up for the fact that you must always follow a B+ tree
to the leaf page to get the data reference, whereas in a B-
tree the data reference may be found in an intermediate page
or even in the root page.
dBASE and Clipper use a B- tree structure, but dBASE does
not make use of the data reference in intermediate and root
pages. FoxBASE+ uses a B+ tree structure.
The first question above has been obviously answered, but
what about the second? The answer lies in the fact that
because we are using an index file we no longer have to keep
the data file in alphabetical order, all we need to do is
append records to the end of the data file and add a key to
the index file.
This ends the general discussion of databases. One note, it
is good programming practice to create keys only from data
fields found in the data record, this allows the
reconstruction of an index file should something
catastrophic happen.
12
Chapter 4
Database Functions
In order to benefit fully from the SoftC Database Library,
it is necessary to use only the functions found in the
library when performing database I/O. When standard
functions such as fprintf are used, the SoftC Database
Library file manager is bypassed. This means that it can no
longer keep track of the activities in your database files
which can lead to unpredictable results.
This is not to say that you cannot use the standard C file
I/O functions found in your compiler's libraries, but their
use should be restricted to non-database I/O.
dBASE Data File Functions
In order to use a data file it first must be opened.
scddopenx will open any dBASEIII, dBASEIII+, or dBASEIV
compatible data file. The SoftC Database Library file
manager handle will be returned. This handle number must be
used for all I/O with that specific data file.
When you are finished with a data file it is good practice
to close that data file via a call to scddclose. This is
true for a couple of reasons: 1) the data will be safe if
your application crashes, and 2) computer memory will be
freed for other use. A safety net is provided by scdterm in
that it will close all data, memo, and index files open at
program termination.
The length of the data file in bytes can be found using
scddsize. The name of the data file (and other information)
associated with a particular handle can be retrieved via a
call to scddinfo. Also a new data file can be created by
scddcreate.
scddbof checks the file pointer position and returns SC_TRUE
if at the beginning of the file. scddeof returns SC_TRUE if
at the end of file. The date the file was created or last
modified is returned by scddlud.
13
CHAPTER 4, DATABASE FUNCTIONS
Record I/O will be buffered if the file was opened using the
SC_BUFFER switch. scddflush will flush all buffered data to
the disk. To get the current size of the I/O buffer or to
change it, use scddbfrsz.
dBASE Data Record I/O
Having a data file is of little use unless you can
manipulate the individual records. The library provides nine
functions to: read/write individual records, delete/recover
deleted records, manipulate I/O buffers, and retrieve
information about the record structure.
A data record can be read from the data file using scddrget.
The actual data will be placed in an internal buffer. See
the discussion on Data Field I/O for more information on
accessing the individual fields found in a data record. When
a data record needs to be written to the file, scddrput
should be used. This function is used both for the changing
of a record as well as adding new records.
dBASE data records are not physically removed from the data
file when they are deleted. This enables the user to change
his mind and recover the deleted records for use again. The
SoftC Database Library follows this guideline by providing
the scddrdel function to mark a data record as deleted, and
the scddrundel function to recover the record (or mark as
active).
When you have inactive data records which you no longer
want to save use scddpack to "pack" the data file. All
inactive data records will be removed from the file and the
file compressed.
Information about the data record structure can be retrieved
by a call to scddrinfo. The record length, number of fields
in the data record, and the address of the internal record
buffer can be obtained in this way.
scddrclear is useful in clearing the record buffer before
placing data in the individual fields. The entire data
record will be set to spaces (" "). This has the effect on
numeric fields of placing nothing in the field rather than
zero.
14
CHAPTER 4, DATABASE FUNCTIONS
To get the status (active/inactive) of the current record
use scddrstat. Use scddrnum to get the current record
number.
dBASE Data Field I/O
The six data field manipulation functions provide for: the
writing and reading of data to and from fields in the
internal I/O buffer, the conversion of field names to field
numbers, and the retrieval of the field descriptions
originally setup with scddcreate.
There are two types of field I/O: standard C types and
ASCIIZ string. scddfput and scddfget use the standard C
types below to place data in and retrieve data from
individual fields in a record. scddfput attempts to properly
format the data before placing it in the field. This means
that the proper number of spaces, zeros, and/or a decimal
point will be added as appropriate. Please see the "Default
Date String Format" discussion in Chapter 6 for more
information about date fields.
C types dBASE types
ASCIIZ string character
ASCIIZ string date
double float (dBASEIV BCD)
char logical
unsigned long memo
double numeric
scddfputs and scddfgets use ASCIIZ strings exclusively. It
is left up to the users of these functions to ensure that
the data is properly formatted.
A function exists to retrieve the field descriptions (name,
type, length, number of decimal places) and the length of
the longest data field (scddfinfo). A field name to field
number translation function (scddfnam2no) is provided to
isolate your application from the structure of the data
files.
File Sharing Functions
Three functions are available to facilitate file sharing on
a local area network: scddlock (locks the entire data file),
15
CHAPTER 4, DATABASE FUNCTIONS
scddrlock (locks an individual record of the data file), and
scddunlock (unlocks the locked region). Please refer to
Chapter 7 for more information on sharing files on a
network.
dBASEIII Memo File Functions
dBASE stores the memo file record number in the data file.
The "scddfget" functions return the record number and the
"scddfput" functions expect a valid memo record number.
Memo files are not automatically opened when the data files
are opened. These files must be explicitly opened via
scdtopenx. Any dBASEIII+ compatible memo file can be opened
with this function. The SoftC Database Library file manager
handle will be returned on exit. This handle number must be
used for all I/O with that memo file.
When you are finished with a memo file it should be closed
with a call to scdtclose. The name of the memo file
associated with a particular handle can be retrieved via a
call to scdtinfo. A new file can be created by scdtcreate.
dBASEIII inserts soft carriage returns in the memo data as
it is written to the file. scdtrget will return the contents
of the memo record. The user specifies whether or not the
soft carriage returns are removed.
scdtrput allows the user to specify whether or not soft
carriage returns are added and, if added, the line length.
Note that the memo file record number returned by this
function should be written into the appropriate data file
field by using scddfput.
There will be times when the data record associated with a
memo record has been physically removed (data file packed).
When this occurs the memo file must be packed with scdtpack.
dBASE Index File Functions
In order to use an index file it first must be opened.
scdnopenx will open any dBASEIII, dBASEIII+, or dBASEIV
compatible index file (.NDX). The SoftC Database Library
16
CHAPTER 4, DATABASE FUNCTIONS
file manager handle will be returned. This handle number
must be used for all I/O with that specific index file.
When you are finished with an index file, it can be closed
via a call to scdnclose. Information about the index file
such as the file name and length of the key expression can
be retrieved by a call to scdninfo. A new index file can be
created by using the function scdncreate.
scdnexpr can be used to get the actual index key expression.
This key expression is generally a formula listing the field
names used to make the index key. For example, FIRST_NAME
and LAST_NAME are both fields found in a data file. If an
index key was made from the combination of these fields, the
key expression could be "LAST_NAME + FIRST_NAME".
The functional equivalent to dBASE's "INDEX ON" command is
provided by scdnindex. This function will build an index
file.
dBASE Index Page Functions
Page I/O will be buffered if the file was opened using the
SC_BUFFER switch. scdnflush will flush all buffered data to
the disk. To get the current size of the I/O buffer or to
change it, use scdnbfrsz.
dBASE Index Key Functions
Twelve functions have been provided for use in: finding a
key, moving to the next or previous key, adding/deleting a
key, retrieving the current key, and building a key. There
are three search functions supported: find the first key
(scdnktop), find the last key (scdnkbot), and search for a
specific key (scdnkfind). The keys found in this manner
become the "current key". Wildcards such as "?" and "*"
cannot be used.
Once a particular key is found it is often desired to get
the key following (scdnknext) or preceding (scdnkprev) it.
These keys, if found, become the current key. Another
function is provided to return the current key, scdnkcur.
17
CHAPTER 4, DATABASE FUNCTIONS
It is also desirable to be able to add and delete keys from
the index file. scdnkadd and scdnkdel provide these
functions.
A function is supplied to convert date fields to valid
index keys, scdnkdate allows the user to specify the date
string format.
dBASE provides certain functions which may be used in a key
expression. scdnkmake will build a key for you using the
index key expression and the current contents of the
internal record buffer of the data file. This function
supports five of the more common dBASE functions: dtoc,
left, right, str, and substr (and the various legitimate
combinations). Note that this function is not necessary for
single field character or numeric keys, but it (or
scdnkdate) can be used for date keys.
Clipper Index Functions
All the dBASE Index File functions listed above have Clipper
equivalents with the exception of scdnkdate. Clipper does
not need the functionality provided by this function.
FoxBASE+ Index Functions
All the dBASE Index File functions listed above have
FoxBASE+ equivalents. FoxBASE+ has one additional function
used to create a numeric key (scdiknum). The FoxBASE+
numeric key format as stored on disk is different from 'C'
doubles.
18
Chapter 5
Clock & Calendar Functions
This chapter will describe the time and date functions
available in the SoftC Database Library. Currently there are
twenty-seven functions implemented: twenty-one calendar,
and six clock.
Five date string formats are supported: SC_GREGOR
(mm/dd/yy), SC_GREGORL (mm/dd/yyyy), SC_JULIAN (yyyy/ddd),
SC_YMD (yyyymmdd), and SC_DMY (ddmmyy). Two time string
formats are supported: SC_CSHMS (hh:mm:ss) and SC_MIL (0000
- 2359).
Conversion to String
Internal to dBASE the date fields are formatted as SC_YMD.
This format enables the date field to be used properly as an
index key and ensures that the date "February 13, 1989" will
always be larger than the date "December 15, 1988". Note
that this date format is not the one normally used when
entering or displaying dates. In fact dBASE uses the date
format SC_GREGOR when it displays dates. A function sccds2s
was created to allow switching between the various date
formats.
There are two functions available to translate from numeric
dates to string format: sccdi2s, source date is three
integers, and sccdl2sx, source date is a long integer.
Conversion to Integers
Conversion to integer date from a string is accomplished via
sccds2i, and from a long integer by sccdl2i.
Conversion to Long Integer
Two functions are provided to assist in the conversion to a
long integer date: sccdi2l translates an integer date, and
sccds2lx translates a string date.
19
CHAPTER 5, CLOCK & CALENDAR FUNCTIONS
Day of Week Conversions
Two functions are provided to calculate the numeric day of
week (0-Sunday ... 6-Saturday): sccdl2dow uses a long
integer date input, and sccds2dow uses an ASCIIZ string. Two
functions are available to return the day of week string:
sccdsday accepts a numeric input and sccds2day uses a date
string.
Month Conversions
sccds2mon converts from a date string to a month of year
string. Another function uses the month number as input
(sccdsmonth).
Date String Calculations
Three functions are provided to perform date calculations:
sccdsdiff will compute the difference in days between two
dates, sccdsperm and sccdiperm return the number of days
found in the month of the desired year. sccdsperm requires
an ASCIIZ string and sccdiperm requires an integer year and
month as input.
Date Validation and Testing
Two functions are provided to test for leap year: one
requires an ASCIIZ string as input (sccdsleap) and the other
an integer (sccdileap). Also sccdsvalid can be used to check
the validity of an ASCIIZ date string.
Get Current Date from DOS
The current DOS date can be returned either in a string
(sccdsget) or in three integers (sccdiget).
Time String to Numeric Conversion
sccts2i can be used to convert an ASCIIZ string to three
integers (hours, minutes, and seconds).
Time Numeric to String Conversion
A function is also provided to convert from integers to an
ASCIIZ string: sccti2s.
20
CHAPTER 5, CLOCK & CALENDAR FUNCTIONS
Time String Calculations
scctsdiff can be used to calculate the difference between
two ASCIIZ time strings. The difference in seconds is
returned in a long integer.
Time Validation
A function is included in the library to validate an ASCIIZ
time character string: scctsvalid.
Get Current Time from DOS
The current DOS time can be returned either in a string
(scctsget) or in four integers (scctiget).
21
Chapter 6
Miscellaneous Functions
This chapter will describe the miscellaneous functions found
in the SoftC Database Library.
Program Initialization
scdinit sets up the SoftC Database Library file manager.
Memory will be allocated for a variety of internal
structures. As previously mentioned this function should be
called only once at the beginning of your application.
Program Termination
scdterm is called at the end of your application. It will
close all dBASE files (unlocking any shared files) and free
the memory allocated by scdinit. It is suggested that
scdterm be registered with atexit in order to activate a
simple safety-net.
Library Version
The global variable sc_version contains the SoftC Database
Library version as an ASCIIZ string.
Default Date String Format
The global variable sc_date_style holds the date string
format style used by scddfget and scddfput. The initial
value for this variable is SC_GREGOR. If, for example, you
desire European/Military dates as the default style then set
sc_date_style equal to SC_DMY at the beginning of your
program.
Errors and Warnings
A global variable sc_code will contain the results of the
last library function call executed. Errors are indicated by
negative numbers, warnings by positive numbers greater than
zero, and a zero indicates success. Most functions in the
22
CHAPTER 6, MISCELLANEOUS FUNCTIONS
library will NOT execute if sc_code contains an error.
Because the functions will not operate on errant
information, this feature provides a small measure of
security for your data.
During program debug it may be advantageous to print the
text message associated with the contents of sc_code. scemsg
will return the address of the message associated with the
contents of sc_code, which can then be printed by puts.
If you desire to clear an error or warning condition either
the global variable sc_code can be set to zero or the
function sceclr can be used. It is preferable to use the
function rather than the global variable.
See Appendix A for a complete list of error and warning
codes and their associated messages.
23
Chapter 7
Sharing Files on a LAN
As discussed previously, the SoftC Database Library provides
three functions to facilitate sharing files with dBASE on a
Local Area Network (LAN): scddlock, scddrlock, and
scddunlock. scddrlock is used only when you are updating an
individual record. If a record is to be added to the data
file or an index or memo file is to be modified (or even
read), then scddlock must be used to lock the entire data
file. scddunlock is used to remove either of the locks.
It is NEVER a good idea to keep a record/file locked while
input is solicited from the keyboard.
Updating a Data Record
The proper sequence to follow when updating a record (no
changes required to any associated index or memo files) is:
1) Lock the record in the data file. If the record
cannot be locked then wait for a period of time
and try again. If after a reasonable number of
retries the record still cannot be locked then
fail.
2) Read the original contents of the record.
3) Unlock the record.
4) Solicit keyboard input.
5) Lock the record (as in step 1).
6) Re-read the record.
7) Verify no one else has changed it. If altered then
either go back to step 3, or if changes made by
others are unaffected by your changes then update
modified fields and continue.
8) Update the record.
9) Unlock the record.
If you think about it the reason for steps 5-7 above is
fairly obvious. It is reasonable to expect that since you
are updating a record someone else may want to update that
24
CHAPTER 7, SHARING FILES ON A LAN
same record. Changes could be lost if steps are not taken to
explicitly protect them.
There will be occasions when the field modified in the
record will be: 1) part of or the entire key for an index
file, or 2) an added or modified memo record. When this
occurs the following sequence should be followed:
1) Lock the record in the data file. If the record
cannot be locked, then wait for a period of time
and try again. If after a reasonable number of
retries the record still cannot be locked then
fail.
2) Read the original contents of the record.
3) Unlock the record.
4) Solicit keyboard input.
5) Lock the data file (similar to step 1).
6) Re-read the record.
7) Verify no one else has changed it. If altered then
either unlock the file and go back to step 4, or
if changes made by others are unaffected by your
changes then update modified fields and continue.
8) Modify any memo or index files required.
9) Update the record.
10) Unlock the file.
The memo file must be updated before the data file because
the memo record number must be recorded in the data record.
Adding or Removing a Data Record
The proper sequence to follow when adding or removing a
record is:
1) Lock the data file. If the file cannot be locked,
then wait for a period of time and try again. If
after a reasonable number of retries the file
still cannot be locked then fail.
2) Modify memo file as needed.
3) Add or delete the record.
4) Update index file(s) as needed.
5) Unlock the file.
The memo file must be updated before the data file because
the memo record number must be recorded in the data record.
25
CHAPTER 7, SHARING FILES ON A LAN
The index file(s) must be updated after the data record is
added because the data record number is written into the
index file along with the key.
The locking mechanisms provided by dBASE (Clipper and
FoxBASE+ as well) are very simple and crude. Many other
schemes exist to provide a more elegant solution to the
locking problem, but keep in mind that they are not
implicitly compatible with dBASE. They will not work with
dBASEIII+'s ASSIST or with R&R Report Writer, for example.
We would advise caution when contemplating straying too far
from the dBASE standards.
26
Chapter 8
The SoftC Database Library
This chapter contains a detailed description of each of the
functions in the library.
Many of the code samples listed in this chapter are based
upon the demo programs (versions for dBASE, Clipper, and
FoxBASE+ index files) found in Appendix B.
The following sample function description explains how to
use this portion of the SoftC Database Library Reference
Manual.
27
CHAPTER 8, THE SOFTC DATABASE LIBRARY
function name
USAGE
function(
modifier parameter[,...]);
The declaration syntax for function, "parameter"
names are underlined. The [,...] indicates that
other parameters and their modifiers may follow.
PROTOTYPE IN
This lists the header files in which the function
is prototyped.
DESCRIPTION
This describes what the function does, the
parameters it takes, and any details you need in
order to use the function and the related routines
listed.
SEE ALSO
Routines related to the function about which you
may wish to read are listed here.
EXAMPLE
A sample program listing demonstrating how the
function is used.
28
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdi2l
USAGE
signed int sccdi2l(
signed long *date,
signed int year,
signed int month,
signed int day );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdi2l converts three integer date values
("year", "month", and "day") into a long integer.
The integer values are verified to be a valid date
before conversion.
SEE ALSO
sccdl2i.
EXAMPLE
#include
#include
#include
void main()
{
int year = 1990, month = 5, day = 16;
long date = 0L;
scdinit(20,0);
sccdi2l(&date, year, month, day);
printf("%d %d %d = %ld\n", year, month, day, date);
scdterm();
}
29
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdi2s
USAGE
signed int sccdi2s(
signed char *string,
signed int format,
signed int year,
signed int month,
signed int day );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdi2s converts three integer date values
("year", "month", and "day") into an ASCIIZ string
"string" using the date string style "format". A
check is made to verify that "string" is a valid
date string before exiting.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccdsvalid, sccds2i.
EXAMPLE
#include
#include
#include
void main()
{
signed char d[9];
sccdi2s(d,SC_YMD,1989,2,13);
puts(d);
}
30
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdiget
USAGE
signed int sccdiget(
signed int *year,
signed int *month,
signed int *monthday,
signed int *dayofweek );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdiget returns the current date in integer form
from DOS.
SEE ALSO
sccdsget.
EXAMPLE
#include
#include
#include
void main()
{
int year, month, dayofmonth, dayofweek;
sccdiget(&year, &month, &dayofmonth, &dayofweek);
printf("%d %d %d %d\n",year, month, dayofmonth,
dayofweek);
}
31
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdileap
USAGE
signed int sccdileap(
signed int leap );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdileap tests the integer year passed to it in
"leap" to see if it is a leap year.
RETURN VALUES
SC_TRUE is leap year
SC_FALSE not leap year
SEE ALSO
sccdsleap.
EXAMPLE
#include
#include
#include
void main()
{
if (sccdileap(1989))
puts("Leap Year!");
else
puts("Normal Year.");
}
32
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdiperm
USAGE
signed int sccdiperm(
signed char *days,
signed int year,
signed int month );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdiperm calculates the number of "days" in
"month" for "year". This function also senses leap
year and will properly return 29 days for
February.
SEE ALSO
sccdsperm.
EXAMPLE
#include
#include
#include
void main()
{
signed char d;
sccdiperm(&d,1989,3);
printf("%d",d);
}
33
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdl2dow
USAGE
signed int sccdl2dow(
signed char *dayofweek,
signed long date );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdl2dow converts a long integer "date" to an
integer "dayofweek". "dayofweek" will be a value
between 0 (Sunday) and 6 (Saturday).
SEE ALSO
sccds2dow.
EXAMPLE
#include
#include
#include
void main()
{
char dayofweek;
long date;
sccdi2l(&date,1990,5,16);
sccdl2dow(&dayofweek,date);
printf("%d\n",dayofweek);
}
34
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdl2i
USAGE
signed int sccdl2i(
signed int *year,
signed int *month,
signed int *day,
signed long date );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdl2i converts a long integer "date" into three
integers: "year", "month", and "day". The long
"date" is tested for validity before the
conversion takes place.
SEE ALSO
sccdi2l.
EXAMPLE
#include
#include
#include
void main()
{
int year, month, day;
long date;
sccdi2l(&date,1990,5,16);
date++;
sccdl2i(&year,&month,&day,date);
printf("%d %d %d\n",year,month,day);
}
35
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdl2sx
USAGE
signed int sccdl2sx(
signed char *string,
signed int format,
signed long date);
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdl2sx converts a long "date" into an ASCIIZ
string "string" of the date style "format". A
check is made to verify that "string" is a valid
date string before exiting.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccds2lx.
EXAMPLE
#include
#include
#include
void main()
{
signed char d[9];
sccdl2sx(d,SC_YMD,726489);
puts(d);
}
36
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccds2day
USAGE
signed int sccds2day(
signed char *dayofweek,
signed char *daystr,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccds2day converts an ASCIIZ string date "datestr"
of style "format" to an ASCIIZ string "dayofweek".
"dayofweek" will be a NULL terminated string
"Sunday" ... "Saturday".
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccds2dow.
EXAMPLE
#include
#include
#include
void main()
{
char dayofweek[10];
sccds2day(dayofweek, "19900516", SC_YMD);
printf("%s\n",dayofweek);
}
37
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccds2dow
USAGE
signed int sccds2dow(
signed char *dayofweek,
signed char *daystr,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccds2dow converts an ASCIIZ string date "datestr"
to an integer "dayofweek". "dayofweek" will be a
value between 0 (Sunday) and 6 (Saturday).
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccds2day.
EXAMPLE
#include
#include
#include
void main()
{
char dayofweek;
sccds2dow(&dayofweek, "19900516", SC_YMD);
printf("%d\n",dayofweek);
}
38
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccds2i
USAGE
signed int sccds2i(
signed int *year,
signed int *month,
signed int *day,
signed char *string,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccds2i converts dates from an ASCIIZ string
"string" of the style "format" to three integer
values ("year", "month", and "day"). A partial
check is made to verify that "string" is a valid
date string before attempting to convert.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccdi2s.
EXAMPLE
#include
#include
#include
void main()
{
signed int y, m, d;
sccds2i(&y,&m,&d,"19890213",SC_YMD);
printf("%d %d %d",y,m,d);
}
39
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccds2lx
USAGE
signed int sccds2lx(
signed long *date,
signed char *string,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccds2lx converts an ASCIIZ "string" into a long
"date". The date string must be of the style
"format". This date is a calculated count of days
since 1/1/0001. No attempt has been made to adjust
for changes made in the calendar. This function is
used predominantly for date arithmetic,
calculating elapsed days, etc.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
EXAMPLE
#include
#include
#include
void main()
{
signed long l;
sccds2lx(&l,"19890323",SC_YMD);
printf("%ld",l);
}
40
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccds2mon
USAGE
signed int sccds2mon(
signed char *monthstr,
signed char *date,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccds2mon returns the ASCIIZ month of year
("monthstr"). The ASCIIZ date string ("date") is
converted to integers under control of the date
string format indicator ("format") and then the
month is translated into a string.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccds2day.
EXAMPLE
#include
#include
#include
void main()
{
char month[10];
sccds2mon(&month,"5/16/90",SC_GREGOR);
puts(month);
}
41
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccds2s
USAGE
signed int sccds2s(
signed char *outstr,
signed int outformat,
signed char *instr,
signed int informat );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccds2s translates one ASCIIZ date string "instr"
of "informat" to another ("outstr" of
"outformat"). The input date string is converted
to integers and checked for validity before being
translated to a string again. This function
replaces the sccdxlat function which has been
removed from the library.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
EXAMPLE
#include
#include
#include
void main()
{
char day[10];
sccds2s(day, SC_GREGOR, "19900516", SC_YMD);
puts(day);
}
42
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsday
USAGE
signed int sccdsday(
signed char *daystr,
signed char day );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsday returns the day of the week ASCIIZ string
in "daystr" for the day specified by "day". "day"
must be in the range of 0 (Sunday) to 6
(Saturday). The maximum length of the string
returned will be 9 plus the NULL byte.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccdsmonth.
EXAMPLE
#include
#include
#include
void main()
{
char day[10];
sccdsday(day,0);
puts(day);
}
43
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsdiff
USAGE
signed int sccdsdiff(
signed long *diff,
signed char *date1,
signed int format1,
signed char *date2,
signed int format2 );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsdiff returns the difference in days between
"date1" and "date2". The two ASCIIZ date strings
can be in any order, but the styles ("format1",
"format2") must be valid.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccds2s, sccdi2s, sccdsvalid.
EXAMPLE
#include
#include
#include
void main()
{
signed long d;
sccdsdiff(&d, "19890213", SC_YMD, "19881217", SC_YMD);
printf("%ld",d);
}
44
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsget
USAGE
signed int sccdsget(
signed char *date,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsget returns the current "date" in ASCIIZ
string "format" from DOS.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccdiget, scctsget.
EXAMPLE
#include
#include
#include
void main()
{
char date[10];
sccdsget(date,SC_GREGOR);
puts(date);
}
45
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsleap
USAGE
signed int sccdsleap(
signed char *leap,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsleap tests the ASCIIZ year string formatted
as "format" passed to it in "leap" to see if it is
a leap year.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
RETURN VALUES
SC_TRUE is leap year
SC_FALSE not leap year
SEE ALSO
sccdileap
EXAMPLE
#include
#include
#include
void main()
{
if (sccdsleap("19890101",SC_YMD))
puts("Leap Year!");
else
puts("Normal Year.");
}
46
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsmonth
USAGE
signed int sccdsmonth(
signed char *monthstr,
signed char month );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsmonth returns the ASCIIZ month string in
"monthstr" for the month specified by "month".
"month" must be in the range of 1 (January) to 12
(December). The maximum length of the string
returned will be 9 plus the NULL byte.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccdsday
EXAMPLE
#include
#include
#include
void main()
{
char month[10];
sccdsmonth(month,4);
puts(month);
}
47
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsperm
USAGE
signed int sccdsperm(
signed char *days,
signed char *date,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsperm calculates the number of "days" in the
month for the year specified in "date". The date
string style ("format") must be valid. This
function also senses leap year and will properly
return 29 days for February.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
sccdiperm.
EXAMPLE
#include
#include
#include
void main()
{
signed char d;
sccdsperm(&d, "19890325", SC_YMD);
printf("%d",d);
}
48
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccdsvalid
USAGE
signed int sccdsvalid(
signed char *string,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccdsvalid tests the date ASCIIZ "string" passed
for validity: string properly formatted (format),
valid day of month, and valid month of year.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
EXAMPLE
#include
#include
#include
void main()
{
if (sccdsvalid("19890213" SC_YMD) == SC_SUCCESS)
puts("Good Date.");
else
puts("Bad Date.");
}
49
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccti2s
USAGE
signed int sccti2s(
signed char *string,
signed int format,
signed int hours,
signed int minutes,
signed int seconds );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccti2s converts three integer time values
"hours", "minutes", and "seconds" into an ASCIIZ
string "string" of the string style "format". A
check is made to verify that "string" is a valid
time string before exiting.
Time string styles:
SC_CSHMS hh:mm:ss
SC_MIL European/military
SEE ALSO
scctsvalid, sccts2i.
EXAMPLE
#include
#include
#include
void main()
{
signed char d[9];
sccti2s(d,SC_GREGOR,12,3,59);
puts(d);
}
50
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scctiget
USAGE
signed int scctiget(
signed int *hours,
signed int *minutes,
signed int *seconds,
signed int *fraction );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
scctiget returns the current time from DOS in
integer form: "hours", "minutes", "seconds", and
hundredths of a second ("fraction").
EXAMPLE
#include
#include
#include
void main()
{
int hours, minutes, seconds, fraction;
scctiget(&hours, &minutes, &seconds, &fraction);
printf("%d %d %d %d\n", hours, minutes, seconds,
fraction);
}
51
CHAPTER 8, THE SOFTC DATABASE LIBRARY
sccts2i
USAGE
signed int sccts2i(
signed int *hours,
signed int *minutes,
signed int *seconds,
signed char *string,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
sccts2i converts times from an ASCIIZ string
"string" of style "format" to three integer values
"hour", "minute", and "second". A partial check is
made to verify that "string" is a valid time
string before attempting to convert.
Time string styles:
SC_CSHMS hh:mm:ss
SC_MIL European/military
SEE ALSO
sccti2s.
EXAMPLE
#include
#include
#include
void main()
{
signed int h, m, s;
sccts2i(&h,&m,&s,"12:03:59",SC_CSHMS);
printf("%d %d %d",h,m,s);
}
52
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scctsdiff
USAGE
signed int scctsdiff(
signed long *diff,
signed char *time1,
signed int format1,
signed char *time2,
signed int format2 );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
scctsdiff returns the difference in seconds
between "time1" and "time2". The two ASCIIZ time
strings can be in any order, but must be valid
string styles ("format1", "format2").
Time string styles:
SC_CSHMS hh:mm:ss
SC_MIL European/military
SEE ALSO
sccti2s, scctsvalid.
EXAMPLE
#include
#include
#include
void main()
{
signed long d;
scctsdiff(&d, "12:03:59", SC_CSHMS, "11:30:00", SC_CSHMS);
printf("%ld",d);
}
53
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scctsget
USAGE
signed int scctsget(
signed char *time,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
scctsget returns the current "time" from DOS in
ASCIIZ string "format".
Time string styles:
SC_CSHMS hh:mm:ss
SC_MIL European/military
EXAMPLE
#include
#include
#include
void main()
{
char time[10];
scctsget(time,SC_MIL);
puts(time);
}
54
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scctsvalid
USAGE
signed int scctsvalid(
signed char *string,
signed int format );
PROTOTYPE IN
sc_clock.h
DESCRIPTION
scctsvalid tests the ASCIIZ time string "string"
passed for validity: string properly formatted
("format"), valid hours, minutes, and seconds.
Time string styles:
SC_CSHMS hh:mm:ss
SC_MIL European/military
EXAMPLE
#include
#include
#include
void main()
{
if (scctsvalid("12:03:59",SC_CSHMS) == SC_SUCCESS)
puts("Good Time.");
else
puts("Bad Time.");
}
55
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcbfrsz
USAGE
signed int scdcbfrsz(
signed int handle,
signed int *numpgs,
signed int command );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcbfrsz will either get (SC_GETSZ) or set
(SC_SETSZ) the maximum number of index pages the
library file manager can keep in memory and
returns it via "numpgs". This is under control of
"command".
EXAMPLE
/* get size */
#include
#include
#include
void main()
{
int ntx, numpgs;
scdinit(20,0);
if (scdcopenx(&ntx,"TOCNAME.NTX",SC_BUFFER) == SC_SUCCESS)
{
scdcbfrsz(ntx,&numpgs,SC_GETSZ);
printf("Maximum number of pages = %d\n", numpgs);
scdcclose(ntx);
}
scdterm();
}
/* set size */
#include
#include
#include
void main()
56
CHAPTER 8, THE SOFTC DATABASE LIBRARY
{
int ntx, numpgs = 5;
scdinit(20,0);
if (scdcopenx(&ntx,"TOCNAME.NTX",SC_BUFFER) == SC_SUCCESS)
{
scdcbfrsz(ntx,&numpgs,SC_SETSZ);
printf("New max = %d\n",numpgs);
scdcclose(ntx);
}
scdterm();
}
57
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcclose
USAGE
signed int scdcclose(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcclose closes a Clipper index file and frees
all allocated memory associated with "handle".
EXAMPLE
#include
#include
void main()
{
int ntx;
scdinit(20,0);
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS)
scdcclose(ntx);
scdterm();
}
58
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdccreate
USAGE
signed int scdccreate(
signed char *filename,
signed int keytype,
signed char *keyexpr,
signed int keylen,
signed int decpl );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdccreate creates a Clipper index file. "keyexpr"
will be translated to all upper case when the
index file is created.
If "keytype" is SC_CKEY, then "keyexpr" must be an
ASCIIZ string consisting of one or more field
names from the data record. All fields included in
the expression must be of type 'c' or be
translated into type 'c'. No check is made to
verify this. "keylen" cannot exceed 100.
If "keytype" is SC_NKEY, then "keyexpr" should
consist of only one data field. "keylen" cannot
exceed 19, and "decpl" must be 2 less than
"keylen" and not more than 15.
If "keytype" is SC_DKEY, then "keyexpr" should
consist of only one data field. "keylen" and
"decpl" are ignored as the length is forced to 8.
When unique keys are required, OR SC_UNIQUE with
"keytype".
NOTES
scdccreate will create a new index file even if
one had already existed.
59
CHAPTER 8, THE SOFTC DATABASE LIBRARY
"keyexpr" is NOT checked for validity during the
file creation process. Currently only the
scdckmake function uses "keyexpr".
SEE ALSO
scdckmake.
EXAMPLE
#include
void main()
{
scdinit(20,0);
scdccreate("TOCNAME.NTX", SC_DKEY, "name", 64, 0);
scdterm();
}
60
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcexpr
USAGE
signed int scdcexpr(
signed int handle,
signed char *keyexpr );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcexpr gets the index key expression and returns
it as an ASCIIZ string into a user supplied buffer
"keyexpr". The user must ensure that the buffer is
large enough (the key expression length can be
determined via a call to scdcinfo) to hold the
entire key expression.
NOTES
A NULL byte will be appended to the end of the
expression string returned.
SEE ALSO
scdcinfo.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char buffer[512];
scdinit(20,0);
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS) {
scdcexpr(ntx,buffer);
printf("key expression = %s",buffer);
scdcclose(ntx);
}
61
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdterm();
}
62
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcflush
USAGE
signed int scdcflush(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcflush will write the contents of the I/O cache
to disk. An I/O cache will be used only if the
index file was opened with SC_BUFFER command
switch.
SEE ALSO
scdcopenx
EXAMPLE
#include
#include
#include
void main()
{
int dbf, ntx;
char *key;
long record;
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF", SC_BUFFER) == SC_SUCCESS) {
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS) {
scddfput(dbf,0,"TOC.DBF");
scddrput(dbf,&record,SC_ADD);
scdckmake(dbf,ntx,&key);
scdckadd(ntx,key,record);
free(key);
scdcflush(ntx);
scdcclose(ntx);
}
scddclose(dbf);
}
63
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdterm();
}
64
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcindex
USAGE
signed int scdcindex(
signed int datafile,
signed char *filename,
signed int keytype,
signed char *keyexpr,
signed int keylen,
signed int decpl );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcindex will create and build a Clipper index
file. A blank file will be created using
"filename", "keytype", "keyexpr", "keylen", and
"decpl". The resultant file will be opened, and
the "datafile" will be read sequentially building
keys from each data record. The index file will
be closed at exit. The "datafile" must be open
prior to the function call.
SEE ALSO
scdccreate
EXAMPLE
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",SC_BUFFER) == SC_SUCCESS) {
scdcindex(dbf, "TOCNAME.NTX", SC_CKEY, "NAME", 64, 0);
scddclose(dbf);
}
scdterm();
}
65
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcinfo
USAGE
signed int scdcinfo(
signed int handle,
SC_NTXINFO *info );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcinfo gets the filename of the index file
associated with "handle", the index key type, the
maximum index key length and number of decimal
places (numeric keys) , and the length of the
index key expression via the structure:
typedef struct {
signed char fname[80]; /* file name */
signed char keylen; /* key length */
signed char keydpl; /* decimal places */
signed char exprlen; /* expression len */
SC_FLAGS flags; /* misc. flags */
} SC_NTXINFO;
NOTES
If you are using the value returned for the index
expression to dynamically allocate memory to hold
the key expression, be sure to add one to the
length before allocation.
SEE ALSO
scdcopenx.
EXAMPLE
#include
#include
#include
void main()
{
66
CHAPTER 8, THE SOFTC DATABASE LIBRARY
int ntx;
SC_NTXINFO info;
scdinit(20,0);
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS) {
scdcinfo(ntx,&info);
printf("File name = %s\n",info.fname);
printf("Maximum key length = %d\n",info.keylen);
printf("Number of decimals = %d\n,info.keydpl);
printf("Key expression length = %d\n",info.exprlen);
scdcclose(ntx);
}
scdterm();
}
67
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckadd
USAGE
signed int scdckadd(
signed int handle,
void *key,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckadd will add "key" to the index file
specified by "handle". "recno" is the data record
number to be associated with "key" (the data
record pointed to by recno must exist prior to
calling scdckadd).
NOTES
When adding character keys it is not necessary to
pad the key string to size with spaces (" "),
because the function will automatically do this
for you.
SEE ALSO
scdckmake.
EXAMPLE
#include
#include
#include
void main()
{
int dbf, ntx;
char name[65] = "ABC.DEF";
long recno;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS) {
68
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfputs(dbf,0,name);
if (scddrput(dbf,&recno,SC_ADD) == SC_SUCCESS)
scdckadd(ntx,name,recno);
scdcclose(ntx);
}
scddclose(dbf)
}
scdterm();
}
69
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckbot
USAGE
signed int scdckbot(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckbot will set the current key pointer to the
last logical key in the index and return the key
value "key" and data record number "recno"
associated with the new current key.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdcinfo.
All keys are returned as strings.
SEE ALSO
scdcinfo.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char name[65];
long recno;
scdinit(20,0);
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
70
CHAPTER 8, THE SOFTC DATABASE LIBRARY
SC_SUCCESS) {
name[64] = 0;
scdckbot(ntx,name,&recno);
printf("%s %ld\n",name,recno);
scdcclose(ntx);
}
scdterm();
}
71
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckcur
USAGE
signed int scdckcur(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckcur will return the key value "key" and data
record number "recno" associated with the current
key in the index file.
The current key pointer must be set by a call to
either scdckfind, scdcktop, scdckbot, scdcknext,
or scdckprev before calling scdckcur.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdcinfo.
SEE ALSO
scdcinfo, scdckfind, scdcktop, scdckbot,
scdcknext, scdckprev.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char date[17], dat[17];
long recno, recn;
72
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdinit(20,0);
if (scdcopenx(&ntx, "TOCDATE.NTX", SC_BUFFER) ==
SC_SUCCESS) {
date[16] = 0;
dat[16] = 0;
scdcktop(ntx,date,&recn);
scdckcur(ntx,dat,&recno);
printf("%s %s %ld %ld\n", date,dat,recno,recn);
scdcclose(ntx);
}
scdterm();
}
73
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckdel
USAGE
signed int scdckdel(
signed int handle,
void *key,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckdel will remove "key" from the index file
specified by "handle". "recno" is used along with
"key" to ensure that the proper key has been
removed from the index file.
NOTES
When deleting keys it is not necessary to pad
the key string to size with spaces (" "), the
function will automatically do this for you.
SEE ALSO
scdckadd.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char date[17];
scdinit(20,0);
if (scdcopenx(&ntx, "TOCDATE.NTX", SC_BUFFER) ==
SC_SUCCESS) {
strcpy(date,"12/05/8815:30:04");
scdckdel(ntx,date,7L);
scdcclose(ntx);
}
74
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdterm();
}
75
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckfind
USAGE
signed int scdckfind(
signed int handle,
void *key,
signed long *recno,
signed int method );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckfind supports two key search methods
(determined by "method"): SC_EXACT - find an exact
match with "key" and "recno", and SC_FIRST - find
the first logical occurrence of "key" in the index
and return the associated record number "recno" if
found.
If a match cannot be found, the current key will
be the physical key which would immediately
precede "key". The current key's value and data
record number will be returned in "key" and
"recno".
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdcinfo.
When searching it is not necessary to pad the
key string to size with spaces (" "), the function
will automatically do this for you.
Searching for partial keys can be accomplished by
using the SC_FIRST method. For example, you are
using a fifteen character key and you want to find
the first entry where the first five characters
are "ABCDE". All you need do is copy that five
character ASCIIZ string into your key buffer and
then call scdckfind. The function will space pad
to length and then find the first matching entry.
76
CHAPTER 8, THE SOFTC DATABASE LIBRARY
All keys are returned as strings.
SEE ALSO
scdcinfo.
EXAMPLE
#include
#include
#include
#include
void main()
{
int ntx;
char key[65];
long recno;
scdinit(20,0);
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS) {
strcpy(key,"ABCDE.XYZ");
recno = 7L;
if (scdckfind(ntx,key,&recno,SC_FIRST) != SC_SUCCESS)
printf("%s\n",scemsg());
else
printf("%s %ld\n",key,recno);
scdcclose(ntx);
}
scdterm();
}
77
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckmake
USAGE
signed int scdckmake(
signed int datahandle,
signed int indexhandle,
void **key );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckmake will build an index key using the key
expression of the index file specified by
"indexhandle" and the data found in the record
buffer of the data file "datahandle". Memory space
for the "key" will be allocated and the address of
this block will be returned.
The key expression can consist of either the data
field name or one of five Clipper functions or a
combination thereof. Data field types of date,
numeric, or character are allowed. Clipper
functions dtoc, left, right, str, and substr are
currently supported by scdckmake.
Following is a brief description of the five
expression functions:
dtoc will convert data from a date field to an
ASCIIZ string of the format "mm/dd/yy". Syntax is:
dtoc(field_name)
left will return the left portion of a character
field as an ASCIIZ string. The number of
characters returned is specified after the field
name. Syntax is:
left(field_name,number)
78
CHAPTER 8, THE SOFTC DATABASE LIBRARY
right will return the right portion of a character
field as an ASCIIZ string. The number of
characters returned is specified after the field
name. This is a count from the right side of the
field. Syntax is:
right(field_name,number)
str will convert a numeric field to an ASCIIZ
string. The total length of the string and the
number of decimal places are optional parameters.
The default string length is 10 and the number of
decimal places is 0. Syntax is:
str(field_name,length,decimal_places)
substr will return the middle portion of a
character field. The starting offset into the
field is a required parameter. The number of
characters to be used is an optional parameter
whose default value is the remainder of the field.
Syntax is:
substr(field_name,start,count)
An example of a more complex key expression:
right(dtoc(date),2)+left(dtoc(date,2)
This expression would cause scdckmake to create an
index key string consisting of the year and month
("yymm"). For example if date equals "2/13/89" the
resultant key would be "8902".
NOTES
For key expressions consisting of only one data
field scdckmake is probably an overkill. You can
easily generate these keys yourself. scdckmake is
a fairly large module and if not needed probably
should not be used. This function is best used
when the key expression is more complex.
79
CHAPTER 8, THE SOFTC DATABASE LIBRARY
Memory is allocated for the generated key and it
is the responsibility of the caller to free this
memory when finished.
SEE ALSO
scdccreate.
EXAMPLE
#include
#include
#include
void main()
{
int ntx, dbf;
char *key;
long recno;
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF", 0) == SC_SUCCESS) {
if (scdcopenx(&ntx, "TOCNAME.NTX", SC_BUFFER) ==
SC_SUCCESS) {
scddfput(dbf,0,"ABCDEF.XYZ");
scddrput(dbf,&recno,SC_ADD);
scdckmake(dbf,ntx,(void **) &key);
printf("%s\n",key);
scdckadd(ntx,key,recno);
free(key); /* free memory allocated for key */
scdcclose(ntx);
}
scddclose(dbf);
}
scdterm();
}
80
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcknext
USAGE
signed int scdcknext(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcknext will increment the key pointer and
return the key value "key" and data record number
"recno" associated with the new current key.
If scdcknext is called immediately after opening
the index file the first logical key will be
returned.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdcinfo.
All keys are returned as strings.
SEE ALSO
scdcinfo.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char key[11];
81
CHAPTER 8, THE SOFTC DATABASE LIBRARY
long recno;
scdinit(20,0);
if (scdcopenx(&ntx, "TOCLNGTH.NTX", SC_BUFFER) ==
SC_SUCCESS) {
scdcknext(ntx,key,&recno); /* return first key */
printf("%s %ld\n",key,recno);
scdcclose(ntx);
}
scdterm();
}
82
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdckprev
USAGE
signed int scdckprev(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdckprev will decrement the key pointer and
return the key value "key" and data record number
"recno" associated with the new current key.
If scdckprev is called immediately after opening
the index file the last logical key will be
returned.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdcinfo.
All keys are returned as strings.
SEE ALSO
scdcinfo.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char character[65];
83
CHAPTER 8, THE SOFTC DATABASE LIBRARY
long recno;
scdinit(20,0);
if (scdcopenx(&ntx,"TOCNAME.NTX",SC_BUFFER) == SC_SUCCESS)
{
scdckprev(ntx,character,&recno); /* get last key */
printf("%s %ld\n",character,recno);
scdcclose(ntx);
}
scdterm();
}
84
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcktop
USAGE
signed int scdcktop(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcktop will set the current key pointer to the
first logical key in the index and return the key
value "key" and data record number "recno"
associated with the new current key.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdcinfo.
All keys are returned as strings.
SEE ALSO
scdcinfo.
EXAMPLE
#include
#include
#include
void main()
{
int ntx;
char date[17];
long recno;
scdinit(20,0);
if (scdcopenx(&ntx,"TOCDATE.NTX",SC_BUFFER) == SC_SUCCESS)
85
CHAPTER 8, THE SOFTC DATABASE LIBRARY
{
date[16] = 0;
scdcktop(ntx,date,&recno);
printf("%s %ld\n",date,recno);
scdcclose(ntx);
}
scdterm();
}
86
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdcopenx
USAGE
signed int scdcopenx(
signed int *handle,
signed char *filename,
signed int command );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdcopenx opens a Clipper index file (.NTX).
Memory will be allocated for a file packet, I/O
buffers, and other miscellaneous structures for
use internally by the SoftC Database Library file
manager. The index file will be tested as much as
possible to insure that it is a legitimate Clipper
index file.
A block of memory large enough to hold at least 3
pages (3072 bytes) will be allocated during the
open. Three pages is the minimum number of buffers
required to add or delete index keys.
The file will be opened under control of the
"command" parameter. Using SC_RDWR opens the file
for both read and write access. SC_RDONLY
overrides SC_RDWR and causes the file to be opened
for read access only. Any attempt to write to a
read only file will result in an error
(SC_READOLY).
Using SC_EXCLUDE opens the file for exclusive use
of this station (single user). SC_SHARED
overrides SC_EXCLUDE and opens the file in multi-
user mode. This mode is used when a LAN file is
to be shared with other stations.
Using SC_BUFFER opens the file with I/O caching
enabled. Memory for up to 10 pages will be
allocated during the open. Caching of page I/O
greatly increases the speed of file access.
Typically this mode is used with single user
87
CHAPTER 8, THE SOFTC DATABASE LIBRARY
files. SC_FLUSH overrides SC_BUFFER and causes
the file to be opened with no caching. This mode
is generally used with file sharing, although it
is not required.
The index expression will be translated to upper
case after being read from the index file.
EXAMPLE
#include
#include
void main()
{
int ntx;
scdinit(20,0);
if (scdcopenx(&ntx, "UNKNOWN.NTX", SC_BUFFER) ==
SC_SUCCESS) {
scdcclose(ntx);
}
scdterm();
}
88
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddbfrsz
USAGE
signed int scddbfrsz(
signed int handle,
signed int *length,
signed int command );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddbfrsz either sets (SC_SETSZ) or gets
(SC_GETSZ) the I/O cache "length" (in records)
based upon the value of "command".
If the cache length is being set, the current
cache will be flushed to disk before the buffer is
reallocated.
An I/O cache will be used only if the data file
was opened with SC_BUFFER in the command field.
SEE ALSO
scddopenx
EXAMPLE
/* Get Size */
#include
#include
#include
void main()
{
int dbf, length;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",SC_BUFFER) == SC_SUCCESS) {
scddbfrsz(dbf,&length,SC_GETSZ);
printf("%d\n",length);
scddclose(dbf);
89
CHAPTER 8, THE SOFTC DATABASE LIBRARY
}
scdterm();
}
/* Get Size */
#include
#include
#include
void main()
{
int dbf, length = 100;
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF", SC_BUFFER) == SC_SUCCESS) {
scddbfrsz(dbf,&length,SC_SETSZ);
printf("%d\n",length);
scddclose(dbf);
}
scdterm();
}
90
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddbof
USAGE
signed int scddbof(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddbof returns an indicator as to whether or not
the record pointer is positioned at the beginning
of the file.
RETURN VALUES
SC_TRUE at beginning of file
SC_FALSE somewhere else
SEE ALSO
scddeof, scddrnum.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
if (scddbof(dbf) < SC_SUCCESS)
puts(scemsg());
else if (sc_code == SC_TRUE)
puts("At beginning of file");
else
puts("Somewhere else.");
scddclose(dbf);
}
scdterm();
}
91
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddclose
USAGE
signed int scddclose(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddclose closes a data file and frees all
allocated memory associated with data file
"handle". If the data file was modified, today's
date will be written into the file header.
NOTES
If any locks are applied to the file, they will be
removed before closing.
SEE ALSO
scddopenx
EXAMPLE
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS)
scddclose(dbf);
scdterm();
}
92
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddcreate
USAGE
signed int scddcreate(
signed char *filename,
signed int numfields,
SC_FIELD *fields,
signed int style );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddcreate creates a dBASEIII or dBASEIV
compatible data file. A pointer to an array of
SC_FIELD must be passed.
typedef struct {
signed char name[11]; /* field name */
signed char type; /* field type */
unsigned char len; /* field length */
unsigned char decpl; /* decimal places */
} SC_FIELD;
The field description array must be initialized
and each element set to appropriate values. The
array determines the organization of the data
record. The data file does not remain open upon
exit of this function.
This function will create a new data file even if
one had already existed.
Field names and types are converted to all upper
case when the file is created.
Valid field types are:
'C' character (not NULL terminated in record)
'D' date ("yyyymmdd" format)
'F' floating point (valid only for dBASEIV files)
'L' logical (TRUE, FALSE)
93
CHAPTER 8, THE SOFTC DATABASE LIBRARY
'M' memo (memo file record number)
'N' numeric.
Both 'F' and 'N' fields are handled as doubles by
the library. The library does not support BCD
numbers.
The type of data file created depends upon the
value of the "style" parameter: SC_DB3 - dBASEIII
compatible, or SC_DB4 - dBASEIV compatible.
RESTRICTIONS
The maximum record length is 4000 bytes.
The maximum number of dBASE III fields is 128, but
the maximum number of dBASEIV fields is 255.
The maximum length of character fields is 254, and
they cannot be longer than 100 if used as a key.
The maximum length of dBASE III numeric fields is
19, but the maximum length of dBASE IV numeric &
float fields is 20.
The length of a date field is forced to 8.
The length of a logical field is forced to 1.
The length of a memo field is forced to 10.
The number of decimal places will be forced to
zero for all types except: 1) dBASE III NUMERIC -
it must be less than ('len' - 2) and also less
than 16, and 2) dBASE IV NUMERIC and FLOAT - it
must be less than ('len' - 2). The number of
decimal places cannot be less than zero.
SEE ALSO
scddcreate
EXAMPLE
#include
#include
94
CHAPTER 8, THE SOFTC DATABASE LIBRARY
void main()
{
SC_FIELD fields[] = {
"name",'c',64,0, /* file name */
"length",'n',10,0, /* file size */
"date",'d',8,0, /* date */
"time",'c',8,0, /* time */
"attribute",'c',3,0 /* file attributes */
};
scdinit(20,0);
scddcreate("TOC.DBF",5,fields,SC_DB3);
scdterm();
}
95
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddeof
USAGE
signed int scddeof(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddeof returns an indicator as to whether or not
the record pointer is positioned at the end of the
file.
RETURN VALUES
SC_TRUE at end of file
SC_FALSE somewhere else
SEE ALSO
scddbof, scddrnum.
EXAMPLE
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF", 0) == SC_SUCCESS) {
if (scddeof(dbf) < SC_SUCCESS)
puts(scemsg());
else if (sc_code == SC_TRUE)
puts("At end of file");
else
puts("Somewhere else");
scddclose(dbf);
}
scdterm();
}
96
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfget
USAGE
signed int scddfget(
signed int handle,
signed int fieldno,
void *data );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddfget gets data from the desired field
"fieldno" of the record I/O buffer. "data" will be
converted from dBASE to a more natural data type
for 'c':
dBASE field type returned data type
'C' signed char *
'D' signed char [9]
'F' double (dBASEIV)
'L' signed char
'M' unsigned long
'N' double
Date and character fields are returned as ASCIIZ
strings. The date strings will be formatted under
control of the global variable sc_date_style. This
variable will default to SC_GREGOR.
Data returned by this function for memo fields is
the memo file record number NOT the actual memo
text. A call must be made to scdtrget to retrieve
the memo text.
scddfinfo can be used to determine the length of
the longest data field in the file.
NOTES
Fields are numbered from zero (0).
97
CHAPTER 8, THE SOFTC DATABASE LIBRARY
SEE ALSO
scdtrget, scddfgets, scddfput, scddfinfo,
scddrget.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
char name[65], time[9], date[9];
double length, attribute;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrget(dbf,1L);
scddfget(dbf,0,name);
scddfget(dbf,1,&length);
scddfget(dbf,2,date);
scddfget(dbf,3,time);
scddfget(dbf,4,&attribute);
printf("%s %lf %s %s %lf\n",
name,length,date,time,attribute);
scddclose(dbf);
}
scdterm();
}
98
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfgets
USAGE
signed int scddfgets(
signed int handle,
signed int fieldno,
char *data );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddfgets gets data from the desired field
"fieldno" of the record I/O buffer. "data" will be
returned as an ASCIIZ string.
scddfinfo can be used to determine the length of
the longest data field in the file.
NOTES
Date fields are returned in the form "yyyymmdd".
There is a difference between the date formats of
scddfgets and scddfget.
Fields are numbered from zero (0).
SEE ALSO
scddfget, scddfputs, scddfinfo, scddrget.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
char name[65], time[9], date[9], length[11], attribute[4];
scdinit(20,0);
99
CHAPTER 8, THE SOFTC DATABASE LIBRARY
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrget(dbf,1L);
scddfgets(dbf,0,name);
scddfgets(dbf,1,length);
scddfgets(dbf,2,date);
scddfgets(dbf,3,time);
scddfgets(dbf,4,attribute);
printf("%s %s %s %s %s\n",
name,length,date,time,attribute);
scddclose(dbf);
}
scdterm();
}
100
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfinfo
USAGE
signed int scddfinfo(
signed int handle,
signed int *longfldlen,
SC_FIELD *fields );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddfinfo copies the data field descriptions to
"fields" using the structure SC_FIELD. The length
of the longest data field is also returned
"longfldlen".
typedef struct {
signed char name[11]; /* field name */
signed char type; /* field type */
unsigned char len; /* field length */
unsigned char decpl; /* decimal places */
} SC_FIELD;
NOTES
The user must ensure that the array defined for
"fields" is large enough to hold all of the field
descriptions because scddfinfo blindly copies the
descriptions to "fields". Severe program errors
can be the result if the field array is too small.
Use scddrinfo to determine the number of fields in
the data record.
SEE ALSO
scddrinfo
EXAMPLE
#include
#include
#include
101
CHAPTER 8, THE SOFTC DATABASE LIBRARY
void main()
{
int dbf, longfld, numflds, a, reclen;
SC_FIELD fields[128]; /* dBASEIII max size */
unsigned char *bfr;
SC_DBFRINFO rinfo;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrinfo(dbf,&rinfo);
scddfinfo(dbf,&longfld,fields);
printf("longest field length = %d\n",longfld);
for (a=0; a
fields[a].type,
fields[a].len, fields[a].decpl);
scddclose(dbf);
}
scdterm();
}
102
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddflush
USAGE
signed int scddflush(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddflush will write the contents of the I/O cache
to disk. An I/O cache will be used only if the
data file was opened with SC_BUFFER in the command
switch.
SEE ALSO
scddopenx
EXAMPLE
#include
#include
void main()
{
int dbf;
long record;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",SC_BUFFER) == SC_SUCCESS) {
.
.
.
scddrput(dbf,&record,SC_ADD);
scddflush(dbf);
.
.
.
scddclose(dbf);
}
scdterm();
}
103
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfnam2no
USAGE
signed int scddfnam2no(
signed int handle,
signed int *fieldno,
signed char *fieldname );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddfnam2no searches through the field description
array for data file "handle" looking for
"fieldname". It will return the corresponding
field number.
NOTES
Data files created by the SoftC Database Library
will have field names and types changed to all
upper case.
EXAMPLE
#include
#include
#include
void main()
{
int dbf, fldno
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddfnam2no(dbf,&fldno,"ATTRIBUTE");
printf("%d",fldno);
scddclose(dbf);
}
scdterm();
}
104
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfput
USAGE
signed int scddfput(
signed int handle,
signed int fieldno,
void *data );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddfput will convert "data" from 'c' format to
dBASE format and place it in the proper field
"fieldno" of the record I/O buffer.
dBASE field type returned data type
'C' signed char *
'D' signed char [9]
'F' double (dBASE IV)
'L' signed char
'M' unsigned long
'N' double
NOTES
Fields are numbered from zero (0).
scddfput uses the global variable sc_date_style to
control date string formatting. The initial value
of this variable is SC_GREGOR.
SEE ALSO
scddfget, scddfputs.
EXAMPLE
#include
#include
#include
void main()
105
CHAPTER 8, THE SOFTC DATABASE LIBRARY
{
int dbf;
double length = 1200.0L, attribute = 1.0L;
long recno;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddfput(dbf,0,"ABC.XYZ");
scddfput(dbf,1,&length);
scddfput(dbf,2,"07/21/90");
scddfput(dbf,3,"20:01:45");
scddfput(dbf,4,&attribute);
scddrput(dbf,&recno,SC_ADD);
scddclose(dbf);
}
scdterm();
}
106
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfputs
USAGE
signed int scddfputs(
signed int handle,
signed int fieldno,
char *data );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddfputs will place "data" in the proper field
"fieldno" of the record I/O buffer. It is the
user's responsibility to provide a properly sized
and formatted ASCIIZ string to scddfputs.
NOTES
Fields are numbered from zero (0).
scddfputs follows the date formatting conventions
of scddfgets. Also be aware that the date
formatting conventions of scddfget/scddfput are
not the same as scddfgets/scddfputs.
SEE ALSO
scddfgets, scddfput.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
long recno;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddfputs(dbf,0,"ABC.XYZ");
107
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfputs(dbf,1," 1234.0");
scddfputs(dbf,2,"19900721");
scddfputs(dbf,3,"20:01:45");
scddfputs(dbf,4," 1");
scddrput(dbf,&recno,SC_ADD);
scddclose(dbf);
}
scdterm();
}
108
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddinfo
USAGE
signed int scddinfo(
signed int handle,
SC_DBFINFO *info );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddinfo returns an information structure for the
file associated with "handle".
typedef struct {
signed char fname[80]; /* file name */
signed char style; /* file type */
/* (dBASE 3 or 4) */
signed char memo; /* memo file used */
signed char mdx; /* MDX file used */
signed char trans; /* transaction */
/* in progress */
signed char encrypt; /* data encrypted */
signed char lockt; /* lock status */
unsigned long ladrs; /* address of lock */
unsigned long lsize; /* locked length */
SC_FLAGS flags; /* misc. flags */
} SC_DBFINFO;
SEE ALSO
scddopenx
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
SC_DBFINFO info;
109
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddinfo(dbf,&info);
puts(info.fname);
if (info.style == SC_DB3)
puts("dBASE III data file");
else {
puts("dBASE IV data file");
if (info.memo)
puts("memo file attached");
else
puts("no memo file attached");
if (info.mdx)
puts(".MDX file used")
else
puts("No .MDX file used");
if (info.trans)
puts("Transaction in progress");
if (info.encrypt)
puts("File encrypted");
}
scddclose(dbf);
}
scdterm();
}
110
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddlock
USAGE
signed int scddlock(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddlock will lock the entire data file for
exclusive use by this station. This function
should be used immediately prior to adding records
to the data file, or writing to the index and/or
memo files. A call to scddunlock should
immediately follow the write so that others may
again access the data, memo, and index files.
File sharing is enabled by opening the data file
with SC_SHARED in the command switch. Any
associated index and memo files should also be
opened with SC_SHARED in the command switch.
SEE ALSO
scddopenx, scddrlock,scddunlock.
EXAMPLE
#include
#include
void main()
{
int dbf;
long record;
double length = 1305, attribute = 1;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",SC_SHARED) == SC_SUCCESS) {
scddfput(dbf,0,"MNO.XYZ");
scddfput(dbf,1,&length);
scddfput(dbf,2,"07/22/90");
scddfput(dbf,3,"20:10:45");
111
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfput(dbf,4,&attribute);
scddlock(dbf);
scddrput(dbf,&record,SC_ADD);
scddunlock(dbf);
scddclose(dbf);
}
scdterm();
}
112
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddlud
USAGE
signed int scddlud(
signed int handle,
signed char *datestr,
signed int format );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddlud returns the ASCIIZ date string ("datestr")
of when the last update to the data file was made.
The date string will be under control of the
"format" command. This date will be updated after
the data file has been closed.
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
char date[9];
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddlud(dbf,&date,SC_YMD);
puts(date);
scddclose(dbf);
}
scdterm();
}
113
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddopenx
USAGE
signed int scddopenx(
signed int *handle,
signed char *filename,
signed int command );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddopenx opens a data file. Memory will be
allocated for a file packet and I/O buffers for
use internally by the SoftC Database Library file
manager. The data file will be tested as much as
possible to insure that it is a legitimate dBASE
data file.
The file will be opened under control of the
"command" parameter. Using SC_RDWR opens the file
for both read and write access. SC_RDONLY
overrides SC_RDWR and causes the file to be opened
for read access only. Any attempt to write to a
read only file will result in an error
(SC_READOLY).
Using SC_EXCLUDE opens the file for exclusive use
of this station (single user). SC_SHARED
overrides SC_EXCLUDE and opens the file in multi-
user mode. This mode is used when a LAN file is
to be shared with other stations.
Using SC_BUFFER opens the file with I/O caching
enabled. A buffer of at least 512 bytes but no
more than 16384 will be allocated during the open.
Caching of record I/O greatly increases the speed
of sequential file access. Typically this mode is
used with single user files. SC_FLUSH overrides
SC_BUFFER and causes the file to be opened with no
caching. This mode is generally used with file
sharing, although it is not required.
114
CHAPTER 8, THE SOFTC DATABASE LIBRARY
NOTES
All field names and types, and the file name will
be converted to upper case after the file has been
opened.
SEE ALSO
scddopenx
EXAMPLE
#include
#include
void main()
{
int dbf;
scdinit(20,0);
scddopenx(&dbf, "TOC.DBF", SC_SHARED|SC_FLUSH|SC_RDWR);
scdterm();
}
115
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddpack
USAGE
signed int scddpack(
signed int *handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddpack will remove all data file records which
have been flagged as deleted (SC_NOTUSED). The
data file will be compressed so that all active
records will be contiguous after the pack. Files
opened with the read only flag (SC_RDONLY) cannot
be packed.
SEE ALSO
scddopenx,scdnindex,scdtpack
EXAMPLE
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddpack(dbf);
scddclose(dbf);
}
scdterm();
}
116
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrclear
USAGE
signed int scddrclear(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrclear clears the record buffer. The buffer
will be written with spaces (" ") NOT zeros (0).
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
char name[65];
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddfput(dbf,0,"Now is the time for all...");
scddrclear(dbf);
scddfget(dbf,0,name);
puts(name);
}
scdterm();
}
117
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrdel
USAGE
signed int scddrdel(
signed int handle,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrdel will flag a record specified by "recno"
as 'deleted'. To maintain compatibility with dBASE
the data record cannot be reused, but it can be
recovered by scddrundel.
SEE ALSO
scddrundel.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrdel(dbf,1L);
scddrget(dbf,1L);
puts(scemsg()); /* WARNING - record read is marked
deleted */
scddclose(dbf);
}
scdterm();
}
118
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrget
USAGE
signed int scddrget(
signed int handle,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrget will read the data record specified by
"recno" from the data file associated with
"handle" into the internal record buffer.
SEE ALSO
scddfget, scddfput, scddrput.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
char name[65], time[9], date[9];
double length, attribute;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrget(dbf,1L);
scddfget(dbf,0,name);
scddfget(dbf,1,&length);
scddfget(dbf,2,date);
scddfget(dbf,3,time);
scddfget(dbf,4,&attribute);
printf("%s %lf %s %s %lf\n",
name,length,date,time,attribute);
scddclose(dbf);
}
scdterm();
}
119
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrinfo
USAGE
signed int scddrinfo(
signed int handle,
SC_DBFRINFO *rinfo );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrinfo gets the data record length, the number
of data fields per record, and the address of the
record buffer.
typedef struct {
signed int reclen; /* record length */
signed int numflds; /* number of */
/* fields */
unsigned char *bfr; /* buffer address */
} SC_DBFRINFO;
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
SC_DBFRINFO rinfo;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrinfo(dbf,&rinfo);
printf("Record length = %d\n",rinfo.reclen);
printf("Number of fields = %d\n",rinfo.numflds);
printf("Record buffer = %p\n",rinfo.bfr);
scddclose(dbf);
}
scdterm();
}
120
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrlock
USAGE
signed int scddrlock(
signed int handle,
signed long record );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrlock will lock the specified "record" in the
data file for exclusive use by this station. This
function should be used immediately prior to
updating a data file record. A call to scddunlock
should immediately follow the write so that others
may again access the data record.
File sharing is enabled by opening the data file
with SC_SHARED in the command switch.
SEE ALSO
scddopenx, scddlock,scddunlock.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
long record = 1L;
double length = 1936, attribute = 1;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",SC_SHARED) == SC_SUCCESS) {
scddfput(dbf,0,"MNO.XYZ");
scddfput(dbf,1,&length);
scddfput(dbf,2,"07/22/90");
scddfput(dbf,3,"20:10:45");
scddfput(dbf,4,&attribute);
121
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdnkmake(dbf,ndx,&key);
scdrlock(dbf,record);
scddrput(dbf,&record,SC_UPDATE);
scddunlock(dbf);
free(key);
scddclose(dbf);
}
scdterm();
}
122
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrnum
USAGE
signed int scddrnum(
signed int handle,
signed long *position );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrnum returns the current position (record
number) in the data file.
SEE ALSO
scddbof, scddeof.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
long position;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrget(dbf,4L);
scddrnum(dbf,&position);
printf("%ld\n",position);
scddclose(dbf);
}
scdterm();
}
123
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrput
USAGE
signed int scddrput(
signed int handle,
signed long *recno,
signed int howto );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrput will write the data record specified by
"recno" to the data file associated with "handle"
from the internal record buffer. "howto"
determines how the data record is to be written:
"howto" = action
SC_ADD append to end of file
SC_UPDATE update current record
If a record update is occurring the data record
number passed in "recno" will be written in the
disk file.
Use scddrget/scddrcopy to load a data record or
scddfput or scddfputs to fill the data record
field by field.
SEE ALSO
scddfput, scddfputs, scddrget.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
124
CHAPTER 8, THE SOFTC DATABASE LIBRARY
double length = 1200.0L, attribute = 1.0L;
long recno;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddfput(dbf,0,"ABC.XYZ");
scddfput(dbf,1,&length);
scddfput(dbf,2,"07/21/90");
scddfput(dbf,3,"20:01:45");
scddfput(dbf,4,&attribute);
scddrput(dbf,&recno,SC_ADD);
scddclose(dbf);
}
scdterm();
}
125
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrstat
USAGE
signed int scddrstat(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrstat returns an indicator as to whether or
not the current record loaded is active or
inactive (flagged as deleted).
RETURN VALUES
SC_DELREC record inactive
SC_SUCCESS active record
SEE ALSO
scddrget
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrget(dbf,1L);
if (scddrstat(dbf) == SC_DELREC)
puts("Record is inactive.");
else
puts("Record is active.");
scddclose(dbf);
}
scdterm();
}
126
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddrundel
USAGE
signed int scddrundel(
signed int handle,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddrundel will remove the 'deleted' flag from the
data record specified by "recno".
SEE ALSO
scddrdel.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddrundel(dbf,1L);
scddrget(dbf,1L);
puts(scemsg());
scddclose(dbf);
}
scdterm();
}
127
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddsize
USAGE
signed int scddsize(
signed int handle,
signed long *recsused );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddsize gets the number of records "recsused" in
the data file. This number will include all
records inactive as well as active records.
EXAMPLE
#include
#include
#include
void main()
{
int dbf;
long recsused;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",0) == SC_SUCCESS) {
scddsize(dbf,&recsused);
printf("%ld",recsused);
scddclose(dbf);
}
scdterm();
}
128
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddunlock
USAGE
signed int scddunlock(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scddunlock will unlock the data file/record for
shared use by other stations. This function
should be used immediately after writing to all
required data, index and memo files.
File sharing is enabled by opening the data file
with SC_SHARED in the command switch. Any
associated index and memo files should also be
opened with SC_SHARED in the command switch.
SEE ALSO
scddopenx, scddlock,scddrlock.
EXAMPLE
#include
#include
#include
void main()
{
int dbf, ndx;
char *key;
long record;
double length = 2367, attribute = 1;
scdinit(20,0);
if (scddopenx(&dbf,"TOC.DBF",SC_SHARED) == SC_SUCCESS) {
if (scdnopenx(&ndx,"TOCNAME.NDX",SC_SHARED) ==
SC_SUCCESS) {
scddfput(dbf,0,"ABC.XYZ");
scddfput(dbf,1,&length);
scddfput(dbf,2,"07/21/90");
129
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scddfput(dbf,3,"20:01:45");
scddfput(dbf,4,&attribute);
scdnkmake(dbf,ndx,&key);
scddlock(dbf);
scddrput(dbf,&record,SC_ADD);
scdnkadd(ndx,key,record);
scddunlock(dbf);
free(key);
scdnclose(ndx);
}
scddclose(dbf);
}
scdterm();
}
130
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdibfrsz
USAGE
signed int scdibfrsz(
signed int handle,
signed int *numpgs,
signed int command );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdibfrsz will either get (SC_GETSZ) or set
(SC_SETSZ) the maximum number of index pages the
library file manager can keep in memory and
returns it via "numpgs". This is under control of
"command".
EXAMPLE
/* Get Size */
#include
#include
#include
void main()
{
int idx, numpgs;
scdinit(20,0);
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS) {
scdibfrsz(idx,&numpgs,SC_GETSZ) == SC_SUCCESS)
printf("Maximum number of pages = %d\n",numpgs);
scdiclose(idx);
}
scdterm();
}
/* Set Size */
#include
#include
#include
void main()
131
CHAPTER 8, THE SOFTC DATABASE LIBRARY
{
char idx, numpgs = 5;
scdinit(20,0);
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS) {
scdibfrsz(idx,&numpgs,SC_SETSZ);
printf("New max = %d\n",numpgs);
scdiclose(idx);
}
scdterm();
}
132
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdiclose
USAGE
signed int scdiclose(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdiclose closes an index file and frees all
allocated memory associated with the index file
specified by "handle".
EXAMPLE
#include
#include
#include
void main()
{
int idx;
scdinit(20,0);
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS)
scdiclose(idx);
scdterm();
}
133
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdicreate
USAGE
signed int scdicreate(
signed char *filename,
signed int keytype,
signed char *keyexpr,
signed int keylen );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdicreate creates an index file. "keyexpr" will
be translated to all upper case when the index
file is created.
If "keytype" is SC_CKEY, then "keyexpr" must be an
ASCIIZ string consisting of one or more field
names from the data record. All fields included in
the expression must be of type 'c' or be
translated into type 'c'. No check is made to
verify this. "keyexpr" cannot be longer that 220
characters. "keylen" cannot exceed 100.
If "keytype" is SC_DKEY or SC_NKEY, then "keyexpr"
should consist of only one data field. "keylen"
will automatically be set to 8 (numeric and date
keys are stored as modified doubles).
If "keytype" is SC_LKEY, then "keyexpr" should
consist of only one data field. "keylen" will
automatically be set to 1 (logical keys are stored
as characters).
When unique keys are required, OR SC_UNIQUE with
"keytype".
NOTES
scdicreate will create a new index file even if
one had already existed.
134
CHAPTER 8, THE SOFTC DATABASE LIBRARY
"keyexpr" is NOT checked for validity during the
file creation process. Currently only the
scdikmake function uses "keyexpr".
SEE ALSO
scdikmake.
EXAMPLE
#include
void main()
{
scdinit(20,0);
scdicreate("TOCDATE.IDX",SC_CKEY,"dtoc(date) + time",16);
scdterm();
}
135
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdiexpr
USAGE
signed int scdiexpr(
signed int handle,
signed char *keyexpr );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdiexpr gets the index key expression and returns
it as an ASCIIZ string into a user supplied buffer
"keyexpr". The user must ensure that the buffer is
large enough (the key expression length can be
determined via a call to scdiinfo) to hold the
entire key expression.
NOTES
A NULL byte will be appended to the end of the
expression string returned. If you are dynamically
allocating memory be sure to make the buffer large
enough.
SEE ALSO
scdiinfo.
EXAMPLE
#include
#include
#include
void main()
{
int idx;
char buffer[512];
scdinit(20,0);
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS) {
scdiexpr(idx,buffer);
printf("key expression = %s",buffer);
136
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdiclose(idx);
}
scdterm();
}
137
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdiflush
USAGE
signed int scdiflush(
signed int handle );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdiflush will write the contents of the page
cache to disk. A page cache will be used only if
the index file was opened with SC_BUFFER in the
command field.
SEE ALSO
scdiopenx
EXAMPLE
#include
#include
#include
void main()
{
int dbf, idx;
char *key, name[65];
long record;
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF", SC_BUFFER) == SC_SUCCESS) {
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS) {
strcpy(name,"TOC.DBF");
scddfput(dbf,0,name);
scddrput(dbf,&record,SC_ADD);
scdikmake(dbf,idx,&key);
scdikadd(idx,key,record);
free(key);
scdiflush(idx);
scdiclose(idx);
}
scddclose(dbf);
138
CHAPTER 8, THE SOFTC DATABASE LIBRARY
}
scdterm();
}
139
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdiindex
USAGE
signed int scdiindex(
signed int datafile,
signed char filename,
signed char keytype,
signed char keyexpr,
signed int keylen );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdiindex will create and build a FoxBASE+ index
file. A blank file will be created using
"filename", "keytype", "keyexpr", and "keylen".
The resultant file will be opened, and the
"datafile" will be read sequentially building keys
from each data record. The index file will be
closed at exit. The "datafile" must be open prior
to the function call.
EXAMPLE
#include
#include
void main()
{
int dbf;
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF", SC_BUFFER) == SC_SUCCESS) {
scdiindex(dbf, "TOCNAME.IDX", SC_CKEY, "NAME", 64);
scddclose(dbf);
}
scdterm();
}
140
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdiinfo
USAGE
signed int scdiinfo(
signed int handle,
SC_IDXINFO *info );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdiinfo gets the filename of the index file
associated with "handle", the index key type, the
maximum index key length, and the length of the
index key expression and returns in "info":
typedef struct {
signed char fname[80]; /* file name */
signed char keytype; /* key type */
/* (C,D,L,N) */
signed char keylen; /* key length */
signed char exprlen; /* expression */
/* length */
SC_FLAGS flags; /* misc. flags */
} SC_IDXINFO;
NOTES
If you are using the expression length to
dynamically allocate memory to hold the key
expression be sure to add one to the length before
allocation.
SEE ALSO
scdiopenx.
EXAMPLE
#include
#include
#include
void main()
141
CHAPTER 8, THE SOFTC DATABASE LIBRARY
{
int idx;
SC_IDXINFO info;
scdinit(20,0);
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS) {
scdiinfo(idx,&info);
printf("File name = %s\n",info.fname);
printf("Index key type = %c\n",info.keytype);
printf("Maximum key length = %d\n",info.keylen);
printf("Key expression length = %d\n",info.exprlen);
scdiclose(idx);
}
scdterm();
}
142
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdikadd
USAGE
signed int scdikadd(
signed int handle,
void *key,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdikadd will add "key" to the index file
specified by "handle". "recno" is the data record
number to be associated with "key" (the data
record pointed to by "recno" must exist prior to
calling scdikadd).
NOTES
When adding character keys it is necessary to
pad the key string to size with spaces (" "), the
function will not automatically do this for you.
This differs from the dBASE and Clipper
corresponding functions.
SEE ALSO
scdikdate, scdikmake,scdiknum.
EXAMPLE
#include
#include
void main()
{
int dbf, idx;
long recno;
unsigned char key[8]
double length = 123.67L
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF",0) == SC_SUCCESS) {
if (scdiopenx(&idx, "TOCLNGTH.IDX", SC_BUFFER) ==
143
CHAPTER 8, THE SOFTC DATABASE LIBRARY
SC_SUCCESS) {
scddfput(dbf,1,&length);
if (scddrput(dbf,&recno,SC_ADD) == SC_SUCCESS) {
scdiknum(key,length);
scdikadd(idx,key,recno);
}
scdiclose(idx);
}
scddclose(dbf)
}
scdterm();
}
144
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdikbot
USAGE
signed int scdikbot(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdikbot will set the current key pointer to the
last logical key in the index and return the key
value "key" and data record number "recno"
associated with the new current key.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdiinfo.
Numeric keys are returned as doubles, and
character keys are returned as strings.
SEE ALSO
scdiinfo.
EXAMPLE
#include
#include
#include
void main()
{
int idx;
char name[65];
long recno;
scdinit(20,0);
145
CHAPTER 8, THE SOFTC DATABASE LIBRARY
if (scdiopenx(&idx, "TOCNAME.IDX", SC_BUFFER) ==
SC_SUCCESS) {
name[64] = 0;
scdikbot(idx,name,&recno);
printf("%s %ld\n",name,recno);
scdiclose(idx);
}
scdterm();
}
146
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdikcur
USAGE
signed int scdikcur(
signed int handle,
void *key,
signed long *recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdikcur will return the key value "key" and data
record number "recno" associated with the current
key in the index file.
The current key pointer must be set by a call to
either scdikfind, scdiktop, scdikbot, scdiknext,
or scdikprev before calling scdikcur.
NOTES
The user must ensure that the buffer used to
return the key is large enough to hold the entire
key. The maximum length of the key can be
determined via a call to scdiinfo.
SEE ALSO
scdiinfo, scdikfind, scdiktop, scdikbot,
scdiknext, scdikprev.
EXAMPLE
#include
#include
#include
void main()
{
int idx;
char date[17], dat[17];
long recno, recn;
147
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdinit(20,0);
if (scdiopenx(&idx, "TOCDATE.IDX", SC_BUFFER) ==
SC_SUCCESS) {
date[16] = 0;
dat[16] = 0;
scdiktop(idx,date,&recno);
scdikcur(idx,dat,&recn);
printf("%s %s %ld %ld\n", date,dat,recno,recn);
scdiclose(idx);
}
scdterm();
}
148
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdikdate
USAGE
signed int scdikdate(
unsigned char *key,
signed char *string,
signed int format );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdikdate will translate an ASCIIZ date string
"string" of style "format" into a valid FoxBASE+
date key "key".
Date string styles:
SC_GREGOR mm/dd/yy
SC_GREGORL mm/dd/yyyy
SC_JULIAN yyyy/ddd
SC_YMD yyyymmdd
SC_DMY ddmmyy
SEE ALSO
scdikmake, scdiknum.
EXAMPLE
#include
#include
void main()
{
int dbf, idx;
long recno;
unsigned char key[8]
scdinit(20,0);
if (scddopenx(&dbf, "TOC.DBF",0) == SC_SUCCESS) {
if (scdiopenx(&idx, "TOCFDATE.IDX", SC_BUFFER) ==
SC_SUCCESS) {
scddfput(dbf,2,"07/21/90);
.
.
149
CHAPTER 8, THE SOFTC DATABASE LIBRARY
.
if (scddrput(dbf,&recno,SC_ADD) == SC_SUCCESS) {
scdikdate(key, "07/21/90", SC_GREGOR);
scdikadd(idx,key,recno);
}
scdiclose(idx);
}
scddclose(dbf)
}
scdterm();
}
150
CHAPTER 8, THE SOFTC DATABASE LIBRARY
scdikdel
USAGE
signed int scdikdel(
signed char handle,
void *key,
signed long recno );
PROTOTYPE IN
sc_base.h
DESCRIPTION
scdikdel will remove "key" from the index file
specified by "handle". "recno" is used along with
"key" to ensure that the proper key has been
removed from the index file.
NOTES
When deleting character keys it is necessary to
pad the key string to size with spaces (" "), the
function will not automatically do this for you.
This differs from the corresponding dBASE and
Clipper functions.
SEE ALSO
scdikadd.
EXAMPLE
#include