00001
00023
00024
00025
00026
00027
00028 #include "Global.h"
00029 #include "GrafKern.h"
00030 #include "Interval.h"
00031 #include "Hilfs.h"
00032
00033
00034
00035
00036
00037
00038
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;
00059
00060 static void berechne_toene_absolut (struct ton *ton_liste);
00061
00062 static void check_konsistenz (void);
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073
00074
00075
00076
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
00218
00219
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
00250
00251
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));
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
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));
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
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
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 ;
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 ;
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
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
00543
00544
00545
00546
00547
00548
00549
00550
00551
00552
00553
00554
00555
00556 };
00557
00558
00559
00560 #endif
00561
00562
00563
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);
00591 }
00592
00593 fclose (quelldatei);
00594
00595
00596
00597
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
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 }
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
00886
00887
00888
00889
00890
00891
00892
00893
00894
00895
00896
00897
00898
00899
00900
00901
00902
00903
00904
00905
00906
00907
00908
00909
00910
00911
00912
00913
00914
00915
00916
00917
00918
00919
00920
00921
00922
00923
00924
00925
00926
00927
00928
00929
00930
00931
00932
00933
00934
00935
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
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963
00964
00965
00966
00967
00968
00969
00970
00971
00972
00973
00974
00975
00976
00977
00978
00979
00980
00981
00982
00983
00984
00985
00986
00987
00988
00989
00990
00991
00992
00993
00994
00995
00996
00997
00998
00999
01000
01001
01002
01003
01004
01005
01006
01007
01008
01009
01010
01011
01012
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));
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));
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
01062
01063
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));
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));
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));
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
01141
01142
01143
01144
01145
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
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));
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));
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
01225
01226
01227
01228
01229
01230
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));
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
01271
01272
01273
01274
01275
01276
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));
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));
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));
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));
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
01422
01423
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 ;
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 ;
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 ;
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
01561
01562
01563
01564
01565
01566
01567
01568
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 ;
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
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));
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
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));
01644 } else {
01645 argument_lauf->argument.u.parameter.parameter_nummer = i;
01646 }
01647 }
01648 }
01649 }
01650 }
01651 }
01652
01653
01654
01655 }
01656
01657
01658
01659
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 ;
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
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));
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 ;
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 ;
01756
01757 (* lauf) = (case_liste*) xmalloc (sizeof (struct case_liste));
01758
01759 (* lauf) -> case_label = -1000000;
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
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));
01821 } else {
01822 argument_lauf->argument.u.parameter.parameter_nummer = i;
01823 }
01824 }
01825 }
01826 }
01827 }
01828 }
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
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));
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
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));
01900 } else {
01901 argument_lauf->argument.u.parameter.parameter_nummer = i;
01902 }
01903 }
01904 }
01905 }
01906 }
01907 }
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
01927
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 ;
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));
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
01976
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 ;
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));
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
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
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);
02176 }
02177 }
02178
02179 if ( midi_von > midi_bis )
02180 {
02181 temp=midi_von;
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
02222
02223
02224
02225
02226
02227
02228
02229
02230
02231
02232 static int anzahl_toene;
02233
02234 static struct ton ** toene;
02235
02236
02237
02238 static char * visited;
02239
02240 static char * matrix;
02241
02242
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));
02267
02268 return 0;
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:
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
02333
02334 belege_toene (toene, list_of_toene);
02335
02336
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
02346
02347 for (i=0; i<anzahl_toene; i++)
02348 {
02349 if (toene[i]->ton_typ == ton_absolut) ;
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
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
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
02391
02392 for (k=0; k<anzahl_toene; k++)
02393 berechne_ton_endgueltig (k);
02394
02395 #ifdef DEBUG_ANZEIGE
02396
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
02423
02424
02425
02426
02427
02428
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
02480 } else {
02481 compiler_warning (2, mutC_STR(name));
02482
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
02492 } else {
02493 compiler_warning (2, mutC_STR(name));
02494
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
02516 } else {
02517 compiler_warning (2, mutC_STR(name));
02518
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
02528 } else {
02529 compiler_warning (2, mutC_STR(name));
02530
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
02652
02653
02654
02655
02656
02657
02658
02659
02660
02661
02662 static int anzahl_umstimmungen_und_logiken;
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;
02681
02682
02683
02684 static char * u_visited;
02685
02686 static char * u_matrix;
02687
02688
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));
02733
02734 return 0;
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
02770
02771
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));
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
02798
02799
02800
02801
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
02847
02848 if (lauf_ton -> ton_typ == ton_absolut) {
02849 fatal_error(48,mutC_STR(lauf->name), mutC_STR(lauf_ton->name));
02850
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
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
02877
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
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
02933
02934
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
02969
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
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 }
03024 }
03025
03026
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
03042
03043 belege_zyklenfeld (zyklen_feld, list_of_umstimmungen, list_of_logiken);
03044
03045
03046
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
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
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
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
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
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
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
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
03187
03188 }
03189
03190
03191
03192
03193
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
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
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