Example #1
0
void readdht11()
{
	uchar TEMP;
	DSET;
	CLR;
	delay_20ms();
	SET;
	delay_40us();
    SET;
	DCLR;
	if(!(P1IN&BIT5));
	{
		FLAG=2;
		while((!(P1IN&BIT5))&&FLAG++);
		FLAG=2;
		while((P1IN&BIT5)&&FLAG++);
		RH_DATA_H_TEMP=COM();
		RH_DATA_L_TEMP=COM();
		T_DATA_H_TEMP=COM();
		T_DATA_L_TEMP=COM();
		CHECKDATA=COM();

		TEMP=(T_DATA_H_TEMP+T_DATA_L_TEMP+RH_DATA_H_TEMP+RH_DATA_L_TEMP);
		if(TEMP==CHECKDATA)
		{
			RH_DATA_H=RH_DATA_H_TEMP;
			RH_DATA_L=RH_DATA_L_TEMP;
			T_DATA_H=T_DATA_H_TEMP;
			T_DATA_L=T_DATA_L_TEMP;

		}

	}
}
Example #2
0
void DHT11(void)   //温湿传感启动
{
    DATA_PIN=0;
    Delay_ms(19);  //>18MS
    DATA_PIN=1; 
    P1DIR &= ~0x02; //重新配置IO口方向
    Delay_10us();
    Delay_10us();                        
    Delay_10us();
    Delay_10us();  
    if(!DATA_PIN) 
    {
        ucharFLAG=2; 
        while((!DATA_PIN)&&ucharFLAG++);
        ucharFLAG=2;
        while((DATA_PIN)&&ucharFLAG++); 
        COM();
        ucharRH_data_H_temp=ucharcomdata;
        COM();
        ucharRH_data_L_temp=ucharcomdata;
        COM();
        ucharT_data_H_temp=ucharcomdata;
        COM();
        ucharT_data_L_temp=ucharcomdata;
        COM();
        ucharcheckdata_temp=ucharcomdata;
        DATA_PIN=1; 
        uchartemp=(ucharT_data_H_temp+ucharT_data_L_temp+ucharRH_data_H_temp+ucharRH_data_L_temp);
        if(uchartemp==ucharcheckdata_temp)
        {
            ucharRH_data_H=ucharRH_data_H_temp;
            ucharRH_data_L=ucharRH_data_L_temp;
            ucharT_data_H=ucharT_data_H_temp;
            ucharT_data_L=ucharT_data_L_temp;
            ucharcheckdata=ucharcheckdata_temp;
        }
        wendu_shi=ucharT_data_H/10; 
        wendu_ge=ucharT_data_H%10;
        
        shidu_shi=ucharRH_data_H/10; 
        shidu_ge=ucharRH_data_H%10;        
    } 
    else //没用成功读取,返回0
    {
        wendu_shi=0; 
        wendu_ge=0;
        
        shidu_shi=0; 
        shidu_ge=0;  
    } 
    
    P1DIR |= 0x02; //IO口需要重新配置 
}
Example #3
0
/**********************************************************************************
函数功能:点亮或者熄灭某'8'中的某一个元素:'A'~'G'
入口:    
         offset----具体的设备对应的偏移
         Bit---------------清除还是显示的具体位:0~6('A'~'G')
出口:   1-----------成功;0-------------失败
**********************************************************************************/
INT8U SetOnPixyLED8(INT16U Device,INT8U DisChar)
{
  INT16U Seg,Com,Pos;
  
    //找合理位置
  Pos=GetPixySegPos_SxNxDx(Device,Nx);
  if(!Pos)
    return 0;
    
  if(Pos>=MAX_N_NUM) //防止越界
    return 0;
  
  //检查显示的字段是否合法
  if(DisChar<'A')
    return 0;
  
  if(DisChar>'G')
    return 0;
  
  DisChar=DisChar-'A';
  
  Seg=SEG(LCD_N_Const[Pos+DisChar].x);
  Com=COM(LCD_N_Const[Pos+DisChar].y);
    
  if((Seg<=MAX_SEG)&&(Com<=MAX_COL)) //防止越界
  {
     Show_Lcd_Flag=1;
     SET_BIT(Show_Lcd_Ram[Seg],Com);
  }
  return 1;
}
int
main (int argc, char **argv)
{

  VERBOSE = 1;

  struct params p;
  processArgsAnalyze (argc, argv, p);
  gsl_matrix *atomsNonCrop = ReadFitsImg_gsl_matrix (p.atomsfile);
  //gsl_matrix *noatoms = ReadFitsImg_gsl_matrix (p.noatomsfile);


  gsl_matrix *atoms = cropImage (p.reportfile, atomsNonCrop);
  //gsl_matrix *cnoatoms = cropImage (p.reportfile, noatoms);

  double com[2];
  COM (atoms, com);

  cout << "COM_X = " << com[0] << endl;
  cout << "COM_Y = " << com[1] << endl;

  setINI_num (p.reportfile, "CPP", "COM_X", com[0]);
  setINI_num (p.reportfile, "CPP", "COM_Y", com[1]);

  gsl_matrix_free (atomsNonCrop);
  gsl_matrix_free (atoms);

}
Example #5
0
int add_table_name(int index, const char *name) {
  set_table_name(name, index);

  if (add_symbol(name, 10, 1, COM(TABTYPE, index)) < 0)
    return 1;

  return 0;
}
Example #6
0
/**********************************************************************************
函数功能:点亮或者熄灭某一个显示标志
入口:    Flag----1:显示;0:熄灭
出口:    1---------有此设备;0------找不到设备
**********************************************************************************/
INT8U SetOrClrPixPiyDot(INT16U ShouID,INT8U ClrOrSet,INT8U Type)
{
  INT16U Pos,Seg,Com;
  INT8U Flag,i,temp;
  
  Pos=GetPixySegPos_SxNxDx(ShouID,Type);
  if(!Pos)
    return 0;
  
  switch(Type)
  {
    case Sx:
       Seg=SEG(LCD_S_Const[Pos].x);
       Com=COM(LCD_S_Const[Pos].y);
       Flag=SetOrClrAndChkSEGCOM(Seg,Com,Type,ClrOrSet);
       return Flag;
  
    case Dx:
       Seg=SEG(LCD_D_Const[Pos].x);
       Com=COM(LCD_D_Const[Pos].y);
       Flag=SetOrClrAndChkSEGCOM(Seg,Com,Type,ClrOrSet);
       return Flag;

  case Nx: 
//#ifdef CONFLICT_TAB_CHKEN
//	temp=7;
//#else
	temp=1;
//#endif
      for(i=0;i<temp;i++)
      { 
        Seg=SEG(LCD_N_Const[Pos+i].x);
        Com=COM(LCD_N_Const[Pos+i].y);
      	Flag=SetOrClrAndChkSEGCOM(Seg,Com,Type,ClrOrSet);
      	if(!Flag)
      	return 0;
      }
      return 1;

			
      
	}

  return 0;
}
Example #7
0
int add_kernel(const char *name, double mu, const char *expr) {
  int ki = volterra2_add_kernel(expr, mu);
  if (ki < 0)
    return 1;

  if (add_symbol(name, 10, 0, COM(KERTYPE, ki)) < 0) {
    volterra2_remove_kernel(ki);
    return 1;
  }

  return 0;
}
Example #8
0
void RH_(void)
{
	dht11=0;
	Delay18ms();
	dht11=1;
	Delay_10us();
	Delay_10us();
	dht11=1; 
	if(!dht11)	
	{
		U8FLAG=2;
		while((!dht11)&&U8FLAG++);
		U8FLAG=2;
		while((dht11)&&U8FLAG++);
		COM();
		U8RH_data_H_temp=U8comdata;
		COM();
		U8RH_data_L_temp=U8comdata;
		COM();
		U8T_data_H_temp=U8comdata;
		COM();
		U8T_data_L_temp=U8comdata;
		COM();
		U8checkdata_temp=U8comdata;
		dht11=1;
			
		U8temp=(U8T_data_H_temp+U8T_data_L_temp+U8RH_data_H_temp+U8RH_data_L_temp);
		if(U8temp==U8checkdata_temp)
		{
			U8RH_data_H = U8RH_data_H_temp;
			U8RH_data_L = U8RH_data_L_temp;
			U8T_data_H=U8T_data_H_temp;
			U8T_data_L=U8T_data_L_temp;
			U8checkdata=U8checkdata_temp;
		}
	}

}
Example #9
0
int add_con(const char *name, double value) {
  double *p = parser_doubles_append(&constants);

  if (!p) return 1;

  *p = value;

  if (add_symbol(name, 10, 0, COM(CONTYPE, constants.len - 1)) < 0) {
    parser_doubles_remove(&constants, constants.len - 1, 1);
    return 1;
  }

  return 0;
}
Example #10
0
int add_var(const char *name, double value) {
  double *p = parser_doubles_append(&variables);

  if (!p) return 1;

  *p = value;

  if (add_symbol(name, 10, 0, COM(VARTYPE, variables.len - 1)) < 0) {
    parser_doubles_remove(&variables, variables.len - 1, 1);
    return 1;
  }

  return 0;
}
Example #11
0
void Molecule::rotate(Vector axis, double theta) {
    Eigen::Vector3d axisEig = {axis[0], axis[1], axis[2]};
    Eigen::AngleAxisd ax(theta, axisEig);
    Eigen::Matrix3d rot;
    rot = ax;
    Vector com = COM();
    Eigen::Vector3d comEig= {com[0], com[1], com[2]};
    for (int id : ids) {
        Atom &a = state->idToAtom(id);
        Eigen::Vector3d posEig = {a.pos[0], a.pos[1], a.pos[2]};
        Eigen::Vector3d relEig = posEig-comEig;
        relEig = rot * relEig;
        a.pos = Vector(relEig[0], relEig[1], relEig[2]) + com;
    }
}
Example #12
0
int add_ufun_name(char *name, int narg) {
  UserFunction *p = parser_ufuns_append(&ufuns);

  if (!p) return 1;

  strncpy(p->name, name, sizeof(p->name));
  p->name[sizeof(p->name) - 1] = '\0';

  if (add_symbol(name, 10, narg, COM(UFUNTYPE, ufuns.len - 1)) < 0) {
    parser_ufuns_remove(&ufuns, ufuns.len - 1, 1);
    return 1;
  }

  return 0;
}
Example #13
0
int add_ufun(const char *name, const char *expr, int narg) {
  int i, l;
  int end;
  UserFunction *p = parser_ufuns_append(&ufuns);

  if (!p) return 1;

  if ((p->rpn = malloc(1024)) == NULL) {
    plintf("not enough memory!!\n");
    return 1;
  }
  if ((p->def = malloc(MAXEXPLEN)) == NULL) {
    free(p->rpn);
    parser_ufuns_remove(&ufuns, ufuns.len - 1, 1);
    plintf("not enough memory!!\n");
    return 1;
  }

  strcpy(p->def, expr);
  l = strlen(p->def);
  p->def[l - 1] = '\0';
  strcpy(p->name, name);
  p->narg = narg;
  for (i = 0; i < narg; i++) {
    sprintf(p->args[i], "ARG%d", i + 1);
  }

  if (parse_expr(expr, p->rpn, &end)) {
    free(p->def);
    free(p->rpn);
    parser_ufuns_remove(&ufuns, ufuns.len - 1, 1);
    plintf("ERROR IN FUNCTION DEFINITION\n");
    return 1;
  }

  fixup_endfun(p->rpn, end, narg);

  if (add_symbol(name, 10, narg, COM(UFUNTYPE, ufuns.len - 1)) < 0) {
    free(p->def);
    free(p->rpn);
    parser_ufuns_remove(&ufuns, ufuns.len - 1, 1);
    return 1;
  }

  return 0;
}
Example #14
0
int touch(const char* filename, mode_t mode)
{
	size_t bytes = 0;
	int fd = -1;

	if((fd = open(filename, O_CREAT | O_WRONLY, mode)) < 0)
	{
		COM(SELF, "FATAL: %s: %s: %s\n", filename, strerror(errno));
		fprintf(stderr, "FATAL: %s: %s: %s\n", SELF, filename, strerror(errno));
		return errno;
	}
	char byte = '\0';
	if((bytes = write(fd, &byte, 1)) < 1)
	{
		return errno;
	}
	close(fd);
	return 0;
}
Example #15
0
int
arch_pdp11_translate_instr(cpu_t *cpu, addr_t pc, BasicBlock *bb) {
	uint16_t opcode = cpu->RAM[pc];

//LOG("%s:%d PC=$%04X\n", __func__, __LINE__, pc);

	switch (get_instr(opcode)) {
		/* flags */
		case INSTR_CLC:	LET1(cpu->ptr_C, FALSE);				break;
		case INSTR_CLD:	LET1(ptr_D, FALSE);				break;
		case INSTR_CLI:	LET1(ptr_I, FALSE);				break;
		case INSTR_CLV:	LET1(cpu->ptr_V, FALSE);				break;
		case INSTR_SEC:	LET1(cpu->ptr_C, TRUE);				break;
		case INSTR_SED:	LET1(ptr_D, TRUE);				break;
		case INSTR_SEI:	LET1(ptr_I, TRUE);				break;

		/* register transfer */
		case INSTR_TAX:	SET_NZ(LET(X,R(A)));			break;
		case INSTR_TAY:	SET_NZ(LET(Y,R(A)));			break;
		case INSTR_TXA:	SET_NZ(LET(A,R(X)));			break;
		case INSTR_TYA:	SET_NZ(LET(A,R(Y)));			break;
		case INSTR_TSX:	SET_NZ(LET(X,R(S)));			break;
		case INSTR_TXS:	SET_NZ(LET(S,R(X)));			break;

		/* load */
		case INSTR_LDA:	SET_NZ(LET(A,OPERAND));			break;
		case INSTR_LDX:	SET_NZ(LET(X,OPERAND));			break;
		case INSTR_LDY:	SET_NZ(LET(Y,OPERAND));			break;

		/* store */
		case INSTR_STA:	STORE(R(A),LOPERAND);			break;
		case INSTR_STX:	STORE(R(X),LOPERAND);			break;
		case INSTR_STY:	STORE(R(Y),LOPERAND);			break;

		/* stack */
		case INSTR_PHA:	PUSH(R(A));						break;
		case INSTR_PHP:	PUSH(arch_flags_encode(cpu, bb));	break;
		case INSTR_PLA:	SET_NZ(LET(A,PULL));			break;
		case INSTR_PLP:	arch_flags_decode(cpu, PULL, bb);	break;

		/* shift */
		case INSTR_ASL:	SET_NZ(SHIFTROTATE(LOPERAND, LOPERAND, true, false));	break;
		case INSTR_LSR:	SET_NZ(SHIFTROTATE(LOPERAND, LOPERAND, false, false));	break;
		case INSTR_ROL:	SET_NZ(SHIFTROTATE(LOPERAND, LOPERAND, true, true));	break;
		case INSTR_ROR:	SET_NZ(SHIFTROTATE(LOPERAND, LOPERAND, false, true));	break;

		/* bit logic */
		case INSTR_AND:	SET_NZ(LET(A,AND(R(A),OPERAND)));			break;
		case INSTR_ORA:	SET_NZ(LET(A,OR(R(A),OPERAND)));			break;
		case INSTR_EOR:	SET_NZ(LET(A,XOR(R(A),OPERAND)));			break;
		case INSTR_BIT:	SET_NZ(OPERAND);							break;

		/* arithmetic */
		case INSTR_ADC:	SET_NZ(ADC(ptr_A, ptr_A, OPERAND, true, false));		break;
		case INSTR_SBC:	SET_NZ(ADC(ptr_A, ptr_A, COM(OPERAND), true, false));	break;
		case INSTR_CMP:	SET_NZ(ADC(NULL, ptr_A, COM(OPERAND), false, true));		break;
		case INSTR_CPX:	SET_NZ(ADC(NULL, ptr_X, COM(OPERAND), false, true));		break;
		case INSTR_CPY:	SET_NZ(ADC(NULL, ptr_Y, COM(OPERAND), false, true));		break;

		/* increment/decrement */
		case INSTR_INX:	SET_NZ(LET(X,INC(R(X))));			break;
		case INSTR_INY:	SET_NZ(LET(Y,INC(R(Y))));			break;
		case INSTR_DEX:	SET_NZ(LET(X,DEC(R(X))));			break;
		case INSTR_DEY:	SET_NZ(LET(Y,DEC(R(Y))));			break;

		case INSTR_INC:	SET_NZ(STORE(INC(OPERAND),LOPERAND));			break;
		case INSTR_DEC:	SET_NZ(STORE(DEC(OPERAND),LOPERAND));			break;
		
		/* control flow */
		case INSTR_JMP:
			if (get_addmode(opcode) == ADDMODE_IND) {
				Value *v = LOAD_RAM16(CONST32(OPERAND_16));
				new StoreInst(v, cpu->ptr_PC, bb);
			}
			break;
		case INSTR_JSR:	PUSH16(pc+2);						break;
		case INSTR_RTS:	STORE(ADD(PULL16, CONST16(1)), cpu->ptr_PC);	break;

		/* branch */
		case INSTR_BEQ:
		case INSTR_BNE:
		case INSTR_BCS:
		case INSTR_BCC:
		case INSTR_BMI:
		case INSTR_BPL:
		case INSTR_BVS:
		case INSTR_BVC:
			break;

		/* other */
		case INSTR_NOP:											break;
		case INSTR_BRK:	arch_6502_trap(cpu, pc, bb);			break;
		case INSTR_RTI:	arch_6502_trap(cpu, pc, bb);			break;
		case INSTR_XXX:	arch_6502_trap(cpu, pc, bb);			break;
	}

	return get_length(get_addmode(opcode));
}
Example #16
0
int add_net_name(int index, const char *name) {
  if (add_symbol(name, 10, 1, COM(NETTYPE, index)) < 0)
    return 1;

  return 0;
}
Example #17
0
/* communicate objects using point to point communication */
int COMOBJS (MPI_Comm comm, int tag,
	     OBJ_Pack pack,
	     void *data,
	     OBJ_Unpack unpack,
             COMOBJ *send, int nsend,
	     COMOBJ **recv, int *nrecv) /* recv is contiguous => free (*recv) releases all memory */
{
  COMDATA *send_data,
	  *recv_data,
	  *cd, *cc;
  int recv_count,
      i, n,
      ret;
  COMOBJ *co;
  MAP *map;
  MEM mem;

  ERRMEM (send_data = malloc (nsend * sizeof (COMDATA)));
  MEM_Init (&mem, sizeof (MAP), MAX (nsend, 64));

  /* pack objects */
  for (i = 0, cd = send_data, co = send, map = NULL; i < nsend; i ++, cd ++, co ++)
  {
    int isize = 0,
	dsize = 0;

    cd->rank = co->rank;

    if ((cc = MAP_Find (map, co->o, NULL))) /* same object was already packed */
    {
      cd->ints = cc->ints;
      cd->doubles = cc->doubles;
      cd->i = cc->i;
      cd->d = cc->d;
    }
    else
    {
      cd->ints = 0;
      cd->doubles = 0;
      cd->i = NULL;
      cd->d = NULL;

      pack (co->o, &dsize, &cd->d, &cd->doubles, &isize, &cd->i, &cd->ints);

      MAP_Insert (&mem, &map, co->o, cd, NULL);
    }
  }

  /* send and receive packed data */
  if (tag == INT_MIN) ret = COMALL (comm, send_data, nsend, &recv_data, &recv_count); /* all to all */
  else ret = COM (comm, tag, send_data, nsend, &recv_data, &recv_count); /* point to point */

#if PARDEBUG
  {
    int debug_send_count, *ip, *jp, ii [2], jj [2];
    COMDATA *debug_send_data;
    double *qq, *pp;

    /* send backwards */
    if (tag == INT_MIN) COMALL (comm, recv_data, recv_count, &debug_send_data, &debug_send_count);
    else COM (comm, tag, recv_data, recv_count, &debug_send_data, &debug_send_count);

    ii[0] = 0, ii[1] = 0;
    jj[0] = 0, jj[1] = 0;
    do
    {
      ip = next_int (send_data, nsend, ii);
      jp = next_int (debug_send_data, debug_send_count, jj);
      if (ip && jp)
      {
	ASSERT_DEBUG (*ip == *jp, "Integer values mismatch");
      }
      else
      {
	ASSERT_DEBUG (!ip && !jp, "Integer count mismatch");
      }
    }
    while (ip && jp);

    ii[0] = 0, ii[1] = 0;
    jj[0] = 0, jj[1] = 0;
    do
    {
      qq = next_double (send_data, nsend, ii);
      pp = next_double (debug_send_data, debug_send_count, jj);
      if (qq && pp)
      {
	ASSERT_DEBUG (*qq == *pp, "Double values mismatch");
      }
      else
      {
	ASSERT_DEBUG (!qq && !pp, "Double count mismatch");
      }
    }
    while (qq && pp);

    free (debug_send_data);
  }
#endif

  if (recv_count)
  {
    *nrecv = recv_count;
    ERRMEM (*recv = malloc ((*nrecv) * sizeof (COMOBJ)));

    /* unpack received objects */
    for (n = i = 0, cd = recv_data, co = *recv; i < recv_count; i ++, cd ++)
    {
      int ipos = 0,
	  dpos = 0;

      do
      {
	if (n == *nrecv)
	{
	  *nrecv *= 2; /* resize the receive buffer */
	  ERRMEM (*recv = realloc (*recv, (*nrecv) * sizeof (COMOBJ)));
	  co = *recv + n; /* and reset the current pointer */
	}

	co->rank = cd->rank;
	co->o = unpack (data, &dpos, cd->d, cd->doubles, &ipos, cd->i, cd->ints);

	co ++;
	n ++;

      } while (ipos < cd->ints || dpos < cd->doubles); /* while something is left to unpack */
    }

    /* truncate output */
    if (n) ERRMEM (*recv = realloc (*recv, n * sizeof (COMOBJ)));
    *nrecv = n;
  }
  else
  {
    *recv = NULL;
    *nrecv = 0;
  }

  /* cleanup */
  for (MAP *item = MAP_First (map); item; item = MAP_Next (item))
  { cd = item->data; free (cd->i); free (cd->d); }
  MEM_Release (&mem);
  free (send_data);
  free (recv_data); /* contiguous */

  return ret;
}
Example #18
0
static double eval_rpn(int *equat) {
  int i;
  double temx, temy, temz;
  union /*  WARNING  -- ASSUMES 32 bit int  and 64 bit double  */
  {
    struct {
      int int1;
      int int2;
    } pieces;
    struct {
      double z;
    } num;
  } encoder;

  while ((i = *equat++) != ENDEXP) {
    switch (i) {
    case NUMSYM:
      encoder.pieces.int2 = *equat++;
      encoder.pieces.int1 = *equat++;
      PUSH(encoder.num.z);
      break;
    case ENDFUN:
      i = *equat++;
      uptr -= i;
      break;
    case MYIF: {
      int ijmp;

      temx = POP;
      ijmp = *equat++;
      if (temx == 0.0)
        equat += ijmp;
      break;
    }
    case MYTHEN: {
      int ijmp = *equat++;

      equat += ijmp;
      break;
    }
    case MYELSE:
      break;
    case ENDDELSHFT:
      temx = POP;
      temy = POP;
      temz = POP;
      PUSH(do_delay_shift(temx, temy, temz));
      break;
    case ENDDELAY:
      temx = POP;
      temy = POP;
      PUSH(do_delay(temx, temy));
      break;
    case ENDSHIFT:
      temx = POP;
      temy = POP;
      PUSH(do_shift(temx, temy));
      break;
    case ENDISHIFT:
      temx = POP;
      temy = POP;
      PUSH(do_ishift(temx, temy));
      break;
    case SUMSYM: {
      int high;
      int low;
      int ijmp;
      double sum;

      temx = POP;
      high = (int)temx;
      temx = POP;
      low = (int)temx;
      ijmp = *equat++;
      sum = 0.0;
      if (low <= high) {
        for (int is = low; is <= high; is++) {
          constants.elems[SumIndex] = (double)is;
          sum += eval_rpn(equat);
        }
      }
      equat += ijmp;
      PUSH(sum);
      break;
    }
    case ENDSUM:
      return (POP);
    case INDXCOM:
      PUSH(0.0);
      break;
    default: {
      int it = i / MAXTYPE;
      int in = i % MAXTYPE;
      switch (it) {
      case FUN1TYPE:
        PUSH(expr_fun1[in](POP));
        break;
      case FUN2TYPE:
        switch (in) {
        case 0:
          temx = POP;
          temy = POP;
          PUSH(temx + temy);
          break;
        case 1:
          temx = POP;
          temy = POP;
          PUSH(temy - temx);
          break;
        case 2:
          temx = POP;
          temy = POP;
          PUSH(temx * temy);
          break;
        case 3:
          temx = POP;
          if (temx == 0.0)
            temx = DOUB_EPS;
          temy = POP;
          PUSH(temy / temx);
          break;
        default:
          temx = POP;
          temy = POP;
          PUSH(expr_fun2[in](temy, temx));
          break;
        }
        break;
      case CONTYPE:
        PUSH(constants.elems[in]);
        break;
      case NETTYPE:
        PUSH(network_value(POP, in));
        break;
      case TABTYPE:
        PUSH(lookup(POP, in));
        break;
      case USTACKTYPE:
        /* ram: so this means ustacks really do need to be of USTACKTYPE */
        PUSH(ustack[uptr - 1 - in]);
        break;
      case KERTYPE:
        PUSH(ker_val(in));
        break;
      case VARTYPE:
        PUSH(variables.elems[in]);
        break;
      /* indexes for shift and delay operators... */
      case SCONTYPE:
        PUSH((double)(COM(CONTYPE, in)));
        break;
      case SVARTYPE:
        PUSH((double)(COM(VARTYPE, in)));
        break;
      case UFUNTYPE:
        i = *equat++;
        for (int j = 0; j < i; j++) {
          ustack[uptr] = POP;
          uptr++;
        }
        PUSH(eval_rpn(ufuns.elems[in].rpn));
        break;
      }
      break;
    }
    }
  }
  return (POP);
}
Example #19
0
static int alg_to_rpn(int *toklist, int *command) {
  int tokstak[500], comptr = 0, stakptr = 0, lstptr = 0, temp;
  int ncomma = 0;
  int loopstk[100];
  int loopptr = 0;
  int nif = 0, nthen = 0, nelse = 0;

  tokstak[0] = STARTTOK;
  stakptr = 1;
  for (;;) {
    int newtok = toklist[lstptr++];
    int oldtok;

    switch (newtok) {
    case DELSYM:
      temp = my_symb.elems[toklist[lstptr + 1]].com;
      if (!is_uvar(temp)) {
        printf("Illegal use of DELAY \n");
        return 1;
      }

      /* ram -- is this right? not sure I understand what was happening here */
      /* create a temporary sybol */
      my_symb.elems[shift_index].com = COM(SVARTYPE, temp % MAXTYPE);
      NDELAYS++;
      toklist[lstptr + 1] = shift_index;
      break;

    case DELSHFTSYM:
      temp = my_symb.elems[toklist[lstptr + 1]].com;
      if (!is_uvar(temp)) {
        printf("Illegal use of DELAY Shift \n");
        return 1;
      }

      /* ram -- same issue */
      /* create a temporary sybol */
      my_symb.elems[shift_index].com = COM(SVARTYPE, temp % MAXTYPE);
      NDELAYS++;
      toklist[lstptr + 1] = shift_index;
      break;

    case SHIFTSYM:
    case ISHIFTSYM:
      temp = my_symb.elems[toklist[lstptr + 1]].com;
      if (!is_uvar(temp) && !is_ucon(temp)) {
        printf("Illegal use of SHIFT \n");
        return 1;
      }

      /* ram -- same issue */
      /* create a temporary sybol */
      if (is_uvar(temp))
        my_symb.elems[shift_index].com = COM(SVARTYPE, temp % MAXTYPE);
      if (is_ucon(temp))
        my_symb.elems[shift_index].com = COM(SCONTYPE, temp % MAXTYPE);
      toklist[lstptr + 1] = shift_index;
      break;
    }

  next:
    oldtok = tokstak[stakptr - 1];

    if (newtok == ENDTOK && oldtok == STARTTOK)
      break;

    if (newtok == LPAREN) {
      tokstak[stakptr++] = LPAREN;
      continue;
    }
    if (newtok == RPAREN) {
      switch (oldtok) {
      case LPAREN:
        stakptr--;
        continue;
      case COMMA:
        stakptr--;
        ncomma++;
        goto next;
      }
    }
    if (newtok == COMMA && oldtok == COMMA) {
      tokstak[stakptr++] = COMMA;
      continue;
    }

    if (my_symb.elems[oldtok].pri >= my_symb.elems[newtok].pri) {
      int my_com = my_symb.elems[oldtok].com;
      command[comptr] = my_com;
      comptr++;

      switch (my_com) {
      case NUMSYM:
        /* NUMSYM stores the encoded value as two extra integers. */
        stakptr--;
        command[comptr] = tokstak[stakptr - 1];
        comptr++;
        stakptr--;
        command[comptr] = tokstak[stakptr - 1];
        comptr++;
        break;

      case SUMSYM:
        /* SUMSYM has a jump location to be filled in. */
        loopstk[loopptr] = comptr;
        comptr++;
        loopptr++;
        ncomma -= 1;
        break;

      case ENDSUM:
        /* Fill in SUMSYM jump location. */
        loopptr--;
        command[loopstk[loopptr]] = comptr - loopstk[loopptr] - 1;
        break;

      case MYIF:
        /* MYIF has a jump location to be filled in. */
        loopstk[loopptr] = comptr;
        comptr++;
        loopptr++;
        nif++;
        break;

      case MYTHEN:
        /* Fill in the MYIF jump location. */
        loopptr--;
        command[loopstk[loopptr]] = comptr - loopstk[loopptr]; /* -1 is old */

        /* MYTHEN has a jump location to be filled in. */
        loopstk[loopptr] = comptr;
        loopptr++;
        comptr++;
        nthen++;
        break;

      case MYELSE:
        /* Fill in the MYTHEN jump location. */
        loopptr--;
        command[loopstk[loopptr]] = comptr - loopstk[loopptr] - 1;
        nelse++;
        break;

      case ENDDELAY:
      case ENDSHIFT:
      case ENDISHIFT:
        ncomma -= 1;
        break;

      case ENDDELSHFT:
        ncomma -= 2;
        break;

      default:
        if (my_com / MAXTYPE == FUN2TYPE && my_symb.elems[oldtok].arg == 2)
          ncomma--;

        /*    CHECK FOR USER FUNCTION       */
        if (is_ufun(my_com)) {
          int my_arg = my_symb.elems[oldtok].arg;
          command[comptr] = my_arg;
          comptr++;
          ncomma += 1 - my_arg;
        }
      }

      stakptr--;
      goto next;
    }

    if (newtok == NUMTOK) {
      /* NUMTOK stores the encoded value as two extra integers. */
      tokstak[stakptr++] = toklist[lstptr++];
      tokstak[stakptr++] = toklist[lstptr++];
    }
    tokstak[stakptr++] = newtok;
  }

  if (ncomma != 0) {
    plintf("Illegal number of arguments\n");
    return 1;
  }
  if (nif != nelse || nif != nthen) {
    plintf("If statement missing ELSE or THEN \n");
    return 1;
  }
  command[comptr] = my_symb.elems[ENDTOK].com;

  return 0;
}
Example #20
0
ParserDoubles variables = VECTOR_INIT;
ParserSymbols my_symb = VECTOR_INIT;
ParserUserFunctions ufuns = VECTOR_INIT;

