Commit dceb2b75 by Vladimir Makarov Committed by Vladimir Makarov

genautomata.c (reserv_sets_hash_value): Define hash_value as set_el_t.

2002-05-21  Vladimir Makarov  <vmakarov@redhat.com>

	* genautomata.c (reserv_sets_hash_value): Define hash_value as
	set_el_t.  Transform the hash value into unsigned.
	(output_cycle_reservs): Fix bug with output of repeated `nothing'.
	(transform_3): Add code to process `(A,B)+(D,E)'.

From-SVN: r53709
parent 159d5964
2002-05-21 Vladimir Makarov <vmakarov@redhat.com>
* genautomata.c (reserv_sets_hash_value): Define hash_value as
set_el_t. Transform the hash value into unsigned.
(output_cycle_reservs): Fix bug with output of repeated `nothing'.
(transform_3): Add code to process `(A,B)+(D,E)'.
2002-05-21 NIIBE Yutaka <gniibe@m17n.org> 2002-05-21 NIIBE Yutaka <gniibe@m17n.org>
* reload1.c (do_output_reload): Run delete_output_reload * reload1.c (do_output_reload): Run delete_output_reload
......
...@@ -3391,21 +3391,34 @@ static unsigned ...@@ -3391,21 +3391,34 @@ static unsigned
reserv_sets_hash_value (reservs) reserv_sets_hash_value (reservs)
reserv_sets_t reservs; reserv_sets_t reservs;
{ {
unsigned int hash_value; set_el_t hash_value;
int reservs_num; unsigned result;
int reservs_num, i;
set_el_t *reserv_ptr; set_el_t *reserv_ptr;
hash_value = 0; hash_value = 0;
reservs_num = els_in_reservs; reservs_num = els_in_reservs;
reserv_ptr = reservs; reserv_ptr = reservs;
i = 0;
while (reservs_num != 0) while (reservs_num != 0)
{ {
reservs_num--; reservs_num--;
hash_value = ((hash_value >> (sizeof (unsigned) - 1) * CHAR_BIT) hash_value += ((*reserv_ptr >> i)
| (hash_value << CHAR_BIT)) + *reserv_ptr; | (*reserv_ptr << (sizeof (set_el_t) * CHAR_BIT - i)));
i++;
if (i == sizeof (set_el_t) * CHAR_BIT)
i = 0;
reserv_ptr++; reserv_ptr++;
} }
return hash_value; if (sizeof (set_el_t) < sizeof (unsigned))
return hash_value;
result = 0;
for (i = sizeof (set_el_t); i > 0; i -= sizeof (unsigned))
{
result += (unsigned) hash_value;
hash_value >>= sizeof (unsigned) * CHAR_BIT;
}
return result;
} }
/* Comparison of given reservation sets. */ /* Comparison of given reservation sets. */
...@@ -3638,12 +3651,10 @@ output_cycle_reservs (f, reservs, start_cycle, repetition_num) ...@@ -3638,12 +3651,10 @@ output_cycle_reservs (f, reservs, start_cycle, repetition_num)
fprintf (f, NOTHING_NAME); fprintf (f, NOTHING_NAME);
if (repetition_num <= 0) if (repetition_num <= 0)
abort (); abort ();
if (reserved_units_num != 0 && repetition_num != 1) if (reserved_units_num > 1)
{ fprintf (f, ")");
if (reserved_units_num > 1) if (repetition_num != 1)
fprintf (f, ")"); fprintf (f, "*%d", repetition_num);
fprintf (f, "*%d", repetition_num);
}
} }
/* The function outputs string representation of units reservation in /* The function outputs string representation of units reservation in
...@@ -4638,7 +4649,8 @@ transform_2 (regexp) ...@@ -4638,7 +4649,8 @@ transform_2 (regexp)
/* The function makes transformations /* The function makes transformations
...,A|B|...,C,... -> (...,A,C,...)|(...,B,C,...)|... ...,A|B|...,C,... -> (...,A,C,...)|(...,B,C,...)|...
...+(A|B|...)+C+... -> (...+A+C+...)|(...+B+C+...)|... ...+(A|B|...)+C+... -> (...+A+C+...)|(...+B+C+...)|...
...+(A,B,...)+C+... -> (...+A+C+...),B,... */ ...+(A,B,...)+C+... -> (...+A+C+...),B,...
...+(A,B,...)+(C,D,...) -> (A+C),(B+D),... */
static regexp_t static regexp_t
transform_3 (regexp) transform_3 (regexp)
regexp_t regexp; regexp_t regexp;
...@@ -4695,9 +4707,9 @@ transform_3 (regexp) ...@@ -4695,9 +4707,9 @@ transform_3 (regexp)
else if (regexp->mode == rm_allof) else if (regexp->mode == rm_allof)
{ {
regexp_t oneof, seq; regexp_t oneof, seq;
int oneof_index, seq_index; int oneof_index, max_seq_length, allof_length;
regexp_t result; regexp_t result;
regexp_t allof; regexp_t allof, allof_op;
int i, j; int i, j;
for (i = 0; i < regexp->regexp.allof.regexps_num; i++) for (i = 0; i < regexp->regexp.allof.regexps_num; i++)
...@@ -4740,42 +4752,79 @@ transform_3 (regexp) ...@@ -4740,42 +4752,79 @@ transform_3 (regexp)
regexp_transformed_p = 1; regexp_transformed_p = 1;
regexp = result; regexp = result;
} }
max_seq_length = 0;
for (i = 0; i < regexp->regexp.allof.regexps_num; i++) for (i = 0; i < regexp->regexp.allof.regexps_num; i++)
if (regexp->regexp.allof.regexps [i]->mode == rm_sequence) if (regexp->regexp.allof.regexps [i]->mode == rm_sequence)
{ {
seq_index = i;
seq = regexp->regexp.allof.regexps [i]; seq = regexp->regexp.allof.regexps [i];
if (max_seq_length < seq->regexp.sequence.regexps_num)
max_seq_length = seq->regexp.sequence.regexps_num;
}
else if (regexp->regexp.allof.regexps [i]->mode != rm_unit)
{
max_seq_length = 0;
break; break;
} }
if (i < regexp->regexp.allof.regexps_num) if (max_seq_length != 0)
{ {
if (seq->regexp.sequence.regexps_num <= 1 if (max_seq_length == 1 || regexp->regexp.allof.regexps_num <= 1)
|| regexp->regexp.allof.regexps_num <= 1)
abort (); abort ();
result = create_node (sizeof (struct regexp) result = create_node (sizeof (struct regexp)
+ sizeof (regexp_t) + sizeof (regexp_t) * (max_seq_length - 1));
* (seq->regexp.sequence.regexps_num - 1));
result->mode = rm_sequence; result->mode = rm_sequence;
result->pos = regexp->pos; result->pos = regexp->pos;
result->regexp.sequence.regexps_num result->regexp.sequence.regexps_num = max_seq_length;
= seq->regexp.sequence.regexps_num; for (i = 0; i < max_seq_length; i++)
allof = create_node (sizeof (struct regexp) {
+ sizeof (regexp_t) allof_length = 0;
* (regexp->regexp.allof.regexps_num - 1)); for (j = 0; j < regexp->regexp.allof.regexps_num; j++)
allof->mode = rm_allof; if (regexp->regexp.allof.regexps [j]->mode == rm_sequence
allof->pos = regexp->pos; && (i < (regexp->regexp.allof.regexps [j]
allof->regexp.allof.regexps_num = regexp->regexp.allof.regexps_num; ->regexp.sequence.regexps_num)))
result->regexp.sequence.regexps [0] = allof; {
for (j = 0; j < allof->regexp.allof.regexps_num; j++) allof_op = (regexp->regexp.allof.regexps [j]
if (j != seq_index) ->regexp.sequence.regexps [i]);
allof->regexp.allof.regexps [j] allof_length++;
= copy_insn_regexp (regexp->regexp.allof.regexps [j]); }
else else if (i == 0
allof->regexp.allof.regexps [j] && regexp->regexp.allof.regexps [j]->mode == rm_unit)
= copy_insn_regexp (seq->regexp.sequence.regexps [0]); {
for (i = 1; i < result->regexp.sequence.regexps_num; i++) allof_op = regexp->regexp.allof.regexps [j];
result->regexp.sequence.regexps [i] allof_length++;
= copy_insn_regexp (seq->regexp.sequence.regexps [i]); }
if (allof_length == 1)
result->regexp.sequence.regexps [i] = allof_op;
else
{
allof = create_node (sizeof (struct regexp)
+ sizeof (regexp_t)
* (allof_length - 1));
allof->mode = rm_allof;
allof->pos = regexp->pos;
allof->regexp.allof.regexps_num = allof_length;
result->regexp.sequence.regexps [i] = allof;
allof_length = 0;
for (j = 0; j < regexp->regexp.allof.regexps_num; j++)
if (regexp->regexp.allof.regexps [j]->mode == rm_sequence
&& (i < (regexp->regexp.allof.regexps [j]
->regexp.sequence.regexps_num)))
{
allof_op = (regexp->regexp.allof.regexps [j]
->regexp.sequence.regexps [i]);
allof->regexp.allof.regexps [allof_length] = allof_op;
allof_length++;
}
else if (i == 0
&& (regexp->regexp.allof.regexps [j]->mode
== rm_unit))
{
allof_op = regexp->regexp.allof.regexps [j];
allof->regexp.allof.regexps [allof_length] = allof_op;
allof_length++;
}
}
}
regexp_transformed_p = 1; regexp_transformed_p = 1;
regexp = result; regexp = result;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment