void prtnote(char *s) { /* "^(<=A-G>)(<?=b#>)(<?=whqest>)(<*d>)(/<+d>|)" */ if (pmxcount() == 0) logprintf("'%-6s' no note",s); else logprintf("'%-6s' Pitch:%.*s Accid:%.*s Len:%.*s Mul:%.*s Div:%.*s",s, pmxlen(1),pmxstart(1), pmxlen(2),pmxstart(2), pmxlen(3),pmxstart(3), pmxlen(4),pmxstart(4), pmxlen(5),pmxstart(5) ); }
static const char *utl_pmx_match(const char *pat, const char *txt) { int32_t len; int32_t ch; int32_t c1; int16_t inv =0; utl_pmx_state_s *state; utl_pmx_state_reset(); utl_pmx_state_push(pat,txt,1,1,0); while (*pat) { _logdebug("[MATCH] %d [%s] [%s]",pmxcount(),pat,txt); c1 = 0; switch (*pat) { case '(' : pat++; if (*pat == '|') {inv = 1; pat++;} if (!utl_pmx_state_push(pat,txt,1,1,inv)) utl_pmx_set_paterror(pat); break; case '|' : pat = utl_pmx_alt_skip(pat); break; case ')' : pat++; _logdebug(")->%d",utl_pmx_stack_ptr); if (utl_pmx_stack_ptr < 2) { utl_pmx_set_paterror(pat-1); break; } /* If we are here, we have matched what is in the (...) */ state = utl_pmx_state_top(); inv = state->inv; if (inv) { /* we shouldn't have matched it :( */ utl_pmx_state_pop(); utl_pmx_FAIL; } utl_pmx_capt[state->cap][1] = txt; state->n++; _logdebug("match #%d min:%d max:%d",state->n,state->min_n, state->max_n); if (state->n < state->max_n) { utl_pmx_capt[state->cap][0] = txt; pat = state->pat; /* try to match once more */ } else { utl_pmx_capt[state->cap][0] = state->txt; utl_pmx_state_pop(); } break; case '<' : if (!utl_pmx_class(&pat,&txt)) utl_pmx_FAIL; break; case '%' : if (pat[1]) len = utl_pmx_nextch(++pat, &c1); default : if (c1 == 0) len = utl_pmx_nextch(pat, &c1); len = utl_pmx_nextch(txt, &ch); if (!utl_pmx_case) { ch = utl_pmx_fold(ch); c1 = utl_pmx_fold(c1); } if (ch != c1) { _logdebug("FAIL: %d %d",c1,ch); utl_pmx_FAIL; } txt += len; pat += len; break; fail : pat = utl_pmx_alt(pat, &txt) ; /* search for an alternative */ if (*pat == '\0') utl_pmx_capnum = 0; break; } } utl_pmx_capt[0][1] = txt; for (len = utl_pmx_capnum; len < utl_pmx_MAXCAPT; len++) { utl_pmx_capt[len][0] = utl_pmx_capt[len][1] = NULL; } _logdebug("res: %p - %p",utl_pmx_capt[0][0],utl_pmx_capt[0][1]); return utl_pmx_capt[0][0]; }