/***** * * Michael Riff * RPN software version 1.0 Oktob 2013. * * Hauptprogramm zum einlesen von Berechnugen und diese in RPN oder postfix * Notation zu speichern. * Hier ist die Interaktion mit dem Benutzer implementiert. * * Version 1.1: 08 Jan 2014 * aktDaten declared as extern (defined in Calculs.c) * * Version 1.2: 04 Feb 2014 * Added missing call to InitStdLib * * Version 1.3 : 08 Feb 2014 * Use decimal separator from UX_StdLib.c when USE_ITL is defined. * * Version 1.4: 14 Jun 2014 * Routine call to check argument stack usage for every formula moved from main loop in standard UX version * to common part after successful loading of file. * * Version 1.7: 06 June 2016 * Implemented handling of additional routines that can be called out of the text code. As example * we used the following: print() and print("constant string") that print out * the value of a variable or a string. * * Version 1.8: 23 July 2016 * Use of define for size of IdList. * *****/ #ifndef MAC_UI #include #include #else // Definitionnen fuer Graphiken aus Textdatei auszulesen #include "UX_StdDefs.h" // Définition des valeurs pour touches spéciales /* #define leftArrow 0x7B #define downArrow 0x7D #define rightArrow 0x7C #define upArrow 0x7E */ #define leftArrow 28 #define downArrow 31 #define rightArrow 29 #define upArrow 30 #endif #include "Calculs.h" #include "Parser.h" //#include "Parser2.h" #include "Display.c" /* Tabelle zur Speicherung der Berechnungsformeln */ Grph_struct *Graphs; /* Anzahl der Rechnungsformeln */ int numGraphs; // Der Eingabeparameter von Rechnung ist eine Referenz auf ein Tafel von float: // deren Struktur entschpricht : Parameter Anzahl, Parameter 1, P 2, P 3, P 4. /* ID für die Abarbeitungsgraphik */ int aktGraphik; /* Inkrementierungswerte für die Eingabeparameter */ float aktResolutions[4]; /* Für die Eingabewerte der Formeln */ extern double aktDaten[MAX_PARAM]; /* Layout File für die Abarbeitungsgraphik */ char aktFile[30]; // Variablen vom Yacc Lex Parser oder Rechnung Speicherungsmodul // zum Auslesen der Graphiken. extern Commande * Fonction; extern unsigned long nbFonctions; #ifdef MIT_VAR extern variables *Valeurs; #endif #ifdef ARG_DOUBLE extern double *constValues; extern unsigned int cntValues; #endif #ifdef ADD_FUNCT extern char **Msges; #endif #ifdef TEST void TestCall(int graphIdx, double actualValue); #endif #ifdef MAC_UI #include #include #include typedef struct { UInt16 Id; char title[20]; } GraphId_Type; GraphId_Type IdList[MAXGRAPHS]; UInt16 numIds; ControlHandle GrIdPopup; DialogPtr DlgControle; #ifdef CTRL_TEST Handle staticTxt; #endif DialogPtr DlgParam; Handle editNumParam; Handle editParam1; Handle editParam2; Handle editParam3; Handle editParam4; ControlHandle paramOK; ControlHandle paramCnl; //Handle OKFrame; WindowPtr clickedWin; ControlHandle clickControlHandle; short workInt; Rect workRect; ControlHandle workHandle; Handle selectedEdit; WindowPtr WinDoc; Rect WindocRect; #ifdef USE_ITL /* Decimal separator read from itl0 or itl4 resource in UX_StdLib.c */ extern char decSeparat; #endif /* pascal ControlKeyFilterResult floatFilter(Controlhandle control, SInt16 *keyCode, SInt16 *charCode, SInt16 *modifiers) { if ((char*)(*charCode)) >='0' && (char*)(*charCode)) >='9') return true; switch (*charCode) { case '-': case '.': return true; break; default: return false; break; } } */ void Exec_Calculs() { int numValues = 0; int i; // double graValues[10]; double value; int calValues = 0; // Anzahl der Werte u. Parameter berechnen und // Ansicht der Seite zum Tcl uebergeben for(i=0;iportRect).right,startPos.v); BlockMove("Graphik Seite ", title+1, 14); *title = 14; InitStdLib(); #endif /* Réservation de la mémoire pour les formules */ #ifndef MAC_UI Graphs = (Grph_struct*)calloc(MAXGRAPHS,sizeof(Grph_struct)); #else Graphs = (Grph_struct*)NewPtrClear(MAXGRAPHS*sizeof(Grph_struct)); #endif if (Graphs == NULL) { #ifndef MAC_UI printf("Memory allocation for whole graphik list failed\n\n\r"); exit(1); #else ParamText("\pGraphik Allokierung!","\pFehler","\pSpeicher Allockierung","\pQuit"); i = StopAlert(128, NULL); ExitToShell(); #endif } /* Initialisierung des parsenden Moduls */ if (0 != InitCalc()) { #ifndef MAC_UI free(Graphs); printf("Initialisierungs Fehler! Speicher Allockierung\n\r"); exit(1); #else DisposPtr((char*)Graphs); ParamText("\pInitialisierungs Fehler!","\p","\pSpeicher Allockierung","\pQuit"); i = StopAlert(128, NULL); ExitToShell(); #endif } if (0 != InitParse()) { #ifndef MAC_UI free(Graphs); printf("Initialisierungs Fehler! Speicher Allockierung\n\r"); #else DisposPtr((char*)Graphs); ParamText("\pInitialisierungs Fehler!","\p","\pEingangs Datei","\pQuit"); i = StopAlert(128, NULL); #endif Quit(); #ifndef MAC_UI exit(1); #else ExitToShell(); #endif } /* Registrierung der Formeln mit dem Yacc generierten Parser */ // printf("Vor Parsen\n\n");fflush(stdout); load = yybis2parse(); // load = yybisparse(); /* Puffer Speicher freigeben */ Quit(); /* Fehler test */ if (load != 0) { #ifndef MAC_UI printf("Fehler in den Graphiken Parsen!\n"); #else ParamText("\pFehler in den Graphiken Parsen!",NULL,NULL,"\pQuit"); i = StopAlert(128, NULL); #endif Quit(); #ifndef MAC_UI exit(1); #else ExitToShell(); #endif } // Check for max used stack size for(i=0;icontrlData; // Determine list of values for graphic ID old_grID = -1; numIds = 0; for (i=0; imHandle, valBuffer, numIds); numIds++; } } SetControlMaximum(GrIdPopup, numIds-1); #ifdef CTRL_TEST // For static Text TBC GetDItem (DlgControle, 2, &workInt, (Handle*)(&staticTxt), &workRect); SetRect(&((*((ControlHandle)staticTxt))->contrlRect),workRect.left,workRect.top,workRect.right,workRect.bottom); Draw1Control((ControlHandle)staticTxt); #endif DlgParam = GetNewDialog(129, NULL, (WindowPtr) -1); GetDialogItem(DlgParam, 10, &workInt, (Handle*)(&editNumParam), &workRect); GetDialogItem(DlgParam, 11, &workInt, (Handle*)(&editParam1), &workRect); SetRect(&((*((ControlHandle)editParam1))->contrlRect),workRect.left,workRect.top,workRect.right,workRect.bottom); GetDialogItem(DlgParam, 12, &workInt, (Handle*)(&editParam2), &workRect); SetRect(&((*((ControlHandle)editParam2))->contrlRect),workRect.left,workRect.top,workRect.right,workRect.bottom); GetDialogItem(DlgParam, 13, &workInt, (Handle*)(&editParam3), &workRect); SetRect(&((*((ControlHandle)editParam3))->contrlRect),workRect.left,workRect.top,workRect.right,workRect.bottom); GetDialogItem(DlgParam, 14, &workInt, (Handle*)(&editParam4), &workRect); SetRect(&((*((ControlHandle)editParam4))->contrlRect),workRect.left,workRect.top,workRect.right,workRect.bottom); GetDialogItem(DlgParam, 1, &workInt, (Handle*)(¶mOK), &workRect); GetDialogItem(DlgParam, 2, &workInt, (Handle*)(¶mCnl), &workRect); selectedEdit = editParam1; /* (*editParam1)->contrlAction = NewControlKeyFunctionProc(floatFilter); (*editParam2)->contrlAction = NewControlKeyFunctionProc(floatFilter); (*editParam3)->contrlAction = NewControlKeyFunctionProc(floatFilter); (*editParam4)->contrlAction = NewControlKeyFunctionProc(floatFilter); //SetControlAction(editParam1, NewControlKeyFunctionProc(floatFilter)); */ SetPort((GrafPtr)DlgControle); // Initialise Popup Menu // PopupMenu values range 1 .. numitems !! itemSelect = 1; aktGraphik = IdList[itemSelect-1].Id; old_grID = aktGraphik; // for (i=0; ilytFile); SetCtlValue(GrIdPopup,itemSelect); NumToString((Graphs+i)->parmAnzahl,valBuffer); SetIText(editNumParam, valBuffer); SetIText(editParam1, "\p0"); SetIText(editParam2, "\p0"); SetIText(editParam3, "\p0"); SetIText(editParam4, "\p0"); // LayoutFile zum Display abgeben showPage(aktFile); #endif /* BOUCLE DE CHOIX ET ÉXÉCUTION DES CALCULS ======================================*/ #ifndef MAC_UI printf("Graphik Nummer (-1 zum Verlassen):\n"); #ifndef Mac scanf("%d",&aktGraphik); #else i=0; do { Key = getc(stdin); aktFile[i++] = Key; } while (Key != '\n'); aktFile[i-1] = '\0'; aktGraphik = atoi(aktFile); /* ou i=0; if(aktFile[0]=='-') i++; Key=0; while(aktFile[i]!='\0') { Key += (aktFile[i]-48)<<3 + (aktFile[i]-48)<<1 }; if (aktFile[0]=='-') Key = -Key; */ #endif #endif #ifndef MAC_UI /* MAIN LOOP UX */ while (aktGraphik != -1) { // Wenn die Graphik ID die gleiche ist als die zuletzt angesteuerte, dann // die Werte de Eingabe Parameter behalten if (old_grID != aktGraphik) { // Parameter werte initialisierung for(i=0;i<=4;i++) { aktDaten[i] = 0; } old_grID = aktGraphik; } /* Ansonsten werden die alten Parameter Werte behalten */ // Anzahl der Werte u. Parameter berechnen und // Ansicht der Seite zum Tcl uebergeben numValues = 0; for(i=0;i0 && Key<9) { // Daten aktualisieren // Achtung aktDaten[0] beinhaltet die Parameter Anzahl der // aktuellen Graphik und sollte nicht geaendert werden switch(Key) { case 1 : aktDaten[1] = aktDaten[1] + aktResolutions[0]; break; case 2 : aktDaten[1] = aktDaten[1] - aktResolutions[0]; break; case 3 : aktDaten[2] = aktDaten[2] + aktResolutions[1]; break; case 4 : aktDaten[2] = aktDaten[2] - aktResolutions[1]; break; case 5 : aktDaten[3] = aktDaten[3] + aktResolutions[2]; break; case 6 : aktDaten[3] = aktDaten[3] - aktResolutions[2]; break; case 7 : aktDaten[4] = aktDaten[4] + aktResolutions[3]; break; case 8 : aktDaten[4] = aktDaten[4] - aktResolutions[3]; break; } #else // Parameter Werte Zuweisung erfolgt nach muendliches Schema while (Key != '0' && Key != '9') { printf("Parameter wählen 1 - 4 (0 oder 9 für andere Graphik):\n"); #ifndef Mac scanf("%c",&Key); #else Key = getc(stdin); dummy = getc(stdin); #endif if (Key >= '1' && Key <= '4') { // Nummer des zu Selektierenden Parameter ist gegeben worden // Parameter Selektieren for (i=0;i<21;i++) valBuffer[i] = '\0'; lenBuf = 0; aktParam = (int)Key - 48; // Werte auf der Seite aktualisieren (Berechnungen nicht aendern) startGrFile2(aktParam,"_._",aktDaten,numValues); for(i=0;i 0 mit - Zeichen versehen for (i=lenBuf;i>=0;i--) { valBuffer[i+1] = valBuffer[i]; } valBuffer[0] = '-'; lenBuf++; } else { // - Zeichen in valBuffer wegnehmen for (i=0;i= 0 && Key <= 9) { if (Key >= '0' && Key <= '9') { sprintf(valBuffer+lenBuf,"%c",Key); valBuffer[++lenBuf] = '_'; valBuffer[lenBuf+1] = '.'; valBuffer[lenBuf+2] = '_'; valBuffer[lenBuf+3] = '\0'; // Werte auf der Seite aktualisieren (Berechnungen nicht aendern) startGrFile2(aktParam,valBuffer,aktDaten,numValues); for(i=0;i='0' && Key <= '9') { sprintf(valBuffer+lenBuf,"%c",Key); valBuffer[++lenBuf] = '.'; valBuffer[lenBuf] = '_'; valBuffer[lenBuf+1] = '\0'; // Werte auf der Seite aktualisieren (Berechnungen nicht aendern) startGrFile2(aktParam,valBuffer,aktDaten,numValues); for(i=0;i0 && Key<9) / (Key>=1 && Key<=4) } // Ende Schleife while (Key!=0 && Key!=9) / (Key != '0' && Key != '9') // Sonst wird die nächste Graphik sofort verlassen Key = -1; // Nächste Graphik auswählen printf("Graphik Nummer (-1 zum Verlassen):\n"); #ifndef Mac scanf("%d",&aktGraphik); #else i=0; do { Key = getc(stdin); aktFile[i++] = Key; } while (Key != '\n'); aktFile[i-1] = '\0'; aktGraphik = atoi(aktFile); /* ou i=0; if(aktFile[0]=='-') i++; Key=0; while(aktFile[i]!='\0') { Key += (aktFile[i]-48)<<3 + (aktFile[i]-48)<<1 }; if (aktFile[0]=='-') Key = -Key; */ #endif } // End while (aktGraphik != -1) #else /* MAIN LOOP MAC */ while(aktGraphik != -1) { if (WaitNextEvent(0xFFFF,&Evt,0x00000080,0L)) { switch(Evt.what) { case nullEvent : // IdleControls() break; case updateEvt: if (IsDialogEvent(&Evt)) { #ifndef CTRL_TEST DialogSelect(&Evt, &actionWindow, &workInt); #else // Handle dialogs if (DlgControle==(DialogPtr)Evt.message && !EmptyRgn(DlgControle->visRgn)) { // Handle ctrl window // We try to handle elements separately BeginUpdate((WindowPtr)Evt.message); // DrawControl(GrIdPopup); /* if (!DialogSelect(&Evt, &actionWindow, &workInt)) { // Traiter l'evènement que DialogSelectn'a pas trainté } */ // UpdateControls(DlgControle, DlgControle->visRgn); UpdtControl(DlgControle, DlgControle->visRgn); // ShowDItem(DlgControle,2); Draw1Control((ControlHandle)staticTxt); EndUpdate((WindowPtr)Evt.message); } else if (DlgParam == (DialogPtr)Evt.message) { // editNumParam // editParam1 // editParam2 DialogSelect(&Evt, &actionWindow, &workInt); } #endif } else { // Handle doc window SetPort(WinDoc); BeginUpdate((WindowPtr)Evt.message); // Try to copy window content from offline gepfport CopyBits(&(WinDoc->portBits), &(qd.screenBits), &WindocRect, &(WinDoc->portRect), srcCopy, NULL); EndUpdate((WindowPtr)Evt.message); } break; case mouseUp : break; case mouseDown : workInt = FindWindow(Evt.where, &actionWindow); if (actionWindow != FrontWindow()) { if (DlgControle == actionWindow) { SelectConsole(); printf("Control Dialogue selected. Type q to quit application\n"); } if (DlgParam == actionWindow) { SelectConsole(); printf("Parameter Dialogue selected. Type d to view code\n"); } SelectWindow(actionWindow); } else { if (inContent == workInt) { if (actionWindow == DlgControle) { SetPort(DlgControle); GlobalToLocal(&(Evt.where)); workInt = FindControl(Evt.where, DlgControle, &workHandle); if(workHandle == GrIdPopup) { // TrackControl(workHandle, Evt.where, NULL); TrackControl(workHandle, Evt.where, (ControlActionUPP) -1); itemSelect = GetCtlValue(GrIdPopup); // PopupMenu values range 1 .. numitems !! aktGraphik = IdList[itemSelect-1].Id; if (old_grID != aktGraphik) { old_grID = aktGraphik; // Réinitialiser valeurs paramètres for(i=0;icontrlRect), Evt.where)) { selectedEdit = editParam1; } else if (editPos == PinRect(&((*(ControlHandle)editParam2)->contrlRect), Evt.where)) { selectedEdit = editParam2; } else if (editPos == PinRect(&((*(ControlHandle)editParam3)->contrlRect), Evt.where)) { selectedEdit = editParam3; } else if (editPos == PinRect(&((*(ControlHandle)editParam4)->contrlRect), Evt.where)) { selectedEdit = editParam4; } } else if (paramOK == workHandle) { // OK button. Start calculation GetIText(editParam1, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[1] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[1] = atof((char*)valBuffer+1); } GetIText(editParam2, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[2] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[2] = atof((char*)valBuffer+1); } GetIText(editParam3, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[3] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[3] = atof((char*)valBuffer+1); } GetIText(editParam4, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[4] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[4] = atof((char*)valBuffer+1); } // erreur = FormatStr2X((ConstStr255Param)sValueSrc, &formatRec, partsTbl, &xValueBuf); // x80tod ( &xValueBuf, &dblValue ); nécessite MathLib V2 // x80told ( &xValueBuf, &dblValue ); // ldtox80 ( &dblValue, &xValueSrc ); // erreur = FormatX2Str(&xValueBuf, &formatRec, partsTbl, sValueDst); // LayoutFile zum Display abgeben showPage(aktFile); Exec_Calculs(); } else if (paramCnl == workHandle) { // Cancel button SetIText(editParam1, "\p0"); SetIText(editParam2, "\p0"); SetIText(editParam3, "\p0"); SetIText(editParam4, "\p0"); // CloseWindow } else { SelectConsole(); printf("Debugger..."); Debugger(); } } } else if (inDrag == workInt) { DragWindow(actionWindow, Evt.where, &(qd.screenBits.bounds)); SetRect(&WindocRect, 0, 0, WinDoc->portRect.right - WinDoc->portRect.left, WinDoc->portRect.bottom - WinDoc->portRect.top); } break; case keyUp : break; case keyDown : touche = Evt.message & charCodeMask; /* Si *touche plantage ici sauf parfois */ if (FrontWindow() == DlgParam) { if (touche == '\r' || touche == '\n') { // As OK button. Start calculation GetIText(editParam1, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[1] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[1] = atof((char*)valBuffer+1); } GetIText(editParam2, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[2] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[2] = atof((char*)valBuffer+1); } GetIText(editParam3, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[3] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[3] = atof((char*)valBuffer+1); } GetIText(editParam4, valBuffer); if (0==valBuffer[0]) { // Set param to 0 aktDaten[4] = 0; } else { valBuffer[++(valBuffer[0])] = 0; aktDaten[4] = atof((char*)valBuffer+1); } // erreur = FormatStr2X((ConstStr255Param)sValueSrc, &formatRec, partsTbl, &xValueBuf); // x80tod ( &xValueBuf, &dblValue ); nécessite MathLib V2 // x80told ( &xValueBuf, &dblValue ); // ldtox80 ( &dblValue, &xValueSrc ); // erreur = FormatX2Str(&xValueBuf, &formatRec, partsTbl, sValueDst); // LayoutFile zum Display abgeben showPage(aktFile); // Exécuter calculs Exec_Calculs(); } #ifndef USE_ITL if ( (touche >= '0' && touche <= '9') || '.' == touche) { #else if ( (touche >= '0' && touche <= '9') || decSeparat == touche) { #endif GetIText(selectedEdit, valBuffer); if (valBuffer[0]<8) { if (1==valBuffer[0] && '0'==valBuffer[1] || 2==valBuffer[0] && '-'==valBuffer[1] && '0'==valBuffer[2]) { valBuffer[(valBuffer[0])] = touche; } else { valBuffer[++(valBuffer[0])] = touche; } SetIText(selectedEdit, valBuffer); } else { // If we set a string longer than 8 char, the values contrlRect get overwritten!! SysBeep(0); } } if ('-' == touche) { GetIText(selectedEdit, valBuffer); if ('-' == valBuffer[1]) { valBuffer[1] = valBuffer[0] - 1; SetIText(selectedEdit, valBuffer+1); } else { GetIText(selectedEdit, valBuffer+1); if (valBuffer[0]<8) { valBuffer[0] = valBuffer[1] +1; valBuffer[1] = touche; SetIText(selectedEdit, valBuffer); } else { // If we set a string longer than 8 char, the values contrlRect get overwritten!! SysBeep(0); } } } if ('\b' == touche) { GetIText(selectedEdit, valBuffer); if (valBuffer[0]>0) { valBuffer[0] = valBuffer[0] -1; SetIText(selectedEdit, valBuffer); } else { SysBeep(0); } } if ('d' == touche) { SelectConsole(); printf("Code window opened. Type q to close\n"); // Set global references for(i=0;iRechnung; nbFonctions = (Graphs+i)->execSize; #ifdef MIT_VAR Valeurs = (Graphs+i)->Vars; #endif #ifdef ARG_DOUBLE constValues = (Graphs+i)->Constants; cntValues = (Graphs+i)->numConsts; #endif #ifdef ADD_FUNCT Msges = (*(Graphs + i)).Msges; #endif Debug(); /* ToDo ? // Force update of the two lower windows SetPort(DlgControle); InvalRect(&(DlgControle->portRect)); SetPort(DlgParam); InvalRect(&(DlgParam->portRect)); */ } } if (FrontWindow() == DlgControle) { //Debugger(); if (touche == downArrow){ if (itemSelect1) { itemSelect--; SetCtlValue(GrIdPopup,itemSelect); // Réinitialiser valeurs paramètres aktGraphik = IdList[itemSelect-1].Id; old_grID = aktGraphik; for(i=0;iportRect)); SetPort(DlgParam); InvalRect(&(DlgParam->portRect)); } } break; } } } } #endif /* SORTIE */ #ifdef MAC_UI /* DisposeControl(editNumParam); DisposeControl(editParam1); DisposeControl(editParam2); DisposeControl(editParam3); DisposeControl(editParam4); DisposeControl(paramOK); DisposeControl(paramCnl); */ DisposeControl(GrIdPopup); DisposDialog(DlgControle); DisposDialog(DlgParam); ReleaseConsole(); DisposeWindow(WinDoc); #endif CleanUp(); #ifndef Mac return 0; #else #ifndef MAC_UI return EXIT_SUCCESS; #else return 0; #endif #endif }