/* interpréteur sur un texte sans faute (pour un temps) */ int reinterprete_temps(char * txt) { int som= 0; /* accumulateur pour le total */ int somg= 0; /* accumulateur pour les symboles du groupe */ int val= 0; /* registre pour le symbole */ int valNP= 0; /* registre pour le symbole doublement pointé */ short p= 0; /* symbole pointé (une fois) */ short g= 0; /* entrée dans un groupe */ short fin= 0; /* fin de boucle */ int er= 0; /* nombre de symboles, utilisé pour les groupes */ int it= 0; /* indice dans txt */ while( !fin) { switch(txt[it]) { case '(' : { p= 0; som+= val; val= 0; g= 1; er= 0; somg= 0; } break; case ')' : { somg+= val; g= 0; val= vg(somg, er); } break; case '2' : case '3' : case '4' : case '5' : case '6' : case '7' : { val= vg(somg, txt[it] - '0'); } break; case '_' : break; case 'o' : { p= 0; g ? somg+= val : (som+= val); val= 64; er++; } break; // ronde case 'd' : { p= 0; g ? somg+= val : (som+= val); val= 32; er++; } break; // blanche case '!' : { p= 0; g ? somg+= val : (som+= val); val= 16; er++; } break; // noire case '[' : { p= 0; g ? somg+= val : (som+= val); val= 8; er++; } break; // etc case 'f' : { p= 0; g ? somg+= val : (som+= val); val= 4; er++; } break; case 't' : { p= 0; g ? somg+= val : (som+= val); val= 2; er++; } break; case 'q' : { p= 0; g ? somg+= val : (som+= val); val= 1; er++; } break; case '-' : { p= 0; g ? somg+= val : (som+= val); val= 64; er++; } break; // pause case '=' : { p= 0; g ? somg+= val : (som+= val); val= 32; er++; } break; // demi-pause case '<' : { p= 0; g ? somg+= val : (som+= val); val= 16; er++; } break; // soupir case '>' : { p= 0; g ? somg+= val : (som+= val); val= 8; er++; } break; // etc case 'k' : { p= 0; g ? somg+= val : (som+= val); val= 4; er++; } break; case 'x' : { p= 0; g ? somg+= val : (som+= val); val= 2; er++; } break; case 'w' : { p= 0; g ? somg+= val : (som+= val); val= 1; er++; } break; case '.' : { if ( p ) val= valNP + (valNP / 2) + (valNP / 4); // valeur dbl. pointée else { valNP= val; val= val + val / 2; p= 1; } } break; // valeur pointée /* sorties possibles */ case '\0': fin= 1; break; case ' ' : fin= 2; break; default : fin= 3; break; } it++; } /* fin == 2 ET txt[it] == '\0' */ if ( (fin == 2 && txt[it] != '\0') || fin == 3 ) { fprintf(stderr, "reinterprete_temps : erreur de programmation, temps se terminant\n\t\ par \"%s\"\n", &txt[it - 1]); exit(1); } return som+= val; } ------------------------------------- int vg(int val, int grp_repet) { // valeur groupe (ex. triolet de croche) switch(grp_repet) { case 2 : return val * 3/ 2; /* duolet */ case 4 : return val * 3/ 2; /* quartolet */ case 6 : return val * 3/ 2; /* sextolet 3/2 (2/3 pour deux triolets) */ case 3 : return val * 2/ 3; /* triolet */ case 5 : return val * 3/ 5; /* quintolet */ case 7 : return val * 4/ 7; /* septuolet */ default : return 0; } return val; } ------------------------------------