+struct icu_chain_step *icu_chain_step_clone(struct icu_chain_step *old)
+{
+ struct icu_chain_step *step = 0;
+ struct icu_chain_step **sp = &step;
+ while (old)
+ {
+ *sp = (struct icu_chain_step *) xmalloc(sizeof(**sp));
+ (*sp)->type = old->type;
+
+ switch ((*sp)->type)
+ {
+ case ICU_chain_step_type_display:
+ break;
+ case ICU_chain_step_type_casemap:
+ (*sp)->u.casemap = icu_casemap_clone(old->u.casemap);
+ break;
+ case ICU_chain_step_type_transform:
+ case ICU_chain_step_type_transliterate:
+ (*sp)->u.transform = icu_transform_clone(old->u.transform);
+ break;
+ case ICU_chain_step_type_tokenize:
+ (*sp)->u.tokenizer = icu_tokenizer_clone(old->u.tokenizer);
+ break;
+ case YAZ_chain_step_type_stemming:
+ (*sp)->u.stemmer = yaz_stemmer_clone(old->u.stemmer);
+ break;
+ case ICU_chain_step_type_none:
+ break;
+ }
+ old = old->previous;
+ sp = &(*sp)->previous;
+ }
+ *sp = 0;
+ return step;
+}
+