home *** CD-ROM | disk | FTP | other *** search
/ Turbo Toolbox / Turbo_Toolbox.iso / spezial / 20 / dos_txl / source / db_txl.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-02-19  |  11.2 KB  |  674 lines

  1. /***
  2.   Schnittstelle Datenbank - TXL, 
  3.   Stackfunktionen und Menüs
  4.   (c) 1991 by Elmar Warken
  5. ***/
  6.  
  7.  
  8. #include <string.h>
  9. #include <conio.h>
  10. #include <alloc.h>
  11. #include "interp.h"
  12. #include "windows.h"
  13. #include "db.h"
  14. #include "macros.c"
  15.  
  16. extern    int    Steuer;                
  17. extern    char    ScanBuffer[ZEILENLAENGE]; 
  18.  
  19. extern struct windowdata *FirstWindow;
  20. extern int WEITER; 
  21.  
  22. int cdefDB(void)
  23. {
  24.   long nr,str,len;
  25.   if ( GetIntegerParam(&nr) &&
  26.        GetIntegerParam(&str) &&
  27.        GetIntegerParam(&len) )
  28.     AddDefinition(nr,str,len);
  29.  
  30.   else 
  31.   {
  32.     serror(" Parameterfehler bei 'DefDB'! ");
  33.     return(FALSE);
  34.   }
  35.  
  36.   return(OK);
  37. }
  38.  
  39. int copenDB(void)
  40. {
  41.   long nr;
  42.   char *name;
  43.  
  44.   if ( GetIntegerParam(&nr) &&
  45.        GetStringParam(&name) )
  46.   {
  47.     if (!OpenFile(nr,name))
  48.     {
  49.       serror(" Fehler beim Öffnen der Datei! ");
  50.       return(FALSE);
  51.     }
  52.   }
  53.   else 
  54.   {
  55.     serror(" Parameterfehler bei 'OpenDB'! ");
  56.     return(FALSE);
  57.   }
  58.  
  59.   return(OK);
  60. }
  61.  
  62. int ccreateDB(void)
  63. {
  64.   long nr;
  65.   char *name;
  66.  
  67.   if ( GetIntegerParam(&nr) &&
  68.        GetStringParam(&name) )
  69.   {
  70.     if (!CreateFile(nr,name))
  71.     {
  72.       serror(" Fehler beim Erstellen der Datei! ");
  73.       return(FALSE);
  74.     }
  75.   }
  76.   else 
  77.   {
  78.     serror(" Parameterfehler bei 'CreateDB'! ");
  79.     return(FALSE);
  80.   }
  81.  
  82.   return(OK);
  83. }
  84.  
  85. int cWriteDB(void)
  86. {
  87.   long dbnr,satznr,zahl;
  88.   char *str, string[200];
  89.  
  90.   if ( GetIntegerParam(&dbnr) &&
  91.        GetIntegerParam(&satznr) &&
  92.        GetStringParam(&str) && strcpy(string,str) &&
  93.        GetIntegerParam(&zahl) )
  94.  
  95.     BeschreibeSatz(dbnr,satznr,string,zahl);
  96.  
  97.   else 
  98.   {
  99.     serror(" Parameterfehler bei 'WriteDB'! ");
  100.     return(FALSE);
  101.   }
  102.  
  103.   return(OK);
  104. }
  105.  
  106. int cReadDB(void)
  107. {
  108.   long dbnr,feldnr;
  109.   int zahl;
  110.   char str[300];
  111.   char VarName1[50],VarName2[50];
  112.  
  113.  
  114.   if ( GetIntegerParam(&dbnr) &&
  115.        GetIntegerParam(&feldnr) )
  116.   { 
  117.     Scan();
  118.     if (Steuer == ALPHA) {
  119.       strcpy (VarName1,ScanBuffer);    
  120.  
  121.       Scan();
  122.       if (Steuer==ALPHA)
  123.     strcpy(VarName2,ScanBuffer);
  124.       else 
  125.       {
  126.     serror ("Variablenname erwartet! ");
  127.     return(FALSE);
  128.       }
  129.  
  130.       LeseSatz(dbnr,feldnr,str,&zahl);
  131.  
  132.       SetVarStr(VarName1,str);
  133.       SetVarInt(VarName2,zahl);
  134.     } 
  135.     else 
  136.     {
  137.       serror ("Variablenname erwartet! ");
  138.       return(FALSE);
  139.     }
  140.   }
  141.   else 
  142.   {
  143.     serror(" Parameterfehler bei 'ReadDB'! ");
  144.     return(FALSE);
  145.   }
  146.  
  147.   return(OK);
  148. }
  149.  
  150. int cAddDB(void)
  151. {
  152.   long dbnr;
  153.  
  154.   if (GetIntegerParam(&dbnr))
  155.     WriteToFile(dbnr);
  156.   else 
  157.   {
  158.     serror(" Parameterfehler bei 'AddDB'! ");
  159.     return(FALSE);
  160.   }
  161.   return(OK);
  162. }
  163.  
  164. int cGotoBegin(void)
  165. {
  166.   long dbnr;
  167.  
  168.   if (GetIntegerParam(&dbnr))
  169.     GotoFileBegin(dbnr);
  170.   else 
  171.   {
  172.     serror(" Parameterfehler bei 'GotoFileBegin'! ");
  173.     return(FALSE);
  174.   }
  175.   return(OK);
  176. }
  177.  
  178. int cGotoEnd(void)
  179. {
  180.   long dbnr;
  181.  
  182.   if (GetIntegerParam(&dbnr))
  183.     GotoFileEnd(dbnr);
  184.   else 
  185.   {
  186.     serror(" Parameterfehler bei 'GotoFileEnd'! ");
  187.     return(FALSE);
  188.   }
  189.   return(OK);
  190. }
  191.  
  192. int cGoBackward(void)
  193. {
  194.   long dbnr;
  195.  
  196.   if (GetIntegerParam(&dbnr))
  197.     GoBackward(dbnr);
  198.   else 
  199.   {
  200.     serror(" Parameterfehler bei 'GoBackward'! ");
  201.     return(FALSE);
  202.   }
  203.   return(OK);
  204. }
  205.  
  206. int cGoForward(void)
  207. {
  208.   long dbnr;
  209.  
  210.   if (GetIntegerParam(&dbnr))
  211.     GoForward(dbnr);
  212.   else 
  213.   {
  214.     serror(" Parameterfehler bei 'GoForward'! ");
  215.     return(FALSE);
  216.   }
  217.   return(OK);
  218. }
  219.  
  220. int cGoTo(void)
  221. {
  222.   long dbnr,spos;
  223.  
  224.   if (GetIntegerParam(&dbnr) &&
  225.       GetIntegerParam(&spos) )
  226.  
  227.     GoTo(dbnr,spos);
  228.   else 
  229.   {
  230.     serror(" Parameterfehler bei 'GoTo'! ");
  231.     return(FALSE);
  232.   }
  233.   return(OK);
  234. }
  235.  
  236. int cGoToNr(void)
  237. {
  238.   long dbnr,snr;
  239.  
  240.   if (GetIntegerParam(&dbnr) &&
  241.       GetIntegerParam(&snr) )
  242.  
  243.     GoToNr(dbnr,snr);
  244.   else 
  245.   {
  246.     serror(" Parameterfehler bei 'GoToNr'! ");
  247.     return(FALSE);
  248.   }
  249.   return(OK);
  250. }
  251.  
  252. int cCloseFile(void)
  253. {
  254.   long dbnr;
  255.  
  256.   if (GetIntegerParam(&dbnr))
  257.     CloseFile(dbnr);
  258.   else 
  259.   {
  260.     serror(" Parameterfehler bei 'CloseFile'! ");
  261.     return(FALSE);
  262.   }
  263.   return(OK);
  264. }
  265.  
  266. int cMakeTree(void)
  267. {
  268.   long dbnr,fnr;
  269.  
  270.   if (GetIntegerParam(&dbnr) &&
  271.       GetIntegerParam(&fnr) )
  272.  
  273.     MakeTree(dbnr,fnr);
  274.   else 
  275.   {
  276.     serror(" Parameterfehler bei 'MakeTree'! ");
  277.     return(FALSE);
  278.   }
  279.   return(OK);
  280. }
  281.  
  282. int cMarkCurrent(void)
  283. {
  284.   long dbnr,markval;
  285.  
  286.   if (GetIntegerParam(&dbnr) &&
  287.       GetIntegerParam(&markval) )
  288.  
  289.     MarkCurrent(dbnr,markval);
  290.   else 
  291.   {
  292.     serror(" Parameterfehler bei 'MarkCurrent'! ");
  293.     return(FALSE);
  294.   }
  295.   return(OK);
  296. }
  297.  
  298. int cUnMarkAll(void)
  299. {
  300.   long dbnr,markval;
  301.  
  302.   if (GetIntegerParam(&dbnr))
  303.     UnMarkAll(dbnr);
  304.   else 
  305.   {
  306.     serror(" Parameterfehler bei 'UnMarkAll'! ");
  307.     return(FALSE);
  308.   }
  309.   return(OK);
  310. }
  311.  
  312. int cDelTree(void)
  313. {
  314.   long dbnr;
  315.  
  316.   if (GetIntegerParam(&dbnr))
  317.     DelTree(dbnr);
  318.   else 
  319.   {
  320.     serror(" Parameterfehler bei 'DelTree'! ");
  321.     return(FALSE);
  322.   }
  323.   return(OK);
  324. }
  325.  
  326. int cDelMarked(void)
  327. {
  328.   long dbnr;
  329.  
  330.   if (GetIntegerParam(&dbnr))
  331.     DelMarked(dbnr);
  332.   else 
  333.   {
  334.     serror(" Parameterfehler bei 'DelMarked'! ");
  335.     return(FALSE);
  336.   }
  337.   return(OK);
  338. }
  339.  
  340. int cListTree(void)
  341. {
  342.   long dbnr;
  343.  
  344.   if (GetIntegerParam(&dbnr))
  345.     ListTree(dbnr);
  346.   else 
  347.   {
  348.     serror(" Parameterfehler bei 'ListTree'! ");
  349.     return(FALSE);
  350.   }
  351.   return(OK);
  352. }
  353.  
  354. long testprog,ausgproc;
  355. int gefunden;
  356.  
  357. int cGefundenOK(void)
  358. {
  359.   gefunden=1;
  360.  
  361.   return(OK);
  362. }
  363.  
  364. int cStopSearch(void)
  365. {
  366.   WEITER=0;
  367.  
  368.   return(OK);
  369. }
  370.  
  371. int TestP() 
  372.   gefunden=0;
  373.  
  374.   if (testprog==0) 
  375.     gefunden=1;
  376.   else dogosub(testprog);
  377.  
  378.   return(gefunden); 
  379. }
  380.  
  381. void AusgP()
  382. {
  383.   dogosub(ausgproc);
  384. }
  385.  
  386. int cSearchDB(void)
  387. {
  388.   long nr;
  389.  
  390.   if ( GetIntegerParam(&nr) &&
  391.        GetIntegerParam(&testprog) &&
  392.        GetIntegerParam(&ausgproc) )
  393.  
  394.   DurchSuche(nr,TestP,AusgP);
  395.  
  396.   else 
  397.   {
  398.     serror(" Parameterfehler bei 'SearchDB'! ");
  399.     return(FALSE);
  400.   }
  401.  
  402.   return(OK);
  403. }
  404.  
  405. int cSearchTree(void)
  406. {
  407.   long dbnr,pos;
  408.   char VarName[50];
  409.   char *str;
  410.  
  411.   if ( GetIntegerParam(&dbnr) )
  412.   { 
  413.     Scan();
  414.     if (Steuer == ALPHA) {
  415.       strcpy (VarName,ScanBuffer);    
  416.  
  417.       if (GetStringParam(&str))
  418.       {
  419.     if (!SearchTree(dbnr,&pos,str))
  420.       pos=1000000000; /** Position 1 Milliarde bedeutet Fehler, da **/
  421.               /** Gigabyte-Dateien sehr unwahrscheinlich   **/
  422.       } else
  423.       {
  424.     serror(" Parameterfehler bei 'SearchTree'! ");
  425.     return(FALSE);
  426.       }
  427.  
  428.       SetVarInt(VarName,pos);
  429.     } 
  430.     else 
  431.     {
  432.       serror ("Variablenname erwartet! ");
  433.       return(FALSE);
  434.     }
  435.   }
  436.   else 
  437.   {
  438.     serror(" Parameterfehler bei 'SearchTree'! ");
  439.     return(FALSE);
  440.   }
  441.  
  442.   return(OK);
  443. }
  444.  
  445.  
  446. int cDurchsucheTree(void)
  447. {
  448.   long nr;
  449.  
  450.   if ( GetIntegerParam(&nr) &&
  451.        GetIntegerParam(&testprog) &&
  452.        GetIntegerParam(&ausgproc) )
  453.  
  454.   DurchsucheTree(nr,TestP,AusgP);
  455.  
  456.   else 
  457.   {
  458.     serror(" Parameterfehler bei 'DurchsucheTree'! ");
  459.     return(FALSE);
  460.   }
  461.  
  462.   return(OK);
  463. }
  464.  
  465. /** Pulldownmenüs für TXL : **/
  466. /** Es werden solange Unterprogramme aufgerufen, bis ESC gedrückt wird. **/
  467. int cMenue(void)
  468. {
  469.   char Punkte[20][30];  /*** 20 Punkte je maximal 29 Zeichen ***/
  470.   long Subs[20];    /*** 20 Unterprogramme ***/
  471.   char *str;
  472.   int x1,y1,i,breite=0,punkte=0;
  473.   int wahl;
  474.   char c;
  475.  
  476.   while (GetStringParam(&str))
  477.   {
  478.     strcpy(Punkte[punkte],str);
  479.     if (strlen(str) > breite)
  480.       breite=strlen(str);
  481.     if (!GetIntegerParam(&Subs[punkte]))
  482.     {
  483.       serror(" Unterprogrammzeile für Menüpunkt erwartet. ");
  484.       return(FALSE);
  485.     }
  486.     punkte++;
  487.   }
  488.   if (!FirstWindow)
  489.   { 
  490.     serror(" Das Fenster für das Menü muß bereits geöffnet sein. ");
  491.     return(FALSE);
  492.   }
  493.   x1=FirstWindow->x1;  y1=FirstWindow->y1;
  494.   for (i=0; i<punkte; i++)
  495.   {
  496.     SET_POS(x1+1,y1+i+1);
  497.     WR_STRMAX(Punkte[i],FirstWindow->BackCol,breite);
  498.   }
  499.   wahl=1;
  500.   SET_POS(x1+1,y1+wahl);
  501.   WR_STRMAX(Punkte[wahl-1],FirstWindow->FrameCol,breite);  
  502.   while ((c=getch())!=27)
  503.   {
  504.     SET_POS(x1+1,y1+wahl);
  505.     WR_STRMAX(Punkte[wahl-1],FirstWindow->BackCol,breite);  
  506.     switch (c)
  507.     {
  508.       case 0 : 
  509.     c=getch();
  510.     switch(c)
  511.     {
  512.       case 80 : wahl++; break;
  513.       case 72 : wahl--; break;
  514.       case 71 : wahl=1; break;
  515.       case 79 : wahl=punkte; 
  516.     } break;
  517.       case 13 :
  518.     dogosub(Subs[wahl-1]);
  519.     }
  520.     if (wahl==0) wahl=punkte;
  521.     if (wahl>punkte) wahl=1;
  522.     SET_POS(x1+1,y1+wahl);
  523.     WR_STRMAX(Punkte[wahl-1],FirstWindow->FrameCol,breite);  
  524.   }
  525.   return(OK);
  526. }
  527.  
  528. typedef struct stack
  529. {
  530.   long val;
  531.   struct stack *Next;
  532. } Stack;
  533.  
  534. Stack *Top;
  535.  
  536. int cpush()
  537. {
  538.   long wert;
  539.   Stack *new;
  540.  
  541.   if (GetIntegerParam(&wert))
  542.   { 
  543.     if ((new=malloc(sizeof(Stack)))==NULL)
  544.     {
  545.       serror(" Stacküberlauf bzw. Speicher voll. ");
  546.       return(FALSE);
  547.     }
  548.     new->val=wert;
  549.     new->Next=Top;
  550.     Top=new;
  551.   } else
  552.   {
  553.     serror(" Falscher Parameter von 'push' ");
  554.     return(FALSE);
  555.   }
  556.   return(OK);
  557. }
  558.  
  559. int cpop()
  560. {
  561.   long *wert;
  562.   Stack *alt;
  563.  
  564.   if (GetNumbVarParam(&wert))
  565.   {
  566.     if (Top)
  567.     {
  568.       *wert=Top->val;
  569.       alt=Top;
  570.       Top=Top->Next;
  571.       free(alt);
  572.     }
  573.     else 
  574.     {
  575.       serror(" Stack ist leer. ");
  576.       return(FALSE);
  577.     }
  578.   } else
  579.   {
  580.     serror(" Falscher Parameter von 'pop' ");
  581.     return(FALSE);
  582.   }
  583.   return(OK);
  584. }
  585.  
  586. /** Auswahlliste für TXL : **/
  587. /** Ein Menüpunkt wird ausgewählt und dessen 
  588.     Nummer auf dem Stack zurückgegeben.      **/
  589.  
  590. int cAuswahl(void)
  591. {
  592.   char Punkte[20][30];  /*** 20 Punkte je maximal 29 Zeichen ***/
  593.   long Subs[20];    /*** 20 Unterprogramme ***/
  594.   char *str;
  595.   int x1,y1,i,breite=0,punkte=0;
  596.   int wahl;
  597.   char c;
  598.   Stack *new;
  599.  
  600.   while (GetStringParam(&str))
  601.   {
  602.     strcpy(Punkte[punkte],str);
  603.     if (strlen(str) > breite)
  604.       breite=strlen(str);
  605.     punkte++;
  606.   }
  607.   if (!FirstWindow)
  608.   { 
  609.     serror(" Das Fenster für das Menü muß bereits geöffnet sein. ");
  610.     return(FALSE);
  611.   }
  612.   x1=FirstWindow->x1;  y1=FirstWindow->y1;
  613.   for (i=0; i<punkte; i++)
  614.   {
  615.     SET_POS(x1+1,y1+i+1);
  616.     WR_STRMAX(Punkte[i],FirstWindow->BackCol,breite);
  617.   }
  618.   wahl=1;
  619.   SET_POS(x1+1,y1+wahl);
  620.   WR_STRMAX(Punkte[wahl-1],FirstWindow->FrameCol,breite);  
  621.   while ((c=getch())!=13)
  622.   {
  623.     SET_POS(x1+1,y1+wahl);
  624.     WR_STRMAX(Punkte[wahl-1],FirstWindow->BackCol,breite);  
  625.     if (c==0)
  626.     {
  627.       c=getch();
  628.       switch(c)
  629.       {
  630.     case 80 : wahl++; break;
  631.     case 72 : wahl--; break;
  632.     case 71 : wahl=1; break;
  633.     case 79 : wahl=punkte; 
  634.       } 
  635.     }
  636.     if (wahl==0) wahl=punkte;
  637.     if (wahl>punkte) wahl=1;
  638.     SET_POS(x1+1,y1+wahl);
  639.     WR_STRMAX(Punkte[wahl-1],FirstWindow->FrameCol,breite);  
  640.   }
  641.  
  642.   if ((new=malloc(sizeof(Stack)))==NULL)
  643.   {
  644.     serror(" Stacküberlauf bzw. Speicher voll. ");
  645.     return(FALSE);
  646.   }
  647.   new->val=wahl;
  648.   new->Next=Top;
  649.   Top=new;
  650.  
  651.   return(OK);
  652. }
  653.  
  654. int cReadKey()
  655. {
  656.   long *val;
  657.   char c;
  658.  
  659.   if (GetNumbVarParam(&val))
  660.   {
  661.     if ((c=getch())==0)
  662.       *val=(getch() << 8) & c;
  663.     else *val=c;
  664.   } 
  665.   else
  666.   {
  667.     serror(" ReadKey : Integervariable erwartet. ");
  668.     return(FALSE);
  669.   }
  670.   return(OK);
  671. }
  672.  
  673.