⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 env.c

📁 ADAM2 sources (modified by Oleg)
💻 C
📖 第 1 页 / 共 2 页
字号:
  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 + -