summaryrefslogtreecommitdiffstats
path: root/src/var.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/var.c')
-rw-r--r--src/var.c82
1 files changed, 58 insertions, 24 deletions
diff --git a/src/var.c b/src/var.c
index a53fae8..5219507 100644
--- a/src/var.c
+++ b/src/var.c
@@ -2,7 +2,7 @@
/*-
* Copyright (c) 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010,
- * 2011, 2012, 2013, 2014, 2015, 2016, 2017
+ * 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018
* mirabilos <m@mirbsd.org>
*
* Provided that these terms and disclaimer and all copyright notices
@@ -28,7 +28,7 @@
#include <sys/sysctl.h>
#endif
-__RCSID("$MirOS: src/bin/mksh/var.c,v 1.220 2017/07/26 23:02:28 tg Exp $");
+__RCSID("$MirOS: src/bin/mksh/var.c,v 1.223 2018/01/13 23:55:15 tg Exp $");
/*-
* Variables
@@ -136,7 +136,7 @@ initvar(void)
struct tbl *tp;
ktinit(APERM, &specials,
- /* currently 18 specials: 75% of 32 = 2^5 */
+ /* currently 21 specials: 75% of 32 = 2^5 */
5);
while (i < V_MAX - 1) {
tp = ktenter(&specials, initvar_names[i],
@@ -204,7 +204,7 @@ array_index_calc(const char *n, bool *arrayp, uint32_t *valp)
}
innermost_refflag = SRF_NOP;
- if (p != n && ord(*p) == ord('[') && (len = array_ref_len(p))) {
+ if (p != n && ord(*p) == ORD('[') && (len = array_ref_len(p))) {
char *sub, *tmp;
mksh_ari_t rval;
@@ -780,7 +780,7 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
/* no variable name given */
return (NULL);
}
- if (ord(*val) == ord('[')) {
+ if (ord(*val) == ORD('[')) {
if (new_refflag != SRF_NOP)
errorf(Tf_sD_s, var,
"reference variable can't be an array");
@@ -803,13 +803,13 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
}
val += len;
}
- if (ord(val[0]) == ord('=')) {
+ if (ord(val[0]) == ORD('=')) {
strndupx(tvar, var, val - var, ATEMP);
++val;
} else if (set & IMPORT) {
/* environment invalid variable name or no assignment */
return (NULL);
- } else if (ord(val[0]) == ord('+') && ord(val[1]) == ord('=')) {
+ } else if (ord(val[0]) == ORD('+') && ord(val[1]) == ORD('=')) {
strndupx(tvar, var, val - var, ATEMP);
val += 2;
vappend = true;
@@ -822,9 +822,9 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
val = NULL;
/* handle foo[*] => foo (whole array) mapping for R39b */
len = strlen(tvar);
- if (len > 3 && ord(tvar[len - 3]) == ord('[') &&
- ord(tvar[len - 2]) == ord('*') &&
- ord(tvar[len - 1]) == ord(']'))
+ if (len > 3 && ord(tvar[len - 3]) == ORD('[') &&
+ ord(tvar[len - 2]) == ORD('*') &&
+ ord(tvar[len - 1]) == ORD(']'))
tvar[len - 3] = '\0';
}
@@ -861,7 +861,7 @@ typeset(const char *var, uint32_t set, uint32_t clr, int field, int base)
nameref_empty:
errorf(Tf_sD_s, var, "empty nameref target");
}
- len = (ord(*ccp) == ord('[')) ? array_ref_len(ccp) : 0;
+ len = (ord(*ccp) == ORD('[')) ? array_ref_len(ccp) : 0;
if (ccp[len]) {
/*
* works for cases "no array", "valid array with
@@ -1071,7 +1071,7 @@ skip_varname(const char *s, bool aok)
do {
++s;
} while (ctype(*s, C_ALNUX));
- if (aok && ord(*s) == ord('[') && (alen = array_ref_len(s)))
+ if (aok && ord(*s) == ORD('[') && (alen = array_ref_len(s)))
s += alen;
}
return (s);
@@ -1087,7 +1087,7 @@ skip_wdvarname(const char *s,
do {
s += 2;
} while (s[0] == CHAR && ctype(s[1], C_ALNUX));
- if (aok && s[0] == CHAR && ord(s[1]) == ord('[')) {
+ if (aok && s[0] == CHAR && ord(s[1]) == ORD('[')) {
/* skip possible array de-reference */
const char *p = s;
char c;
@@ -1098,9 +1098,9 @@ skip_wdvarname(const char *s,
break;
c = p[1];
p += 2;
- if (ord(c) == ord('['))
+ if (ord(c) == ORD('['))
depth++;
- else if (ord(c) == ord(']') && --depth == 0) {
+ else if (ord(c) == ORD(']') && --depth == 0) {
s = p;
break;
}
@@ -1294,9 +1294,29 @@ setspec(struct tbl *vp)
{
mksh_ari_u num;
char *s;
- int st;
+ int st = special(vp->name);
- switch ((st = special(vp->name))) {
+#ifdef MKSH_DOSPATH
+ switch (st) {
+ case V_PATH:
+ case V_TMPDIR:
+#ifdef __OS2__
+ case V_BEGINLIBPATH:
+ case V_ENDLIBPATH:
+#endif
+ /* convert backslashes to slashes for convenience */
+ if (!(vp->flag&INTEGER)) {
+ s = str_val(vp);
+ do {
+ if (*s == ORD('\\'))
+ *s = '/';
+ } while (*s++);
+ }
+ break;
+ }
+#endif
+
+ switch (st) {
#ifdef __OS2__
case V_BEGINLIBPATH:
case V_ENDLIBPATH:
@@ -1366,6 +1386,13 @@ setspec(struct tbl *vp)
}
vp->flag |= SPECIAL;
break;
+#ifdef MKSH_EARLY_LOCALE_TRACKING
+ case V_LANG:
+ case V_LC_ALL:
+ case V_LC_CTYPE:
+ recheck_ctype();
+ return;
+#endif
default:
/* do nothing, do not touch vp at all */
return;
@@ -1465,6 +1492,13 @@ unsetspec(struct tbl *vp)
/* AT&T ksh leaves previous value in place */
unspecial(vp->name);
break;
+#ifdef MKSH_EARLY_LOCALE_TRACKING
+ case V_LANG:
+ case V_LC_ALL:
+ case V_LC_CTYPE:
+ recheck_ctype();
+ return;
+#endif
}
}
@@ -1528,8 +1562,8 @@ array_ref_len(const char *cp)
char c;
int depth = 0;
- while ((c = *s++) && (ord(c) != ord(']') || --depth))
- if (ord(c) == ord('['))
+ while ((c = *s++) && (ord(c) != ORD(']') || --depth))
+ if (ord(c) == ORD('['))
depth++;
if (!c)
return (0);
@@ -1601,18 +1635,18 @@ set_array(const char *var, bool reset, const char **vals)
}
while ((ccp = vals[i])) {
#if 0 /* temporarily taken out due to regression */
- if (ord(*ccp) == ord('[')) {
+ if (ord(*ccp) == ORD('[')) {
int level = 0;
while (*ccp) {
- if (ord(*ccp) == ord(']') && --level == 0)
+ if (ord(*ccp) == ORD(']') && --level == 0)
break;
- if (ord(*ccp) == ord('['))
+ if (ord(*ccp) == ORD('['))
++level;
++ccp;
}
- if (ord(*ccp) == ord(']') && level == 0 &&
- ord(ccp[1]) == ord('=')) {
+ if (ord(*ccp) == ORD(']') && level == 0 &&
+ ord(ccp[1]) == ORD('=')) {
strndupx(cp, vals[i] + 1, ccp - (vals[i] + 1),
ATEMP);
evaluate(substitute(cp, 0), (mksh_ari_t *)&j,