Hi,
`cut -a ARRAY ...` puts its last line of output in ARRAY[0] and discards any
other elements ARRAY used to have. I tried 3 alternatives:
Alternative A: put last line of output in ARRAY[0] but preserve any other
elements.
Alternative B: empty out the array then put lines of output in successive array
elements.
Alternative C: apply patch A and then patch B so lines are put in successive
elements but if there are less lines than there were elements originally then
preserve those that weren't overwritten.
I have no feeling for which is the most useful, but in any case help should say
what -a does.
Patches are against version 5.3.0(1)-rc2[dbe4256d].
patch-B is not signal-safe, it was just a quick test. arrayind_t ind needs to be
external and zeroed out in the main reading loop.
Cheers ... Duncan.
diff --git a/builtins/common.c b/builtins/common.c
index a681cee4..4628c44f 100644
--- a/builtins/common.c
+++ b/builtins/common.c
@@ -1008,7 +1008,7 @@ builtin_find_indexed_array (char *array_name, int flags)
else if (invisible_p (entry))
VUNSETATTR (entry, att_invisible); /* no longer invisible */
- if (flags & 1)
+ if ((flags & 5) == 1)
array_flush (array_cell (entry));
return entry;
diff --git a/examples/loadables/cut.c b/examples/loadables/cut.c
index b3b8a477..dd0c2c4b 100644
--- a/examples/loadables/cut.c
+++ b/examples/loadables/cut.c
@@ -518,7 +518,7 @@ cut_internal (int which, WORD_LIST *list)
#if defined (ARRAY_VARS)
if (array_name)
{
- v = builtin_find_indexed_array (array_name, 1);
+ v = builtin_find_indexed_array (array_name, 5);
if (v == 0)
{
free (poslist);
@@ -561,7 +561,7 @@ lcut_builtin (WORD_LIST *list)
int
cut_builtin (WORD_LIST *list)
{
- return (cut_internal (1, list));
+ return (cut_internal (5, list));
}
char *lcut_doc[] = {
diff --git a/examples/loadables/cut.c b/examples/loadables/cut.c
index b3b8a477..a7f6024c 100644
--- a/examples/loadables/cut.c
+++ b/examples/loadables/cut.c
@@ -60,6 +60,8 @@ struct cutop
struct cutpos *poslist;
};
+static arrayind_t ind;
+
static int
poscmp (const void *a, const void *b)
{
@@ -145,7 +147,6 @@ getlist (char *arg, struct cutpos **opp)
static int
cutbytes (SHELL_VAR *v, char *line, struct cutop *ops)
{
- arrayind_t ind;
char *buf, *bmap;
size_t llen;
int i, b, n, s, e;
@@ -177,7 +178,6 @@ cutbytes (SHELL_VAR *v, char *line, struct cutop *ops)
if (v)
{
- ind = 0;
#if defined (ARRAY_VARS)
bind_array_element (v, ind, buf, 0);
#endif
@@ -195,7 +195,6 @@ cutbytes (SHELL_VAR *v, char *line, struct cutop *ops)
static int
cutchars (SHELL_VAR *v, char *line, struct cutop *ops)
{
- arrayind_t ind;
char *buf, *bmap;
wchar_t *wbuf, *wb2;
size_t llen, wlen;
@@ -247,7 +246,6 @@ cutchars (SHELL_VAR *v, char *line, struct cutop *ops)
if (v)
{
- ind = 0;
#if defined (ARRAY_VARS)
bind_array_element (v, ind, buf, 0);
#endif
@@ -269,12 +267,10 @@ cutchars (SHELL_VAR *v, char *line, struct cutop *ops)
static int
cutfields (SHELL_VAR *v, char *line, struct cutop *ops)
{
- arrayind_t ind;
char *buf, *bmap, *field, **fields, delim[2];
size_t llen, fsize;
int i, b, n, s, e, nf;
- ind = 0;
delim[0] = ops->delim;
delim[1] = '\0';
@@ -436,6 +432,7 @@ cut_internal (int which, WORD_LIST *list)
struct cutpos *poslist;
v = 0;
+ ind = 0;
rval = EXECUTION_SUCCESS;
cutflags = 0;