int getenv_r ()是如何实现环境变量的比较和复制的?
在UBOOT1.1.6代码中有如下代码int getenv_r (char *name, char *buf, unsigned len)
{
int i, nxt;
for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
int val, n;
for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) {
if (nxt >= CFG_ENV_SIZE) {
return (-1);
}
}
if ((val=envmatch((uchar *)name, i)) < 0)
continue;
/* found; copy out */
n = 0;
while ((len > n++) && (*buf++ = env_get_char(val++)) != '\0')
;
if (len == n)
*buf = '\0';
return (n);
}
return (-1);
}
问题1:
如果外循环FOR实现遍历default_environment[],内循环FOR实现检测是否超出环境变量的大小,
内循环FOR和外循环FOR中的变量int i ,nxt 是重叠的,如果内循环执行完毕,那nxt应该=8(default_environment[],定义了9个字符串,最后一个是0),那再执行外循环FORfor (i=0; env_get_char(i) != '\0'; i=nxt+1), 那 i=nxt+1=8+1=9, env_get_char(i) != '\0'是否就会超出default_environment[],
问题2
static int
envmatch (uchar *s1, int i2)
{
while (*s1 == env_get_char(i2++))
if (*s1++ == '=')
return(i2);
if (*s1 == '\0' && env_get_char(i2-1) == '=')
return(i2);
return(-1);
}
if (*s1++ == '=') '='在这里起什么作用,有网上的资料说是 = 前的字符串,这个 = 是否有特殊的用法?
请高手能够给予解答,能否详细解释int getenv_r (char *name, char *buf, unsigned len)
及相关子函数。谢谢! 再问个问题
char *getenv (char *name)
{
int i, nxt;
WATCHDOG_RESET();
for (i=0; env_get_char(i) != '\0'; i=nxt+1) {
int val;
for (nxt=i; env_get_char(nxt) != '\0'; ++nxt) {
if (nxt >= CFG_ENV_SIZE) {
return (NULL);
}
}
if ((val=envmatch((uchar *)name, i)) < 0)
continue;
return ((char *)env_get_addr(val));
}
return (NULL);
}
如果*name = ethaddr
在default_environment[],索引下标是4,
如果执行到static int
envmatch (uchar *s1, int i2)
{
while (*s1 == env_get_char(i2++))
if (*s1++ == '=')
return(i2);
if (*s1 == '\0' && env_get_char(i2-1) == '=')
return(i2);
return(-1);
}
在执行while (*s1 == env_get_char(i2++))
i2 = 4的情况,return(i2); 此时i2的返回值应该是5了。
也就是return ((char *)env_get_addr(val));的返回地址也是5,
我感觉我的理解有问题,请高手解惑!
问题1的答案:
根据for循环的运行规则,i=nxt+1执行完成后,就会执行 env_get_char(i) != '\0',根据你的假设他就为非真,然后就跳出循环了。
问题2的答案:
我的理解就是等号这个字符。
guobinname_301 发表于 2012-10-8 13:41 static/image/common/back.gif
再问个问题
char *getenv (char *name)
{
亲,建议你直接加串口打印信息,然后把它们的内容答应出来看看就知道了,这里不做解答了。 本帖最后由 874176706 于 2013-1-4 14:22 编辑
if (*s1++ == '='):如果name字符串中有‘=’字符,这句才起作用,很显然没有,所以这个条件语句不执行。主要还看下个条件语句。
if (*s1 == '\0' == name字符串最后一个字符即\0&& env_get_char(i2-1) == '='==环境变量中的等号正好对应name字符串的\0)
return(i2);此时i2返回的是‘=’后面字符所在的地址相对于此环境变量地址的偏移量。
{:2_148:}
页:
[1]