aboutsummaryrefslogtreecommitdiffstats
path: root/libautomata_clone_automaton.c
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;
}