Files
TeslaRel410/BORLAND/BDE/EXAMPLES/SNIPIT/PRDXSORT.C
T
CydandClaude Fable 5 63312e07f9 source410: literal 4.10 source reconstruction + BC++ 4.52 fleet toolchain archived
- BORLAND/: Borland C++ 4.52 (chosen over 4.5 by byte-match: CODE/RP/CW32.LIB
  is identical to 4.52's install lib). BCC32/TLINK32/TLIB/MAKE run natively on
  Win11; CODE/BT/OPT.MAK is the shipped BTL4OPT.EXE's exact flag recipe
  (extender = Borland PowerPack DPMI32, not Phar Lap TNT).
- restoration/source410/: the literal 1995-form reconstruction of the missing
  BT game source (never mixed into CODE/). Round 1-3 state:
  * 6 of 10 surviving original TUs COMPILE CLEAN under the period toolchain
    (BTMSSN, BTCNSL, BTSCNRL, BTTEAM, BTL4MODE, BTL4ARND) - first builds
    since 1996.
  * BT_L4/BTL4APP.CPP pilot reconstruction: 12/12 functions, Fail() lands on
    its binary-recorded line 400 exactly.
  * BT/BTCNSL.HPP: console wire IDs recovered from the binary's ctors
    (Killed=9, Damaged=10, ScoreUpdate=13, DeathWithoutHonor=15 [T1];
    TeamScore=12 flagged [T4]).
  * MUNGA/: 8 engine-header backfills back-dated from the BT412 WinTesla tree
    (VDATA numbering decomp-verified; AUDREND's OpenAL-era virtual removed -
    the period compiler is the drift detector).
  * Tooling: backdate.py (WinTesla->1995 header transform), compile410.sh
    (per-TU verification sweep under authentic OPT.MAK flags).
  * README: corrected roadmap - MECH.HPP is the capstone grown with the mech
    TU reconstructions; BTREG.CPP green = the header-family milestone.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-19 07:33:26 -05:00

261 lines
9.4 KiB
C++

// BDE - (C) Copyright 1995 by Borland International
// prdxsort.c
#include "snipit.h"
// Default length of the mapped fields
#define NAMELEN 30
static const char szTblName[] = "vendors";
static const char szSortedTblName[] = "SortVend";
static const char szTblType[] = "PARADOX";
// Field descriptor used in mapping the fields of the table.
// Used in order to display the fields in the order that they
// are sorted: 'State/Prov' and 'Street'. The 'Vendor Name' is
// included as additional information.
// See the fieldmap.c file for a description of field mapping
static SNIPFAR FLDDesc FldDescs1[] = {
{
1, // Field number
"State/Prov", // Field name
fldZSTRING, // Field type
fldUNKNOWN, // Field subtype
NAMELEN, // Field size (1 or 0, except
// BLOB or CHAR field)
0, // Decimal places ( 0 )
// computed
0, // Offset in record ( 0 )
0, // Length in bytes ( 0 )
0, // For NULL Bits ( 0 )
fldvNOCHECKS, // Validiy checks ( 0 )
fldrREADWRITE // Rights
},
{
2, "Street", fldZSTRING, fldUNKNOWN,
NAMELEN, 0, 0, 0, 0,
fldvNOCHECKS, fldrREADWRITE
},
{
3, "Vendor Name", fldZSTRING, fldUNKNOWN,
NAMELEN, 0, 0, 0, 0,
fldvNOCHECKS, fldrREADWRITE
}
}; // FldDescs1.
INT16 DBIFN StreetCompare(pVOID pLdObj, pVOID pValue1, pVOID pValue2,
INT16 iLen);
pCHAR DBIFN FindFirstChar(const char *pszString);
//=====================================================================
// Function:
// ParadoxSort();
//
// Description:
// This example shows how to sort on a field in a PARADOX
// table. The example will use the DbiSortTable() function.
//=====================================================================
void
ParadoxSort (void)
{
hDBIDb hDb; // Handle to the database
hDBICur hCur; // Handle to the table
hDBICur hSortCur; // Handle to the sorted table
UINT16 uSortFields[] = { 5, 3 }; // Which fields to sort
BOOL bCaseIns[] = { FALSE, FALSE};
SORTOrder SortOrder[] = { sortASCEND, sortASCEND };
pfSORTCompFn pfSortFn[] = { NULL, StreetCompare };
UINT16 NOSRTFLDS; // Number of fields to sort
UINT32 uNumToSort = 10;// Number of record to display
UINT16 uNumFields; // Number of fields in the table
DBIResult rslt; // Return value from IDAPI functions
Screen("*** Sorting Example ***\r\n");
BREAK_IN_DEBUGGER();
Screen(" Initializing IDAPI...");
if (InitAndConnect(&hDb) != DBIERR_NONE)
{
Screen("\r\n*** End of Example ***");
return;
}
Screen(" Setting the database directory...");
rslt = DbiSetDirectory(hDb, (pCHAR) szTblDirectory);
ChkRslt(rslt, "SetDirectory");
Screen(" Open the %s table...", szTblName);
rslt = DbiOpenTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType,
NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
xltFIELD, FALSE, NULL, &hCur);
if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
{
CloseDbAndExit(&hDb);
Screen("\r\n*** End of Example ***");
return;
}
rslt = DbiSetToBegin(hCur);
ChkRslt(rslt, "SetToBegin");
Screen(" Display the unsorted %s table...", szTblName);
DisplayTable(hCur, uNumToSort);
Screen("\r\n Sort the %s table, using first the 'State/Prov'"
" field,", szTblName);
Screen(" and then the 'Street' field. The sorted"
" records are saved in the %s table", szSortedTblName);
// Number of sort fields on which to sort the table.
NOSRTFLDS = sizeof(uSortFields) / sizeof(uSortFields[0]);
rslt = DbiSortTable(hDb, (pCHAR) szTblName, (pCHAR) szTblType, 0,
(pCHAR) szSortedTblName, NULL, 0, NOSRTFLDS,
uSortFields, bCaseIns, SortOrder, pfSortFn,
FALSE, NULL, &uNumToSort);
if (ChkRslt(rslt, "SortTable") != DBIERR_NONE)
{
rslt = DbiDeleteTable(hDb, (pCHAR) szSortedTblName, (pCHAR) szTblType);
ChkRslt(rslt, "DeleteTable");
CloseDbAndExit(&hDb);
Screen("\r\n*** End of Example ***");
return;
}
Screen(" Open the %s sorted table...", szSortedTblName);
rslt = DbiOpenTable(hDb, (pCHAR) szSortedTblName, (pCHAR) szTblType,
NULL, NULL, 0, dbiREADWRITE, dbiOPENSHARED,
xltFIELD, FALSE, NULL, &hSortCur);
if (ChkRslt(rslt, "OpenTable") != DBIERR_NONE)
{
rslt = DbiDeleteTable(hDb, (pCHAR) szSortedTblName, (pCHAR) szTblType);
ChkRslt(rslt, "DeleteTable");
CloseDbAndExit(&hDb);
Screen("\r\n*** End of Example ***");
return;
}
Screen(" Change which fields of the table are displayed:"
"\r\n 'State/Prov', 'Street', and 'Vendor Name'");
// Determine the number of fields that are part of the descriptor.
uNumFields = sizeof(FldDescs1) / sizeof (FldDescs1[0]);
// Set the field mapping.
rslt = DbiSetFieldMap(hSortCur, uNumFields, FldDescs1);
ChkRslt(rslt, "SetFieldMap");
rslt = DbiSetToBegin(hSortCur);
ChkRslt(rslt, "SetToBegin");
Screen(" Display the %s sorted table...", szSortedTblName);
DisplayTable(hSortCur, uNumToSort);
Screen("\r\n Close the %s original table...", szTblName);
rslt = DbiCloseCursor(&hCur);
ChkRslt(rslt, "CloseCursor");
Screen(" Close the %s sorted table...", szSortedTblName);
rslt = DbiCloseCursor(&hSortCur);
ChkRslt(rslt, "CloseCursor");
Screen(" Delete the %s sorted table...", szSortedTblName);
rslt = DbiDeleteTable(hDb, (pCHAR) szSortedTblName, (pCHAR) szTblType);
ChkRslt(rslt, "DeleteTable");
Screen(" Close the database and exit IDAPI...");
CloseDbAndExit(&hDb);
Screen("\r\n*** End of Example ***");
}
//=====================================================================
// Function:
// StreetCompare(pLdObj, pValue1, pValue2, iLen);
//
// Input:
// pLdObj - Language driver, not used
// pValue1 - First value to compare
// pValue2 - Second value to compare
// iLen - Length, not used
//
// Return: -1 if (pValue1 < pValue2)
// 0 if (pValue1 == pValue2)
// 1 if (pValue1 > pValue2)
//
// Description:
// This function is used in comparing the 'Street'
// field of the vendor table. This function will
// sort according to the street name, not the address.
//=====================================================================
INT16 DBIFN
StreetCompare (pVOID pLdObj, pVOID pValue1, pVOID pValue2,
INT16 iLen)
{
INT16 rslt; // Value returned from IDAPI functions
pCHAR szOne; // First value to compare
pCHAR szTwo; // Second value to compare
// Dummy assignments to avoid warnings.
iLen = iLen;
pLdObj = pLdObj;
// Skip leading numeric values - used to skip the house number
// portion of the street address.
szOne = FindFirstChar((const char *)pValue1);
szTwo = FindFirstChar((const char *)pValue2);
// Compare the values in the 'Street' field, starting the
// strings at the first non-numeric character - sort on
// Street name, not the house number on a given street.
rslt = strcmp(szOne, szTwo);
// If on the same street (pValue1 == pValue2),
// compare House Number on the street.
if (rslt == DBIERR_NONE)
{
rslt = strcmp((pCHAR)pValue1, (pCHAR)pValue2);
}
if (0 < rslt)
{
rslt = 1;
}
if (rslt < 0)
{
rslt = -1;
}
return rslt;
}
//=====================================================================
// Code: FindFirstChar(pszString);
//
// Input: pszString - String to search
//
// Return: Pointer to the location in the string after the house
// number
//
// Description:
// This function is used to skip the house number part
// of the street address when sorting the table. This
// allows the 'Street' field to be sorted according to
// the street name.
//=====================================================================
pCHAR DBIFN
FindFirstChar (const char *pszString)
{
UINT16 uWhere = 0; // Counter to keep track of the current character
// within the string
// Search for the first blank as part of the string -
// this should be the start of the street name.
while ((pszString[uWhere] != 0) &&
(pszString[uWhere] != ' '))
{
uWhere++;
}
// Return the character after the space
return (pCHAR)&(pszString[uWhere+1]);
}