unset iterate; truncate DSL function

This commit is contained in:
John Kerl 2020-10-26 17:14:39 -04:00
parent bd1f58f29c
commit aff21172d5
16 changed files with 322 additions and 108 deletions

View file

@ -241,6 +241,7 @@ static function_lookup_t FUNCTION_LOOKUP_TABLE[] = {
"inclusive. Negative indices -len .. -1 alias to 0 .. len-1."},
{FUNC_CLASS_STRING, "tolower", 1,0, "Convert string to lowercase."},
{FUNC_CLASS_STRING, "toupper", 1,0, "Convert string to uppercase."},
{FUNC_CLASS_STRING, "truncate", 2,0, "Truncates string first argument to max length of int second argument."},
{FUNC_CLASS_STRING, "capitalize", 1,0, "Convert string's first character to uppercase."},
{FUNC_CLASS_STRING, "lstrip", 1,0, "Strip leading whitespace from string."},
{FUNC_CLASS_STRING, "rstrip", 1,0, "Strip trailing whitespace from string."},
@ -1288,6 +1289,7 @@ static rval_evaluator_t* fmgr_alloc_evaluator_from_binary_func_name(char* fnnm,
} else if (streq(fnnm, "strptime")) { return rval_evaluator_alloc_from_x_ss_func(i_ss_strptime_func, parg1, parg2);
} else if (streq(fnnm, "strptime_local")) { return rval_evaluator_alloc_from_x_ss_func(i_ss_strptime_local_func, parg1, parg2);
} else if (streq(fnnm, "urandrange")) { return rval_evaluator_alloc_from_f_ff_func(f_ff_urandrange_func, parg1, parg2);
} else if (streq(fnnm, "truncate")) { return rval_evaluator_alloc_from_s_si_func(s_si_truncate_func, parg1, parg2);
} else { return NULL; }
}

View file