static int SumIndex = 1;
static int shift_index = -1;

/* FIXXX */
static int stack_pointer, uptr;
static double stack[200], ustack[200];

static const ParserSymbol BUILTIN_SYMBOLS[] = {
    {"(", 1, ENDEXP, 0, 1}, /*  0   */
    {")", 1, ENDEXP, 0, 2},
    {",", 1, ENDEXP, 0, 3},
    {"+", 1, COM(FUN2TYPE, 0), 0, 4},
    {"-", 1, COM(FUN2TYPE, 1), 0, 4},
    {"*", 1, COM(FUN2TYPE, 2), 0, 6},
    {"/", 1, COM(FUN2TYPE, 3), 0, 6},
    {"^", 1, COM(FUN2TYPE, 5), 0, 7},
    {"**", 2, COM(FUN2TYPE, 5), 0, 7},
    {"~", 1, COM(FUN1TYPE, 14), 0, 6},
    {"START", 5, -1, 0, 0}, /* 10  */
    {"END", 3, ENDEXP, 0, -1},
    {"ATAN2", 5, COM(FUN2TYPE, 4), 2, 10},
    {"MAX", 3, COM(FUN2TYPE, 6), 2, 10},
    {"MIN", 3, COM(FUN2TYPE, 7), 2, 10},
    {"SIN", 3, COM(FUN1TYPE, 0), 0, 10},
    {"COS", 3, COM(FUN1TYPE, 1), 0, 10},
    {"TAN", 3, COM(FUN1TYPE, 2), 0, 10},
    {"ASIN", 4, COM(FUN1TYPE, 3), 0, 10},