shells: expand TODO comments, no code changes
authorDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Jul 2017 14:13:35 +0000 (16:13 +0200)
committerDenys Vlasenko <vda.linux@googlemail.com>
Mon, 17 Jul 2017 14:13:35 +0000 (16:13 +0200)
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
shell/ash.c
shell/hush.c

index b0c7dac54222ac963a99da35110e17cc39603822..987d618c6a9cea268ecfaa63c51c092d8426cb94 100644 (file)
@@ -6680,6 +6680,7 @@ subevalvar(char *p, char *varname, int strloc, int subtype,
                        if (*loc++ == ':') {
                                len = number(loc);
                        }
+//TODO: number() chokes on "-n". In bash, LEN=-n means strlen()-n
                }
                if (pos < 0) {
                        /* ${VAR:$((-n)):l} starts n chars from the end */
index 8d9292ed198ca27765ec8be78478c2e819dfa742..fd2a3d0f57936067a03e79ca30c60cdb49cf9f49 100644 (file)
  *
  * TODOs:
  *      grep for "TODO" and fix (some of them are easy)
+ *      make complex ${var%...} constructs support optional
+ *      make here documents optional
  *      special variables (done: PWD, PPID, RANDOM)
+ *      follow IFS rules more precisely, including update semantics
  *      tilde expansion
  *      aliases
- *      follow IFS rules more precisely, including update semantics
  *      builtins mandated by standards we don't support:
- *          [un]alias, command, fc, getopts, newgrp, readonly, times
- *      make complex ${var%...} constructs support optional
- *      make here documents optional
+ *          [un]alias, command, fc, getopts, readonly, times:
+ *          command -v CMD: print "/path/to/CMD"
+ *              prints "CMD" for builtins
+ *              prints "alias ALIAS='EXPANSION'" for aliases
+ *              prints nothing and sets $? to 1 if not found
+ *          command -V CMD: print "CMD is /path/CMD|a shell builtin|etc"
+ *          command [-p] CMD: run CMD, even if a function CMD also exists
+ *              (can use this to override standalone shell as well)
+ *              -p: use default $PATH
+ *          readonly VAR[=VAL]...: make VARs readonly
+ *          readonly [-p]: list all such VARs (-p has no effect in bash)
+ *          getopts: getopt() for shells
+ *          times: print getrusage(SELF/CHILDREN).ru_utime/ru_stime
+ *          fc -l[nr] [BEG] [END]: list range of commands in history
+ *          fc [-e EDITOR] [BEG] [END]: edit/rerun range of commands
+ *          fc -s [PAT=REP] [CMD]: rerun CMD, replacing PAT with REP
  *
  * Bash compat TODO:
  *      redirection of stdout+stderr: &> and >&
  *          The EXPR is evaluated according to ARITHMETIC EVALUATION.
  *          This is exactly equivalent to let "EXPR".
  *      $[EXPR]: synonym for $((EXPR))
+ *      indirect expansion: ${!VAR}
+ *      substring op on @: ${@:n:m}
  *
  * Won't do:
+ *      Some builtins mandated by standards:
+ *          newgrp [GRP]: not a builtin in bash but a suid binary
+ *              which spawns a new shell with new group ID
  *      In bash, export builtin is special, its arguments are assignments
  *          and therefore expansion of them should be "one-word" expansion:
  *              $ export i=`echo 'a  b'` # export has one arg: "i=a  b"
@@ -5703,7 +5723,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
                        if (errmsg)
                                goto arith_err;
                        debug_printf_varexp("len:'%s'=%lld\n", exp_word, (long long)len);
-                       if (len >= 0) { /* bash compat: len < 0 is illegal */
+                       if (len >= 0) {
                                if (beg < 0) {
                                        /* negative beg counts from the end */
                                        beg = (arith_t)strlen(val) + beg;
@@ -5723,6 +5743,7 @@ static NOINLINE const char *expand_one_var(char **to_be_freed_pp, char *arg, cha
                                }
                                debug_printf_varexp("val:'%s'\n", val);
                        } else
+//TODO: in bash, len=-n means strlen()-n
 #endif /* HUSH_SUBSTR_EXPANSION && FEATURE_SH_MATH */
                        {
                                die_if_script("malformed ${%s:...}", var);