@ -136,6 +136,11 @@ rval_evaluator_t* rval_evaluator_alloc_from_f_s_func(mv_unary_func_t* pfunc, rva
rval_evaluator_t* rval_evaluator_alloc_from_i_s_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1);
rval_evaluator_t* rval_evaluator_alloc_from_x_x_func(mv_unary_func_t* pfunc, rval_evaluator_t* parg1);
rval_evaluator_t* rval_evaluator_alloc_from_s_si_func(
mv_binary_func_t* pfunc,
rval_evaluator_t* parg1,
rval_evaluator_t* parg2);
rval_evaluator_t* rval_evaluator_alloc_from_x_xi_func(
mv_binary_func_t* pfunc,
rval_evaluator_t* parg1,

View file

@ -978,6 +978,52 @@ rval_evaluator_t* rval_evaluator_alloc_from_x_xi_func(mv_binary_func_t* pfunc,
return pevaluator;
}
// ----------------------------------------------------------------
typedef struct _rval_evaluator_s_si_state_t {
mv_binary_func_t* pfunc;
rval_evaluator_t* parg1;
rval_evaluator_t* parg2;
} rval_evaluator_s_si_state_t;
static mv_t rval_evaluator_s_si_func(void* pvstate, variables_t* pvars) {
rval_evaluator_s_si_state_t* pstate = pvstate;
mv_t val1 = pstate->parg1->pprocess_func(pstate->parg1->pvstate, pvars);
mv_t val2 = pstate->parg2->pprocess_func(pstate->parg2->pvstate, pvars);
if (val1.type != MT_EMPTY && val1.type != MT_STRING) {
return mv_error();
}
if (val2.type != MT_INT) {
return mv_error();
}
// nullity of 1st argument handled by full disposition matrices
return pstate->pfunc(&val1, &val2);
}
static void rval_evaluator_s_si_free(rval_evaluator_t* pevaluator) {
rval_evaluator_s_si_state_t* pstate = pevaluator->pvstate;
pstate->parg1->pfree_func(pstate->parg1);
pstate->parg2->pfree_func(pstate->parg2);
free(pstate);
free(pevaluator);
}
rval_evaluator_t* rval_evaluator_alloc_from_s_si_func(mv_binary_func_t* pfunc,
rval_evaluator_t* parg1, rval_evaluator_t* parg2)
{
rval_evaluator_s_si_state_t* pstate = mlr_malloc_or_die(sizeof(rval_evaluator_s_si_state_t));
pstate->pfunc = pfunc;
pstate->parg1 = parg1;
pstate->parg2 = parg2;
rval_evaluator_t* pevaluator = mlr_malloc_or_die(sizeof(rval_evaluator_t));
pevaluator->pvstate = pstate;
pevaluator->pprocess_func = rval_evaluator_s_si_func;
pevaluator->pfree_func = rval_evaluator_s_si_free;
return pevaluator;
}
// ----------------------------------------------------------------
typedef struct _rval_evaluator_x_ns_state_t {
mv_binary_func_t* pfunc;

View file

@ -490,6 +490,23 @@ mv_t s_s_system_func(mv_t* pval1) {
return retval;
}
mv_t s_si_truncate_func(mv_t* pval1, mv_t* pval2) {
char* string = pval1->u.strv;
int len = strlen(string);
int maxlen = pval2->u.intv;
if (len <= maxlen) {
return *pval1;
} else {
char* buf = mlr_malloc_or_die(maxlen+1);
strncpy(buf, string, maxlen);
buf[len] = 0;
mv_free(pval1);
pval1->u.strv = NULL;
return mv_from_string_with_free(buf);
}
}
// ----------------------------------------------------------------
mv_t s_s_lstrip_func(mv_t* pval1) {
if (!isspace(pval1->u.strv[0])) {

View file

@ -215,6 +215,8 @@ mv_t s_s_clean_whitespace_func(mv_t* pval1);
mv_t s_s_system_func(mv_t* pval1);
mv_t s_si_truncate_func(mv_t* pval1, mv_t* pval2);
mv_t s_xx_dot_func(mv_t* pval1, mv_t* pval2);
mv_t sub_no_precomp_func(mv_t* pval1, mv_t* pval2, mv_t* pval3);

View file

@ -10619,7 +10619,7 @@ x_p100 10
================================================================
IN-PLACE PROCESSING
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533
a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797
a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776
@ -10631,7 +10631,7 @@ a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006
a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059
a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533
a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797
a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776
@ -10643,14 +10643,14 @@ a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006
a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059
a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864
mlr -I --opprint head -n 2 /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1 /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
mlr -I --opprint head -n 2 /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1 /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
a b i x y
pan pan 1 0.3467901443380824 0.7268028627434533
eks pan 2 0.7586799647899636 0.5221511083334797
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
a b i x y
pan pan 1 0.3467901443380824 0.7268028627434533
eks pan 2 0.7586799647899636 0.5221511083334797
@ -10658,10 +10658,10 @@ eks pan 2 0.7586799647899636 0.5221511083334797
mlr -I --opprint head -n 2
mlr: -I option (in-place operation) requires input files.
mlr -I --opprint -n head -n 2 /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
mlr -I --opprint -n head -n 2 /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
mlr: -I option (in-place operation) requires input files.
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533
a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797
a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776
@ -10673,7 +10673,7 @@ a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006
a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059
a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
a=pan,b=pan,i=1,x=0.3467901443380824,y=0.7268028627434533
a=eks,b=pan,i=2,x=0.7586799647899636,y=0.5221511083334797
a=wye,b=wye,i=3,x=0.20460330576630303,y=0.33831852551664776
@ -10685,9 +10685,9 @@ a=zee,b=wye,i=8,x=0.5985540091064224,y=0.976181385699006
a=hat,b=wye,i=9,x=0.03144187646093577,y=0.7495507603507059
a=pan,b=wye,i=10,x=0.5026260055412137,y=0.9526183602969864
mlr -I --opprint rename a,AYE,b,BEE /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1 /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
mlr -I --opprint rename a,AYE,b,BEE /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1 /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp1
AYE BEE i x y
pan pan 1 0.3467901443380824 0.7268028627434533
eks pan 2 0.7586799647899636 0.5221511083334797
@ -10700,7 +10700,7 @@ zee wye 8 0.5985540091064224 0.976181385699006
hat wye 9 0.03144187646093577 0.7495507603507059
pan wye 10 0.5026260055412137 0.9526183602969864
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/abixy.temp2
AYE BEE i x y
pan pan 1 0.3467901443380824 0.7268028627434533
eks pan 2 0.7586799647899636 0.5221511083334797
@ -22947,6 +22947,46 @@ s3 10
s4 9
================================================================
TRUNCATE
mlr put $y=truncate($x, 0)
x=abcd,y=
mlr put $y=truncate($x, 1)
x=abcd,y=a
mlr put $y=truncate($x, 2)
x=abcd,y=ab
mlr put $y=truncate($x, 3)
x=abcd,y=abc
mlr put $y=truncate($x, 4)
x=abcd,y=abcd
mlr put $y=truncate($x, 5)
x=abcd,y=abcd
mlr put $y=truncate($x, 0)
x=abcdefgh,y=
mlr put $y=truncate($x, 1)
x=abcdefgh,y=a
mlr put $y=truncate($x, 2)
x=abcdefgh,y=ab
mlr put $y=truncate($x, 3)
x=abcdefgh,y=abc
mlr put $y=truncate($x, 4)
x=abcdefgh,y=abcd
mlr put $y=truncate($x, 5)
x=abcdefgh,y=abcde
================================================================
STATS1/STEP INT/FLOAT
@ -53430,7 +53470,7 @@ c 6
mlr termcvt --lf2crlf
---------------------------------------------------------------- input comments1-crlf.dkvp
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.dkvp
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.dkvp
# hello world 1
a=1,b=2,c=3
a=4,b=5,c=6
@ -53446,7 +53486,7 @@ a 4
b 5
c 6
mlr --skip-comments --idkvp --oxtab cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.dkvp
mlr --skip-comments --idkvp --oxtab cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.dkvp
a 1
b 2
c 3
@ -53467,7 +53507,7 @@ a 4
b 5
c 6
mlr --pass-comments --idkvp --oxtab cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.dkvp
mlr --pass-comments --idkvp --oxtab cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.dkvp
# hello world 1
a 1
b 2
@ -53782,7 +53822,7 @@ mlr --pass-comments --inidx --oxtab cat ./reg_test/input/comments/comments3.nidx
mlr termcvt --lf2crlf
---------------------------------------------------------------- input comments1-crlf.nidx
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.nidx
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.nidx
# hello world 1
aX1 bX2 cX3
aX4 bX5 cX6
@ -53798,7 +53838,7 @@ mlr --skip-comments --inidx --oxtab cat
2 bX5
3 cX6
mlr --skip-comments --inidx --oxtab cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.nidx
mlr --skip-comments --inidx --oxtab cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.nidx
1 aX1
2 bX2
3 cX3
@ -53819,7 +53859,7 @@ mlr --pass-comments --inidx --oxtab cat
2 bX5
3 cX6
mlr --pass-comments --inidx --oxtab cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.nidx
mlr --pass-comments --inidx --oxtab cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.nidx
# hello world 1
1 aX1
2 bX2
@ -53923,7 +53963,7 @@ a=4,b=5,c=6
mlr termcvt --lf2crlf
---------------------------------------------------------------- input comments1-crlf.json
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.json
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.json
# hello world 1
{ "a":1, "b":2, "c":3 }
{ "a":4, "b":5, "c":6 }
@ -53934,7 +53974,7 @@ mlr --skip-comments --ijson --odkvp cat
a=1,b=2,c=3
a=4,b=5,c=6
mlr --skip-comments --ijson --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.json
mlr --skip-comments --ijson --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.json
a=1,b=2,c=3
a=4,b=5,c=6
@ -53945,7 +53985,7 @@ mlr --pass-comments --ijson --odkvp cat
a=1,b=2,c=3
a=4,b=5,c=6
mlr --pass-comments --ijson --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.json
mlr --pass-comments --ijson --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.json
# hello world 1
a=1,b=2,c=3
a=4,b=5,c=6
@ -54042,7 +54082,7 @@ x=2,z=5
mlr termcvt --lf2crlf
---------------------------------------------------------------- input comments1-crlf.xtab
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.xtab
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.xtab
x 1
#hello world3
z 3
@ -54058,7 +54098,7 @@ mlr --skip-comments --ixtab --odkvp cat
x=1,z=3
x=2,z=5
mlr --skip-comments --ixtab --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.xtab
mlr --skip-comments --ixtab --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.xtab
x=1,z=3
x=2,z=5
@ -54070,7 +54110,7 @@ x=1,z=3
#hello world4
x=2,z=5
mlr --pass-comments --ixtab --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.xtab
mlr --pass-comments --ixtab --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.xtab
#hello world3
x=1,z=3
#hello world4
@ -54152,7 +54192,7 @@ a=4,b=5,c=6
mlr termcvt --lf2crlf
---------------------------------------------------------------- input comments1-crlf.csv
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
# hello
a,b,c
1,2,3
@ -54164,7 +54204,7 @@ mlr --skip-comments --icsvlite --odkvp cat
a=1,b=2,c=3
a=4,b=5,c=6
mlr --skip-comments --icsvlite --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
mlr --skip-comments --icsvlite --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
a=1,b=2,c=3
a=4,b=5,c=6
@ -54175,7 +54215,7 @@ mlr --pass-comments --icsvlite --odkvp cat
a=1,b=2,c=3
a=4,b=5,c=6
mlr --pass-comments --icsvlite --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
mlr --pass-comments --icsvlite --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
# hello
a=1,b=2,c=3
a=4,b=5,c=6
@ -54256,7 +54296,7 @@ a=4,b=5,c=6
mlr termcvt --lf2crlf
---------------------------------------------------------------- input comments1-crlf.csv
cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
# hello
a,b,c
1,2,3
@ -54268,7 +54308,7 @@ mlr --skip-comments --icsv --odkvp cat
a=1,b=2,c=3
a=4,b=5,c=6
mlr --skip-comments --icsv --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
mlr --skip-comments --icsv --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
a=1,b=2,c=3
a=4,b=5,c=6
@ -54279,7 +54319,7 @@ mlr --pass-comments --icsv --odkvp cat
a=1,b=2,c=3
a=4,b=5,c=6
mlr --pass-comments --icsv --odkvp cat /Users/johnkerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
mlr --pass-comments --icsv --odkvp cat /Users/kerl/pub_http_internet/miller-releases/miller-head/c/output-regtest/comments1-crlf.csv
# hello
a=1,b=2,c=3
a=4,b=5,c=6

View file

@ -1948,6 +1948,16 @@ announce UTF-8 STRLEN
run_mlr --inidx --ifs comma --oxtab put '$s1=strlen($1);$s2=strlen($2);$s3=strlen($3);$s4=strlen($4)' $indir/utf8-align.dkvp
# ----------------------------------------------------------------
announce TRUNCATE
for n in 0 1 2 3 4 5; do
echo "x=abcd" | run_mlr put '$y=truncate($x, '$n')'
done
for n in 0 1 2 3 4 5; do
echo "x=abcdefgh" | run_mlr put '$y=truncate($x, '$n')'
done
# ----------------------------------------------------------------
announce STATS1/STEP INT/FLOAT

View file

@ -145,22 +145,23 @@ This is simply a copy of what you should see on running **man mlr** at a command
FUNCTION LIST
+ + - - * / // .+ .+ .- .- .* ./ .// % ** | ^ & ~ << >> bitcount == != =~ !=~
> >= < <= && || ^^ ! ? : . gsub regextract regextract_or_else strlen sub ssub
substr tolower toupper capitalize lstrip rstrip strip collapse_whitespace
clean_whitespace system abs acos acosh asin asinh atan atan2 atanh cbrt ceil
cos cosh erf erfc exp expm1 floor invqnorm log log10 log1p logifit madd max
mexp min mmul msub pow qnorm round roundm sgn sin sinh sqrt tan tanh urand
urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms fsec2hms gmt2sec
localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt sec2gmtdate
sec2localtime sec2localtime sec2localdate sec2hms strftime strftime_local
strptime strptime_local systime is_absent is_bool is_boolean is_empty
is_empty_map is_float is_int is_map is_nonempty_map is_not_empty is_not_map
is_not_null is_null is_numeric is_present is_string asserting_absent
asserting_bool asserting_boolean asserting_empty asserting_empty_map
asserting_float asserting_int asserting_map asserting_nonempty_map
asserting_not_empty asserting_not_map asserting_not_null asserting_null
asserting_numeric asserting_present asserting_string boolean float fmtnum
hexfmt int string typeof depth haskey joink joinkv joinv leafcount length
mapdiff mapexcept mapselect mapsum splitkv splitkvx splitnv splitnvx
substr tolower toupper truncate capitalize lstrip rstrip strip
collapse_whitespace clean_whitespace system abs acos acosh asin asinh atan
atan2 atanh cbrt ceil cos cosh erf erfc exp expm1 floor invqnorm log log10
log1p logifit madd max mexp min mmul msub pow qnorm round roundm sgn sin sinh
sqrt tan tanh urand urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms
fsec2hms gmt2sec localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt
sec2gmtdate sec2localtime sec2localtime sec2localdate sec2hms strftime
strftime_local strptime strptime_local systime is_absent is_bool is_boolean
is_empty is_empty_map is_float is_int is_map is_nonempty_map is_not_empty
is_not_map is_not_null is_null is_numeric is_present is_string
asserting_absent asserting_bool asserting_boolean asserting_empty
asserting_empty_map asserting_float asserting_int asserting_map
asserting_nonempty_map asserting_not_empty asserting_not_map
asserting_not_null asserting_null asserting_numeric asserting_present
asserting_string boolean float fmtnum hexfmt int string typeof depth haskey
joink joinkv joinv leafcount length mapdiff mapexcept mapselect mapsum splitkv
splitkvx splitnv splitnvx
Please use "mlr --help-function {function name}" for function-specific help.
@ -1568,6 +1569,9 @@ This is simply a copy of what you should see on running **man mlr** at a command
toupper
(class=string #args=1): Convert string to uppercase.
truncate
(class=string #args=2): Truncates string first argument to max length of int second argument.
capitalize
(class=string #args=1): Convert string's first character to uppercase.
@ -2366,4 +2370,4 @@ This is simply a copy of what you should see on running **man mlr** at a command
2020-10-07 MILLER(1)
2020-10-26 MILLER(1)

View file

@ -135,22 +135,23 @@ OPTIONS
FUNCTION LIST
+ + - - * / // .+ .+ .- .- .* ./ .// % ** | ^ & ~ << >> bitcount == != =~ !=~
> >= < <= && || ^^ ! ? : . gsub regextract regextract_or_else strlen sub ssub
substr tolower toupper capitalize lstrip rstrip strip collapse_whitespace
clean_whitespace system abs acos acosh asin asinh atan atan2 atanh cbrt ceil
cos cosh erf erfc exp expm1 floor invqnorm log log10 log1p logifit madd max
mexp min mmul msub pow qnorm round roundm sgn sin sinh sqrt tan tanh urand
urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms fsec2hms gmt2sec
localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt sec2gmtdate
sec2localtime sec2localtime sec2localdate sec2hms strftime strftime_local
strptime strptime_local systime is_absent is_bool is_boolean is_empty
is_empty_map is_float is_int is_map is_nonempty_map is_not_empty is_not_map
is_not_null is_null is_numeric is_present is_string asserting_absent
asserting_bool asserting_boolean asserting_empty asserting_empty_map
asserting_float asserting_int asserting_map asserting_nonempty_map
asserting_not_empty asserting_not_map asserting_not_null asserting_null
asserting_numeric asserting_present asserting_string boolean float fmtnum
hexfmt int string typeof depth haskey joink joinkv joinv leafcount length
mapdiff mapexcept mapselect mapsum splitkv splitkvx splitnv splitnvx
substr tolower toupper truncate capitalize lstrip rstrip strip
collapse_whitespace clean_whitespace system abs acos acosh asin asinh atan
atan2 atanh cbrt ceil cos cosh erf erfc exp expm1 floor invqnorm log log10
log1p logifit madd max mexp min mmul msub pow qnorm round roundm sgn sin sinh
sqrt tan tanh urand urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms
fsec2hms gmt2sec localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt
sec2gmtdate sec2localtime sec2localtime sec2localdate sec2hms strftime
strftime_local strptime strptime_local systime is_absent is_bool is_boolean
is_empty is_empty_map is_float is_int is_map is_nonempty_map is_not_empty
is_not_map is_not_null is_null is_numeric is_present is_string
asserting_absent asserting_bool asserting_boolean asserting_empty
asserting_empty_map asserting_float asserting_int asserting_map
asserting_nonempty_map asserting_not_empty asserting_not_map
asserting_not_null asserting_null asserting_numeric asserting_present
asserting_string boolean float fmtnum hexfmt int string typeof depth haskey
joink joinkv joinv leafcount length mapdiff mapexcept mapselect mapsum splitkv
splitkvx splitnv splitnvx
Please use "mlr --help-function {function name}" for function-specific help.
@ -1558,6 +1559,9 @@ FUNCTIONS FOR FILTER/PUT
toupper
(class=string #args=1): Convert string to uppercase.
truncate
(class=string #args=2): Truncates string first argument to max length of int second argument.
capitalize
(class=string #args=1): Convert string's first character to uppercase.
@ -2356,4 +2360,4 @@ SEE ALSO
2020-10-07 MILLER(1)
2020-10-26 MILLER(1)

View file

@ -2,12 +2,12 @@
.\" Title: mlr
.\" Author: [see the "AUTHOR" section]
.\" Generator: ./mkman.rb
.\" Date: 2020-10-07
.\" Date: 2020-10-26
.\" Manual: \ \&
.\" Source: \ \&
.\" Language: English
.\"
.TH "MILLER" "1" "2020-10-07" "\ \&" "\ \&"
.TH "MILLER" "1" "2020-10-26" "\ \&" "\ \&"
.\" -----------------------------------------------------------------
.\" * Portability definitions
.\" ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
@ -184,22 +184,23 @@ output separator to the given value.
.nf
+ + - - * / // .+ .+ .- .- .* ./ .// % ** | ^ & ~ << >> bitcount == != =~ !=~
> >= < <= && || ^^ ! ? : . gsub regextract regextract_or_else strlen sub ssub
substr tolower toupper capitalize lstrip rstrip strip collapse_whitespace
clean_whitespace system abs acos acosh asin asinh atan atan2 atanh cbrt ceil
cos cosh erf erfc exp expm1 floor invqnorm log log10 log1p logifit madd max
mexp min mmul msub pow qnorm round roundm sgn sin sinh sqrt tan tanh urand
urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms fsec2hms gmt2sec
localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt sec2gmtdate
sec2localtime sec2localtime sec2localdate sec2hms strftime strftime_local
strptime strptime_local systime is_absent is_bool is_boolean is_empty
is_empty_map is_float is_int is_map is_nonempty_map is_not_empty is_not_map
is_not_null is_null is_numeric is_present is_string asserting_absent
asserting_bool asserting_boolean asserting_empty asserting_empty_map
asserting_float asserting_int asserting_map asserting_nonempty_map
asserting_not_empty asserting_not_map asserting_not_null asserting_null
asserting_numeric asserting_present asserting_string boolean float fmtnum
hexfmt int string typeof depth haskey joink joinkv joinv leafcount length
mapdiff mapexcept mapselect mapsum splitkv splitkvx splitnv splitnvx
substr tolower toupper truncate capitalize lstrip rstrip strip
collapse_whitespace clean_whitespace system abs acos acosh asin asinh atan
atan2 atanh cbrt ceil cos cosh erf erfc exp expm1 floor invqnorm log log10
log1p logifit madd max mexp min mmul msub pow qnorm round roundm sgn sin sinh
sqrt tan tanh urand urandrange urand32 urandint dhms2fsec dhms2sec fsec2dhms
fsec2hms gmt2sec localtime2sec hms2fsec hms2sec sec2dhms sec2gmt sec2gmt
sec2gmtdate sec2localtime sec2localtime sec2localdate sec2hms strftime
strftime_local strptime strptime_local systime is_absent is_bool is_boolean
is_empty is_empty_map is_float is_int is_map is_nonempty_map is_not_empty
is_not_map is_not_null is_null is_numeric is_present is_string
asserting_absent asserting_bool asserting_boolean asserting_empty
asserting_empty_map asserting_float asserting_int asserting_map
asserting_nonempty_map asserting_not_empty asserting_not_map
asserting_not_null asserting_null asserting_numeric asserting_present
asserting_string boolean float fmtnum hexfmt int string typeof depth haskey
joink joinkv joinv leafcount length mapdiff mapexcept mapselect mapsum splitkv
splitkvx splitnv splitnvx
Please use "mlr --help-function {function name}" for function-specific help.
.fi
@ -2243,6 +2244,15 @@ inclusive. Negative indices -len .. -1 alias to 0 .. len-1.
.fi
.if n \{\
.RE
.SS "truncate"
.if n \{\
.RS 0
.\}
.nf
(class=string #args=2): Truncates string first argument to max length of int second argument.
.fi
.if n \{\
.RE
.SS "capitalize"
.if n \{\
.RS 0

View file

@ -2620,6 +2620,8 @@ Built-in functions for filter and put, summary
+----------------------------+------------+----------+
| ``toupper`` | string | 1 |
+----------------------------+------------+----------+
| ``truncate`` | string | 2 |
+----------------------------+------------+----------+
| ``capitalize`` | string | 1 |
+----------------------------+------------+----------+
| ``lstrip`` | string | 1 |
@ -4716,6 +4718,17 @@ toupper
.. _reference-dsl-truncate:
truncate
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
::
truncate (class=string #args=2): Truncates string first argument to max length of int second argument.
.. _reference-dsl-typeof:
typeof

View file

@ -795,7 +795,7 @@ Examples:
Functions for the filter and put verbs:
+ + - - * / // .+ .+ .- .- .* ./ .// % ** | ^ & ~ << >> bitcount == != =~
!=~ > >= < <= && || ^^ ! ? : . gsub regextract regextract_or_else strlen sub
ssub substr tolower toupper capitalize lstrip rstrip strip
ssub substr tolower toupper truncate capitalize lstrip rstrip strip
collapse_whitespace clean_whitespace system abs acos acosh asin asinh atan
atan2 atanh cbrt ceil cos cosh erf erfc exp expm1 floor invqnorm log log10
log1p logifit madd max mexp min mmul msub pow qnorm round roundm sgn sin

View file

@ -102,19 +102,22 @@ func (this *DirectFieldValueLvalueNode) AssignIndexed(
func (this *DirectFieldValueLvalueNode) Unset(
state *State,
) {
lib.InternalCodingErrorIf(!this.lhsFieldName.IsString())
name := this.lhsFieldName.String()
state.Inrec.Remove(&name)
this.UnsetIndexed(nil, state)
}
func (this *DirectFieldValueLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO: indexed
//lib.InternalCodingErrorIf(!this.lhsFieldName.IsString())
//name := this.lhsFieldName.String()
//state.Inrec.Remove(&name)
if indices == nil {
lib.InternalCodingErrorIf(!this.lhsFieldName.IsString())
name := this.lhsFieldName.String()
state.Inrec.Remove(&name)
} else {
state.Inrec.UnsetIndexed(
append([]*types.Mlrval{this.lhsFieldName}, indices...),
)
}
}
// ----------------------------------------------------------------
@ -177,16 +180,22 @@ func (this *IndirectFieldValueLvalueNode) AssignIndexed(
func (this *IndirectFieldValueLvalueNode) Unset(
state *State,
) {
lhsFieldName := this.lhsFieldNameExpression.Evaluate(state)
name := lhsFieldName.String()
state.Inrec.Remove(&name)
this.UnsetIndexed(nil, state)
}
func (this *IndirectFieldValueLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO
lhsFieldName := this.lhsFieldNameExpression.Evaluate(state)
if indices == nil {
name := lhsFieldName.String()
state.Inrec.Remove(&name)
} else {
state.Inrec.UnsetIndexed(
append([]*types.Mlrval{&lhsFieldName}, indices...),
)
}
}
// ----------------------------------------------------------------
@ -231,14 +240,18 @@ func (this *FullSrecLvalueNode) AssignIndexed(
func (this *FullSrecLvalueNode) Unset(
state *State,
) {
state.Inrec.Clear()
this.UnsetIndexed(nil, state)
}
func (this *FullSrecLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO
if indices == nil {
state.Inrec.Clear()
} else {
state.Inrec.UnsetIndexed(indices)
}
}
// ----------------------------------------------------------------
@ -290,15 +303,22 @@ func (this *DirectOosvarValueLvalueNode) AssignIndexed(
func (this *DirectOosvarValueLvalueNode) Unset(
state *State,
) {
name := this.lhsOosvarName.String()
state.Oosvars.Remove(&name)
this.UnsetIndexed(nil, state)
}
func (this *DirectOosvarValueLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO
if indices == nil {
name := this.lhsOosvarName.String()
state.Oosvars.Remove(&name)
} else {
// TODO
//state.Inrec.UnsetIndexed(
//append([]*types.Mlrval{&lhsFieldName}, indices...),
//)
}
}
// ----------------------------------------------------------------
@ -364,8 +384,7 @@ func (this *IndirectOosvarValueLvalueNode) AssignIndexed(
func (this *IndirectOosvarValueLvalueNode) Unset(
state *State,
) {
name := this.lhsOosvarNameExpression.Evaluate(state).String()
state.Oosvars.Remove(&name)
this.UnsetIndexed(nil, state)
}
func (this *IndirectOosvarValueLvalueNode) UnsetIndexed(
@ -373,6 +392,18 @@ func (this *IndirectOosvarValueLvalueNode) UnsetIndexed(
state *State,
) {
// TODO
//name := this.lhsOosvarNameExpression.Evaluate(state).String()
//state.Oosvars.Remove(&name)
// lhsFieldName := this.lhsFieldNameExpression.Evaluate(state)
// if indices == nil {
// name := lhsFieldName.String()
// state.Inrec.Remove(&name)
// } else {
// state.Inrec.UnsetIndexed(
// append([]*types.Mlrval{&lhsFieldName}, indices...),
// )
// }
}
// ----------------------------------------------------------------
@ -417,14 +448,21 @@ func (this *FullOosvarLvalueNode) AssignIndexed(
func (this *FullOosvarLvalueNode) Unset(
state *State,
) {
state.Oosvars.Clear()
this.UnsetIndexed(nil, state)
}
func (this *FullOosvarLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO
if indices == nil {
state.Oosvars.Clear()
} else {
// TODO
//state.Inrec.UnsetIndexed(
//append([]*types.Mlrval{&lhsFieldName}, indices...),
//)
}
}
// ----------------------------------------------------------------
@ -493,14 +531,21 @@ func (this *LocalVariableLvalueNode) AssignIndexed(
func (this *LocalVariableLvalueNode) Unset(
state *State,
) {
state.stack.UnsetVariable(this.typeGatedMlrvalName.Name)
this.UnsetIndexed(nil, state)
}
func (this *LocalVariableLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO
if indices == nil {
state.stack.UnsetVariable(this.typeGatedMlrvalName.Name)
} else {
// TODO
//state.Inrec.UnsetIndexed(
//append([]*types.Mlrval{&lhsFieldName}, indices...),
//)
}
}
// ----------------------------------------------------------------
@ -603,12 +648,20 @@ func (this *IndexedLvalueNode) AssignIndexed(
func (this *IndexedLvalueNode) Unset(
state *State,
) {
// TODO
indices := make([]*types.Mlrval, len(this.indexEvaluables))
for i, indexEvaluable := range this.indexEvaluables {
index := indexEvaluable.Evaluate(state)
indices[i] = &index
}
this.baseLvalue.UnsetIndexed(indices, state)
}
func (this *IndexedLvalueNode) UnsetIndexed(
indices []*types.Mlrval,
state *State,
) {
// TODO
// We are the delegator, not the delegatee
lib.InternalCodingErrorIf(true)
}

View file

@ -166,6 +166,13 @@ func (this *Mlrmap) GetWithMlrvalIndex(index *Mlrval) (*Mlrval, error) {
}
}
func (this *Mlrmap) RemoveWithPositionalIndex(position int64) {
mapEntry := this.findEntryByPositionalIndex(position)
if mapEntry != nil {
this.unlink(mapEntry)
}
}
// ----------------------------------------------------------------
func (this *Mlrmap) Clear() {
this.FieldCount = 0

View file

@ -430,8 +430,7 @@ func unsetIndexedOnMap(baseMap *Mlrmap, indices []*Mlrval) error {
baseMap.Remove(&baseIndex.printrep)
return nil
} else if baseIndex.mvtype == MT_INT {
// TODO:
// * RemoveByPositionalIndex
baseMap.RemoveWithPositionalIndex(baseIndex.intval)
return nil
} else {
return errors.New(

View file

@ -23,6 +23,7 @@ TOP OF LIST:
* UDS
! parse errors need some context somehow
? ;; is parse error; also {...};
* more copy-on-retain for concurrent pointer-mods !
o make a thorough audit, and warn everywhere
@ -194,3 +195,4 @@ NITS/NON-IMMEDIATE:
* good example of wording for why/when to make a breaking release:
https://webpack.js.org/blog/2020-10-10-webpack-5-release/
* unset, unassign, remove -- too many different names. also assign/put ... maybe stick w/ 2?
* make truncate() UTF8-friendly