guobinname_301 发表于 2012-10-8 13:07:34

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)
及相关子函数。谢谢!

guobinname_301 发表于 2012-10-8 13:41:43

再问个问题
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,
我感觉我的理解有问题,请高手解惑!

亚瑟王 发表于 2012-10-8 17:11:10

问题1的答案:
根据for循环的运行规则,i=nxt+1执行完成后,就会执行 env_get_char(i) != '\0',根据你的假设他就为非真,然后就跳出循环了。
问题2的答案:
我的理解就是等号这个字符。

亚瑟王 发表于 2012-10-8 17:13:53

guobinname_301 发表于 2012-10-8 13:41 static/image/common/back.gif
再问个问题
char *getenv (char *name)
{


亲,建议你直接加串口打印信息,然后把它们的内容答应出来看看就知道了,这里不做解答了。

874176706 发表于 2013-1-4 14:20:32

本帖最后由 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]
查看完整版本: int getenv_r ()是如何实现环境变量的比较和复制的?