天嵌 ARM开发社区

 找回密码
 注册
查看: 4361|回复: 4

int getenv_r ()是如何实现环境变量的比较和复制的?

[复制链接]
guobinname_301 发表于 2012-10-8 13:07:34 | 显示全部楼层 |阅读模式
在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
再问个问题
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返回的是‘=’后面字符所在的地址相对于此环境变量地址的偏移量。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

i.MX8系列ARM cortex A53 M4 工控板上一条 /1 下一条

Archiver|手机版|小黑屋|天嵌 嵌入式开发社区 ( 粤ICP备11094220号 )

GMT+8, 2024-5-4 02:55 , Processed in 1.031250 second(s), 18 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表