From c2908c37bbf44029fbe9ec9f0f2efdedc42b62a9 Mon Sep 17 00:00:00 2001 From: Daniel Holden Date: Sat, 20 Feb 2016 14:44:08 +0000 Subject: [PATCH] Added copy function --- README.md | 10 ++++++++++ mpc.c | 12 ++++++++++++ mpc.h | 1 + 3 files changed, 23 insertions(+) diff --git a/README.md b/README.md index 120ac94..b918603 100644 --- a/README.md +++ b/README.md @@ -530,6 +530,16 @@ void mpc_cleanup(int n, ...); To ease the task of undefining and then deleting parsers `mpc_cleanup` can be used. It takes `n` parsers as input, and undefines them all, before deleting them all. +* * * + +```c +mpc_parser_t *mpc_copy(mpc_parser_t *a); +``` + +This function makes a copy of a parser `a`. This can be useful when you want to +use a parser as input for some other parsers multiple times without retaining +it. + Library Reference ================= diff --git a/mpc.c b/mpc.c index a8e7f0a..cc0267a 100644 --- a/mpc.c +++ b/mpc.c @@ -1364,6 +1364,18 @@ mpc_parser_t *mpc_new(const char *name) { return p; } +mpc_parser_t *mpc_copy(mpc_parser_t *a) { + mpc_parser_t *p = mpc_undefined(); + p->retained = a->retained; + p->type = a->type; + p->data = a->data; + if (a->name) { + p->name = malloc(strlen(a->name)+1); + strcpy(p->name, a->name); + } + return p; +} + mpc_parser_t *mpc_undefine(mpc_parser_t *p) { mpc_undefine_unretained(p, 1); p->type = MPC_TYPE_UNDEFINED; diff --git a/mpc.h b/mpc.h index a408d09..a9d8a72 100644 --- a/mpc.h +++ b/mpc.h @@ -81,6 +81,7 @@ typedef mpc_val_t*(*mpc_fold_t)(int,mpc_val_t**); */ mpc_parser_t *mpc_new(const char *name); +mpc_parser_t *mpc_copy(mpc_parser_t *a); mpc_parser_t *mpc_define(mpc_parser_t *p, mpc_parser_t *a); mpc_parser_t *mpc_undefine(mpc_parser_t *p);