(svn r10792) -Fix [FS#1104]: when determining the gender of a string, do not assume that the gender is in the front of the string when there can be case switching code at that location.
This commit is contained in:
		@@ -680,7 +680,18 @@ static char* FormatString(char* buff, const char* str, const int64* argv, uint c
 | 
				
			|||||||
				const char* s = GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender.
 | 
									const char* s = GetStringPtr(argv_orig[(byte)*str++]); // contains the string that determines gender.
 | 
				
			||||||
				int len;
 | 
									int len;
 | 
				
			||||||
				int gender = 0;
 | 
									int gender = 0;
 | 
				
			||||||
				if (s != NULL && Utf8Consume(&s) == SCC_GENDER_INDEX) gender = (byte)s[0];
 | 
									if (s != NULL) {
 | 
				
			||||||
 | 
										wchar_t c = Utf8Consume(&s);
 | 
				
			||||||
 | 
										/* Switch case is always put before genders, so remove those bits */
 | 
				
			||||||
 | 
										if (c == SCC_SWITCH_CASE) {
 | 
				
			||||||
 | 
											/* Skip to the last (i.e. default) case */
 | 
				
			||||||
 | 
											for (uint num = (byte)*s++; num != 0; num--) s += 3 + (s[1] << 8) + s[2];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
											c = Utf8Consume(&s);
 | 
				
			||||||
 | 
										}
 | 
				
			||||||
 | 
										/* Does this string have a gender, if so, set it */
 | 
				
			||||||
 | 
										if (c == SCC_GENDER_INDEX) gender = (byte)s[0];
 | 
				
			||||||
 | 
									}
 | 
				
			||||||
				str = ParseStringChoice(str, gender, buff, &len);
 | 
									str = ParseStringChoice(str, gender, buff, &len);
 | 
				
			||||||
				buff += len;
 | 
									buff += len;
 | 
				
			||||||
				break;
 | 
									break;
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user