diff options
Diffstat (limited to 'unicode/unicode_bidi.c')
| -rw-r--r-- | unicode/unicode_bidi.c | 49 | 
1 files changed, 30 insertions, 19 deletions
| diff --git a/unicode/unicode_bidi.c b/unicode/unicode_bidi.c index b23b833..b97ec25 100644 --- a/unicode/unicode_bidi.c +++ b/unicode/unicode_bidi.c @@ -464,7 +464,7 @@ struct directional_status_stack_entry {  typedef struct {  	struct directional_status_stack_entry *head; -	unicode_bidi_level_t paragraph_embedding_level; +	struct unicode_bidi_direction paragraph_embedding_level;  	const char32_t    *chars;  	enum_bidi_type_t *types;  	const enum_bidi_type_t *orig_types; @@ -618,7 +618,7 @@ get_enum_bidi_type_for_paragraph_embedding_level(size_t i,  	return p->p[i];  } -static unicode_bidi_level_t +static struct unicode_bidi_direction  compute_paragraph_embedding_level_from_types(const enum_bidi_type_t *p,  					     size_t i, size_t j)  { @@ -628,7 +628,7 @@ compute_paragraph_embedding_level_from_types(const enum_bidi_type_t *p,  	return compute_paragraph_embedding_level  		(i, j,  		 get_enum_bidi_type_for_paragraph_embedding_level, -		 &info).direction; +		 &info);  }  static directional_status_stack_t @@ -642,10 +642,18 @@ directional_status_stack_init(const char32_t *chars,  	stack=(directional_status_stack_t)calloc(1, sizeof(*stack)); -	stack->paragraph_embedding_level= -		initial_embedding_level -		? *initial_embedding_level & 1 -		: compute_paragraph_embedding_level_from_types(types, 0, n); +	if (initial_embedding_level) +	{ +		stack->paragraph_embedding_level.direction= +			*initial_embedding_level & 1; +		stack->paragraph_embedding_level.is_explicit=1; +	} +	else +	{ +		stack->paragraph_embedding_level= +			compute_paragraph_embedding_level_from_types(types, +								     0, n); +	}  	stack->chars=chars;  	stack->orig_types=types; @@ -666,7 +674,8 @@ directional_status_stack_init(const char32_t *chars,  	stack->size=n;  	directional_status_stack_push(stack, -				      stack->paragraph_embedding_level, +				      stack->paragraph_embedding_level +				      .direction,  				      do_neutral, 0);  	return stack; @@ -736,7 +745,7 @@ void unicode_bidi_setbnl(char32_t *p,  		}  } -unicode_bidi_level_t +struct unicode_bidi_direction  unicode_bidi_calc(const char32_t *p, size_t n, unicode_bidi_level_t *bufp,  		  const unicode_bidi_level_t *initial_embedding_level)  { @@ -748,7 +757,7 @@ unicode_bidi_calc(const char32_t *p, size_t n, unicode_bidi_level_t *bufp,  	unicode_bidi_calc_types(p, n, buf); -	unicode_bidi_level_t level= +	struct unicode_bidi_direction level=  		unicode_bidi_calc_levels(p,  					 buf,  					 n, @@ -762,7 +771,7 @@ unicode_bidi_calc(const char32_t *p, size_t n, unicode_bidi_level_t *bufp,  static void unicode_bidi_cl(directional_status_stack_t stack); -unicode_bidi_level_t +struct unicode_bidi_direction  unicode_bidi_calc_levels(const char32_t *p,  			 const enum_bidi_type_t *types,  			 size_t n, @@ -779,12 +788,12 @@ unicode_bidi_calc_levels(const char32_t *p,  	stack=directional_status_stack_init(p, types, n, bufp,  					    initial_embedding_level); -	unicode_bidi_level_t paragraph_embedding_level= +	struct unicode_bidi_direction paragraph_embedding_level=  		stack->paragraph_embedding_level;  #ifdef BIDI_DEBUG  	fprintf(DEBUGDUMP, "BIDI: START: Paragraph embedding level: %d\n", -		(int)stack->paragraph_embedding_level); +		(int)paragraph_embedding_level.direction);  #endif  	unicode_bidi_cl(stack); @@ -971,7 +980,8 @@ static void unicode_bidi_cl(directional_status_stack_t stack)  			}  			cur_class=compute_paragraph_embedding_level_from_types -				(stack->types, i+1, j) == 1 +				(stack->types, i+1, j).direction +				!= UNICODE_BIDI_LR  				? UNICODE_BIDI_TYPE_RLI  				: UNICODE_BIDI_TYPE_LRI;  		} @@ -1104,7 +1114,8 @@ static void unicode_bidi_cl(directional_status_stack_t stack)  		{  			/* X8 */ -			stack->levels[i]=stack->paragraph_embedding_level; +			stack->levels[i]= +				stack->paragraph_embedding_level.direction;  		}  	} @@ -1203,9 +1214,9 @@ static void unicode_bidi_cl(directional_status_stack_t stack)  			continue; /* Edge case */  		unicode_bidi_level_t before= -			stack->paragraph_embedding_level; +			stack->paragraph_embedding_level.direction;  		unicode_bidi_level_t after= -			stack->paragraph_embedding_level; +			stack->paragraph_embedding_level.direction;  		size_t first_i=beg_iter.i; @@ -1301,11 +1312,11 @@ static void unicode_bidi_cl(directional_status_stack_t stack)  		case UNICODE_BIDI_TYPE_PDI:  			if (seen_sb)  				stack->levels[i]= -					stack->paragraph_embedding_level; +					stack->paragraph_embedding_level.direction;  			break;  		case UNICODE_BIDI_TYPE_S:  		case UNICODE_BIDI_TYPE_B: -			stack->levels[i]=stack->paragraph_embedding_level; +			stack->levels[i]=stack->paragraph_embedding_level.direction;  			seen_sb=1;  			break;  		default: | 
