| 1150 | |
| 1151 | /* Calculate the union set of the sets SRC1 and SRC2. And store it to |
| 1152 | DEST. Return value indicate the error code or REG_NOERROR if succeeded. */ |
| 1153 | |
| 1154 | static reg_errcode_t |
| 1155 | internal_function |
| 1156 | re_node_set_init_union (re_node_set *dest, const re_node_set *src1, |
| 1157 | const re_node_set *src2) |
| 1158 | { |
| 1159 | int i1, i2, id; |
| 1160 | if (src1 != NULL && src1->nelem > 0 && src2 != NULL && src2->nelem > 0) |
| 1161 | { |
| 1162 | dest->alloc = src1->nelem + src2->nelem; |
| 1163 | dest->elems = re_malloc (int, dest->alloc); |
| 1164 | if (BE (dest->elems == NULL, 0)) |
| 1165 | return REG_ESPACE; |
| 1166 | } |
| 1167 | else |
| 1168 | { |
| 1169 | if (src1 != NULL && src1->nelem > 0) |
| 1170 | return re_node_set_init_copy (dest, src1); |
| 1171 | else if (src2 != NULL && src2->nelem > 0) |
| 1172 | return re_node_set_init_copy (dest, src2); |
| 1173 | else |
| 1174 | re_node_set_init_empty (dest); |
| 1175 | return REG_NOERROR; |
| 1176 | } |
| 1177 | for (i1 = i2 = id = 0 ; i1 < src1->nelem && i2 < src2->nelem ;) |
| 1178 | { |
| 1179 | if (src1->elems[i1] > src2->elems[i2]) |
| 1180 | { |
| 1181 | dest->elems[id++] = src2->elems[i2++]; |
| 1182 | continue; |
| 1183 | } |
| 1184 | if (src1->elems[i1] == src2->elems[i2]) |
| 1185 | ++i2; |
| 1186 | dest->elems[id++] = src1->elems[i1++]; |
| 1187 | } |
| 1188 | if (i1 < src1->nelem) |
| 1189 | { |
| 1190 | memcpy (dest->elems + id, src1->elems + i1, |
| 1191 | (src1->nelem - i1) * sizeof (int)); |
| 1192 | id += src1->nelem - i1; |
| 1193 | } |
| 1194 | else if (i2 < src2->nelem) |
| 1195 | { |
| 1196 | memcpy (dest->elems + id, src2->elems + i2, |
| 1197 | (src2->nelem - i2) * sizeof (int)); |
| 1198 | id += src2->nelem - i2; |
| 1199 | } |
| 1200 | dest->nelem = id; |
| 1201 | return REG_NOERROR; |
| 1202 | } |
| 1203 |
no test coverage detected