home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / blt2_214.zip / src / bd_main.c < prev    next >
C/C++ Source or Header  |  1996-10-16  |  10KB  |  403 lines

  1.  
  2. /* This main() is for console apps.  For Win32s see bd_mainw.c, instead.
  3.  *
  4.  * bd_main.c - 30-Sep-1996 Cornel Huth
  5.  * This module calls the other bd_*.c modules
  6.  * Bullet 2 Demonstration Program
  7.  *
  8.  * These samples should be read as if a book, where you start
  9.  * with bd_main.c, then to bd_rix.c, then bd_ko, bd_ins, bd_upd,
  10.  * bd_join, bd_memo, bd_files, bd_lock, and bd_cust ...
  11.  *
  12.  * This is because the later examples do not explain what has
  13.  * already been explained in previous samples.
  14.  *
  15.  * Filenames used in these demo modules are prefixed with .\ to
  16.  * ensure that no path searching is done (if ever the OS would).
  17.  *
  18.  */
  19.  
  20. #define PRG_DATE "[16-Oct-96]"
  21.  
  22. #include "platform.h"           // defines platform, brings in includes
  23.  
  24. #if FOR_WINDOWS == 1
  25.  #define main main2
  26.  
  27. // external to this module (in bd_mainw.c)
  28.  
  29.  
  30.  extern HWND gHwnd;
  31.  extern int gCurrStr;           // current element in gPutStr[n][0]  (n=1 to 39)
  32.  extern CHAR gPutStr[40][82];   // output from bd_*.c modules should be less than this size
  33.  
  34.  void DoWinThing(int waitFlag); // GetMessage() loop (lack of threads is somewhat awkward)
  35.  extern MSG gMsg;
  36.  extern int gInputReady;        // flag when CR hit
  37.  extern int gCurrChar;          // current character pointer, in gGetStr[] (n=0 to 80)
  38.  extern CHAR gGetStr[82];       // input from bd_*.c (GetMsg())
  39.  extern BOOL gDie;              // pull the plug
  40.  
  41. #endif
  42.  
  43. // external to this module
  44.  
  45. int bd_rix();     // add, reindex, threads, access
  46. int bd_ko();      // key-only index managing
  47. int bd_ins();     // insert, transactions
  48. int bd_upd();     // update, transactions
  49. int bd_join();    // join, multi-table view
  50. int bd_memo();    // memo fields/memo files
  51. int bd_files();   // lots of open files
  52. int bd_locks();   // region locks
  53. int bd_rixu();    // similar to bd_rix() but uses custom sort-compare
  54.  
  55.  
  56. // public in this module
  57.  
  58. void PutMsg(CHAR *strg);
  59. void GetMsg(CHAR *strg);
  60.  
  61.  
  62. #if PLATFORM == ON_DOSX32
  63.  
  64.  int __far INT24HANDLER(unsigned deverr,unsigned errcode,unsigned far *devhdr) {
  65.  
  66.     //if (!(deverr & 0x8000)) {
  67.     //
  68.     //   // Bit15=0 is disk error
  69.     //
  70.     //   return 0;                      // 0=_HARDERR_IGNORE
  71.     //}
  72.  
  73.     // you may prefer to abort, rather than ignore, if not a disk error
  74.     // see your compiler for details
  75.     // #include <conio.h>           // for cprintf()
  76.     // cprintf( "Critical error other than from Bullet: " );
  77.     // cprintf( "deverr=%4.4X errcode=%d\r\n",deverr, errcode );
  78.     // cprintf( "devhdr = %Fp\r\n", devhdr );
  79.  
  80.     return 0;
  81.  
  82.     deverr;
  83.     errcode;
  84.     devhdr;
  85.  }
  86.  
  87. #endif
  88.  
  89. CHAR *collateTable = NULL; // use OS-supplied collate table (DOSX32 see ccdosfn.c for more)
  90. CHAR gCLS[6] = "";         // used here and in bd_join
  91.  
  92. // Main program start ////////////////////////////////////////////////////////
  93.  
  94. int main(void) {
  95.  
  96.  //MSG msg;
  97.  
  98. #pragma pack(1)
  99.  
  100.  EXITPACK EP;
  101.  INITPACK IP;
  102.  
  103. #if PLATFORM == ON_DOSX32
  104.  QUERYSETPACK QSP;
  105.  
  106. #ifdef __cplusplus
  107.  extern "C" {
  108. #endif
  109.   // these are defined in ccdosfn.c
  110.   long __cdecl BulletMalloc(ULONG bytes, VOID **baseAddrPtr);
  111.   long __cdecl BulletFree(VOID *baseAddr);
  112.   long __cdecl BulletGetMemoryAvail(void);
  113.   long __cdecl BulletGetTmpDir(CHAR *bufferPtr);
  114.  
  115. #ifdef __cplusplus
  116.  }
  117. #endif
  118. #endif
  119.  
  120. #pragma pack()
  121.  
  122.  int rez=0;
  123.  
  124.  CHAR tmpStr[128];
  125.  CHAR putStr[128];
  126.  
  127.  CHAR aPRGDATE[] = PRG_DATE;
  128.  CHAR op1[] = "Import/Add/REINDEX, with import data generated on-the-fly to DBF.";
  129.  CHAR op2[] = "Key I/O on non-Bullet data file (only index file is maintained).";
  130.  CHAR op3[] = "Atomic INSERT (transaction-list of up to 512 files).";
  131.  CHAR op4[] = "Atomic UPDATE (transaction-list of up to 512 files).";
  132.  CHAR op5[] = "Two-table joined view of EMPLOYEE and DEPARTMENT tables.";
  133.  CHAR op6[] = "Memo support for text/BLOB data to DBT.";
  134.  CHAR op7[] = "Files blowout -- many files opened simultaneously.";
  135.  CHAR op8[] = "Lock file, region, & record; exclusive/shared relock.";
  136.  CHAR op9[] = "Import/Add/REINDEX (as #1) using Custom sortFunction (float key).";
  137.  
  138.  
  139. #if FOR_WINDOWS == 1
  140.  CHAR aGRN[] = "";
  141.  CHAR aWHT[] = "";
  142.  strcpy(gCLS,"\x0C");
  143. #elif USE_ANSI == 0
  144.  CHAR aGRN[] = "";
  145.  CHAR aWHT[] = "";
  146.  strcpy(gCLS,"\n");
  147. #else
  148.  CHAR aGRN[] = "\x1B[1;32m";
  149.  CHAR aWHT[] = "\x1B[0;37m";
  150.  strcpy(gCLS,"\x1B[2J");
  151. #endif
  152.  
  153.  setbuf(stdout,NULL);
  154.  
  155. #if PLATFORM == ON_DOSX32
  156.  
  157.  // set minimum required external function vectors for DOSX32 compiler support
  158.  // these must be setup before calling INIT_XB to prevent chicken-and-the-egg dilemma
  159.  
  160.  QSP.func = SET_VECTORS_XB;
  161.  QSP.item = VECTOR_MALLOC;
  162.  QSP.itemValue = (ULONG) &BulletMalloc;   // in ccdosfn.c
  163.  rez = BULLET(&QSP);
  164.  if (rez==0) {
  165.     QSP.item = VECTOR_FREE;
  166.     QSP.itemValue = (ULONG) &BulletFree;
  167.     rez = BULLET(&QSP);
  168.     if (rez==0) {
  169.        QSP.item = VECTOR_GET_MEMORY;
  170.        QSP.itemValue = (ULONG) &BulletGetMemoryAvail;
  171.        rez = BULLET(&QSP);
  172.        if (rez==0) {
  173.           QSP.item = VECTOR_GET_TMP_DIR;
  174.           QSP.itemValue = (ULONG) &BulletGetTmpDir;
  175.           rez = BULLET(&QSP);
  176.        }
  177.     }
  178.  }
  179.  if (rez) {
  180.     sprintf(putStr,"Failed SET_VECTORS_XB #%d (DOSX32 support setup) call.  Err: %d\n",QSP.item,rez);
  181.     PutMsg(putStr);
  182.     goto ExitNow;
  183.  }
  184.  
  185. #endif
  186.  
  187.  IP.func = INIT_XB;
  188.  IP.JFTsize = HANDLES_WANTED;
  189.  
  190.  rez = BULLET(&IP);
  191.  if (rez) {
  192.     sprintf(putStr,"Failed Bullet initialization.  Err: %d\n",rez);
  193.     PutMsg(putStr);
  194.     goto ExitNow;
  195.  }
  196.  
  197. #if PLATFORM == ON_DOSX32
  198.  
  199.  // register EXIT_XB with the startup code's shutdown list so that Bullet
  200.  // is exited with files closed, etc.
  201.  
  202.  rez = atexit(IP.exitPtr);
  203.  if (rez) PutMsg("\a\n<*> Could not register EXIT_XB with atexit().  Continuing...\n");
  204.  
  205.  _harderr(INT24HANDLER);
  206.  
  207. #elif PLATFORM == ON_OS2
  208.  
  209.  // Instead of using _harderr() as is done for DOSX32, in OS/2 all one needs to
  210.  // do to prevent pop-ups is to call DosError(FERR_DISABLEHARDERR) (or 0).
  211.  // You may prefer to place it around Bullet sections only (use
  212.  // FERR_ENABLEHARDERR, or 1, to restore pop-ups).  This does not disable
  213.  // numeric or other exceptions, which would be FERR_DISABLEEXCEPTION, or 2.
  214.  
  215.  DosError(FERR_DISABLEHARDERR);
  216.  
  217. #elif PLATFORM == ON_WIN32
  218.  
  219.  // register EXIT_XB with the startup code's shutdown list so that Bullet
  220.  // is exited with files closed, etc.
  221.  
  222.  rez = atexit(IP.exitPtr);
  223.  if (rez) PutMsg("\a\n<*> Could not register EXIT_XB with atexit().  Continuing...\n");
  224.  
  225.  SetErrorMode(SEM_FAILCRITICALERRORS);
  226.  
  227. #endif
  228.  
  229.  while (1) {
  230.  
  231.     PutMsg(gCLS);
  232.     sprintf(putStr,"%sBullet %u.%3.3u Demo.%s  NLS IX3/DBF/DBT/external %s\n\n",aGRN,
  233.                      IP.versionBullet/1000 ,IP.versionBullet % 1000,aWHT,aPRGDATE);
  234.     PutMsg(putStr);
  235.     PutMsg("Take your pick (each has selectable run options):\n\n");
  236.     PutMsg(" 0. Exit demo\n");
  237.     sprintf(putStr," 1. %s\n",op1);
  238.     PutMsg(putStr);
  239.     sprintf(putStr," 2. %s\n",op2);
  240.     PutMsg(putStr);
  241.     sprintf(putStr," 3. %s\n",op3);
  242.     PutMsg(putStr);
  243.     sprintf(putStr," 4. %s\n",op4);
  244.     PutMsg(putStr);
  245.     sprintf(putStr," 5. %s\n",op5);
  246.     PutMsg(putStr);
  247.     sprintf(putStr," 6. %s\n",op6);
  248.     PutMsg(putStr);
  249.     sprintf(putStr," 7. %s\n",op7);
  250.     PutMsg(putStr);
  251.     sprintf(putStr," 8. %s\n",op8);
  252.     PutMsg(putStr);
  253.     sprintf(putStr," 9. %s\n\n",op9);
  254.     PutMsg(putStr);
  255.     PutMsg("Selection: ");
  256.  
  257.     GetMsg(tmpStr);
  258.     switch(*tmpStr) {
  259.     case '1':
  260.        PutMsg(gCLS);
  261.        sprintf(putStr,"%s%s%s\n\n",aGRN,op1,aWHT);
  262.        PutMsg(putStr);
  263.        rez = bd_rix();
  264.        break;
  265.     case '2':
  266.        PutMsg(gCLS);
  267.        sprintf(putStr,"%s%s%s\n\n",aGRN,op2,aWHT);
  268.        PutMsg(putStr);
  269.        rez = bd_ko();
  270.        break;
  271.     case '3':
  272.        PutMsg(gCLS);
  273.        sprintf(putStr,"%s%s%s\n\n",aGRN,op3,aWHT);
  274.        PutMsg(putStr);
  275.        rez = bd_ins();
  276.        break;
  277.     case '4':
  278.        PutMsg(gCLS);
  279.        sprintf(putStr,"%s%s%s\n\n",aGRN,op4,aWHT);
  280.        PutMsg(putStr);
  281.        rez = bd_upd();
  282.        break;
  283.     case '5':
  284.        PutMsg(gCLS);
  285.        sprintf(putStr,"%s%s%s\n\n",aGRN,op5,aWHT);
  286.        PutMsg(putStr);
  287.        rez = bd_join();
  288.        break;
  289.     case '6':
  290.        PutMsg(gCLS);
  291.        sprintf(putStr,"%s%s%s\n\n",aGRN,op6,aWHT);
  292.        PutMsg(putStr);
  293.        rez = bd_memo();
  294.        break;
  295.     case '7':
  296.        PutMsg(gCLS);
  297.        sprintf(putStr,"%s%s%s\n\n",aGRN,op7,aWHT);
  298.        PutMsg(putStr);
  299.        rez = bd_files();
  300.        break;
  301.     case '8':
  302.        PutMsg(gCLS);
  303.        sprintf(putStr,"%s%s%s\n\n",aGRN,op8,aWHT);
  304.        PutMsg(putStr);
  305.        rez = bd_locks();
  306.        break;
  307.     case '9':
  308.        PutMsg(gCLS);
  309.        sprintf(putStr,"%s%s%s\n\n",aGRN,op9,aWHT);
  310.        PutMsg(putStr);
  311.        rez = bd_rixu();
  312.        break;
  313.     case '0':
  314.        break;
  315.     }
  316.  
  317.     if ((*tmpStr=='0') | (rez)) break;
  318.  
  319.     PutMsg("\nPress ENTER for select menu...");
  320.     GetMsg(tmpStr);
  321.  
  322.  }
  323.  EP.func = EXIT_XB;
  324.  rez = BULLET(&EP);
  325.  
  326. ExitNow:
  327.  
  328. #if FOR_WINDOWS == 1
  329.  gDie = TRUE;
  330. #endif
  331.  
  332.  return rez;
  333. }
  334.  
  335.  
  336. //-----------------
  337. // Write out string
  338.  
  339. void PutMsg(CHAR *strg) {
  340.  
  341. #if FOR_WINDOWS != 1
  342.  printf(strg);
  343.  //fflush(stdout); // already have setbuf(stdout,NULL);
  344.  return;
  345.  
  346. #else
  347.  static int skipIncFlag=0;
  348.  int tmpLen;
  349.  
  350.  if (skipIncFlag==0) gCurrStr++;
  351.  if (gCurrStr > 39) {
  352.     gCurrStr=1;
  353.     PutMsg(gCLS);
  354.  }
  355.  strncpy(&gPutStr[gCurrStr][0],strg,82);
  356.  
  357.  InvalidateRect(gHwnd,NULL,FALSE);
  358.  DoWinThing(0);   // do it, no waiting around
  359.  
  360.  tmpLen = strlen(&gPutStr[gCurrStr][0]);  // reuse current string line if \r
  361.  if (tmpLen) {
  362.     if (gPutStr[gCurrStr][tmpLen-1] == '\r') {
  363.        skipIncFlag=1;
  364.     }
  365.     else {
  366.        skipIncFlag=0;
  367.     }
  368.  }
  369.  return;
  370.  
  371. #endif
  372. }
  373.  
  374.  
  375. //---------------
  376. // Read in string
  377.  
  378. void GetMsg(CHAR *strg) {
  379.  
  380. #if FOR_WINDOWS != 1
  381.  gets(strg);
  382.  return;
  383.  
  384. #else
  385.  
  386.  gCurrChar = 0;
  387.  ShowCaret(gHwnd);
  388.  
  389.  // wait for input
  390.  
  391.  while (gInputReady==0) {
  392.     DoWinThing(1);   // 1=waits for message
  393.  }
  394.  
  395.  HideCaret(gHwnd);
  396.  gInputReady = 0;
  397.  strcpy(strg,gGetStr);
  398.  PutMsg("\n");
  399.  return;
  400.  
  401. #endif
  402. }
  403.