ref: 1e65f096bbff9993fedc691c440837d20737a8a3
parent: 002f248ade44e83258b36bd0bd1bc2e3605dcc7a
author: Ali Gholami Rudi <ali@rudi.ir>
date: Fri Mar 2 07:12:55 EST 2018
cp: support \$^ Suggested and tested by aksr <aksr@t-com.me>.
--- a/cp.c
+++ b/cp.c
@@ -85,6 +85,27 @@
in_push(num_getfmt(regid()), NULL);
}
+/* interpolate \$*, \$@, and \$^ */
+static void cp_args(int quote, int escape)
+{
+ struct sbuf sb;
+ char *s;
+ int i;
+ sbuf_init(&sb);
+ for (i = 1; i <= in_nargs(); i++) {
+ sbuf_append(&sb, i > 1 ? " " : "");
+ sbuf_append(&sb, quote ? "\"" : "");
+ s = in_arg(i);
+ while (*s) {
+ sbuf_append(&sb, escape && *s == '"' ? "\"" : "");
+ sbuf_add(&sb, (unsigned char) *s++);
+ }
+ sbuf_append(&sb, quote ? "\"" : "");
+ }
+ in_push(sbuf_buf(&sb), NULL);
+ sbuf_done(&sb);
+}
+
/* interpolate \$1 */
static void cp_arg(void)
{
@@ -92,6 +113,18 @@
char *arg = NULL;
int argnum;
cparg(argname, sizeof(argname));
+ if (!strcmp("@", argname)) {
+ cp_args(1, 0);
+ return;
+ }
+ if (!strcmp("*", argname)) {
+ cp_args(0, 0);
+ return;
+ }
+ if (!strcmp("^", argname)) {
+ cp_args(1, 1);
+ return;
+ }
argnum = atoi(argname);
if (argnum > 0 && argnum < NARGS + 1)
arg = in_arg(argnum);