|  |  | @@ -1790,80 +1790,6 @@ static int EmbeddedCommand(unsigned int *source_index_out) | 
		
	
		
			
			|  |  |  | return 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // handle .replace rule in xx_rules file | 
		
	
		
			
			|  |  |  | static int SubstituteChar(Translator *tr, unsigned int c, unsigned int next_in, int *insert, int *wordflags) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | int ix; | 
		
	
		
			
			|  |  |  | unsigned int word; | 
		
	
		
			
			|  |  |  | unsigned int new_c, c2 = ' ', c_lower; | 
		
	
		
			
			|  |  |  | int upper_case = 0; | 
		
	
		
			
			|  |  |  | static bool ignore_next = false; | 
		
	
		
			
			|  |  |  | const unsigned int *replace_chars; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (ignore_next) { | 
		
	
		
			
			|  |  |  | ignore_next = false; | 
		
	
		
			
			|  |  |  | return 8; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if (c == 0) return 0; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if ((replace_chars = tr->langopts.replace_chars) == NULL) | 
		
	
		
			
			|  |  |  | return c; | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | // there is a list of character codes to be substituted with alternative codes | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (iswupper(c_lower = c)) { | 
		
	
		
			
			|  |  |  | c_lower = towlower2(c, tr); | 
		
	
		
			
			|  |  |  | upper_case = 1; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | new_c = 0; | 
		
	
		
			
			|  |  |  | for (ix = 0; (word = replace_chars[ix]) != 0; ix += 2) { | 
		
	
		
			
			|  |  |  | if (c_lower == (word & 0xffff)) { | 
		
	
		
			
			|  |  |  | if ((word >> 16) == 0) { | 
		
	
		
			
			|  |  |  | new_c = replace_chars[ix+1]; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | if ((word >> 16) == (unsigned int)towlower2(next_in, tr)) { | 
		
	
		
			
			|  |  |  | new_c = replace_chars[ix+1]; | 
		
	
		
			
			|  |  |  | ignore_next = true; | 
		
	
		
			
			|  |  |  | break; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (new_c == 0) | 
		
	
		
			
			|  |  |  | return c; // no substitution | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (new_c & 0xffe00000) { | 
		
	
		
			
			|  |  |  | // there is a second character to be inserted | 
		
	
		
			
			|  |  |  | // don't convert the case of the second character unless the next letter is also upper case | 
		
	
		
			
			|  |  |  | c2 = new_c >> 16; | 
		
	
		
			
			|  |  |  | if (upper_case && iswupper(next_in)) | 
		
	
		
			
			|  |  |  | c2 = ucd_toupper(c2); | 
		
	
		
			
			|  |  |  | *insert = c2; | 
		
	
		
			
			|  |  |  | new_c &= 0xffff; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | if (upper_case) | 
		
	
		
			
			|  |  |  | new_c = ucd_toupper(new_c); | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | *wordflags |= FLAG_CHAR_REPLACED; | 
		
	
		
			
			|  |  |  | if (option_phonemes & espeakPHONEMES_TRACE) { | 
		
	
		
			
			|  |  |  | char msg[21] = {'R','e','p','l','a','c','e',':',' '}; | 
		
	
		
			
			|  |  |  | char *index = msg; | 
		
	
		
			
			|  |  |  | index += 9; | 
		
	
		
			
			|  |  |  | index += utf8_out(c, index); | 
		
	
		
			
			|  |  |  | *index++ = ' '; | 
		
	
		
			
			|  |  |  | *index++ = '>'; | 
		
	
		
			
			|  |  |  | *index++ = ' '; | 
		
	
		
			
			|  |  |  | index += utf8_out(new_c, index); | 
		
	
		
			
			|  |  |  | index += utf8_out(c2, index); | 
		
	
		
			
			|  |  |  | *index = 0; | 
		
	
		
			
			|  |  |  | fprintf(f_trans, "%s\n", msg); | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | return new_c; | 
		
	
		
			
			|  |  |  | } | 
		
	
		
			
			|  |  |  | 
 | 
		
	
		
			
			|  |  |  | static bool GetNextTranslateChars(const int **from, const int **to, bool next_step) | 
		
	
		
			
			|  |  |  | { | 
		
	
		
			
			|  |  |  | // Set pointers to next 'from' and 'to' part for replacement |