# define optindval() (voptind.var_text + 7)
#endif
-
-#define is_name(c) ((c) == '_' || isalpha((unsigned char)(c)))
-#define is_in_name(c) ((c) == '_' || isalnum((unsigned char)(c)))
-
#if ENABLE_ASH_GETOPTS
static void FAST_FUNC
getoptsreset(const char *value)
}
#endif
+/* math.h has these, otherwise define our private copies */
+#if !ENABLE_SH_MATH_SUPPORT
+#define is_name(c) ((c) == '_' || isalpha((unsigned char)(c)))
+#define is_in_name(c) ((c) == '_' || isalnum((unsigned char)(c)))
/*
- * Return of a legal variable name (a letter or underscore followed by zero or
- * more letters, underscores, and digits).
+ * Return the pointer to the first char which is not part of a legal variable name
+ * (a letter or underscore followed by letters, underscores, and digits).
*/
-static char* FAST_FUNC
+static const char*
endofname(const char *name)
{
- char *p;
-
- p = (char *) name;
- if (!is_name(*p))
- return p;
- while (*++p) {
- if (!is_in_name(*p))
+ if (!is_name(*name))
+ return name;
+ while (*++name) {
+ if (!is_in_name(*name))
break;
}
- return p;
+ return name;
}
+#endif
/*
* Compares two strings up to the first = or '\0'. The first
static void
setvar(const char *name, const char *val, int flags)
{
- char *p, *q;
- size_t namelen;
+ const char *q;
+ char *p;
char *nameeq;
+ size_t namelen;
size_t vallen;
q = endofname(name);
} else {
vallen = strlen(val);
}
+
INT_OFF;
nameeq = ckmalloc(namelen + vallen + 2);
- p = (char *)memcpy(nameeq, name, namelen) + namelen;
+ p = memcpy(nameeq, name, namelen) + namelen;
if (val) {
*p++ = '=';
- p = (char *)memcpy(p, val, vallen) + vallen;
+ p = memcpy(p, val, vallen) + vallen;
}
*p = '\0';
setvareq(nameeq, flags | VNOSAVE);
math_hooks.lookupvar = lookupvar;
math_hooks.setvar = setvar2;
- math_hooks.endofname = endofname;
+ //math_hooks.endofname = endofname;
INT_OFF;
result = arith(s, &errcode, &math_hooks);
static int
goodname(const char *p)
{
- return !*endofname(p);
+ return endofname(p)[0] == '\0';
}
free(strings);
}
-#if ENABLE_SH_MATH_SUPPORT
-# define is_name(c) ((c) == '_' || isalpha((unsigned char)(c)))
-# define is_in_name(c) ((c) == '_' || isalnum((unsigned char)(c)))
-static char* FAST_FUNC endofname(const char *name)
-{
- char *p;
-
- p = (char *) name;
- if (!is_name(*p))
- return p;
- while (*++p) {
- if (!is_in_name(*p))
- break;
- }
- return p;
-}
-#endif
-
static void FAST_FUNC set_local_var_from_halves(const char *name, const char *val)
{
char *var = xasprintf("%s=%s", name, val);
hooks.lookupvar = get_local_var_value;
hooks.setvar = set_local_var_from_halves;
- hooks.endofname = endofname;
+ //hooks.endofname = endofname;
exp_str = expand_pseudo_dquoted(arg);
res = arith(exp_str ? exp_str : arg, errcode_p, &hooks);
free(exp_str);
#define a_e_h_t arith_eval_hooks_t
#define lookupvar (math_hooks->lookupvar)
#define setvar (math_hooks->setvar )
-#define endofname (math_hooks->endofname)
+//#define endofname (math_hooks->endofname)
#define arith_isspace(arithval) \
(arithval == ' ' || arithval == '\n' || arithval == '\t')
/* ptr to ")" */
#define endexpression (&op_tokens[sizeof(op_tokens)-7])
+const char* FAST_FUNC
+endofname(const char *name)
+{
+ if (!is_name(*name))
+ return name;
+ while (*++name) {
+ if (!is_in_name(*name))
+ break;
+ }
+ return name;
+}
+
arith_t
arith(const char *expr, int *perrcode, a_e_h_t *math_hooks)
{
#define strto_arith_t strtoul
#endif
+/* ash's and hush's endofname is the same, so... */
+# define is_name(c) ((c) == '_' || isalpha((unsigned char)(c)))
+# define is_in_name(c) ((c) == '_' || isalnum((unsigned char)(c)))
+const char* FAST_FUNC endofname(const char *name);
+
typedef const char* FAST_FUNC (*arith_var_lookup_t)(const char *name);
typedef void FAST_FUNC (*arith_var_set_t)(const char *name, const char *val);
-typedef char* FAST_FUNC (*arith_var_endofname_t)(const char *name);
+//typedef const char* FAST_FUNC (*arith_var_endofname_t)(const char *name);
typedef struct arith_eval_hooks {
arith_var_lookup_t lookupvar;
arith_var_set_t setvar;
- arith_var_endofname_t endofname;
+// arith_var_endofname_t endofname;
} arith_eval_hooks_t;
arith_t arith(const char *expr, int *perrcode, arith_eval_hooks_t*);