1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92
|
/* parser2.c - further parsing */
/* part of abc2midi and yaps */
/* implements event_info, event_instruction, event_gchord and event_slur */
/* also implements event_reserved */
/* parser2 requires parseabc, but parseabc does not need parser2 */
#include <stdio.h>
#include "abc.h"
#include "parseabc.h"
#include "parser2.h"
/* [JA] 2024-04-30 */
void event_info(char* s)
/* An I: field has been encountered. The 2.1 and 2.2 abc standards
specify that this field (stylesheet directive) is handled in the
same way as %% (pseudo-comment). If it isn't recognized it should
be silently ignored.
*/
{
char package[40];
char *p;
p = s;
skipspace(&p);
readstr (package, &p, 40);
event_specific (package, p, 1);
}
static void splitstring(s, sep, handler)
/* breaks up string into fields with sep as the field separator */
/* and calls handler() for each sub-string */
char* s;
char sep;
void (*handler)();
{
char* out;
char* p;
int fieldcoming;
p = s;
fieldcoming = 1;
while (fieldcoming) {
out = p;
while ((*p != '\0') && (*p != sep)) p = p + 1;
if (*p == sep) {
*p = '\0';
p = p + 1;
} else {
fieldcoming = 0;
};
(*handler)(out);
};
}
void event_gchord(s)
/* handles guitar chords " ... " */
char* s;
{
splitstring(s, ';', event_handle_gchord);
}
void event_instruction(s)
/* handles a ! ... ! event in the abc */
char* s;
{
splitstring(s, ';', event_handle_instruction);
}
void event_slur(t)
int t;
/* handles old 's' notation for slur on/slur off */
{
if (t) {
event_sluron(1);
} else {
event_sluroff(0);
};
}
void event_reserved(char s)
/* handles H - Z encountered in abc */
{
char *expansion;
expansion = lookup_abbreviation(s);
if (expansion != NULL) {
event_handle_instruction(expansion);
} else {
event_x_reserved(s);
};
}
|