📄 env.c
字号:
if ((varindex!=-1)&&(val)) /*There is a current value to get reset */
{
evar=sys_getienv(varindex);
if (evar) /*It exist */
{
eval=sys_getenv(evar);
if (eval) /*It has a value */
{
if ((strcmp(var,evar)==0)&&(strcmp(val,eval)==0)) /*Is it the same? */
return(0); /*No need to write!*/
}
}
}
/*Get the first free spot! */
if ((varindex==-1)&&(val)) /*Do we want to add an entry? */
{
i=0;
while((sys_getienv(i))&&(i<MAX_ENV_ENTRY))
i++;
if (i<MAX_ENV_ENTRY)
varindex=i;
}
/*Now write a new record for the var */
s1len=strlen(var);
s2len=(val)?strlen(val):0;
checksum=0;
if (val)
{
for(i=0;i<s1len;i++) checksum+=var[i];
for(i=0;i<s2len;i++) checksum+=val[i];
size=4+s1len+s2len+2;
}
else
{
if (varindex==-1) return(5);
size=4;
}
if (size>FLASH_ENV_ENTRY_SIZE) return(6);
cp=envrec;
*cp++=0x42;
*cp++=checksum;
*cp++=(varindex==-1)?(highest+1):varindex;
*cp++=(val)?(s1len+s2len+2):0;
for(i=0;i<s1len;i++) *cp++=var[i];
*cp++=0;
for(i=0;i<s2len;i++) *cp++=val[i];
*cp++=0;
FWBOpen((int)wfe);
for(i=0;i<size;i++,wfe++)
FWBWriteByte((int)wfe,envrec[i]);
FWBClose();
return(0);
}
int sys_setenv(char *var,char *val)
{
int ret;
ret = setenv(var, val);
if (ret == 4) /* No Space left in ENV BLOCK */
{
fixenv(0, NULL);
ret = setenv(var, val);
}
return ret;
}
char *sys_getenv(char *var)
{
char *s2rtn,*nfe,*cfe,checksum,esum,control,*s1ptr,*s2ptr,*fb,*wfe;
int index,size,s1len,s2len,done,i,vindex,blocksize,j;
s2rtn=0;
vindex=-1;
fb=EnvGetEnvBase(&blocksize);
for(done=FALSE,cfe=fb,i=0;(!done)&&(i<MAX_ENV_ENTRY);i++,cfe=nfe)
{
if (cfe>=(fb+blocksize)) break;
wfe=nfe=cfe+FLASH_ENV_ENTRY_SIZE;
control=*cfe++;
checksum=*cfe++;
index=((int)*cfe++)&0x0ff;
size=(control==0x42)?(((int)*cfe++)&0x0ff):0;
if (size>(FLASH_ENV_ENTRY_SIZE-4))
{
size=0;
checksum=0;
index=0x01ff;
}
s1ptr=cfe;
s1len=((control==0x42)&&(size))?strlen(s1ptr):0;
if (s1len>(FLASH_ENV_ENTRY_SIZE-5))
{
size=0;
s1len=0;
checksum=0;
index=0xff;
}
s2ptr=cfe+s1len+1;
s2len=((control==0x42)&&(size))?strlen(s2ptr):0;
if (s2len>(FLASH_ENV_ENTRY_SIZE-5))
{
size=0;
s1len=0;
s2len=0;
checksum=0;
index=0xff;
}
if ((s2len+s1len)>(FLASH_ENV_ENTRY_SIZE-6))
{
size=0;
s1len=0;
s2len=0;
checksum=0;
index=0xff;
}
esum=0;
for(j=0;j<size;j++) esum+=s1ptr[j];
if (control==(char)0xff) done=TRUE;
if ((control!=(char)0x42)&&(control!=(char)0xff)) return(0);
if (control==0x42)
{
if (checksum!=esum) return(0);
if ((size)&&((size<(s1len+s2len+2))||(size>(s1len+s2len+2+3)))) return(0);
if (size)
{
if (strcmp(s1ptr,var)==0) /*and what we want */
{
s2rtn=s2ptr;
vindex=index;
}
}
else
{
if (vindex==index) /*My env was Deleted */
{
vindex=-1;
s2rtn=0;
}
}
}
}
return(s2rtn);
}
char *sys_getienv(int sindex)
{
char *LastEnvFound,*fb,*cfe,*nfe,control,checksum,esum,*s1ptr,*s2ptr,*sfe;
int index,size,s1len,s2len,i,done,blocksize;
fb=EnvGetEnvBase(&blocksize);
LastEnvFound=0;
for(done=FALSE,cfe=fb,i=0;(!done)&&(i<MAX_ENV_ENTRY);i++,cfe=nfe)
{
nfe=cfe+FLASH_ENV_ENTRY_SIZE;
sfe=cfe;
control=*cfe++;
cfe++;
index=((int)*cfe)&0x0ff;
if (control==(char)0xff)
done=TRUE;
if ((index==sindex)&&(control==0x42))
LastEnvFound=sfe;
}
if (!LastEnvFound)
return(0);
cfe=LastEnvFound;
control=*cfe++;
checksum=*cfe++;
index=((int)*cfe++)&0x0ff;
size =((int)*cfe++)&0x0ff;
if (size>(FLASH_ENV_ENTRY_SIZE-4))
return(0);
s1ptr=cfe;
s1len=(size)?strlen(s1ptr):0;
if (s1len>(FLASH_ENV_ENTRY_SIZE-5))
return(0);
s2ptr=cfe+s1len+1;
s2len=(size)?strlen(s2ptr):0;
if (s2len>(FLASH_ENV_ENTRY_SIZE-5))
return(0);
if ((s1len+s2len)>(FLASH_ENV_ENTRY_SIZE-6))
return(0);
esum=0;
for(i=0;i<size;i++) esum+=s1ptr[i];
if (checksum!=esum)
return(0);
if ((size)&&((size<(s1len+s2len+2))||(size>(s1len+s2len+2+3))))
return(0);
if (size)
return(s1ptr);
return(0);
}
void init_env(void)
{
int i,j;
char *var,*val;
for(i=0;i<SYS_USER_ENVIRONMENT_MAX_INDEX;i++)
{
env_vars[i].name=NULL;
env_vars[i].val=NULL;
}
for(i=0,j=0;(i<MAX_ENV_ENTRY)&&(j<(SYS_USER_ENVIRONMENT_MAX_INDEX-1));i++)
{
var=sys_getienv(i);
if(var)
{
val=sys_getenv(var);
if (val)
{
env_vars[j].name=var;
env_vars[j].val=val;
j++;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -