00001
00058
00059
00060
00061
00062
00063 #include "Global.h"
00064 #include "Interpre.h"
00065 #include "GrafKern.h"
00066 #include "Interval.h"
00067
00068 #include "Execute.h"
00069 #include <setjmp.h>
00070
00071
00072 #include "Runtime.h"
00073
00074 #ifdef MUTWIN
00075 #ifdef WX
00076 #include "wx/msgdlg.h"
00077 wxStaticText* CompDiaLine = NULL;
00078 #else
00079 HWND CompDiaLine;
00080 #endif
00081 #endif
00082
00083 int protokoll_ausgabezeile = 0;
00084 int aktionen_ausgabezeile = 0;
00085
00086 extern jmp_buf weiter_gehts_nach_compilerfehler;
00087
00088 #define PROT_MAXLINES 30
00089 #define PROT_MAXCHARS PROT_MAXLINES*40
00090 #define AKTIONEN_MAX 100
00091
00092 char protokoll_string[PROT_MAXCHARS];
00093
00094 char sAktionen[AKTIONEN_MAX*50];
00095
00096 unsigned char boxAktionen[AKTIONEN_MAX];
00097
00098 int lAktionen[AKTIONEN_MAX];
00099
00100 int nAktionen = 0;
00101
00102 int keys_changed[MAX_BOX];
00103
00104 int keys_changed_sum;
00105
00106 #ifdef WX
00107 wxString sd1, sd2, sd3, sd4, sd5, sd6;
00108
00109 wxString Fmeldung;
00110
00111 #else
00112 char sd1[100], sd2[100];
00113
00114 char Fmeldung[255];
00115
00116 #endif
00117
00118
00119
00120
00121 void AktionenInit()
00122 {
00123 nAktionen = 0;
00124 }
00125
00126 #ifdef MUTWIN
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143
00144
00145 void AktionenMessage(int box, const char* aktionName)
00146 {
00147 if ( nAktionen < AKTIONEN_MAX ) {
00148 boxAktionen[nAktionen] = ((unsigned char*)&box)[0];
00149 int l = 0;
00150
00151 if ( nAktionen )
00152 l = lAktionen[nAktionen-1];
00153
00154 strcpy(&sAktionen[l], aktionName);
00155
00156 lAktionen[nAktionen++] = l + strlen(aktionName);
00157 }
00158 }
00159
00160 int pascal _export GetActString(unsigned char **box, int **l, char **s)
00161
00162 {
00163 int n = nAktionen;
00164 *box = boxAktionen;
00165 *l = lAktionen;
00166 *s = sAktionen;
00167 nAktionen = 0;
00168 return n;
00169 }
00170
00171
00172
00173 #ifdef WX
00174 void InitCompDia(CompDlg *compDia, wxString filename)
00175 {
00176 wxASSERT(compDia);
00177 CompDiaLine = compDia->GetLine();
00178 }
00179
00180 #else
00181 void InitCompDia(HWND compDiaLine)
00182 {
00183 CompDiaLine = compDiaLine;
00184 }
00185
00186 #endif
00187
00188 #else
00189
00190 #include <iostream.h>
00191
00192 extern ostream *Echo;
00193
00194 void aktionen_message( char * Meldung )
00195 {
00196 *Echo << "\n Action: " << Meldung;
00197 }
00198
00199 #endif
00200
00201 void calc_declaration_numbers(char withNames)
00202 {
00203 #ifdef MUTWIN
00204 #ifdef WX
00205 sd1 = wxString::Format(_T("%d"), logik_list_laenge(list_of_logiken));
00206 sd2 = wxString::Format(_T("%d"), ton_list_laenge(list_of_toene));
00207 sd3 = wxString::Format(_T("%d"), umstimmungs_list_laenge(list_of_umstimmungen));
00208 sd4 = wxString::Format(_T("%d"), tonsystem_list_laenge(list_of_tonsysteme));
00209 sd5 = wxString::Format(_T("%d"), intervall_list_laenge(list_of_intervalle));
00210 sd6 = wxString::Format(_T("%ld"), anzahl_eingelesene_zeichen);
00211 #else
00212 sprintf(sd1, "%d\n%d\n%d",
00213 logik_list_laenge(list_of_logiken),
00214 ton_list_laenge(list_of_toene),
00215 umstimmungs_list_laenge(list_of_umstimmungen));
00216 sprintf(sd2, "%d\n%d\n%d",
00217 tonsystem_list_laenge(list_of_tonsysteme),
00218 intervall_list_laenge(list_of_intervalle),
00219 anzahl_eingelesene_zeichen);
00220 #endif
00221 #else
00222
00223 if ( withNames) {
00224 sprintf(sd1, " logics: %d\n tones: %d\n tunes: %d",
00225 logik_list_laenge(list_of_logiken),
00226 ton_list_laenge(list_of_toene),
00227 umstimmungs_list_laenge(list_of_umstimmungen));
00228 sprintf(sd2, " tone systems: %d\n intervalls; %d\n read chars: %d",
00229 tonsystem_list_laenge(list_of_tonsysteme),
00230 intervall_list_laenge(list_of_intervalle),
00231 anzahl_eingelesene_zeichen);
00232 } else {
00233 sprintf(sd1, "%d\n%d\n%d",
00234 logik_list_laenge(list_of_logiken),
00235 ton_list_laenge(list_of_toene),
00236 umstimmungs_list_laenge(list_of_umstimmungen));
00237 sprintf(sd2, "%d\n%d\n%d",
00238 tonsystem_list_laenge(list_of_tonsysteme),
00239 intervall_list_laenge(list_of_intervalle),
00240 anzahl_eingelesene_zeichen);
00241 }
00242
00243 #endif
00244 }
00245
00246 void show_line_number( int n )
00247
00248 {
00249 #ifdef WX
00250 #ifdef DEBUG
00251 std::cerr << "show_line_number(" << n << ") in WX mode " << std::endl;
00252 #endif
00253
00254 if ( !CompDiaLine ) return;
00255
00256 #ifdef DEBUG
00257 std::cerr << "setting number ";
00258
00259 #endif
00260 wxString s = _T("");
00261
00262 if ( n != -1 ) s << n;
00263
00264 DEBUGLOG2(other,_T("s = %s"), s.c_str());
00265
00266 CompDiaLine->SetLabel(s);
00267
00268 CompDiaLine->Refresh();
00269
00270 #else
00271 #ifdef DEBUG
00272 std::cerr << "show_line_number(" << n << ") in non-WX mode " << std::endl;
00273
00274 #endif
00275 #ifdef MUTWIN
00276 if ( !CompDiaLine ) return;
00277
00278 char s[20] = "--- ";
00279
00280 if ( n != -1 ) sprintf(s, "%d ", n);
00281
00282 ::SetWindowText(CompDiaLine, s);
00283
00284 #endif
00285 #endif
00286 }
00287
00288 void fatal_error( int nr, ... )
00289 {
00290 va_list arglist;
00291 va_start(arglist,nr);
00292 #if defined(WX)
00293 Fmeldung = wxString::FormatV(wxGetTranslation(Error_text[nr]), arglist);
00294 #else
00295 vsprintf( Fmeldung, Error_text[nr], arglist );
00296 #endif
00297 longjmp( weiter_gehts_nach_compilerfehler , (nr==0)?255:nr );
00298 }
00299
00300
00301
00302 void compiler_warning( int nr, ... )
00303 {
00304 va_list arglist;
00305 va_start(arglist,nr);
00306 #ifdef MUTWIN
00307 DEBUGLOGBASE (other,_T(""), _T("testing %s"), _T("%s"));
00308 DEBUGLOGBASE (other,_T(""),
00309 _T("Compiler warning %d: %s"),
00310 nr,
00311 Warning_text[nr]);
00312 #if defined(WX)
00313 wxMessageBox(wxString::FormatV(wxGetTranslation(Warning_text[nr]),
00314 arglist),
00315 _("Compiler warning"),
00316 wxOK | wxICON_ASTERISK );
00317 #else
00318 char Fmeldung[255];
00319 vsprintf( Fmeldung, Warning_text[nr], arglist );
00320 MessageBox(0, Fmeldung, "Compiler warning", MB_OK | MB_ICONASTERISK );
00321 #endif
00322 #endif
00323 }
00324
00325 void laufzeit_message(const char * Meldung )
00326 {
00327 if ( strlen(protokoll_string) + strlen(Meldung) <= PROT_MAXCHARS - 2 ) {
00328 if ( protokoll_ausgabezeile ) strcat(protokoll_string, "\n");
00329
00330 strcat(protokoll_string, Meldung);
00331
00332 protokoll_ausgabezeile++;
00333 }
00334 }
00335
00336 void init_laufzeit_protokoll( void )
00337
00338 {
00339 protokoll_ausgabezeile = 0;
00340 strcpy(protokoll_string, "");
00341 }
00342
00343 void exit_laufzeit_protokoll( void )
00344
00345 {}
00346
00347 void laufzeit_protokoll(const char * formatstring , ... )
00348 {
00349 char Fmeldung[255];
00350 va_list arglist;
00351
00352 va_start(arglist, formatstring);
00353 vsprintf(Fmeldung, formatstring, arglist );
00354 laufzeit_message (Fmeldung);
00355 }
00356
00357 #ifdef MUTWIN
00358
00359 char* pascal _export GetKeyString(int box, char asTS)
00360 {
00361 init_laufzeit_protokoll();
00362
00363 if ( asTS )
00364 protokoll_liegende_frequenzen(box);
00365 else
00366 protokoll_liegende_relationen(box);
00367
00368 return protokoll_string;
00369 }
00370
00371 char* pascal _export GetTSString(int box, char asTS)
00372
00373 {
00374 init_laufzeit_protokoll();
00375
00376 if ( asTS )
00377 protokoll_aktuelles_tonsystem(box);
00378 else
00379 protokoll_aktuelle_relationen(box);
00380
00381 return protokoll_string;
00382 }
00383
00384 int pascal _export GetLineNumbers()
00385 {
00386 return protokoll_ausgabezeile;
00387 }
00388
00389 #endif
00390
00391 int pascal _export GetErrorLine()
00392 {
00393 #if defined(WX)
00394 int i = Fmeldung.First(_("line"));
00395 long l;
00396
00397 if ( i != -1 && Fmeldung.Mid(i+wxString(_("line")).Length()).ToLong(&l) )
00398 return l;
00399 else
00400 return -1;
00401
00402 #else
00403 char *s = strstr(Fmeldung, "Zeile");
00404
00405 if ( !s ) return -1;
00406
00407 return atol(&(s[5]));
00408
00409 #endif
00410 }
00411
00412