Parser.cpp
gehe zur Dokumentation dieser Datei
00001 
00023 // ------------------------------------------------------------------
00024 // Mutabor 2.win, 1997, R.Kraufle
00025 // Fileparser
00026 // ------------------------------------------------------------------
00027 
00028 #include "Global.h"
00029 #include "GrafKern.h"
00030 #include "Interval.h"
00031 #include "Hilfs.h"
00032 
00033 /* Globale Variablen des Compilers mit dem Codegenerator und
00034                                        dem Tabellengenerator  */
00035 
00036 /*********** Es folgen die Wurzeln der Listen.
00037              Jede Liste ist nur einmal und global vorhanden,
00038              da die Sprache NICHT rekursiv ist.
00039 ***********/
00040 
00041 
00042 struct intervall      *  list_of_intervalle;
00043 
00044 struct ton            *  list_of_toene;
00045 
00046 struct tonsystem      *  list_of_tonsysteme;
00047 
00048 struct umstimmung     *  list_of_umstimmungen;
00049 
00050 struct harmonie       *  list_of_harmonien;
00051 
00052 struct logik          *  list_of_logiken;
00053 
00054 struct instrument     *  list_of_instrumente;
00055 
00056 struct instrument     *  list_of_config_instrumente;
00057 
00058 struct ton            *  ton_ohne_namen; /* Frequenz=0 */
00059 
00060 static void berechne_toene_absolut (struct ton *ton_liste);
00061 
00062 static void check_konsistenz (void);
00063 
00064 /*
00065 static void drucke_ton (struct ton * lauf);
00066 static void drucke_harmonie (struct harmonie * this_);
00067 static void drucke_argument (struct argument * z_or_p);
00068 
00069 static void print_ausloeser (struct ausloeser * this_);
00070 */
00071 /*
00072 static void print_aktion (struct aktion * this);
00073 */
00074 
00075 
00076 /*********  Allgemeine Hilfsfunktionen ********/
00077 
00078 void allgemeine_initialisierungen( void )
00079 {
00080 
00081         ton_ohne_namen=(ton*) xmalloc((size_t) sizeof(struct ton));
00082         ton_ohne_namen->name=NULL;
00083         ton_ohne_namen->ton_typ=ton_absolut;
00084         ton_ohne_namen->u.ton_absolut.ton_wert=0.0;
00085         ton_ohne_namen->next=NULL;
00086 }
00087 
00088 int ton_list_laenge (struct ton *list)
00089 
00090 {
00091         if (list) return 1 + ton_list_laenge (list -> next);
00092 
00093         return 0;
00094 }
00095 
00096 int tonsystem_list_laenge (struct tonsystem *list)
00097 {
00098         if (list) return 1 + tonsystem_list_laenge (list -> next);
00099 
00100         return 0;
00101 }
00102 
00103 int umstimmungs_list_laenge (struct umstimmung *list)
00104 {
00105         if (list) return 1 + umstimmungs_list_laenge (list -> next);
00106 
00107         return 0;
00108 }
00109 
00110 int logik_list_laenge (struct logik *list)
00111 {
00112         if (list) return 1 + logik_list_laenge (list -> next);
00113 
00114         return 0;
00115 }
00116 
00117 int midi_list_laenge (struct midiliste *list)
00118 {
00119         if (list) return 1 + midi_list_laenge (list -> next);
00120 
00121         return 0;
00122 }
00123 
00124 int get_logik_nummer (const char * name, struct logik * liste)
00125 {
00126         if (liste == NULL)
00127         {
00128                 fatal_error (0, _T(__FILE__), __LINE__);
00129                 return 0;
00130         } else if ( ! strcmp (name, liste->name))
00131                 return 0;
00132         else
00133                 return 1 + get_logik_nummer (name, liste->next);
00134 }
00135 
00136 int parameter_list_laenge (struct parameter_liste *list)
00137 
00138 {
00139         if (list) return 1 + parameter_list_laenge (list -> next);
00140 
00141         return 0;
00142 }
00143 
00144 int argument_list_laenge (struct argument_liste *list)
00145 {
00146         if (list) return 1 + argument_list_laenge (list -> next);
00147 
00148         return 0;
00149 }
00150 
00151 
00152 struct ton * get_ton (const char * name, struct ton * liste)
00153 {
00154         if (name==NULL) return(ton_ohne_namen);
00155 
00156         if (liste == NULL) return NULL;
00157 
00158         if ( ! strcmp (name, liste->name)) return liste;
00159 
00160         return get_ton (name, liste->next);
00161 }
00162 
00163 
00164 struct intervall * get_intervall (const char * name,
00165 
00166                                                           struct intervall * liste)
00167 {
00168         if (liste == NULL) return NULL;
00169 
00170         if ( ! strcmp (name, liste->name)) return liste;
00171 
00172         return get_intervall (name, liste->next);
00173 }
00174 
00175 struct tonsystem * parser_get_tonsystem (const char * name,
00176 
00177                                         struct tonsystem * liste)
00178 {
00179         if (liste == NULL) return NULL;
00180 
00181         if ( ! strcmp (name, liste->name)) return liste;
00182 
00183         return parser_get_tonsystem (name, liste->next);
00184 }
00185 
00186 struct umstimmung * get_umstimmung (const char * name,
00187 
00188                                                             struct umstimmung * liste)
00189 {
00190         if (liste == NULL) return NULL;
00191 
00192         if ( ! strcmp (name, liste->name)) return liste;
00193 
00194         return get_umstimmung (name, liste->next);
00195 }
00196 
00197 struct harmonie * get_harmonie (const char * name, struct harmonie * liste)
00198 {
00199         if (liste == NULL) return NULL;
00200 
00201         if ( ! strcmp (name, liste->name)) return liste;
00202 
00203         return get_harmonie (name, liste->next);
00204 }
00205 
00206 
00207 struct logik * get_logik (const char * name, struct logik * liste)
00208 {
00209         if (liste == NULL) return NULL;
00210 
00211         if ( ! strcmp (name, liste->name)) return liste;
00212 
00213         return get_logik (name, liste->next);
00214 }
00215 
00216 
00217 /********* Einleseroutine fuer Integerliste          *********/
00218 /*         Es wird einfach eine Liste of Integer aufgebaut       **/
00219 /*         die allgemein verwendbar ist.                       **/
00220 
00221 static struct midiliste * list_of_integers;
00222 
00223 void init_integersequenz (void)
00224 {
00225         list_of_integers = NULL;
00226 }
00227 
00228 
00229 void get_new_integer_in_integersequenz (int wert)
00230 
00231 {
00232 
00233         struct midiliste * * lauf;
00234 
00235         for (lauf= & list_of_integers; * lauf; lauf= & (*lauf)->next) {}
00236 
00237         (* lauf) = (midiliste*) xmalloc ((size_t) sizeof (struct midiliste));
00238         (* lauf) -> midi_code     = wert;
00239         (* lauf) -> next          = NULL;
00240 }
00241 
00242 static struct midiliste * get_last_integersequenz (void)
00243 {
00244         return list_of_integers;
00245 }
00246 
00247 
00248 
00249 /********* Einleseroutinen fuer Parameterliste          *********/
00250 /*         Es wird einfach eine Liste of Namen aufgebaut       **/
00251 /*         die allgemein verwendbar ist.                       **/
00252 
00253 static struct parameter_liste * list_of_names;
00254 
00255 void init_parameter_liste (void)
00256 {
00257         list_of_names = NULL;
00258 }
00259 
00260 
00261 void get_new_name_in_parameterlist (const char * name)
00262 
00263 {
00264 
00265         struct parameter_liste * * lauf;
00266 
00267         for (lauf= & list_of_names; * lauf; lauf= & (*lauf)->next) {
00268                 if ( ! strcmp (name, (*lauf)->name)) {
00269                         fatal_error(17,mutC_STR(name)); /* Parametername doppelt: name */
00270                 }
00271         }
00272 
00273         (* lauf) = (parameter_liste*) xmalloc ((size_t) sizeof (struct parameter_liste));
00274         (* lauf) -> name          = name;
00275         (* lauf) -> next          = NULL;
00276 }
00277 
00278 static struct parameter_liste * get_last_parameter_liste (void)
00279 {
00280         return list_of_names;
00281 }
00282 
00283 
00284 static int parameter_nummer (int aktueller_index, const char * such_name,
00285 
00286                              struct parameter_liste * knoten)
00287 {
00288         if (knoten == NULL) return EOF;
00289 
00290         if ( ! strcmp (such_name, knoten -> name))
00291                 return aktueller_index;
00292 
00293         return parameter_nummer (aktueller_index + 1, such_name,
00294                                  knoten -> next);
00295 }
00296 
00297 void print_argumentliste (struct argument_liste * this_)
00298 
00299 {
00300         if (this_)
00301         {
00302                 if (this_ -> argument.argument_typ == zahl)
00303                         printf (" %d ", this_ -> argument.u.zahl.zahl);
00304                 else
00305                         printf (" %s ", this_ -> argument.u.parameter.parameter_name);
00306 
00307                 print_argumentliste (this_ -> next);
00308         }
00309 }
00310 
00311 
00312 /********* Einleseroutinen fuer Argumentliste          *********/
00313 
00314 static struct argument_liste * list_of_argumente;
00315 
00316 void init_argument_liste (void)
00317 {
00318         list_of_argumente = NULL;
00319 }
00320 
00321 
00322 void get_new_number_in_argument_list (double parameter_zahl)
00323 
00324 {
00325 
00326         struct argument_liste * * lauf;
00327 
00328         for (lauf= & list_of_argumente; * lauf; lauf= & (*lauf)->next) {}
00329 
00330         (* lauf) = (argument_liste*) xmalloc ((size_t) sizeof (struct argument_liste));
00331         (* lauf) -> argument.argument_typ = zahl;
00332         (* lauf) -> argument.u.zahl.zahl  = (int) parameter_zahl;
00333         (* lauf) -> next                  = NULL;
00334 }
00335 
00336 
00337 void get_new_name_in_argument_list (const char * parameter_name)
00338 {
00339 
00340         struct argument_liste * * lauf;
00341 
00342         for (lauf= & list_of_argumente; * lauf; lauf= & (*lauf)->next) {
00343 #if 0
00344 
00345                 if ( ! strcmp (name, (*lauf)->name)) {
00346                         fatal_error(17,mutC_STR(name)); /* Parametername doppelt: name */
00347                 }
00348 
00349 #endif
00350         }
00351 
00352         (* lauf) = (argument_liste*) xmalloc ((size_t) sizeof (struct argument_liste));
00353         (* lauf) -> argument.argument_typ = parameter;
00354         (* lauf) -> argument.u.parameter.parameter_nummer = 0;
00355         (* lauf) -> argument.u.parameter.parameter_name = parameter_name;
00356         (* lauf) -> next          = NULL;
00357 }
00358 
00359 static struct argument_liste * get_last_argument_liste (void)
00360 {
00361         return list_of_argumente;
00362 }
00363 
00364 
00365 /********* Einleseroutinen fuer Aktions-liste          *********/
00366 
00367 static struct aktions_liste * list_of_aktionen;
00368 
00369 void init_aktions_liste (void)
00370 {
00371         list_of_aktionen = NULL;
00372 }
00373 
00374 
00375 void get_new_aktion_aufruf_element (const char * name)
00376 
00377 {
00378 
00379         struct aktions_liste * * lauf;
00380 
00381         for (lauf= & list_of_aktionen; * lauf; lauf= & (*lauf)->next) {}
00382 
00383         (* lauf) = (aktions_liste*) xmalloc ((size_t) sizeof (struct aktions_liste));
00384         (* lauf) -> aktions_typ           = aktion_aufruf;
00385         (* lauf) -> u.aktion_aufruf.name  = name;
00386         (* lauf) -> u.aktion_aufruf.argument_liste = get_last_argument_liste ();
00387         (* lauf) -> next                  = NULL;
00388 }
00389 
00390 void get_new_aktion_midi_out_element (void)
00391 
00392 {
00393 
00394         struct aktions_liste * * lauf;
00395 
00396         for (lauf= & list_of_aktionen; * lauf; lauf= & (*lauf)->next) {}
00397 
00398         (* lauf) = (aktions_liste*) xmalloc ((size_t) sizeof (struct aktions_liste));
00399         (* lauf) -> aktions_typ           = aktion_midi_out;
00400         (* lauf) -> u.aktion_midi_out.midi_code = get_last_integersequenz ();
00401         (* lauf) -> next                  = NULL;
00402 }
00403 
00404 static struct aktions_liste * get_last_aktions_liste (void)
00405 {
00406         return list_of_aktionen;
00407 }
00408 
00409 /* Einleseroutinen fÅr komplex_intervalle  ****/
00410 
00411 static struct komplex_intervall * the_komplex_liste;
00412 
00413 void init_komplex_ton_list (void)
00414 {
00415         the_komplex_liste = NULL;
00416 }
00417 
00418 void get_new_faktor_anteil (double f, const char *name)
00419 
00420 {
00421 
00422         struct komplex_intervall * * lauf;
00423 
00424         for (lauf= & the_komplex_liste; * lauf; lauf= & (*lauf)->next)
00425                 /* nur ende der Liste finden */ ;
00426 
00427         (* lauf) = (komplex_intervall*) xmalloc ((size_t) sizeof (struct komplex_intervall));
00428 
00429         (* lauf) -> faktor = f;
00430 
00431         (* lauf) -> name   = name;
00432 
00433         (* lauf) -> next   = NULL;
00434 
00435 }
00436 
00437 struct komplex_intervall * get_last_komplex_intervall (void)
00438 {
00439         return the_komplex_liste;
00440 }
00441 
00442 #if 0
00443 
00444 void get_new_relativ_anteil (double f,
00445                              const char *linke_grenze, const char *rechte_grenze)
00446 {
00447 
00448         struct komplex_anteil * * lauf;
00449 
00450         for (lauf= & komplex_liste; * lauf; lauf= & (*lauf)->next)
00451                 /* nur ende der Liste finden */ ;
00452 
00453         (* lauf) = xmalloc ((size_t) sizeof (struct komplex_anteil));
00454 
00455         (* lauf) -> komplex_typ                     = komplex_anteil_relativ;
00456 
00457         (* lauf) -> u.komplex_anteil_relativ.faktor        = f;
00458 
00459         (* lauf) -> u.komplex_anteil_relativ.linke_grenze  = linke_grenze;
00460 
00461         (* lauf) -> u.komplex_anteil_relativ.rechte_grenze = rechte_grenze;
00462 
00463         (* lauf) -> next                                   = NULL;
00464 
00465 }
00466 
00467 #endif
00468 
00469 
00470 /************************/
00471 
00472 
00473 
00474 void setze_nummer_von_abstand_und_zentrum (void)
00475 {
00476 
00477         struct logik * lauf;
00478 
00479         for (lauf=list_of_logiken; lauf; lauf=lauf->next) {
00480 
00481                 struct anweisung * lauf_anw;
00482 
00483                 for (lauf_anw=lauf->anweisungsliste; lauf_anw; lauf_anw=lauf_anw->next) {
00484                         if (lauf_anw->aktion->aktions_typ == aktion_aufruf) {
00485 
00486                                 struct argument_liste * lauf_arg;
00487 
00488                                 for (lauf_arg=lauf_anw->aktion->u.aktion_aufruf.argument_liste;
00489                                                 lauf_arg;
00490                                                 lauf_arg=lauf_arg->next) {
00491                                         switch (lauf_arg->argument.argument_typ) {
00492 
00493                                         case zahl:
00494                                                 /* OK */
00495                                                 break;
00496 
00497                                         case parameter:
00498                                                 if ( ! strcmp (lauf_arg->argument.u.parameter.parameter_name,
00499                                                                 "ABSTAND")) {
00500                                                         lauf_arg->argument.u.parameter.parameter_nummer
00501                                                         = 0;
00502                                                 } else
00503                                                         if ( ! strcmp (lauf_arg->argument.u.parameter.parameter_name,
00504                                                                         "DISTANCE")) {
00505                                                                 lauf_arg->argument.u.parameter.parameter_nummer
00506                                                                 = 0;
00507                                                         } else
00508                                                                 if ( ! strcmp (lauf_arg->argument.u.parameter.parameter_name,
00509                                                                                 "ZENTRUM")) {
00510                                                                         lauf_arg->argument.u.parameter.parameter_nummer
00511                                                                         = 1;
00512                                                                 } else
00513                                                                         if ( ! strcmp (lauf_arg->argument.u.parameter.parameter_name,
00514                                                                                         "CENTER")) {
00515                                                                                 lauf_arg->argument.u.parameter.parameter_nummer
00516                                                                                 = 1;
00517                                                                         } else
00518                                                                                 fatal_error (39,
00519                                                                                              mutC_STR(lauf_arg->argument.u.parameter.parameter_name),
00520                                                                                              mutC_STR(lauf_anw->aktion->u.aktion_aufruf.name),
00521                                                                                              mutC_STR(lauf->name));
00522 
00523                                                 break;
00524 
00525                                         default:
00526                                                 fatal_error (0, _T(__FILE__), __LINE__);
00527 
00528                                                 break;
00529                                         }
00530                                 }
00531                         }
00532                 }
00533         }
00534 }
00535 
00536 #ifdef DEBUG_ANZEIGE
00537 
00538 void print_aktions_liste (struct aktions_liste * lauf)
00539 { /*
00540 
00541 
00542                                                                                                                                             for (help_umst = lauf->u.umstimmung_umstimmungsbund.aktions_liste;
00543                                                                                                                                                                  help_umst;
00544                                                                                                                                    help_umst = help_umst -> next ) {
00545                                                                                                                                   struct argument_liste * help;
00546                                                                                                                                   printf ("                Umstimmungs-name: %s, Parameter: ",
00547                                                                                                                                            help_umst->name ? help_umst->name : "(NULL)");
00548                                                                                                                                   for (help = help_umst->argument_liste; help; help = help->next ) {
00549                                                                                                                                       drucke_argument ( & help -> argument );
00550                                                                                                                                   }
00551                                                                                                                                   printf ("\n");
00552                                                                                                                               }
00553 
00554 
00555                                                                                                                          */
00556 };
00557 
00558 
00559 
00560 #endif
00561 
00562 
00563 /********* Eintrittspunkt in das File ist hier !! *******/
00564 
00565 FILE * quelldatei;
00566 
00567 void mutabor_programm_einlesen (const mutChar * filename )
00568 {
00569 
00570         if ((quelldatei = wxFopen (filename, _T("r"))) == NULL) {
00571                 fatal_error(3,filename);
00572         }
00573 
00574         list_of_intervalle            = NULL;
00575 
00576         list_of_toene                 = NULL;
00577         list_of_tonsysteme            = NULL;
00578         list_of_umstimmungen          = NULL;
00579         list_of_harmonien             = NULL;
00580         list_of_logiken               = NULL;
00581         list_of_instrumente           = NULL;
00582         list_of_config_instrumente    = NULL;
00583 
00584 
00585 #ifdef DEBUG_ANZEIGE
00586         printf ("\nStart parsing\n");
00587 #endif
00588 
00589         if (yyparse()) {
00590                 fatal_error(1,-999); /* Wird sowieso nie aufgerufen ... */
00591         }
00592 
00593         fclose (quelldatei);
00594 
00595         // NEU: wenn kein Intervall oder Ton da, dann Speichermangel
00596         // also evtl. Dummy
00597         // (das Problem l‰flt sich sicher auch direkt lˆsen ...)
00598 
00599         if ( !list_of_intervalle )
00600                 get_new_intervall("__TopSecret__RK__Intervall__", 1.0);
00601 
00602         berechne_intervalle_absolut (list_of_intervalle);
00603 
00604         if ( !list_of_toene )
00605                 get_new_ton_absolut("__TopSecret__RK__Ton__", 440.0);
00606 
00607         berechne_toene_absolut (list_of_toene);
00608 
00609 
00610         /* Falls kein Instrument angegeben ist: Dann 1 -> 1-16 */
00611 
00612         if (list_of_instrumente == NULL &&
00613                         list_of_config_instrumente == NULL) {
00614                 get_instrument_dekl (1, 1, 16, 0, & list_of_instrumente);
00615         } else if (list_of_instrumente == NULL) {
00616                 list_of_instrumente = list_of_config_instrumente;
00617         }
00618 
00619 
00620         setze_nummer_von_abstand_und_zentrum ();
00621 
00622         check_konsistenz ();
00623 
00624 #ifdef DEBUG_ANZEIGE
00625 
00626         { struct intervall * lauf;
00627                 printf ("\n");
00628 
00629                 for (lauf=list_of_intervalle; lauf; lauf=lauf->next) {
00630                         printf ("Name: %s, Wert: %lf:\n", lauf->name,
00631                                 lauf->intervall_wert );
00632                 }
00633         }
00634 
00635         { struct ton * lauf;
00636                 printf ("\n");
00637 
00638                 for (lauf=list_of_toene; lauf; lauf=lauf->next) {
00639                         drucke_ton (lauf);
00640 
00641                 }
00642         }
00643 
00644         { struct tonsystem * lauf;
00645                 printf ("\n");
00646 
00647                 for (lauf=list_of_tonsysteme; lauf; lauf=lauf->next) {
00648 
00649                         struct ton * help;
00650                         printf ("Name: %s, Taste: %d, Periode: %s, "
00651                                 "Tonleiter_breite: %d\n",
00652                                 lauf->name,
00653                                 lauf->taste,
00654                                 lauf->periode,
00655                                 ton_list_laenge (lauf->toene));
00656 
00657                         for (help = lauf->toene; help; help = help->next ) {
00658                                 printf ("%s , ", help->name ? help->name : "(NULL)");
00659                         }
00660 
00661                         printf ("\n");
00662                 }
00663         }
00664 
00665         printf ("Umstimmungen:\n");
00666 
00667         {
00668 
00669                 struct umstimmung * lauf;
00670                 printf ("\n");
00671 
00672                 for (lauf=list_of_umstimmungen; lauf; lauf=lauf->next) {
00673 
00674                         struct parameter_liste * help;
00675                         printf ("\nName: %s, Parameter: ", lauf->name);
00676 
00677                         for (help = lauf->parameter_liste; help; help = help->next ) {
00678                                 printf ("%s , ", help->name ? help->name : "(NULL)");
00679                         }
00680 
00681                         printf ("\n");
00682 
00683                         switch (lauf -> umstimmung_typ) {
00684 
00685                         case umstimmung_taste_abs :
00686                                 printf ("        umstimmung_taste_abs : ");
00687 
00688                                 drucke_argument (
00689                                         & lauf -> u.umstimmung_taste_abs.argument);
00690 
00691                                 printf ("\n");
00692 
00693                                 break;
00694 
00695                         case umstimmung_taste_rel :
00696                                 printf ("        umstimmung_taste_rel : ");
00697 
00698                                 drucke_argument (
00699                                         & lauf -> u.umstimmung_taste_rel.argument);
00700 
00701                                 printf (" Rechenzeichen: \"%c\"\n",
00702                                         lauf -> u.umstimmung_taste_rel.rechenzeichen);
00703 
00704                                 break;
00705 
00706                         case umstimmung_breite_abs :
00707                                 printf ("        umstimmung_breite_abs : ");
00708 
00709                                 drucke_argument (
00710                                         & lauf -> u.umstimmung_breite_abs.argument);
00711 
00712                                 printf ("\n");
00713 
00714                                 break;
00715 
00716                         case umstimmung_breite_rel :
00717                                 printf ("        umstimmung_breite_rel : ");
00718 
00719                                 drucke_argument (
00720                                         & lauf -> u.umstimmung_breite_rel.argument);
00721 
00722                                 printf (" Rechenzeichen: \"%c\"\n",
00723                                         lauf -> u.umstimmung_breite_rel.rechenzeichen);
00724 
00725                                 break;
00726 
00727                         case umstimmung_toene_veraendert : {
00728 
00729                                 struct ton * help;
00730                                 printf ("        umstimmung_toene_veraendert : \n");
00731 
00732                                 for (help = lauf -> u.umstimmung_toene_veraendert.tonliste;
00733                                                 help;
00734                                                 help = help -> next) {
00735                                         printf ("        ");
00736                                         drucke_ton (help);
00737                                 }
00738 
00739                                 break;
00740                         }
00741 
00742                         case umstimmung_wiederholung_abs :
00743                                 printf ("        umstimmung_wiederholung_abs :");
00744 
00745                                 printf ("Name : %s \n",
00746                                         lauf -> u.umstimmung_wiederholung_abs.name);
00747 
00748                                 break;
00749 
00750                         case umstimmung_wiederholung_rel :
00751                                 printf ("        umstimmung_wiederholung_rel : ");
00752 
00753                                 drucke_argument (
00754                                         & lauf -> u.umstimmung_wiederholung_rel.argument);
00755 
00756                                 printf (" R-zeichen: \"%c\"\n",
00757                                         lauf -> u.umstimmung_wiederholung_rel.rechenzeichen);
00758 
00759                                 break;
00760 
00761                         case umstimmung_umstimmungsbund : {
00762 
00763                                 struct aktions_liste * help_umst;
00764                                 printf ("        umstimmung_umstimmungsbund : \n");
00765                                 print_aktions_liste (lauf->u.umstimmung_umstimmungsbund.aktions_liste);
00766 
00767 
00768 
00769                                 for (help_umst = lauf->u.umstimmung_umstimmungsbund.aktions_liste;
00770                                                 help_umst;
00771                                                 help_umst = help_umst -> next ) {
00772 
00773                                         struct argument_liste * help;
00774                                         printf ("                Umstimmungs-name: %s, Parameter: ",
00775                                                 help_umst->name ? help_umst->name : "(NULL)");
00776 
00777                                         for (help = help_umst->argument_liste; help; help = help->next ) {
00778                                                 drucke_argument ( & help -> argument );
00779                                         }
00780 
00781                                         printf ("\n");
00782                                 }
00783 
00784 
00785 
00786                         }
00787 
00788                         break;
00789 
00790                         case umstimmung_umstimmungs_case : {
00791 
00792                                 struct case_liste * help_case;
00793                                 printf ("        umstimmung_umstimmungs_case : \n");
00794                                 drucke_argument (
00795                                         & lauf -> u.umstimmung_umstimmungs_case.argument);
00796 
00797                                 for (help_case = lauf -> u.umstimmung_umstimmungs_case.umstimmungs_case_liste;
00798                                                 help_case;
00799                                                 help_case = help_case -> next) {
00800 
00801                                         struct aufruf_liste * help_umst;
00802 
00803                                         if (help_case->is_default)
00804                                                 printf ("(ANSONSTEN)");
00805                                         else
00806                                                 printf ("%lf ", help_case->case_label);
00807 
00808                                         for (help_umst = help_case->case_aufruf;
00809                                                         help_umst;
00810                                                         help_umst = help_umst -> next ) {
00811 
00812                                                 struct argument_liste * help;
00813                                                 printf ("                Aktions-name: %s, Parameter: ",
00814                                                         help_umst->name ? help_umst->name : "(NULL)");
00815 
00816                                                 for (help = help_umst->argument_liste; help; help = help->next ) {
00817                                                         drucke_argument ( & help->argument);
00818                                                 }
00819 
00820                                                 printf ("\n");
00821                                         }
00822                                 }
00823                         }
00824 
00825                         break;
00826                         } /* end of switch */
00827                 }
00828         }
00829 
00830         printf ("\nHarmonien:\n");
00831 
00832         {
00833 
00834                 struct harmonie * lauf;
00835 
00836                 for (lauf=list_of_harmonien; lauf; lauf=lauf->next) {
00837                         printf ("\n");
00838                         drucke_harmonie (lauf);
00839                         printf ("\n");
00840                 }
00841         }
00842 
00843         printf ("\nLogiken:\n");
00844 
00845         {
00846 
00847                 struct logik * lauf;
00848 
00849                 for (lauf=list_of_logiken; lauf; lauf=lauf->next) {
00850 
00851                         struct anweisung * anw_lauf;
00852                         print_ausloeser (lauf->ausloeser);
00853                         printf ("\nName: %s Einstimmung : %s\n",
00854                                 lauf->name,
00855                                 lauf->einstimmungs_name ?
00856                                 lauf->einstimmungs_name :
00857                                 "(NULL)");
00858 
00859                         for (anw_lauf = lauf->anweisungsliste;
00860                                         anw_lauf;
00861                                         anw_lauf = anw_lauf -> next) {
00862                                 print_ausloeser (anw_lauf->ausloeser);
00863                                 print_aktion (anw_lauf->aktion);
00864                         }
00865                 }
00866         }
00867 
00868         printf ("\nInstrumente:\n");
00869 
00870         {
00871 
00872                 struct instrument * lauf;
00873 
00874                 for (lauf=list_of_instrumente; lauf; lauf=lauf->next) {
00875                         printf ("Instrument %d -> %d - %d\n", lauf->midi_in,
00876                                 lauf->midi_von, lauf->midi_bis);
00877                 }
00878         }
00879 
00880 
00881 #endif
00882 
00883 }
00884 
00885 /* unused
00886 
00887 static void drucke_argument (struct argument * z_or_p)
00888 {
00889     if (z_or_p -> argument_typ == zahl) {
00890       printf (" Number: %d ", z_or_p->u.zahl.zahl);
00891     }
00892     else {
00893       printf (" Parameter: %s, Nr: %d ",
00894                  z_or_p->u.parameter.parameter_name,
00895                  z_or_p->u.parameter.parameter_nummer);
00896     }
00897 }
00898 
00899 static void drucke_ton (struct ton * lauf)
00900 {
00901           printf ("Name: %s, Typ: %s:\n",
00902                    lauf->name ? lauf->name : "(NULL)",
00903                    lauf->ton_typ == ton_absolut ? "absolut" :
00904                    lauf->ton_typ == ton_komplex ? "komplex" :
00905                                               "undefined" );
00906 
00907       if (lauf->name == NULL) return;
00908 
00909           switch (lauf->ton_typ) {
00910             case ton_absolut :
00911                 printf ("%lf\n", lauf->u.ton_absolut.ton_wert);
00912                 break;
00913             case ton_komplex : {
00914                  struct komplex_intervall * help = lauf->u.ton_komplex.komplex_liste;
00915                  printf ("%s ", lauf->u.ton_komplex.bezugston);
00916                  while (help) {
00917                      printf ("Faktor: %lf %s ",
00918                              help->faktor,
00919                              help->name);
00920                      help = help->next;
00921                  }
00922                 }
00923                 break;
00924           }
00925           printf ("\n");
00926 }
00927 
00928 static void drucke_harmonie (struct harmonie * this_)
00929 {
00930     struct taste * lauf;
00931     printf ("Name : %s Bezugstaste : %d \n      ",
00932              this_->name ? this_->name : "(NULL)",
00933              this_->bezugstaste);
00934     for (lauf = this_->tastenliste; lauf; lauf = lauf -> next) {
00935         printf (" %c%d ,", lauf->stern, lauf->code);
00936     }
00937 }
00938 */
00939 /************/
00940 
00941 void print_integersequenz (struct midiliste * this_)
00942 {
00943         if (this_)
00944         {
00945                 printf (" %d ",this_->midi_code);
00946                 print_integersequenz (this_->next);
00947         }
00948 }
00949 
00950 /*
00951 static void print_ausloeser (struct ausloeser * this_)
00952 {
00953   if (this_) {
00954     switch (this_->ausloeser_typ)
00955     {
00956     default: fatal_error (0, "print_ausloeser");
00957     case ausloeser_default:
00958          printf ("ANSONSTEN\n");
00959          break;
00960     case ausloeser_harmonie:
00961          printf ("Harmonie  Vor-Taste: %d"
00962                  " Harmonie-Name: %s"
00963                  " Nach-Taste: %d \n",
00964                  this_->u.ausloeser_harmonie.vortaste,
00965                  this_->u.ausloeser_harmonie.name,
00966                  this_->u.ausloeser_harmonie.nachtaste);
00967          break;
00968     case ausloeser_harmonie_form:
00969          printf ("Harmonie FORM  Vor-Taste: %d"
00970                  " Harmonie-Name: %s"
00971                  " Nach-Taste: %d \n",
00972                  this_->u.ausloeser_harmonie_form.vortaste,
00973                  this_->u.ausloeser_harmonie_form.name,
00974                  this_->u.ausloeser_harmonie_form.nachtaste);
00975          break;
00976     case ausloeser_taste:
00977          printf ("TASTE  %s\n",
00978                  this_->u.ausloeser_taste.taste);
00979          break;
00980     case ausloeser_midi_in:
00981          printf ("MIDI-IN: ");
00982          print_integersequenz (this_->u.ausloeser_midi_in.midi_code);
00983          break;
00984     }
00985   }
00986   else
00987      printf ("Kein Ausloeser\n");
00988 }
00989 
00990 */
00991 /********
00992 static void print_aktions_liste (struct aktions_liste * this)
00993 {
00994     switch (this->aktions_typ)
00995     {
00996     case aktion_midi_out:
00997          printf ("Aktion MIDI-OUT: ");
00998          print_integersequenz (this->u.aktion_midi_out.midi_code);
00999          break;
01000     case aktion_aufruf:
01001          printf ("Aktion Aufruf: %s ", this->u.aktion_aufruf.name);
01002          print_argumentliste (this->u.aktion_aufruf.argument_liste);
01003          break;
01004     }
01005 }
01006 ***********/
01007 
01008 
01009 
01010 
01011 /********* Einleseroutine fuer die Intervalle           *********/
01012 /*         Es wird einfach eine Liste of Intervallen aufgebaut **/
01013 
01014 void get_new_intervall (const char *name, double wert)
01015 {
01016 
01017         struct intervall * * lauf;
01018 
01019         for (lauf= & list_of_intervalle; * lauf; lauf= &(*lauf)->next) {
01020                 if ( ! strcmp (name, (*lauf)->name)) {
01021                         fatal_error(10,mutC_STR(name)); /* Intervallname doppelt */
01022                 }
01023         }
01024 
01025         if (fabs (wert) < 0.001)
01026                 fatal_error (46, mutC_STR(name));
01027 
01028         (* lauf) = (intervall*) xmalloc ((size_t) sizeof (struct intervall));
01029 
01030         (* lauf) -> name = name;
01031 
01032         (* lauf) -> intervall_typ = intervall_absolut;
01033 
01034         (* lauf) -> u.intervall_absolut.intervall_wert = wert;
01035 
01036         (* lauf) -> next = NULL;
01037 
01038 }
01039 
01040 void get_new_intervall_komplex (const char *name)
01041 
01042 {
01043 
01044         struct intervall * * lauf;
01045 
01046         for (lauf= & list_of_intervalle; * lauf; lauf= &(*lauf)->next) {
01047                 if ( ! strcmp (name, (*lauf)->name)) {
01048                         fatal_error(10,mutC_STR(name)); /* Intervallname doppelt */
01049                 }
01050         }
01051 
01052         (* lauf) = (intervall*) xmalloc ((size_t) sizeof (struct intervall));
01053         (* lauf) -> name = name;
01054         (* lauf) -> intervall_typ = intervall_komplex;
01055         (* lauf) -> u.intervall_komplex.komplex_liste =
01056                 get_last_komplex_intervall ();
01057         (* lauf) -> next = NULL;
01058 
01059 }
01060 
01061 /********* Einleseroutinen fuer die Toene           *********/
01062 /*         Es wird einfach eine Liste of Toenen aufgebaut  **/
01063 /*         Je nach erkanntem Ton_Typ                       **/
01064 
01065 void get_new_ton_absolut (const char *name, double wert)
01066 {
01067 
01068         struct ton * * lauf;
01069 
01070         for (lauf= & list_of_toene; * lauf; lauf= & (*lauf)->next) {
01071                 if ( ! strcmp (name, (* lauf)->name)) {
01072                         fatal_error(11,mutC_STR(name)); /* Tonname doppelt */
01073                 }
01074         }
01075 
01076         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01077         (* lauf) -> name                   = name;
01078         (* lauf) -> ton_typ                = ton_absolut;
01079         (* lauf) -> u.ton_absolut.ton_wert = wert;
01080         (* lauf) -> next                   = NULL;
01081 
01082 }
01083 
01084 
01085 void get_new_ton_komplex_positive (const char *name, const char *bezugston)
01086 
01087 {
01088 
01089         struct ton * * lauf;
01090 
01091         for (lauf= & list_of_toene; * lauf; lauf= & (*lauf)->next) {
01092                 if ( ! strcmp (name, (*lauf)->name)) {
01093                         fatal_error(11,mutC_STR(name)); /* Tonname doppelt */
01094                 }
01095         }
01096 
01097         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01098         (* lauf) -> name                        = name;
01099         (* lauf) -> ton_typ                     = ton_komplex;
01100         (* lauf) -> u.ton_komplex.bezugston     = bezugston;
01101         (* lauf) -> u.ton_komplex.komplex_liste = get_last_komplex_intervall ();
01102         (* lauf) -> next                        = NULL;
01103 
01104 }
01105 
01106 void get_new_ton_komplex_negative (const char *name, const char *bezugston)
01107 
01108 {
01109 
01110         struct ton * * lauf;
01111 
01112         for (lauf= & list_of_toene; * lauf; lauf= & (*lauf)->next) {
01113                 if ( ! strcmp (name, (*lauf)->name)) {
01114                         fatal_error(11,mutC_STR(name)); /* Tonname doppelt */
01115                 }
01116         }
01117 
01118         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01119         (* lauf) -> name                        = name;
01120         (* lauf) -> ton_typ                     = ton_komplex;
01121         (* lauf) -> u.ton_komplex.bezugston     = bezugston;
01122 
01123         {
01124 
01125                 struct komplex_intervall * help = get_last_komplex_intervall ();
01126 
01127                 if (help == NULL) {
01128                         fatal_error (0, _T(__FILE__), __LINE__);
01129                 }
01130 
01131                 help -> faktor *= -1.0 ;
01132 
01133                 (* lauf) -> u.ton_komplex.komplex_liste = help;
01134         }
01135 
01136         (* lauf) -> next                        = NULL;
01137 
01138 }
01139 
01140 /********* Einleseroutinen fuer die Tonsysteme          *********/
01141 /*         Es wird einfach eine Liste of Tonsysteme aufgebaut  **/
01142 
01143 /* ton_liste dient zum Aufsammeln einzelner Tîne
01144    wÑhrend eines Tonsystems. Die aufgebaute Liste wird dann
01145    jeweils an das Tonsystem angehÑngt. */
01146 
01147 static struct ton * ton_liste;
01148 
01149 void init_ton_liste (void)
01150 {
01151         ton_liste = NULL;
01152 }
01153 
01154 void get_new_ton_in_tonsystem (const char *name)
01155 
01156 {
01157 
01158         struct ton * * lauf;
01159 
01160         for (lauf= & ton_liste; * lauf; lauf= & (*lauf)->next) {
01161                 /* Hier sind doppelte Tîne zulÑssig !! */
01162         }
01163 
01164         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01165         (* lauf) -> name                    = name;
01166         (* lauf) -> next                    = NULL;
01167 
01168 }
01169 
01170 void get_new_tonsystem (const char * name, int taste)
01171 
01172 {
01173 
01174         struct tonsystem * * lauf;
01175 
01176         for (lauf= & list_of_tonsysteme; * lauf; lauf= & (*lauf)->next) {
01177                 if ( ! strcmp (name, (*lauf)->name)) {
01178                         fatal_error(12,mutC_STR(name)); /* Tonsystemname doppelt */
01179                 }
01180         }
01181 
01182         (* lauf) = (struct tonsystem*) xmalloc ((size_t) sizeof (struct tonsystem));
01183         (* lauf) -> name          = name;
01184         (* lauf) -> taste         = taste;
01185         (* lauf) -> periode       = get_last_komplex_intervall ();
01186         (* lauf) -> toene         = ton_liste;
01187         (* lauf) -> next          = NULL;
01188 
01189 }
01190 
01191 void get_new_tonsystem_negative (const char * name, int taste)
01192 
01193 {
01194 
01195         struct tonsystem * * lauf;
01196 
01197         for (lauf= & list_of_tonsysteme; * lauf; lauf= & (*lauf)->next) {
01198                 if ( ! strcmp (name, (*lauf)->name)) {
01199                         fatal_error(12,mutC_STR(name)); /* Tonsystemname doppelt */
01200                 }
01201         }
01202 
01203         (* lauf) = (struct tonsystem*) xmalloc ((size_t) sizeof (struct tonsystem));
01204         (* lauf) -> name          = name;
01205         (* lauf) -> taste         = taste;
01206         {
01207 
01208                 struct komplex_intervall * help = get_last_komplex_intervall ();
01209 
01210                 if (help == NULL)
01211                         fatal_error (0, _T(__FILE__), __LINE__);
01212 
01213                 help -> faktor *= -1.0 ;
01214 
01215                 (* lauf) -> periode = help;
01216         }
01217 
01218         (* lauf) -> toene         = ton_liste;
01219         (* lauf) -> next          = NULL;
01220 
01221 }
01222 
01223 
01224 /********* Einleseroutinen fuer Umstimmungen            *********/
01225 /*         Es wird erst eine leere Umstimmung eingerichtet,    **/
01226 /*            init_umstimmung (name);                          **/
01227 /*         in die dann die Varianten eingetragen werden.       **/
01228 /*         Zuletzt wird diese Umstimmung in die Liste          **/
01229 /*         eingehÑngt.                                                        **/
01230 /*            get_new_umstimmung ();                           **/
01231 
01232 static struct umstimmung * tmp_umstimmung;
01233 
01234 void init_umstimmung (const char * name)
01235 {
01236 
01237         struct umstimmung * lauf;
01238 
01239         for (lauf= list_of_umstimmungen; lauf; lauf= lauf -> next) {
01240                 if ( ! strcmp (name, lauf -> name)) {
01241                         fatal_error(13,mutC_STR(name)); /* Umstimmungsname doppelt */
01242                 }
01243         }
01244 
01245         tmp_umstimmung = (umstimmung*) xmalloc ((size_t) sizeof (struct umstimmung));
01246 
01247         tmp_umstimmung -> name            = name;
01248         tmp_umstimmung -> parameter_liste = NULL;
01249         tmp_umstimmung -> next            = NULL;
01250 }
01251 
01252 void get_new_umstimmung (void)
01253 
01254 {
01255 
01256         struct umstimmung * * lauf;
01257 
01258         for (lauf= & list_of_umstimmungen; * lauf; lauf= & (*lauf)->next) {}
01259 
01260         (* lauf) = tmp_umstimmung;
01261 }
01262 
01263 void eintrage_parameterliste_in_umstimmung (void)
01264 {
01265         tmp_umstimmung -> parameter_liste = get_last_parameter_liste ();
01266 }
01267 
01268 
01269 
01270 /************ Die folgenden Funktionen tragen je eine         */
01271 /*            Version von Umstimmung ein.                     */
01272 /*            Genau eine dieser Funktionen wird zwischen      */
01273 /*            init_umstimmung ()                              */
01274 /*            und                                             */
01275 /*            get_new_umstimmung (name)                       */
01276 /*            aufgerufen.                                     */
01277 
01278 void get_umstimmung_taste_abs (
01279         enum argument_typ argument,
01280 
01281         double zahl_wert, const char * parameter)
01282 {
01283         tmp_umstimmung -> umstimmung_typ = umstimmung_taste_abs;
01284         tmp_umstimmung -> u.umstimmung_taste_abs.
01285         argument.argument_typ
01286         = argument;
01287 
01288         if (argument == zahl) {
01289                 tmp_umstimmung -> u.umstimmung_taste_abs.
01290                 argument.u.zahl.zahl = (int) zahl_wert;
01291         } else {
01292                 int i = parameter_nummer (0, parameter,
01293                                           tmp_umstimmung->parameter_liste);
01294 
01295                 if (i == EOF) {
01296                         fatal_error(31,
01297                                     mutC_STR(parameter),
01298                                     mutC_STR(tmp_umstimmung->name)); /* Parameter n.dekl. */
01299                 }
01300 
01301                 tmp_umstimmung -> u.umstimmung_taste_abs.
01302 
01303                 argument.u.parameter.
01304                 parameter_nummer = i;
01305                 tmp_umstimmung -> u.umstimmung_taste_abs.
01306                 argument.u.parameter.
01307                 parameter_name = parameter;
01308         }
01309 }
01310 
01311 void get_umstimmung_taste_rel (
01312 
01313         enum argument_typ argument,
01314 
01315         double zahl_wert, const char * parameter, char vorzeichen)
01316 {
01317         tmp_umstimmung -> umstimmung_typ = umstimmung_taste_rel;
01318         tmp_umstimmung -> u.umstimmung_taste_rel.
01319         argument.argument_typ
01320         = argument;
01321 
01322         if (argument == zahl) {
01323                 tmp_umstimmung -> u.umstimmung_taste_rel.
01324                 argument.u.zahl.zahl = (int) zahl_wert;
01325         } else {
01326                 int i = parameter_nummer (0, parameter,
01327                                           tmp_umstimmung->parameter_liste);
01328 
01329                 if (i == EOF) {
01330                         fatal_error(31,
01331                                     mutC_STR(parameter),
01332                                     mutC_STR(tmp_umstimmung -> name)); /* Parameter n.dekl. */
01333                 }
01334 
01335                 tmp_umstimmung -> u.umstimmung_taste_rel.
01336 
01337                 argument.u.parameter.
01338                 parameter_nummer = i;
01339                 tmp_umstimmung -> u.umstimmung_taste_rel.
01340                 argument.u.parameter.
01341                 parameter_name = parameter;
01342         }
01343 
01344         tmp_umstimmung -> u.umstimmung_taste_rel.rechenzeichen
01345 
01346         = vorzeichen;
01347 }
01348 
01349 void get_umstimmung_breite_abs (
01350 
01351         enum argument_typ argument,
01352 
01353         double zahl_wert, const char * parameter)
01354 {
01355         tmp_umstimmung -> umstimmung_typ = umstimmung_breite_abs;
01356         tmp_umstimmung -> u.umstimmung_breite_abs.
01357         argument.argument_typ
01358         = argument;
01359 
01360         if (argument == zahl) {
01361                 tmp_umstimmung -> u.umstimmung_breite_abs.
01362                 argument.u.zahl.zahl = (int) zahl_wert;
01363         } else {
01364                 int i = parameter_nummer (0, parameter,
01365                                           tmp_umstimmung->parameter_liste);
01366 
01367                 if (i == EOF) {
01368                         fatal_error(31,
01369                                     mutC_STR(parameter),
01370                                     mutC_STR(tmp_umstimmung->name)); /* Parameter n.dekl. */
01371                 }
01372 
01373                 tmp_umstimmung -> u.umstimmung_breite_abs.
01374 
01375                 argument.u.parameter.
01376                 parameter_nummer = i;
01377                 tmp_umstimmung -> u.umstimmung_breite_abs.
01378                 argument.u.parameter.
01379                 parameter_name = parameter;
01380         }
01381 }
01382 
01383 void get_umstimmung_breite_rel (
01384 
01385         enum argument_typ argument,
01386 
01387         double zahl_wert, const char * parameter, char vorzeichen)
01388 {
01389         tmp_umstimmung -> umstimmung_typ = umstimmung_breite_rel;
01390         tmp_umstimmung -> u.umstimmung_breite_rel.
01391         argument.argument_typ
01392         = argument;
01393 
01394         if (argument == zahl) {
01395                 tmp_umstimmung -> u.umstimmung_breite_rel.
01396                 argument.u.zahl.zahl = (int) zahl_wert;
01397         } else {
01398                 int i = parameter_nummer (0, parameter,
01399                                           tmp_umstimmung->parameter_liste);
01400 
01401                 if (i == EOF) {
01402                         fatal_error(31,
01403                                     mutC_STR(parameter),
01404                                     mutC_STR(tmp_umstimmung->name)); /* Parameter n.dekl. */
01405                 }
01406 
01407                 tmp_umstimmung -> u.umstimmung_breite_rel.
01408 
01409                 argument.u.parameter.
01410                 parameter_nummer = i;
01411                 tmp_umstimmung -> u.umstimmung_breite_rel.
01412                 argument.u.parameter.
01413                 parameter_name = parameter;
01414         }
01415 
01416         tmp_umstimmung -> u.umstimmung_breite_rel.rechenzeichen
01417 
01418         = vorzeichen;
01419 }
01420 
01421 /*********** Bei "tonhîhe verÑndert" muû wieder die gesamte
01422              expression eines Tons pro Listeneintrag
01423              aufgesammelt werden.
01424 ********/
01425 
01426 static struct ton * tmp_tonliste;
01427 
01428 void init_umstimm_expression_list (void)
01429 {
01430         tmp_tonliste = NULL;
01431 }
01432 
01433 void get_new_umstimm_expression (const char * bezugston)
01434 
01435 {
01436 
01437         struct ton * * lauf;
01438 
01439         for (lauf= & tmp_tonliste; * lauf; lauf= & (*lauf)->next)
01440                 /* Nur Ende der Liste finden */ ;
01441 
01442         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01443 
01444         (* lauf) -> name                    = bezugston;
01445 
01446         (* lauf) -> ton_typ                 = ton_komplex;
01447 
01448         (* lauf) -> u.ton_komplex.bezugston = bezugston;
01449 
01450         (* lauf) -> u.ton_komplex.komplex_liste = NULL;
01451 
01452         (* lauf) -> next                    = NULL;
01453 
01454 }
01455 
01456 
01457 void get_new_umstimm_expression_positive (const char * bezugston)
01458 
01459 {
01460 
01461         struct ton * * lauf;
01462 
01463         for (lauf= & tmp_tonliste; * lauf; lauf= & (*lauf)->next)
01464                 /* Nur Ende der Liste finden */ ;
01465 
01466         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01467 
01468         (* lauf) -> name                    = bezugston;
01469 
01470         (* lauf) -> ton_typ                 = ton_komplex;
01471 
01472         (* lauf) -> u.ton_komplex.bezugston = bezugston;
01473 
01474         (* lauf) -> u.ton_komplex.komplex_liste = get_last_komplex_intervall ();
01475 
01476         (* lauf) -> next                    = NULL;
01477 
01478 }
01479 
01480 
01481 void get_new_umstimm_expression_negative (const char * bezugston)
01482 
01483 {
01484 
01485         struct ton * * lauf;
01486 
01487         for (lauf= & tmp_tonliste; * lauf; lauf= & (*lauf)->next)
01488                 /* Nur Ende der Liste finden */ ;
01489 
01490         (* lauf) = (ton*) xmalloc ((size_t) sizeof (struct ton));
01491 
01492         (* lauf) -> name                    = bezugston;
01493 
01494         (* lauf) -> ton_typ                 = ton_komplex;
01495 
01496         (* lauf) -> u.ton_komplex.bezugston = bezugston;
01497 
01498         {
01499 
01500                 struct komplex_intervall * help = get_last_komplex_intervall ();
01501                 help->faktor *= -1.0;
01502                 (* lauf) -> u.ton_komplex.komplex_liste = help;
01503         }
01504 
01505         (* lauf) -> next                    = NULL;
01506 
01507 }
01508 
01509 
01510 void get_umstimmung_tonhoehe_veraendert (void)
01511 
01512 {
01513         tmp_umstimmung -> umstimmung_typ = umstimmung_toene_veraendert;
01514         tmp_umstimmung -> u.umstimmung_toene_veraendert.tonliste
01515         = tmp_tonliste;
01516 }
01517 
01518 void get_umstimmung_wiederholung_abs (void)
01519 {
01520         tmp_umstimmung -> umstimmung_typ = umstimmung_wiederholung_abs;
01521         tmp_umstimmung -> u.umstimmung_wiederholung_abs.komplex_liste
01522         = get_last_komplex_intervall ();
01523 }
01524 
01525 void get_umstimmung_wiederholung_abs_negative (void)
01526 {
01527         tmp_umstimmung -> umstimmung_typ = umstimmung_wiederholung_abs;
01528         {
01529 
01530                 struct komplex_intervall * help = get_last_komplex_intervall ();
01531 
01532                 if (help == NULL)
01533                         fatal_error (0, _T(__FILE__), __LINE__);
01534 
01535                 help -> faktor *= -1.0;
01536 
01537                 tmp_umstimmung ->
01538                 u.umstimmung_wiederholung_abs.komplex_liste = help;
01539         }
01540 }
01541 
01542 
01543 void get_umstimmung_wiederholung_rel_positive (void)
01544 {
01545         tmp_umstimmung -> umstimmung_typ = umstimmung_wiederholung_rel;
01546         tmp_umstimmung -> u.umstimmung_wiederholung_rel.
01547         komplex_liste = get_last_komplex_intervall ();
01548 }
01549 
01550 void get_umstimmung_wiederholung_rel_negative (void)
01551 {
01552         tmp_umstimmung -> umstimmung_typ = umstimmung_wiederholung_rel;
01553         tmp_umstimmung -> u.umstimmung_wiederholung_rel.
01554         komplex_liste = get_last_komplex_intervall ();
01555 
01556         tmp_umstimmung -> u.umstimmung_wiederholung_rel.
01557         komplex_liste -> faktor      *= - 1.0 ;
01558 }
01559 
01560 /*********** Bei "umstimmungsbund" muû wieder eine Liste von
01561              Aufrufen (mit evtl. Parametern)
01562              aufgesammelt werden.
01563 ********/
01564 
01565 /*
01566 void init_aufruf_liste (void)
01567 {
01568     tmp_aufruf_liste = NULL;
01569 }
01570 */
01571 #if 0
01572 
01573 void get_umstimmungs_bund_element (const char * name)
01574 {
01575 
01576         struct umstimmung * * lauf;
01577 
01578         for (lauf= & tmp_umstimmungsbund_liste;
01579                         * lauf;
01580                         lauf= & (*lauf)->next)
01581                 /* Nur Ende der Liste finden */ ;
01582 
01583         (* lauf) = xmalloc (sizeof (struct umstimmung));
01584 
01585         (* lauf) -> name                = name;
01586 
01587         (* lauf) -> parameterliste      = get_last_parameter_liste ();
01588 
01589         (* lauf) -> next                = NULL;
01590 
01591         /* check, ob die Parameter zulÑssig sind */
01592 
01593         {
01594 
01595                 struct namensliste * params;
01596 
01597                 for (params = (* lauf) -> parameterliste;
01598                                 params;
01599                                 params = params -> next ) {
01600                         if (parameter_nummer (0,params->name,
01601                                               tmp_umstimmung -> parameterliste)  == EOF ) {
01602                                 fatal_error(31,mutC_STR(params->name),mutC_STR((*lauf)->name)); /* Parameter n.dekl. */
01603                         }
01604                 }
01605         }
01606 
01607 }
01608 
01609 #endif
01610 
01611 void get_umstimmung_umstimmungs_bund (void)
01612 {
01613         tmp_umstimmung -> umstimmung_typ = umstimmung_umstimmungsbund;
01614         tmp_umstimmung -> u.umstimmung_umstimmungsbund
01615         .aktions_liste = get_last_aktions_liste ();
01616 
01617 
01618         /* check, ob die Parameter zulÑssig sind */
01619 
01620         {
01621 
01622                 struct aktions_liste * aktions_lauf;
01623 
01624                 for (aktions_lauf = tmp_umstimmung -> u.umstimmung_umstimmungsbund.aktions_liste;
01625                                 aktions_lauf;
01626                                 aktions_lauf = aktions_lauf -> next) {
01627 
01628                         if (aktions_lauf -> aktions_typ == aktion_aufruf) {
01629 
01630                                 struct argument_liste * argument_lauf;
01631 
01632                                 for (argument_lauf = aktions_lauf -> u.aktion_aufruf.argument_liste;
01633                                                 argument_lauf;
01634                                                 argument_lauf = argument_lauf -> next ) {
01635                                         if (argument_lauf -> argument.argument_typ == parameter) {
01636                                                 int i = parameter_nummer (0,
01637                                                                           argument_lauf->argument.u.parameter.parameter_name,
01638                                                                           tmp_umstimmung -> parameter_liste);
01639 
01640                                                 if (i == EOF ) {
01641                                                         fatal_error(31,
01642                                                                     mutC_STR(argument_lauf->argument.u.parameter.parameter_name),
01643                                                                     mutC_STR(tmp_umstimmung -> name)); /* Parameter n.dekl. */
01644                                                 } else {
01645                                                         argument_lauf->argument.u.parameter.parameter_nummer = i;
01646                                                 } /* if */
01647                                         } /* if */
01648                                 }  /* for argument_lauf */
01649                         }  /* if (aktions_lauf... */
01650                 }  /* for aktions_lauf */
01651         }
01652 
01653 
01654 
01655 }
01656 
01657 
01658 /***********************************
01659       case Umstimmungen:
01660 ***********************************/
01661 
01662 
01663 static struct case_liste * tmp_umstimmungs_case_liste;
01664 
01665 
01666 #if 0
01667 
01668 static struct aufruf_liste * tmp_umstimmungs_case_aufrufs_liste;
01669 
01670 
01671 void init_umstimmungs_case_aufrufs_liste (void)
01672 {
01673         tmp_umstimmungs_case_aufrufs_liste = NULL;
01674 }
01675 
01676 static struct umstimmung * get_last_umstimmungs_case_aufrufs_liste (void)
01677 {
01678         return tmp_umstimmungs_case_aufrufs_liste;
01679 }
01680 
01681 
01682 void get_umstimmungs_case_aufrufs_element (const char * aktion)
01683 
01684 {
01685 
01686         struct aufruf_liste * * lauf;
01687 
01688         for (lauf= & tmp_umstimmungs_case_aufrufs_liste;
01689                         * lauf;
01690                         lauf= & (*lauf)->next)
01691                 /* Nur Ende der Liste finden */ ;
01692 
01693         (* lauf) = xmalloc (sizeof (struct aufruf_liste));
01694 
01695         (* lauf) -> name                = aktion;
01696 
01697         (* lauf) -> argument_liste      = get_last_argument_liste ();
01698 
01699         (* lauf) -> next                = NULL;
01700 
01701         /* check, ob die Parameter zulÑssig sind */
01702 
01703         {
01704 
01705                 struct argument_liste * params;
01706 
01707                 for (params = (* lauf) -> argument_liste;
01708                                 params;
01709                                 params = params -> next ) {
01710                         if (params -> argument.argument_typ == parameter) {
01711                                 if (parameter_nummer (0,params->argument.u.parameter.parameter_name,
01712                                                       tmp_umstimmung -> parameter_liste)  == EOF ) {
01713                                         fatal_error(31,
01714                                                     mutC_STR(params->argument.u.parameter.parameter_name),
01715                                                     mutC_STR((*lauf)->name)); /* Parameter n.dekl. */
01716                                 }
01717                         }
01718                 }
01719         }
01720 
01721 }
01722 
01723 #endif
01724 
01725 void get_umstimmungs_case_zahl_element (int konstante)
01726 {
01727 
01728         struct case_liste * * lauf;
01729 
01730         for (lauf= & tmp_umstimmungs_case_liste;
01731                         * lauf;
01732                         lauf= & (*lauf)->next)
01733                 /* Nur Ende der Liste finden */ ;
01734 
01735         (* lauf) = (case_liste*) xmalloc (sizeof (struct case_liste));
01736 
01737         (* lauf) -> case_label          = konstante;
01738 
01739         (* lauf) -> is_default          = 0;
01740 
01741         (* lauf) -> case_aktion         = get_last_aktions_liste ();
01742 
01743         (* lauf) -> next                = NULL;
01744 }
01745 
01746 void get_umstimmungs_case_default_element (void)
01747 
01748 {
01749 
01750         struct case_liste * * lauf;
01751 
01752         for (lauf= & tmp_umstimmungs_case_liste;
01753                         * lauf;
01754                         lauf= & (*lauf)->next)
01755                 /* Nur Ende der Liste finden */ ;
01756 
01757         (* lauf) = (case_liste*) xmalloc (sizeof (struct case_liste));
01758 
01759         (* lauf) -> case_label          = -1000000; /* als dummy-wert */
01760 
01761         (* lauf) -> is_default          = 1;
01762 
01763         (* lauf) -> case_aktion         = get_last_aktions_liste ();
01764 
01765         (* lauf) -> next                = NULL;
01766 }
01767 
01768 
01769 
01770 void init_umstimmungs_case_liste (void)
01771 {
01772         tmp_umstimmungs_case_liste = NULL;
01773 }
01774 
01775 void get_umstimmung_umstimm_case_zahl (int selector)
01776 {
01777         tmp_umstimmung -> umstimmung_typ = umstimmung_umstimmungs_case;
01778         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01779         .argument
01780         .argument_typ = zahl;
01781         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01782         .argument
01783         .u.zahl.zahl = selector;
01784         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01785         .umstimmungs_case_liste = tmp_umstimmungs_case_liste;
01786 
01787 
01788         /* check, ob die Parameter zulÑssig sind */
01789 
01790         {
01791 
01792                 struct case_liste * case_lauf;
01793 
01794                 for (case_lauf = tmp_umstimmung -> u.umstimmung_umstimmungs_case
01795                                  .umstimmungs_case_liste ;
01796                                 case_lauf;
01797                                 case_lauf = case_lauf -> next) {
01798 
01799                         struct aktions_liste * aktions_lauf;
01800 
01801                         for (aktions_lauf = case_lauf -> case_aktion;
01802                                         aktions_lauf;
01803                                         aktions_lauf = aktions_lauf -> next) {
01804 
01805                                 if (aktions_lauf -> aktions_typ == aktion_aufruf) {
01806 
01807                                         struct argument_liste * argument_lauf;
01808 
01809                                         for (argument_lauf = aktions_lauf -> u.aktion_aufruf.argument_liste;
01810                                                         argument_lauf;
01811                                                         argument_lauf = argument_lauf -> next ) {
01812                                                 if (argument_lauf -> argument.argument_typ == parameter) {
01813                                                         int i = parameter_nummer (0,
01814                                                                                   argument_lauf->argument.u.parameter.parameter_name,
01815                                                                                   tmp_umstimmung -> parameter_liste);
01816 
01817                                                         if (i == EOF ) {
01818                                                                 fatal_error(31,
01819                                                                             mutC_STR(argument_lauf->argument.u.parameter.parameter_name),
01820                                                                             mutC_STR(tmp_umstimmung -> name)); /* Parameter n.dekl. */
01821                                                         } else {
01822                                                                 argument_lauf->argument.u.parameter.parameter_nummer = i;
01823                                                         } /* if */
01824                                                 } /* if */
01825                                         }  /* for argument_lauf */
01826                                 } /* if (aktions_lauf ... */
01827                         }  /* for aktions_lauf */
01828                 }  /* for case_lauf */
01829         }
01830 
01831 
01832 }
01833 
01834 
01835 void get_umstimmung_umstimm_case_parameter (const char * selector)
01836 {
01837         tmp_umstimmung -> umstimmung_typ = umstimmung_umstimmungs_case;
01838         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01839         .argument
01840         .argument_typ = parameter;
01841         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01842         .argument
01843         .u.parameter.parameter_name = selector;
01844 
01845         /* und test, ob selector als Parameter deklariert ist. */
01846 
01847         {
01848                 int i = parameter_nummer (0,selector, tmp_umstimmung -> parameter_liste);
01849 
01850                 if (i == EOF ) {
01851                         fatal_error(31,
01852                                     mutC_STR(selector),
01853                                     mutC_STR(tmp_umstimmung->name)); /* Parameter n.dekl. */
01854                 } else {
01855                         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01856                         .argument
01857                         .u.parameter.parameter_nummer = i;
01858 
01859                 }
01860         }
01861 
01862         tmp_umstimmung -> u.umstimmung_umstimmungs_case
01863         .umstimmungs_case_liste = tmp_umstimmungs_case_liste;
01864 
01865 
01866 
01867         /* check, ob die Parameter zulÑssig sind */
01868 
01869         {
01870 
01871                 struct case_liste * case_lauf;
01872 
01873                 for (case_lauf = tmp_umstimmung -> u.umstimmung_umstimmungs_case
01874                                  .umstimmungs_case_liste ;
01875                                 case_lauf;
01876                                 case_lauf = case_lauf -> next) {
01877 
01878                         struct aktions_liste * aktions_lauf;
01879 
01880                         for (aktions_lauf = case_lauf -> case_aktion;
01881                                         aktions_lauf;
01882                                         aktions_lauf = aktions_lauf -> next) {
01883 
01884                                 if (aktions_lauf -> aktions_typ == aktion_aufruf) {
01885 
01886                                         struct argument_liste * argument_lauf;
01887 
01888                                         for (argument_lauf = aktions_lauf -> u.aktion_aufruf.argument_liste;
01889                                                         argument_lauf;
01890                                                         argument_lauf = argument_lauf -> next ) {
01891                                                 if (argument_lauf -> argument.argument_typ == parameter) {
01892                                                         int i = parameter_nummer (0,
01893                                                                                   argument_lauf->argument.u.parameter.parameter_name,
01894                                                                                   tmp_umstimmung -> parameter_liste);
01895 
01896                                                         if (i == EOF ) {
01897                                                                 fatal_error(31,
01898                                                                             mutC_STR(argument_lauf->argument.u.parameter.parameter_name),
01899                                                                             mutC_STR(tmp_umstimmung -> name)); /* Parameter n.dekl. */
01900                                                         } else {
01901                                                                 argument_lauf->argument.u.parameter.parameter_nummer = i;
01902                                                         } /* if */
01903                                                 } /* if */
01904                                         }  /* for argument_lauf */
01905                                 } /* if (aktions_lauf .. */
01906                         }  /* for aktions_lauf */
01907                 }  /* for case_lauf */
01908         }
01909 
01910 
01911 
01912 }
01913 
01914 
01915 void get_umstimmung_midi_out (void)
01916 
01917 {
01918         tmp_umstimmung -> umstimmung_typ = umstimmung_midi_out;
01919         tmp_umstimmung -> u.umstimmung_midi_out.out_liste
01920         = get_last_integersequenz ();
01921 }
01922 
01923 
01924 
01925 
01926 /******* Einlesen der Harmonien. Pro Harmonie wird eine
01927          Liste von Tasten festgehalten.
01928 *******/
01929 
01930 static struct taste * tmp_tastenliste;
01931 
01932 void init_tastenliste (void)
01933 {
01934         tmp_tastenliste = NULL;
01935 }
01936 
01937 void get_new_taste (int taste, char stern)
01938 
01939 {
01940 
01941         struct taste * * lauf;
01942 
01943         for (lauf= & tmp_tastenliste; * lauf; lauf= & (*lauf)->next)
01944                 /* Nur Ende der Liste finden */ ;
01945 
01946         (* lauf) = (struct taste*) xmalloc (sizeof (struct taste));
01947 
01948         (* lauf) -> code               = taste;
01949 
01950         (* lauf) -> stern               = stern;
01951 
01952         (* lauf) -> next                = NULL;
01953 
01954 }
01955 
01956 void get_new_harmonie (const char * name, int bezugstaste)
01957 {
01958 
01959         struct harmonie * * lauf;
01960 
01961         for (lauf= & list_of_harmonien; * lauf; lauf= & (*lauf)->next) {
01962                 if ( ! strcmp (name, (*lauf)->name)) {
01963                         fatal_error(14, mutC_STR(name)); /* Harmoniename doppelt */
01964                 }
01965         }
01966 
01967         (* lauf) = (harmonie*) xmalloc (sizeof (struct harmonie));
01968         (* lauf) -> name                = name;
01969         (* lauf) -> tastenliste         = tmp_tastenliste;
01970         (* lauf) -> bezugstaste         = bezugstaste;
01971         (* lauf) -> next                = NULL;
01972 
01973 }
01974 
01975 /******* Einlesen der Logiken. Pro Logik wird eine
01976          Liste von Anweisungen festgehalten.
01977 *******/
01978 
01979 
01980 #if 0
01981 
01982 static struct aktion * tmp_aktion;
01983 
01984 struct aktion * get_last_aktion (void)
01985 {
01986         return tmp_aktion;
01987 }
01988 
01989 void get_aktion_midi_out (void)
01990 
01991 {
01992 
01993         tmp_aktion = xmalloc (sizeof (struct aktion));
01994         tmp_aktion -> aktions_typ = aktion_midi_out;
01995         tmp_aktion -> u.aktion_midi_out.midi_code   = get_last_integersequenz ();
01996 }
01997 
01998 void get_aktion_aufruf (const char * name)
01999 {
02000 
02001         tmp_aktion = xmalloc (sizeof (struct aktion));
02002         tmp_aktion -> aktions_typ = aktion_aufruf;
02003         tmp_aktion -> u.aktion_aufruf.name        = name;
02004         tmp_aktion -> u.aktion_aufruf.argument_liste
02005         = get_last_argument_liste ();
02006 }
02007 
02008 
02009 #endif
02010 
02011 
02012 
02013 static int        tmp_vor_taste;
02014 
02015 static const char *     tmp_name;
02016 
02017 static int        tmp_nach_taste;
02018 
02019 void get_harmoniebezeichner (int vor_taste,
02020                              const char * name,
02021                              int nach_taste)
02022 {
02023         tmp_vor_taste   = vor_taste;
02024         tmp_name        = name;
02025         tmp_nach_taste  = nach_taste;
02026 }
02027 
02028 static struct ausloeser * tmp_ausloeser;
02029 
02030 void init_ausloeser (void)
02031 {
02032         tmp_ausloeser = NULL;
02033 }
02034 
02035 struct ausloeser * get_last_ausloeser (void)
02036 {
02037         return tmp_ausloeser;
02038 }
02039 
02040 void get_ausloeser_default (void)
02041 
02042 {
02043 
02044         tmp_ausloeser = (ausloeser*) xmalloc (sizeof (struct ausloeser));
02045         tmp_ausloeser -> ausloeser_typ = ausloeser_default;
02046 }
02047 
02048 void get_ausloeser_harmonie (void)
02049 {
02050 
02051         tmp_ausloeser = (ausloeser*) xmalloc (sizeof (struct ausloeser));
02052         tmp_ausloeser -> ausloeser_typ = ausloeser_harmonie;
02053         tmp_ausloeser -> u.ausloeser_harmonie.vortaste  = tmp_vor_taste;
02054         tmp_ausloeser -> u.ausloeser_harmonie.name      = tmp_name;
02055         tmp_ausloeser -> u.ausloeser_harmonie.nachtaste = tmp_nach_taste;
02056 }
02057 
02058 void get_ausloeser_harmonie_form (void)
02059 {
02060 
02061         tmp_ausloeser = (ausloeser*) xmalloc (sizeof (struct ausloeser));
02062         tmp_ausloeser -> ausloeser_typ = ausloeser_harmonie_form;
02063         tmp_ausloeser -> u.ausloeser_harmonie_form.vortaste  = tmp_vor_taste;
02064         tmp_ausloeser -> u.ausloeser_harmonie_form.name      = tmp_name;
02065         tmp_ausloeser -> u.ausloeser_harmonie_form.nachtaste = tmp_nach_taste;
02066 }
02067 
02068 void get_ausloeser_taste (const char * name)
02069 {
02070 
02071         tmp_ausloeser = (ausloeser*) xmalloc (sizeof (struct ausloeser));
02072         tmp_ausloeser -> ausloeser_typ = ausloeser_taste;
02073         tmp_ausloeser -> u.ausloeser_taste.taste  = name;
02074 
02075         if (strlen (name) != 1) {
02076                 fatal_error (52, mutC_STR(name));
02077         }
02078 
02079 }
02080 
02081 void get_ausloeser_midi_in (void)
02082 
02083 {
02084 
02085         tmp_ausloeser = (ausloeser*) xmalloc (sizeof (struct ausloeser));
02086         tmp_ausloeser -> ausloeser_typ = ausloeser_midi_in;
02087         tmp_ausloeser -> u.ausloeser_midi_in.midi_code
02088         = get_last_integersequenz ();
02089 }
02090 
02091 
02092 
02093 
02094 
02095 
02096 
02097 
02098 static struct anweisung * tmp_anweisungsliste;
02099 
02100 void init_anweisungs_liste (void)
02101 {
02102         tmp_anweisungsliste = NULL;
02103 }
02104 
02105 struct anweisung * get_last_anweisungs_liste (void)
02106 {
02107         return tmp_anweisungsliste ;
02108 }
02109 
02110 void get_new_anweisung (void)
02111 
02112 {
02113 
02114         struct anweisung * * lauf;
02115 
02116         for (lauf= & tmp_anweisungsliste; * lauf; lauf= & (*lauf)->next)
02117                 /* Nur Ende der Liste finden */ ;
02118 
02119         (* lauf) = (anweisung*) xmalloc (sizeof (struct anweisung));
02120 
02121         (* lauf) -> ausloeser   = get_last_ausloeser ();
02122 
02123         (* lauf) -> aktion      = get_last_aktions_liste ();
02124 
02125         (* lauf) -> next        = NULL;
02126 
02127 }
02128 
02129 void get_new_logik (const char * name, const char * einstimmung)
02130 {
02131 
02132         struct logik * * lauf;
02133 
02134         for (lauf= & list_of_logiken; * lauf; lauf= & (*lauf)->next) {
02135                 if ( ! strcmp (name, (*lauf)->name)) {
02136                         fatal_error(15, mutC_STR(name)); /* Logikname doppelt */
02137                 }
02138         }
02139 
02140         (* lauf) = (logik*) xmalloc (sizeof (struct logik));
02141         (* lauf) -> name                = name;
02142         (* lauf) -> ausloeser           = get_last_ausloeser ();
02143         (* lauf) -> einstimmungs_name   = einstimmung;
02144         (* lauf) -> anweisungsliste     = NULL;
02145         (* lauf) -> next                = NULL;
02146 
02147 }
02148 
02149 void vervollstaendige_logik (void)
02150 
02151 {
02152 
02153         struct logik * lauf;
02154 
02155         for (lauf = list_of_logiken; lauf -> next; lauf = lauf->next) {}
02156 
02157         lauf -> anweisungsliste     = get_last_anweisungs_liste ();
02158 }
02159 
02160 /******* Einlesen der Instrumente *******/
02161 
02162 void get_instrument_dekl (int midi_in, int midi_von, int midi_bis, int midi_umleit,
02163 
02164                           struct instrument ** list_to_insert)
02165 {
02166         int temp;
02167 
02168         //for (list_to_insert = & list_of_instrumente;
02169 
02170         for (;
02171                         * list_to_insert;
02172                         list_to_insert = & (*list_to_insert)->next)
02173         {
02174                 if ( midi_in == (*list_to_insert)->midi_in) {
02175                         fatal_error(18, midi_in); /* MIDI-Instrument doppelt */
02176                 }
02177         }
02178 
02179         if ( midi_von > midi_bis )
02180         {
02181                 temp=midi_von;       /* Vertauschen der Reihenfolge */
02182                 midi_von=midi_bis;
02183                 midi_bis=temp;
02184 
02185         }
02186 
02187         if ( (midi_in < 1) || (midi_in > 16) )
02188         {
02189                 fatal_error(45);
02190         }
02191 
02192         if ( midi_von && midi_bis )
02193         {
02194                 if ( (midi_von < 1) || (midi_von > 16) )
02195                         fatal_error(45);
02196 
02197                 if ( (midi_bis < 1) || (midi_bis > 16) )
02198                         fatal_error(45);
02199         }
02200 
02201         if ( (midi_umleit < 0) || (midi_umleit > 16) )
02202         {
02203                 fatal_error(45);
02204         }
02205 
02206 
02207         (* list_to_insert) = (instrument*) xmalloc (sizeof (struct instrument));
02208         (* list_to_insert) -> midi_in             = midi_in;
02209         (* list_to_insert) -> midi_von            = midi_von;
02210         (* list_to_insert) -> midi_bis            = midi_bis;
02211         (* list_to_insert) -> midi_umleit         = midi_umleit;
02212         (* list_to_insert) -> next                = NULL;
02213 
02214 }
02215 
02216 
02217 
02218 
02219 /**************************************************************
02220 
02221             Hier werden die Toene aufgelîst.
02222             Nach dem Parsing ist nur die Syntax-Struktur
02223             vorhanden, aber keine fertig ausgerechneten Toene.
02224 
02225             Es wird ein azyklischer Graph der Toene und ihrer
02226             Untertoene gebildet, der dann nach den
02227             depth-first-search traversiert wird.
02228             Dabei bekommt jeder Ton seine Absolutfrequenz berechnet.
02229 
02230 ****************************************************************/
02231 
02232 static int anzahl_toene;       /* so viele Toene wurden gelesen */
02233 
02234 static struct ton ** toene;    /* Feld von Toenen zum schnelleren Zugriff
02235 
02236                                   als ueber Listen */
02237 
02238 static char * visited;         /* Traversierungsmerker */
02239 
02240 static char * matrix;          /* Adjazenzmatrix (auf sie darf nur ueber
02241 
02242                                   das folgende Makro zugegriffen werden !*/
02243 
02244 #define adjazent(a,b) matrix [ (a) * anzahl_toene * sizeof (char) \
02245                              + (b) * sizeof (char)]
02246 
02247 
02248 
02249 static void belege_toene (struct ton **toene, struct ton * liste)
02250 {
02251         while (liste)
02252         {
02253                 *toene = liste;
02254                 toene++;
02255                 liste = liste->next;
02256         }
02257 }
02258 
02259 static int ton_nummer (const char *name)
02260 {
02261         int i;
02262 
02263         for (i=0; i<anzahl_toene; i++)
02264                 if ( ! strcmp (name, toene[i]->name)) return i;
02265 
02266         fatal_error(27, mutC_STR(name)); /* Ton n.dekl. */
02267 
02268         return 0; /* to prevent warnings */
02269 }
02270 
02271 static void test_zyklen (int startknoten)
02272 {
02273         int i;
02274 
02275         for (i=0; i<anzahl_toene; i++) {
02276                 if (adjazent (startknoten, i)) {
02277                         if (visited [i]) {
02278                                 fatal_error(65,
02279                                             mutC_STR(toene [startknoten]->name),
02280                                             mutC_STR(toene [i]->name));
02281                         }
02282 
02283                         visited [i] = 1;
02284 
02285                         test_zyklen (i);
02286                         visited [i] = 0;
02287                 }
02288         }
02289 }
02290 
02291 static void berechne_ton_endgueltig (int k)
02292 {
02293         int b;
02294         double help, help2;
02295 
02296         switch (toene[k]->ton_typ) {
02297 
02298         case ton_absolut:         /* hier nichts zu tun */
02299                 break;
02300 
02301         case ton_komplex:
02302                 b = ton_nummer (toene[k]->u.ton_komplex.bezugston);
02303 
02304                 berechne_ton_endgueltig (b);
02305 
02306                 help2 = get_wert_komplex_intervall (toene[k]->u.ton_komplex.komplex_liste);
02307 
02308                 help = toene[b]->u.ton_absolut.ton_wert;
02309 
02310                 toene[k]->ton_typ = ton_absolut;
02311 
02312                 toene[k]->u.ton_absolut.ton_wert = help * help2;
02313 
02314                 break;
02315 
02316         default:
02317                 fatal_error(0,_C_STR(_("loop")));
02318         }
02319 }
02320 
02321 static void berechne_toene_absolut (struct ton *list_of_toene)
02322 {
02323         int i,j,k;
02324 
02325         anzahl_toene = ton_list_laenge (list_of_toene);
02326 
02327         toene = (ton* *) xalloca (sizeof(struct ton *) * anzahl_toene);
02328         visited = (char*) xalloca (sizeof(char) * anzahl_toene);
02329         matrix = (char*) xalloca (sizeof(char) * anzahl_toene * anzahl_toene);
02330 
02331 
02332         /* Feld mit toenen initialisieren (zum schnelleren Zugriff) */
02333 
02334         belege_toene (toene, list_of_toene);
02335 
02336         /* Adjazenzmatrix initialisieren (Kein Ton hÑngt vom anderen ab) */
02337 
02338         for (i=0; i<anzahl_toene; i++)
02339         {
02340                 for (j=0; j<anzahl_toene; j++) {
02341                         adjazent (i,j) = 0;
02342                 }
02343         }
02344 
02345         /* Adjazenzmatrix initialisieren (AbhÑngigkeiten eintragen) */
02346 
02347         for (i=0; i<anzahl_toene; i++)
02348         {
02349                 if (toene[i]->ton_typ == ton_absolut)  /* alles ok */ ;
02350                 else if (toene[i]->ton_typ == ton_komplex) {
02351                         adjazent (i, ton_nummer (toene[i]->u.ton_komplex.bezugston)) = 1;
02352                 } else {
02353                         fatal_error(0,_C_STR(_("loop")));
02354                 }
02355         }
02356 
02357 #ifdef DEBUG_ANZEIGE
02358         /* Adjazenzmatrix anzeigen */
02359 
02360         printf ("Matrix:\n");
02361 
02362         for (i=0; i<anzahl_toene; i++)
02363         {
02364                 printf ("%s -> ", toene[i]->name);
02365 
02366                 for (j=0; j<anzahl_toene; j++) {
02367                         if (adjazent (i,j))
02368                                 printf ("%s  ", toene[j]->name);
02369                 }
02370 
02371                 printf ("\n");
02372         }
02373 
02374         printf ("\n");
02375 
02376 #endif
02377 
02378         /* auf Zyklenfreiheit Pruefen */
02379 
02380         for (k=0; k<anzahl_toene; k++)
02381                 visited [k] = 0;
02382 
02383         for (k=0; k<anzahl_toene; k++)
02384         {
02385                 visited [k] = 1;
02386                 test_zyklen (k);
02387                 visited [k] = 0;
02388         }
02389 
02390         /* Toene endgueltig berechnen */
02391 
02392         for (k=0; k<anzahl_toene; k++)
02393                 berechne_ton_endgueltig (k);
02394 
02395 #ifdef DEBUG_ANZEIGE
02396         /* Adjazenzmatrix anzeigen */
02397 
02398         printf ("Matrix:\n");
02399 
02400         for (i=0; i<anzahl_toene; i++)
02401         {
02402                 printf ("%s -> ", toene[i]->name);
02403 
02404                 for (j=0; j<anzahl_toene; j++) {
02405                         if (adjazent (i,j))
02406                                 printf ("%s  ", toene[j]->name);
02407                 }
02408 
02409                 printf ("\n");
02410         }
02411 
02412         printf ("\n");
02413 
02414 #endif
02415 
02416         xde_alloca (toene);
02417         xde_alloca (visited);
02418         xde_alloca (matrix);
02419 
02420 }
02421 
02422 /************** Hier wird die innere Konsistenz des
02423                 ganzen MUTABOR-Programms geprÅft.
02424                 Bei Fehlern wird einfach abgebrochen,
02425                 ansonsten hat diese Funktion keine
02426                 verÑndernde Wirkung auf die Listen.
02427 
02428                 Eintrittspunkt ist "check_konsistenz".
02429 
02430 **************/
02431 
02432 int enthalten_in_tastenliste (int taste, struct taste * lauf)
02433 {
02434         while (lauf)
02435                 if (lauf -> code == taste)
02436                         return 1;
02437                 else
02438                         lauf = lauf -> next;
02439 
02440         return 0;
02441 }
02442 
02443 static
02444 
02445 int case_label_enthalten_in_case_liste (double case_label, struct case_liste * lauf)
02446 {
02447         if (lauf == NULL)
02448                 return 0;
02449         else if ( ! lauf -> is_default  &&
02450                         ( (int)(case_label) == (int)(lauf -> case_label) ) )
02451                 return 1;
02452         else
02453                 return case_label_enthalten_in_case_liste (case_label, lauf -> next);
02454 }
02455 
02456 
02457 static void check_ausloeser (struct ausloeser * ausloeser, const char * name)
02458 {
02459 
02460         struct harmonie * help_harmonie;
02461 
02462         if (ausloeser == NULL) return;
02463 
02464         if (ausloeser->ausloeser_typ == ausloeser_harmonie_form)
02465         {
02466                 help_harmonie = get_harmonie (ausloeser->u.ausloeser_harmonie_form.name, list_of_harmonien);
02467 
02468                 if (help_harmonie == NULL) {
02469                         fatal_error (30,
02470                                      mutC_STR(ausloeser->u.ausloeser_harmonie_form.name),
02471                                      mutC_STR(name));
02472                 }
02473 
02474                 if (enthalten_in_tastenliste
02475                                 (ausloeser->u.ausloeser_harmonie_form.vortaste,
02476                                  help_harmonie->tastenliste) ||
02477                                 ausloeser->u.ausloeser_harmonie_form.vortaste
02478                                 == -1 ) {
02479                         /* OK */
02480                 } else {
02481                         compiler_warning (2, mutC_STR(name));
02482                         /* Markierung setzen, fuer unmoeglichen Ausloeser */
02483                         ausloeser->u.ausloeser_harmonie_form.vortaste = -2;
02484                 }
02485 
02486                 if (enthalten_in_tastenliste
02487                                 (ausloeser->u.ausloeser_harmonie_form.nachtaste,
02488                                  help_harmonie->tastenliste) ||
02489                                 ausloeser->u.ausloeser_harmonie_form.nachtaste
02490                                 == -1 ) {
02491                         /* OK */
02492                 } else {
02493                         compiler_warning (2, mutC_STR(name));
02494                         /* Markierung setzen, fuer unmoeglichen Ausloeser */
02495                         ausloeser->u.ausloeser_harmonie_form.vortaste = -2;
02496                 }
02497         }
02498 
02499 
02500         if (ausloeser->ausloeser_typ == ausloeser_harmonie)
02501         {
02502                 help_harmonie = get_harmonie (ausloeser->u.ausloeser_harmonie.name, list_of_harmonien);
02503 
02504                 if (help_harmonie == NULL) {
02505                         fatal_error (30,
02506                                      mutC_STR(ausloeser->u.ausloeser_harmonie.name),
02507                                      mutC_STR(name));
02508                 }
02509 
02510                 if (enthalten_in_tastenliste
02511                                 (ausloeser->u.ausloeser_harmonie.vortaste,
02512                                  help_harmonie->tastenliste) ||
02513                                 ausloeser->u.ausloeser_harmonie.vortaste
02514                                 == -1 ) {
02515                         /* OK */
02516                 } else {
02517                         compiler_warning (2, mutC_STR(name));
02518                         /* Markierung setzen, fuer unmoeglichen Ausloeser */
02519                         ausloeser->u.ausloeser_harmonie.vortaste = -2;
02520                 }
02521 
02522                 if (enthalten_in_tastenliste
02523                                 (ausloeser->u.ausloeser_harmonie.nachtaste,
02524                                  help_harmonie->tastenliste) ||
02525                                 ausloeser->u.ausloeser_harmonie.nachtaste
02526                                 == -1 ) {
02527                         /* OK */
02528                 } else {
02529                         compiler_warning (2, mutC_STR(name));
02530                         /* Markierung setzen, fuer unmoeglichen Ausloeser */
02531                         ausloeser->u.ausloeser_harmonie.vortaste = -2;
02532                 }
02533         }
02534 
02535         if (ausloeser->ausloeser_typ == ausloeser_midi_in)
02536         {
02537 
02538                 struct midiliste * midi_lauf
02539                                         = ausloeser->u.ausloeser_midi_in.midi_code;
02540 
02541                 if (midi_lauf -> midi_code < 128 ||
02542                                 midi_lauf -> midi_code > 255 ) {
02543                         fatal_error (50, mutC_STR(name), _C_STR(_("status byte")));
02544                 }
02545 
02546                 if (midi_lauf -> midi_code & 0x000F ) {
02547                         midi_lauf -> midi_code &= 0xFFF0;
02548                         compiler_warning(1,mutC_STR(name));
02549                 }
02550 
02551                 midi_lauf = midi_lauf -> next;
02552 
02553                 while (midi_lauf) {
02554                         if (midi_lauf -> midi_code < 0 ||
02555                                         midi_lauf -> midi_code > 127 ) {
02556                                 fatal_error (50, mutC_STR(name), _C_STR(_("data byte")));
02557                         } else
02558                                 midi_lauf = midi_lauf -> next;
02559                 }
02560         }
02561 
02562 }
02563 
02564 
02565 
02566 static void check_aktionen (struct aktions_liste * aktionen, const char * name)
02567 {
02568 
02569         for ( ; aktionen ; aktionen = aktionen -> next )
02570         {
02571                 if (aktionen->aktions_typ == aktion_midi_out) {
02572 
02573                         struct midiliste * midi_lauf
02574                                                 = aktionen->u.aktion_midi_out.midi_code;
02575 
02576                         if (midi_lauf -> midi_code < 128 ||
02577                                         midi_lauf -> midi_code > 255 ) {
02578                                 compiler_warning (1, mutC_STR(name));
02579                         }
02580 
02581                         while (midi_lauf) {
02582                                 if (midi_lauf -> midi_code < 0 ||
02583                                                 midi_lauf -> midi_code > 255 ) {
02584                                         fatal_error (50, mutC_STR(name), _C_STR(_("byte")));
02585                                 }
02586 
02587                                 midi_lauf = midi_lauf -> next;
02588                         }
02589 
02590                 }
02591 
02592                 if (aktionen->aktions_typ == aktion_aufruf) {
02593 
02594                         struct umstimmung * help_umstimmung =
02595                                                         get_umstimmung (aktionen->u.aktion_aufruf.name,
02596                                                                         list_of_umstimmungen);
02597 
02598                         struct tonsystem * help_tonsystem =
02599                                                         parser_get_tonsystem (aktionen->u.aktion_aufruf.name,
02600                                                                               list_of_tonsysteme);
02601 
02602                         struct logik * help_logik =
02603                                                         get_logik (aktionen->u.aktion_aufruf.name,
02604                                                                    list_of_logiken);
02605                         int i=0;
02606 
02607                         if (help_umstimmung) i++;
02608 
02609                         if (help_tonsystem)  i++;
02610 
02611                         if (help_logik)      i++;
02612 
02613                         if (i == 0) {
02614                                 fatal_error (38,
02615                                              mutC_STR(aktionen->u.aktion_aufruf.name),
02616                                              mutC_STR(name));
02617                         }
02618 
02619                         if (i > 1) {
02620                                 compiler_warning (3, mutC_STR(aktionen->u.aktion_aufruf.name), mutC_STR(name));
02621                         }
02622 
02623                         if (help_umstimmung) {
02624                                 if (argument_list_laenge (aktionen->u.aktion_aufruf.argument_liste)
02625                                                 != parameter_list_laenge (help_umstimmung->parameter_liste)) {
02626 
02627                                         fatal_error (61, mutC_STR(name), mutC_STR(aktionen->u.aktion_aufruf.name));
02628                                 }
02629                         } else if (help_tonsystem) {
02630                                 if (argument_list_laenge (aktionen->u.aktion_aufruf.argument_liste)
02631                                                 != 0 ) {
02632 
02633                                         fatal_error (61, mutC_STR(name), mutC_STR(aktionen->u.aktion_aufruf.name));
02634                                 }
02635                         } else if (help_logik) {
02636                                 if (argument_list_laenge (aktionen->u.aktion_aufruf.argument_liste)
02637                                                 != 0 ) {
02638 
02639                                         fatal_error (61, mutC_STR(name), mutC_STR(aktionen->u.aktion_aufruf.name));
02640                                 }
02641                         }
02642 
02643                 }
02644 
02645         }
02646 }
02647 
02648 
02649 /**************************************************************
02650 
02651             Hier sind einige Hilfsfunktionen zum Testen,
02652             daû UmstimmungsbÅnde und die Einstimmungen der
02653             Logiken sich nicht rekursiv enthalten.
02654 
02655             Es wird ein azyklischer Graph der Umstimmungen
02656             gebildet, der dann nach den
02657             depth-first-search traversiert wird.
02658             Dabei wird ein beliebiger Zyklus festgestellt.
02659 
02660 ****************************************************************/
02661 
02662 static int anzahl_umstimmungen_und_logiken;  /* so viele Umstimmungen wurden gelesen */
02663 
02664 enum umst_oder_logik_typ
02665 {
02666         typ_umstimmung, typ_logik
02667 };
02668 
02669 struct umst_oder_logik
02670 {
02671         enum umst_oder_logik_typ umst_oder_logik_typ;
02672         union {
02673 
02674                 struct umstimmung * umstimmung;
02675 
02676                 struct logik * logik;
02677         } u;
02678 };
02679 
02680 static struct umst_oder_logik * zyklen_feld;    /* Feld von Umstimmungen
02681 
02682                       zum schnelleren Zugriff als ueber Listen */
02683 
02684 static char * u_visited;         /* Traversierungsmerker */
02685 
02686 static char * u_matrix; /* Adjazenzmatrix (auf sie darf nur ueber
02687 
02688                                   das folgende Makro zugegriffen werden !*/
02689 
02690 #define u_adjazent(a,b) u_matrix [ (a) * anzahl_umstimmungen_und_logiken \
02691                 * sizeof (char) + (b) * sizeof (char)]
02692 
02693 
02694 
02695 static void belege_zyklenfeld (struct umst_oder_logik *zyklen_feld,
02696 
02697                                struct umstimmung * liste1,
02698 
02699                                struct logik * liste2)
02700 {
02701         int i = 0;
02702 
02703         while (liste1)
02704         {
02705                 zyklen_feld[i].umst_oder_logik_typ = typ_umstimmung;
02706                 zyklen_feld[i].u.umstimmung = liste1;
02707                 liste1 = liste1->next;
02708                 i++;
02709         }
02710 
02711         while (liste2)
02712         {
02713                 zyklen_feld[i].umst_oder_logik_typ = typ_logik;
02714                 zyklen_feld[i].u.logik = liste2;
02715                 liste2 = liste2->next;
02716                 i++;
02717         }
02718 }
02719 
02720 static int test_zyklen_nummer (const char *name)
02721 {
02722         int i;
02723 
02724         for (i=0; i<anzahl_umstimmungen_und_logiken; i++)
02725                 if ( ((zyklen_feld[i].umst_oder_logik_typ == typ_umstimmung) &&
02726                       (! strcmp (name, zyklen_feld[i].u.umstimmung->name)))
02727                      ||
02728                      ((zyklen_feld[i].umst_oder_logik_typ == typ_logik) &&
02729                       (! strcmp (name, zyklen_feld[i].u.logik->name)))
02730                    ) return i;
02731 
02732         fatal_error(29,mutC_STR(name)); /* Umst.n.dekl. */
02733 
02734         return 0; /* to prevent warnings */
02735 }
02736 
02737 static void u_test_zyklen (int startknoten)
02738 {
02739         int i;
02740 
02741         for (i=0; i<anzahl_umstimmungen_und_logiken; i++) {
02742                 if (u_adjazent (startknoten, i)) {
02743                         if (u_visited [i]) {
02744                                 fatal_error(66,
02745                                             zyklen_feld [startknoten].umst_oder_logik_typ == typ_umstimmung ?
02746                                             mutC_STR(zyklen_feld [startknoten].u.umstimmung->name) :
02747                                             mutC_STR(zyklen_feld [startknoten].u.logik->name),
02748                                             zyklen_feld [i].umst_oder_logik_typ == typ_umstimmung ?
02749                                             mutC_STR(zyklen_feld [i].u.umstimmung->name) :
02750                                             mutC_STR(zyklen_feld [i].u.logik->name));
02751                         }
02752 
02753                         u_visited [i] = 1;
02754 
02755                         u_test_zyklen (i);
02756                         u_visited [i] = 0;
02757                 }
02758         }
02759 }
02760 
02761 
02762 
02763 
02764 
02765 static void check_konsistenz (void)
02766 {
02767         allgemeine_initialisierungen();
02768 
02769         /* Tonsysteme:
02770            öberprÅfen, ob Periode und Tîne deklariert sind
02771            und ob die Taste im Bereich 36 - 96 liegt.
02772         */
02773 
02774         { struct tonsystem * lauf;
02775 
02776                 struct ton * ton_lauf;
02777 
02778                 for (lauf = list_of_tonsysteme; lauf; lauf = lauf->next) {
02779                         check_komplex_intervall (lauf->periode, lauf->name);
02780 
02781                         if (lauf->taste < 24  ||  lauf->taste > 108) {
02782                                 fatal_error(47,lauf->taste,mutC_STR(lauf->name)); /* UngÅlt. Taste */
02783                         }
02784 
02785                         for (ton_lauf = lauf->toene;
02786                                         ton_lauf;
02787                                         ton_lauf = ton_lauf->next) {
02788                                 if ((ton_lauf->name != NULL) &&
02789                                                 (get_ton (ton_lauf->name, list_of_toene) == NULL)) {
02790                                         fatal_error(33,mutC_STR(ton_lauf->name),mutC_STR(lauf->name));
02791                                 }
02792                         }
02793                 }
02794         }
02795 
02796 
02797         /**** Umstimmungen prÅfen, ob alle Tîne und Intervalle
02798               global deklariert sind, ob Umstimmungsbund und Umstimmungs_case
02799               keine Rekursion enthÑlt, ob case_labels eindeutig sind,
02800               und ob die benutzten Parameter
02801               zu den deklarierten Parametern passen.
02802         ****/
02803 
02804         {
02805 
02806                 struct umstimmung * lauf;
02807 
02808                 for (lauf = list_of_umstimmungen; lauf; lauf = lauf -> next) {
02809                         switch (lauf -> umstimmung_typ) {
02810 
02811                         default :
02812                                 fatal_error (0, _T(__FILE__), __LINE__);
02813 
02814                                 break;
02815 
02816                         case umstimmung_taste_abs :
02817 
02818                         case umstimmung_taste_rel :
02819 
02820                         case umstimmung_breite_abs :
02821 
02822                         case umstimmung_breite_rel :
02823                                 break;
02824 
02825                         case umstimmung_wiederholung_rel :
02826                                 check_komplex_intervall (lauf->u.umstimmung_wiederholung_rel.komplex_liste,
02827                                                          lauf->name);
02828 
02829                                 break;
02830 
02831                         case umstimmung_wiederholung_abs :
02832                                 check_komplex_intervall (lauf->u.umstimmung_wiederholung_abs.komplex_liste,
02833                                                          lauf->name);
02834 
02835                                 break;
02836 
02837                         case umstimmung_toene_veraendert : {
02838 
02839                                 struct ton * lauf_ton;
02840 
02841                                 for (lauf_ton = lauf->u.umstimmung_toene_veraendert.tonliste;
02842                                                 lauf_ton;
02843                                                 lauf_ton = lauf_ton -> next) {
02844 
02845                                         if (lauf_ton -> name != NULL) {
02846                                                 /*  break geht hier wegen Bug in TURBO-C nicht! break for the next tone */
02847 
02848                                                 if (lauf_ton -> ton_typ == ton_absolut) {
02849                                                         fatal_error(48,mutC_STR(lauf->name), mutC_STR(lauf_ton->name));
02850                                                         /* nicht komplexer Ton */
02851                                                 }
02852 
02853                                                 if (strcmp (lauf_ton->name,
02854                                                                 lauf_ton->u.ton_komplex.bezugston)) {
02855                                                         fatal_error(0,_T(__FILE__),__LINE__,_C_STR(_("retuning")));
02856                                                 }
02857 
02858                                                 if ((lauf_ton->name[0] != '@') &&
02859                                                                 (get_ton (lauf_ton->name, list_of_toene) == NULL)) {
02860                                                         fatal_error(34,mutC_STR(lauf_ton->name),mutC_STR(lauf->name));
02861                                                         /* Undekl. Ton in Umst. */
02862                                                 }
02863 
02864                                                 check_komplex_intervall (lauf_ton->u.ton_komplex.komplex_liste,
02865 
02866                                                                          lauf->name);
02867 
02868                                         }
02869                                 }
02870                         }
02871 
02872                         break;
02873 
02874                         case umstimmung_umstimmungsbund : {
02875 
02876                                 /* Hier werden nur die LÑngen der Parameterlisten
02877                                    verglichen. Die Zyklenfreiheit kommt spÑter
02878                                 */
02879 
02880                                 struct aktions_liste * help_aktionen;
02881 
02882                                 for (help_aktionen = lauf -> u.umstimmung_umstimmungsbund.aktions_liste;
02883                                                 help_aktionen;
02884                                                 help_aktionen = help_aktionen -> next) {
02885                                         if (help_aktionen -> aktions_typ == aktion_aufruf) {
02886 
02887                                                 struct umstimmung * umst =
02888                                                                                 get_umstimmung (help_aktionen -> u.aktion_aufruf.name,
02889                                                                                                 list_of_umstimmungen);
02890 
02891                                                 if (umst == NULL) {
02892 
02893                                                         struct tonsystem * tonsys =
02894                                                                                         parser_get_tonsystem (help_aktionen -> u.aktion_aufruf.name,
02895                                                                                                               list_of_tonsysteme);
02896 
02897                                                         if (tonsys == NULL) {
02898 
02899                                                                 struct logik * help_logik;
02900                                                                 help_logik = get_logik (help_aktionen -> u.aktion_aufruf.name,
02901                                                                                         list_of_logiken);
02902 
02903                                                                 if (help_logik == NULL) {
02904                                                                         fatal_error(36,mutC_STR(help_aktionen -> u.aktion_aufruf.name)
02905                                                                                     ,mutC_STR(lauf->name));
02906                                                                         /* Umst. in Bund */
02907                                                                 } else {
02908                                                                         if (help_aktionen -> u.aktion_aufruf.argument_liste != NULL) {
02909                                                                                 fatal_error (63, mutC_STR(lauf -> name) ,
02910                                                                                              mutC_STR(help_aktionen -> u.aktion_aufruf.name));
02911                                                                         }
02912                                                                 }
02913                                                         } else {
02914                                                                 if (help_aktionen -> u.aktion_aufruf.argument_liste != NULL) {
02915                                                                         fatal_error (63, mutC_STR(lauf -> name), mutC_STR(help_aktionen -> u.aktion_aufruf.name));
02916                                                                 }
02917                                                         }
02918                                                 } else {
02919                                                         if (argument_list_laenge (help_aktionen -> u.aktion_aufruf.argument_liste)
02920                                                                         != parameter_list_laenge (umst -> parameter_liste)) {
02921                                                                 fatal_error(60,mutC_STR(lauf->name),mutC_STR(help_aktionen -> u.aktion_aufruf.name));
02922                                                         }
02923                                                 }
02924                                         }
02925                                 }
02926                         }
02927 
02928                         break;
02929 
02930                         case umstimmung_umstimmungs_case : {
02931 
02932                                 /* Hier werden nur Eindeutigkeit der case_label
02933                                    und die LÑngen der Parameterlisten
02934                                    verglichen. Die Zyklenfreiheit kommt spÑter
02935                                 */
02936 
02937                                 struct case_liste * case_lauf;
02938                                 int anzahl_defaults;
02939 
02940                                 struct aktions_liste * help_aktionen;
02941 
02942 
02943                                 for (case_lauf = lauf->u.umstimmung_umstimmungs_case.umstimmungs_case_liste;
02944                                                 case_lauf;
02945                                                 case_lauf = case_lauf -> next ) {
02946                                         if (  !  case_lauf -> is_default  &&
02947                                                         case_label_enthalten_in_case_liste (case_lauf -> case_label,
02948                                                                                             case_lauf -> next ) ) {
02949                                                 fatal_error (22, (int)(case_lauf -> case_label),
02950                                                              mutC_STR(lauf -> name));
02951                                         }
02952                                 }
02953 
02954 
02955                                 for (anzahl_defaults = 0,
02956                                                 case_lauf = lauf->u.umstimmung_umstimmungs_case.umstimmungs_case_liste;
02957                                                 case_lauf;
02958                                                 case_lauf = case_lauf -> next ) {
02959 
02960                                         if (case_lauf -> is_default) {
02961                                                 anzahl_defaults ++;
02962 
02963                                                 if (anzahl_defaults > 1) {
02964                                                         fatal_error (21, mutC_STR(lauf -> name));
02965                                                 }
02966 
02967                                                 if (case_lauf -> next != NULL) {
02968                                                         /* compiler_warning ( ?? ANSONSTEN ist nicht letztes
02969                                                                               Element der case_liste  */
02970                                                 }
02971                                         }
02972 
02973                                         for (help_aktionen = case_lauf -> case_aktion;
02974                                                         help_aktionen;
02975                                                         help_aktionen = help_aktionen -> next) {
02976                                                 if (help_aktionen -> aktions_typ == aktion_aufruf) {
02977 
02978                                                         struct umstimmung * umst =
02979                                                                                         get_umstimmung (help_aktionen -> u.aktion_aufruf.name,
02980                                                                                                         list_of_umstimmungen);
02981 
02982                                                         if (umst == NULL) {
02983 
02984                                                                 struct tonsystem * tonsys =
02985                                                                                                 parser_get_tonsystem (help_aktionen -> u.aktion_aufruf.name,
02986                                                                                                                       list_of_tonsysteme);
02987 
02988                                                                 if (tonsys == NULL) {
02989 
02990                                                                         struct logik * help_logik;
02991                                                                         help_logik = get_logik (help_aktionen -> u.aktion_aufruf.name,
02992                                                                                                 list_of_logiken);
02993 
02994                                                                         if (help_logik == NULL) {
02995                                                                                 fatal_error(36,mutC_STR(help_aktionen -> u.aktion_aufruf.name)
02996                                                                                             ,lauf->name);
02997                                                                                 /* Umst. in Bund */
02998                                                                         } else {
02999                                                                                 if (help_aktionen -> u.aktion_aufruf.argument_liste != NULL) {
03000                                                                                         fatal_error (64, mutC_STR(lauf -> name) ,
03001                                                                                                      mutC_STR(help_aktionen -> u.aktion_aufruf.name));
03002                                                                                 }
03003                                                                         }
03004                                                                 } else {
03005                                                                         if (help_aktionen -> u.aktion_aufruf.argument_liste != NULL) {
03006                                                                                 fatal_error (64, mutC_STR(lauf -> name) ,
03007                                                                                              mutC_STR(help_aktionen -> u.aktion_aufruf.name));
03008                                                                         }
03009                                                                 }
03010                                                         } else {
03011                                                                 if (argument_list_laenge (help_aktionen -> u.aktion_aufruf.argument_liste)
03012                                                                                 != parameter_list_laenge (umst -> parameter_liste)) {
03013                                                                         fatal_error(60, mutC_STR(lauf->name),
03014                                                                                     mutC_STR(help_aktionen -> u.aktion_aufruf.name));
03015                                                                 }
03016                                                         }
03017                                                 }
03018                                         }
03019                                 }
03020                         }
03021 
03022                         break;
03023                         }  /* of switch */
03024                 }  /* of for */
03025 
03026                 /**** testzyklen ****/
03027 
03028                 {
03029                         int i,j,k;
03030 
03031                         anzahl_umstimmungen_und_logiken =
03032                                 umstimmungs_list_laenge (list_of_umstimmungen)
03033                                 + logik_list_laenge (list_of_logiken) ;
03034 
03035                         zyklen_feld = (umst_oder_logik*) xalloca (sizeof(struct umst_oder_logik) * anzahl_umstimmungen_und_logiken);
03036                         u_visited = (char*) xalloca (sizeof(char) * anzahl_umstimmungen_und_logiken);
03037                         u_matrix = (char*) xalloca (sizeof(char) * anzahl_umstimmungen_und_logiken
03038                                                     * anzahl_umstimmungen_und_logiken);
03039 
03040 
03041                         /* Feld mit Umstimmungen initialisieren (zum schnelleren Zugriff) */
03042 
03043                         belege_zyklenfeld (zyklen_feld, list_of_umstimmungen, list_of_logiken);
03044 
03045                         /* Adjazenzmatrix initialisieren (Keine Umstimmung
03046                                        hÑngt von einer anderen ab) */
03047 
03048                         for (i=0; i<anzahl_umstimmungen_und_logiken; i++) {
03049                                 for (j=0; j<anzahl_umstimmungen_und_logiken; j++) {
03050                                         u_adjazent (i,j) = 0;
03051                                 }
03052                         }
03053 
03054                         /* Adjazenzmatrix initialisieren (AbhÑngigkeiten eintragen) */
03055 
03056                         for (i=0; i<anzahl_umstimmungen_und_logiken; i++) {
03057                                 if (zyklen_feld[i].umst_oder_logik_typ == typ_umstimmung &&
03058                                                 zyklen_feld[i].u.umstimmung->umstimmung_typ == umstimmung_umstimmungsbund) {
03059 
03060                                         struct aktions_liste *lauf = zyklen_feld[i].u.umstimmung->u.umstimmung_umstimmungsbund.aktions_liste;
03061 
03062                                         for ( ; lauf ; lauf = lauf -> next ) {
03063                                                 if (lauf -> aktions_typ == aktion_aufruf) {
03064                                                         if (get_umstimmung (lauf -> u.aktion_aufruf.name,
03065                                                                             list_of_umstimmungen) != NULL
03066                                                                         ||
03067                                                                         get_logik (lauf -> u.aktion_aufruf.name,
03068                                                                                    list_of_logiken) != NULL
03069                                                            ) {
03070                                                                 /* Keine Tonsysteme adjazent eintragen */
03071 
03072                                                                 u_adjazent (i, test_zyklen_nummer (lauf->u.aktion_aufruf.name)) = 1;
03073                                                         }
03074                                                 }
03075                                         }
03076                                 } else if (zyklen_feld[i].umst_oder_logik_typ == typ_umstimmung &&
03077                                                 zyklen_feld[i].u.umstimmung->umstimmung_typ ==
03078                                                 umstimmung_umstimmungs_case) {
03079 
03080                                         struct case_liste * case_lauf;
03081 
03082                                         for (case_lauf = zyklen_feld[i].u.umstimmung->u.umstimmung_umstimmungs_case.umstimmungs_case_liste;
03083                                                         case_lauf;
03084                                                         case_lauf = case_lauf -> next) {
03085 
03086                                                 struct aktions_liste *lauf = case_lauf -> case_aktion;
03087 
03088                                                 for ( ; lauf ; lauf = lauf -> next ) {
03089                                                         if (lauf -> aktions_typ == aktion_aufruf) {
03090                                                                 if (get_umstimmung (lauf -> u.aktion_aufruf.name,
03091                                                                                     list_of_umstimmungen) != NULL
03092                                                                                 ||
03093                                                                                 get_logik (lauf -> u.aktion_aufruf.name,
03094                                                                                            list_of_logiken) != NULL
03095                                                                    ) {
03096                                                                         /* Keine Tonsysteme adjazent eintragen */
03097 
03098                                                                         u_adjazent (i, test_zyklen_nummer (lauf->u.aktion_aufruf.name)) = 1;
03099                                                                 }
03100                                                         }
03101                                                 }
03102                                         }
03103                                 } else if (zyklen_feld[i].umst_oder_logik_typ == typ_logik &&
03104                                                 zyklen_feld[i].u.logik->einstimmungs_name) {
03105 
03106                                         if (get_umstimmung (zyklen_feld[i].u.logik->einstimmungs_name,
03107                                                             list_of_umstimmungen) != NULL) {
03108                                                 /* Keine Tonsysteme adjazent eintragen */
03109 
03110                                                 u_adjazent (i, test_zyklen_nummer (zyklen_feld[i].u.logik->einstimmungs_name)) = 1;
03111                                         }
03112                                 }
03113                         }
03114 
03115 #ifdef DEBUG_ANZEIGE_2
03116                         /* Adjazenzmatrix anzeigen */
03117 
03118                         printf ("U_Matrix:\n");
03119 
03120                         for (i=0; i<anzahl_umstimmungen_und_logiken; i++) {
03121                                 if (zyklen_feld[i].umst_oder_logik_typ == typ_umstimmung)
03122                                         printf ("Umstimmung %s -> ", zyklen_feld[i].u.umstimmung->name);
03123                                 else
03124                                         printf ("Logik %s -> ", zyklen_feld[i].u.logik->name);
03125 
03126                                 for (j=0; j<anzahl_umstimmungen_und_logiken; j++) {
03127                                         if (u_adjazent (i,j))
03128                                                 if (zyklen_feld[j].umst_oder_logik_typ == typ_umstimmung)
03129                                                         printf ("Umstimmung %s ", zyklen_feld[j].u.umstimmung->name);
03130                                                 else
03131                                                         printf ("Logik %s -> ", zyklen_feld[j].u.logik->name);
03132                                 }
03133 
03134                                 printf ("\n");
03135                         }
03136 
03137                         printf ("\n");
03138 
03139 #endif
03140 
03141                         /* auf Zyklenfreiheit Pruefen */
03142 
03143                         for (k=0; k<anzahl_umstimmungen_und_logiken; k++)
03144                                 u_visited [k] = 0;
03145 
03146                         for (k=0; k<anzahl_umstimmungen_und_logiken; k++) {
03147                                 u_visited [k] = 1;
03148                                 u_test_zyklen (k);
03149                                 u_visited [k] = 0;
03150                         }
03151 
03152 
03153 #ifdef DEBUG_ANZEIGE_2
03154                         /* Adjazenzmatrix anzeigen */
03155 
03156                         printf ("U_Matrix:\n");
03157 
03158                         for (i=0; i<anzahl_umstimmungen_und_logiken; i++) {
03159                                 if (zyklen_feld[i].umst_oder_logik_typ == typ_umstimmung)
03160                                         printf ("Umstimmung %s -> ", zyklen_feld[i].u.umstimmung->name);
03161                                 else
03162                                         printf ("Logik %s -> ", zyklen_feld[i].u.logik->name);
03163 
03164                                 for (j=0; j<anzahl_umstimmungen_und_logiken; j++) {
03165                                         if (u_adjazent (i,j))
03166                                                 if (zyklen_feld[j].umst_oder_logik_typ == typ_umstimmung)
03167                                                         printf ("Umstimmung %s ", zyklen_feld[j].u.umstimmung->name);
03168                                                 else
03169                                                         printf ("Logik %s -> ", zyklen_feld[j].u.logik->name);
03170                                 }
03171 
03172                                 printf ("\n");
03173                         }
03174 
03175                         printf ("\n");
03176 
03177 #endif
03178 
03179                         xde_alloca (zyklen_feld);
03180                         xde_alloca (u_visited);
03181                         xde_alloca (u_matrix);
03182 
03183                 }
03184 
03185 
03186                 /******* ende testzyklen **/
03187 
03188         }
03189 
03190 
03191         /* Logiken:
03192            öberprÅfen, ob Einstimmung deklariert ist
03193            und ob die Anweisungen korrekt deklariert sind.
03194         */
03195 
03196 
03197 #if 1
03198 
03199         { struct logik * lauf;
03200 
03201                 struct anweisung * anweisungs_lauf;
03202                 int anzahl_default_ausloeser;
03203 
03204                 for (lauf = list_of_logiken; lauf; lauf = lauf->next) {
03205 
03206                         struct umstimmung * help_umstimmung;
03207 
03208                         check_ausloeser (lauf->ausloeser, lauf->name);
03209 
03210                         /* Eine Logik darf nicht mit dem DEFAULT-Auslîser aufgerufen werden */
03211 
03212                         if (lauf->ausloeser) {
03213                                 if (lauf->ausloeser->ausloeser_typ == ausloeser_default) {
03214                                         fatal_error (51, mutC_STR(lauf->name));
03215                                 }
03216                         }
03217 
03218                         if (lauf->einstimmungs_name!=NULL) {
03219                                 if (parser_get_tonsystem (lauf->einstimmungs_name, list_of_tonsysteme) == NULL) {
03220                                         if ((help_umstimmung=get_umstimmung (lauf->einstimmungs_name, list_of_umstimmungen)) == NULL) {
03221                                                 fatal_error(37,mutC_STR(lauf->einstimmungs_name),
03222                                                             mutC_STR(lauf->name));
03223                                                 /* Einst. in Logik */
03224                                         } else {
03225                                                 if (parameter_list_laenge (help_umstimmung -> parameter_liste) != 0) {
03226                                                         fatal_error(62, mutC_STR(lauf->name),
03227                                                                     mutC_STR(lauf->einstimmungs_name));
03228                                                 }
03229                                         }
03230                                 }
03231                         }
03232 
03233                         for (anweisungs_lauf = lauf->anweisungsliste,
03234                                         anzahl_default_ausloeser = 0;
03235                                         anweisungs_lauf;
03236                                         anweisungs_lauf = anweisungs_lauf->next) {
03237 
03238                                 check_ausloeser (anweisungs_lauf->ausloeser, lauf->name);
03239 
03240                                 if (anweisungs_lauf->ausloeser == NULL)
03241                                         fatal_error (0, _T(__FILE__), __LINE__);
03242                                 else {
03243                                         if (anweisungs_lauf->ausloeser->ausloeser_typ
03244                                                         == ausloeser_default) {
03245                                                 anzahl_default_ausloeser ++;
03246 
03247                                                 if (anzahl_default_ausloeser > 1) {
03248                                                         fatal_error (20, mutC_STR(lauf -> name));
03249                                                 } else {
03250                                                         if (anweisungs_lauf -> next != NULL)
03251                                                                 compiler_warning (4, mutC_STR(lauf -> name));
03252                                                 }
03253                                         }
03254                                 }
03255 
03256                                 check_aktionen (anweisungs_lauf -> aktion, lauf->name);
03257 
03258                         }
03259                 }
03260         }
03261 #endif
03262 }
03263 

Erzeugt am Sun Aug 21 2011 10:51:52 für Mutabor von doxygen 1.7.4