blob: eb772e47b1e9c92c74e9128b219b35acd18a5c90 (
plain) (
blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
/* See LICENSE file for copyright and license details. */
#include "common.h"
int
libautomata_clone_automaton(const struct libautomata_automaton *automaton, struct libautomata_automaton *clone)
{
clone->nnodes = 0;
if (libautomata_grow_automaton(clone, automaton->nnodes))
goto fail;
for (clone->nnodes = 0; clone->nnodes < automaton->nnodes; clone->nnodes++) {
if (automaton->nodes[clone->nnodes].clone) {
if ((*automaton->nodes[clone->nnodes].clone)(&automaton->nodes[clone->nnodes],
&clone->nodes[clone->nnodes]))
goto fail;
} else {
clone->nodes[clone->nnodes] = automaton->nodes[clone->nnodes];
}
}
clone->start = &clone->nodes[automaton->start->index];
clone->current = &clone->nodes[automaton->current->index];
return 0;
fail:
libautomata_destroy_automaton(clone);
return -1;
}
|