MCPcopy Create free account
hub / github.com/git/git / re_node_set_init_union

Function re_node_set_init_union

compat/regex/regex_internal.c:1152–1200  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

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
1154static reg_errcode_t
1155internal_function
1156re_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

Callers 4

merge_state_arrayFunction · 0.85
merge_state_with_logFunction · 0.85
internal_functionFunction · 0.85
transit_state_bkrefFunction · 0.85

Calls 1

re_node_set_init_copyFunction · 0.85

Tested by

no test coverage detected