All of lore.kernel.org
 help / color / mirror / Atom feed
* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
@ 2010-02-25 10:16 Frans Meulenbroeks
  2010-02-25 12:40 ` Frans Meulenbroeks
  0 siblings, 1 reply; 7+ messages in thread
From: Frans Meulenbroeks @ 2010-02-25 10:16 UTC (permalink / raw)
  To: u-boot

This patch add functionality to use memory addresses and environment variables in
expressions. This increases the power of expressions substantially

It adheres to the standard convemtions: memory addresses can be given in the format
*address (e.g. *1000), environment variables as $this_var.
environment variables are not processed recursively but can contain both constants
and memory addresses.

Rationale for this change is that it allows masking off bits from a byte that is
obtained by reading data from e.g. i2c.

Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>

---

If recursive environment vars is desired: this can be added easily by changing the
if statement into a while statement.
I figured that would be somewhat over the top though (and, unless you take
special precautions you can run into an endless loop if an env var contains
its own name.
If it is desired, please let me know and I happily will add it.

And a snippet from the test log:
=> mm.b 1000 
00001000: de ? 12
00001001: ad ? 34
00001002: be ? 56
00001003: ef ? 78
00001004: de ? 
00001005: ad ? .
=> setexpr aap 3 + *1000
=> echo $aap
1234567b
=> setexpr.b aap 3 + *1000
=> echo $aap
15
=> setexpr.w nut $aap + *1000 
=> echo $nut                  
1249

---
 common/cmd_setexpr.c |   31 ++++++++++++++++++++++++++++---
 1 files changed, 28 insertions(+), 3 deletions(-)

diff --git a/common/cmd_setexpr.c b/common/cmd_setexpr.c
index f8b5d4d..a7c6f53 100644
--- a/common/cmd_setexpr.c
+++ b/common/cmd_setexpr.c
@@ -28,10 +28,32 @@
 #include <config.h>
 #include <command.h>
 
+static ulong get_arg(char *s, int w)
+{
+	ulong *p;
+
+	/* if the parameter starts with a $ replace it with the environment value */
+	if (s[0] == '$') {
+		s = getenv(&s[1]);
+	}
+	/* if the parameter starts with a * then assume is a pointer to the value we want */
+	if (s[0] == '*') {
+		p = (ulong *)simple_strtoul(&s[1], NULL, 16);
+		switch (w) {
+		case 1: return((ulong)(*(uchar *)p));
+		case 2: return((ulong)(*(ushort *)p));
+		case 4: return(*p);
+		}
+	} else {
+		return simple_strtoul(s, NULL, 16);
+	}
+}
+
 int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
 	ulong a, b;
 	char buf[16];
+	int w;
 
 	/* Validate arguments */
 	if ((argc != 5) || (strlen(argv[3]) != 1)) {
@@ -39,8 +61,10 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 		return 1;
 	}
 
-	a = simple_strtoul(argv[2], NULL, 16);
-	b = simple_strtoul(argv[4], NULL, 16);
+	w = cmd_get_data_size(argv[0], 4);
+
+	a = get_arg(argv[2], w);
+	b = get_arg(argv[4], w);
 
 	switch (argv[3][0]) {
 	case '|': sprintf(buf, "%lx", (a | b)); break;
@@ -64,7 +88,8 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 U_BOOT_CMD(
 	setexpr, 5, 0, do_setexpr,
 	"set environment variable as the result of eval expression",
-	"name value1 <op> value2\n"
+	"[.b, .w, .l] name value1 <op> value2\n"
 	"    - set environment variable 'name' to the result of the evaluated\n"
 	"      express specified by <op>.  <op> can be &, |, ^, +, -, *, /, %"
+	"      size argument is only meaningful if value1 and/or value2 are memory addresses"
 );
-- 
1.7.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
  2010-02-25 10:16 Frans Meulenbroeks
@ 2010-02-25 12:40 ` Frans Meulenbroeks
  0 siblings, 0 replies; 7+ messages in thread
From: Frans Meulenbroeks @ 2010-02-25 12:40 UTC (permalink / raw)
  To: u-boot

