summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/slibtool/slibtool.h1
-rw-r--r--src/internal/slibtool_driver_impl.h2
-rw-r--r--src/logic/slbt_exec_ctx.c38
3 files changed, 41 insertions, 0 deletions
diff --git a/include/slibtool/slibtool.h b/include/slibtool/slibtool.h
index 18fdc30..2335ae5 100644
--- a/include/slibtool/slibtool.h
+++ b/include/slibtool/slibtool.h
@@ -272,6 +272,7 @@ slbt_api int slbt_set_driver_fdctx (struct slbt_driver_ctx *, const struct
/* execution context api */
slbt_api int slbt_get_exec_ctx (const struct slbt_driver_ctx *, struct slbt_exec_ctx **);
slbt_api void slbt_free_exec_ctx (struct slbt_exec_ctx *);
+slbt_api void slbt_reset_argvector (struct slbt_exec_ctx *);
slbt_api void slbt_reset_arguments (struct slbt_exec_ctx *);
slbt_api void slbt_reset_placeholders (struct slbt_exec_ctx *);
slbt_api void slbt_disable_placeholders (struct slbt_exec_ctx *);
diff --git a/src/internal/slibtool_driver_impl.h b/src/internal/slibtool_driver_impl.h
index 415e99a..69b3675 100644
--- a/src/internal/slibtool_driver_impl.h
+++ b/src/internal/slibtool_driver_impl.h
@@ -119,6 +119,8 @@ struct slbt_exec_ctx_impl {
size_t size;
struct slbt_exec_ctx ctx;
int fdwrapper;
+ char ** lout[2];
+ char ** mout[2];
char * vbuffer[];
};
diff --git a/src/logic/slbt_exec_ctx.c b/src/logic/slbt_exec_ctx.c
index baddab7..256e941 100644
--- a/src/logic/slbt_exec_ctx.c
+++ b/src/logic/slbt_exec_ctx.c
@@ -143,6 +143,8 @@ int slbt_get_exec_ctx(
{
struct slbt_exec_ctx_impl * ictx;
char ** parg;
+ char ** src;
+ char ** dst;
char * ch;
char * mark;
const char * dmark;
@@ -458,6 +460,19 @@ int slbt_get_exec_ctx(
/* argument strings shadow copy */
memcpy(ictx->shadow,ictx->args,ictx->size);
+ /* compile mode: argument vector shadow copy */
+ if (dctx->cctx->mode == SLBT_MODE_COMPILE)
+ for (src=ictx->ctx.argv, dst=ictx->ctx.xargv; *src; src++, dst++)
+ *dst = *src;
+
+ /* save the full vector's lout, mout */
+ ictx->lout[0] = ictx->ctx.lout[0];
+ ictx->lout[1] = ictx->ctx.lout[1];
+
+ ictx->mout[0] = ictx->ctx.mout[0];
+ ictx->mout[1] = ictx->ctx.mout[1];
+
+ /* all done */
*ectx = &ictx->ctx;
return 0;
}
@@ -502,6 +517,29 @@ void slbt_reset_arguments(struct slbt_exec_ctx * ectx)
}
+void slbt_reset_argvector(struct slbt_exec_ctx * ectx)
+{
+ struct slbt_exec_ctx_impl * ictx;
+ uintptr_t addr;
+ char ** src;
+ char ** dst;
+
+ addr = (uintptr_t)ectx - offsetof(struct slbt_exec_ctx_impl,ctx);
+ ictx = (struct slbt_exec_ctx_impl *)addr;
+
+ for (src=ectx->xargv, dst=ectx->argv; *src; src++, dst++)
+ *dst = *src;
+
+ *dst = 0;
+
+ ectx->lout[0] = ictx->lout[0];
+ ectx->lout[1] = ictx->lout[1];
+
+ ectx->mout[0] = ictx->mout[0];
+ ectx->mout[1] = ictx->mout[1];
+}
+
+
void slbt_reset_placeholders(struct slbt_exec_ctx * ectx)
{
*ectx->dpic = "-USLIBTOOL_PLACEHOLDER_DPIC";