From dd422ffbdb63ecf7b2ade8b708b718ee3ea3cc6d Mon Sep 17 00:00:00 2001 From: "Reece H. Dunn" Date: Sat, 28 Jan 2017 12:03:43 +0000 Subject: [PATCH] Ensure phoneme type is set before start/endtype. The eSpeak code uses `end_type` for the `voicingswitch` property when used with consonants. It also allows `endtype` to be specified in consonants if it is the same as `starttype`. This code adds a check in the `starttype` and `endtype` handlers to ensure that the phoneme type has been set to preserve the eSpeak behaviour for these properties. --- src/libespeak-ng/compiledata.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/libespeak-ng/compiledata.c b/src/libespeak-ng/compiledata.c index 23681309..058c7f52 100644 --- a/src/libespeak-ng/compiledata.c +++ b/src/libespeak-ng/compiledata.c @@ -2142,12 +2142,16 @@ int CompilePhoneme(int compile_phoneme) if (phcode == -1) phcode = LookupPhoneme(item_string, 1); phoneme_out->start_type = phcode; + if (phoneme_out->type == phINVALID) + error("a phoneme type or manner of articulation must be specified before starttype"); break; case kENDTYPE: phcode = NextItem(tPHONEMEMNEM); if (phcode == -1) phcode = LookupPhoneme(item_string, 1); - if (phoneme_out->type == phVOWEL) + if (phoneme_out->type == phINVALID) + error("a phoneme type or manner of articulation must be specified before endtype"); + else if (phoneme_out->type == phVOWEL) phoneme_out->end_type = phcode; else if (phcode != phoneme_out->start_type) error("endtype must equal starttype for consonants");