btw no idea why this patch became 7/7. I did not use -n in
format-patch (but indeed I am 7 patches ahead the first 5 then an
unnumbered one (which is independent of the earlier ones) and this one
(which is again independent of earlier ones.

Ah well, the mysteries of git I assume.

Frans

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
@ 2010-02-25 12:47 Frans Meulenbroeks
  2010-02-25 12:48 ` Frans Meulenbroeks
  2010-02-26 12:35 ` Detlev Zundel
  0 siblings, 2 replies; 7+ messages in thread
From: Frans Meulenbroeks @ 2010-02-25 12:47 UTC (permalink / raw)
  To: u-boot

This patch add functionality to use memory addresses and environment variables in
expressions. This increases the power of expressions substantially

It adheres to the standard convemtions: memory addresses can be given in the format
*address (e.g. *1000), environment variables as $this_var.
environment variables are not processed recursively but can contain both constants
and memory addresses.

Rationale for this change is that it allows masking off bits from a byte that is
obtained by reading data from e.g. i2c.

Signed-off-by: Frans Meulenbroeks <fransmeulenbroeks@gmail.com>

---

If recursive environment vars is desired: this can be added easily by changing the
if statement into a while statement.
I figured that would be somewhat over the top though (and, unless you take
special precautions you can run into an endless loop if an env var contains
its own name.
If it is desired, please let me know and I happily will add it.

And a snippet from the test log:
=> mm.b 1000
00001000: de ? 12
00001001: ad ? 34
00001002: be ? 56
00001003: ef ? 78
00001004: de ?
00001005: ad ? .
=> setexpr aap 3 + *1000
=> echo $aap
1234567b
=> setexpr.b aap 3 + *1000
=> echo $aap
15
=> setexpr.w nut $aap + *1000
=> echo $nut
1249
---
 common/cmd_setexpr.c |   33 +++++++++++++++++++++++++++++----
 1 files changed, 29 insertions(+), 4 deletions(-)

diff --git a/common/cmd_setexpr.c b/common/cmd_setexpr.c
index f8b5d4d..6ea9296 100644
--- a/common/cmd_setexpr.c
+++ b/common/cmd_setexpr.c
@@ -28,10 +28,32 @@
 #include <config.h>
 #include <command.h>
 
+static ulong get_arg(char *s, int w)
+{
+	ulong *p;
+
+	/* if the parameter starts with a $ replace it with the environment value */
+	if (s[0] == '$') {
+		s = getenv(&s[1]);
+	}
+	/* if the parameter starts with a * then assume is a pointer to the value we want */
+	if (s[0] == '*') {
+		p = (ulong *)simple_strtoul(&s[1], NULL, 16);
+		switch (w) {
+		case 1: return((ulong)(*(uchar *)p));
+		case 2: return((ulong)(*(ushort *)p));
+		case 4: return(*p);
+		}
+	} else {
+		return simple_strtoul(s, NULL, 16);
+	}
+}
+
 int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 {
 	ulong a, b;
 	char buf[16];
+	int w;
 
 	/* Validate arguments */
 	if ((argc != 5) || (strlen(argv[3]) != 1)) {
@@ -39,8 +61,10 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 		return 1;
 	}
 
-	a = simple_strtoul(argv[2], NULL, 16);
-	b = simple_strtoul(argv[4], NULL, 16);
+	w = cmd_get_data_size(argv[0], 4);
+
+	a = get_arg(argv[2], w);
+	b = get_arg(argv[4], w);
 
 	switch (argv[3][0]) {
 	case '|': sprintf(buf, "%lx", (a | b)); break;
@@ -64,7 +88,8 @@ int do_setexpr(cmd_tbl_t *cmdtp, int flag, int argc, char *argv[])
 U_BOOT_CMD(
 	setexpr, 5, 0, do_setexpr,
 	"set environment variable as the result of eval expression",
-	"name value1 <op> value2\n"
+	"[.b, .w, .l] name value1 <op> value2\n"
 	"    - set environment variable 'name' to the result of the evaluated\n"
-	"      express specified by <op>.  <op> can be &, |, ^, +, -, *, /, %"
+	"      express specified by <op>.  <op> can be &, |, ^, +, -, *, /, %\n"
+	"      size argument is only meaningful if value1 and/or value2 are memory addresses"
 );
-- 
1.7.0

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
  2010-02-25 12:47 [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions Frans Meulenbroeks
@ 2010-02-25 12:48 ` Frans Meulenbroeks
  2010-02-26 12:34   ` Detlev Zundel
  2010-02-26 12:35 ` Detlev Zundel
  1 sibling, 1 reply; 7+ messages in thread
From: Frans Meulenbroeks @ 2010-02-25 12:48 UTC (permalink / raw)
  To: u-boot

Resubmitted the patch (see previous message) as I noticed a \n in the
help was missing.
Apologies for any inconvenience.

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
  2010-02-25 12:48 ` Frans Meulenbroeks
@ 2010-02-26 12:34   ` Detlev Zundel
  0 siblings, 0 replies; 7+ messages in thread
From: Detlev Zundel @ 2010-02-26 12:34 UTC (permalink / raw)
  To: u-boot

Hi Frans,

> Resubmitted the patch (see previous message) as I noticed a \n in the
> help was missing.
> Apologies for any inconvenience.

Then you actually submitted a Version 2 of the patch and should have
expressed that with a "--subject-prefix="PATCH v2" argument to git
format-patch.

Cheers
  Detlev

-- 
vi vi vi - the roman numeral of the beast.
--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: dzu at denx.de

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
  2010-02-25 12:47 [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions Frans Meulenbroeks
  2010-02-25 12:48 ` Frans Meulenbroeks
@ 2010-02-26 12:35 ` Detlev Zundel
  2010-02-26 12:51   ` Frans Meulenbroeks
  1 sibling, 1 reply; 7+ messages in thread
From: Detlev Zundel @ 2010-02-26 12:35 UTC (permalink / raw)
  To: u-boot

Hi Frans,

> This patch add functionality to use memory addresses and environment variables in
> expressions. This increases the power of expressions substantially
>
> It adheres to the standard convemtions: memory addresses can be given in the format
> *address (e.g. *1000), environment variables as $this_var.

This has the same ${var} problem as your other patch.

Cheers
  Detlev

-- 
I had nothing to do with implementing Gosmacs.  It was inspired
by the original Emacs, but that's all.  I would never have agreed
to use a language like Mocklisp.
             -- Richard Stallman in <E1CUySS-00048D-RN@fencepost.gnu.org>
--
DENX Software Engineering GmbH,      MD: Wolfgang Denk & Detlev Zundel
HRB 165235 Munich,  Office: Kirchenstr.5, D-82194 Groebenzell, Germany
Phone: (+49)-8142-66989-40 Fax: (+49)-8142-66989-80 Email: dzu at denx.de

^ permalink raw reply	[flat|nested] 7+ messages in thread

* [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions
  2010-02-26 12:35 ` Detlev Zundel
@ 2010-02-26 12:51   ` Frans Meulenbroeks
  0 siblings, 0 replies; 7+ messages in thread
From: Frans Meulenbroeks @ 2010-02-26 12:51 UTC (permalink / raw)
  To: u-boot

2010/2/26 Detlev Zundel <dzu@denx.de>:
> Hi Frans,
>
>> This patch add functionality to use memory addresses and environment variables in
>> expressions. This increases the power of expressions substantially
>>
>> It adheres to the standard convemtions: memory addresses can be given in the format
>> *address (e.g. *1000), environment variables as $this_var.
>
> This has the same ${var} problem as your other patch.

I'll take it out and resubmit, this time amending the subject line.
I haven't really mastered all git options yet and am not fully up to
speed on how to submit patches. Apologies for any inconvenience.

Frans

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2010-02-26 12:51 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-02-25 12:47 [U-Boot] [PATCH 7/7] cmd_setexpr: allow memory addresses and env vars in expressions Frans Meulenbroeks
2010-02-25 12:48 ` Frans Meulenbroeks
2010-02-26 12:34   ` Detlev Zundel
2010-02-26 12:35 ` Detlev Zundel
2010-02-26 12:51   ` Frans Meulenbroeks
  -- strict thread matches above, loose matches on Subject: below --
2010-02-25 10:16 Frans Meulenbroeks
2010-02-25 12:40 ` Frans Meulenbroeks

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.