示例#1
0
/**********************************************************************
 * AddProtoToClass
 *
 * Add a new proto to this class.  Malloc new space and copy the
 * old protos if necessary.  Return the proto id for the new proto.
 **********************************************************************/
int AddProtoToClass(CLASS_TYPE Class) {
  int i;
  int Bit;
  int NewNumProtos;
  int NewProto;
  BIT_VECTOR Config;

  if (Class->NumProtos >= Class->MaxNumProtos) {
    /* add protos in PROTO_INCREMENT chunks at a time */
    NewNumProtos = (((Class->MaxNumProtos + PROTO_INCREMENT) /
      PROTO_INCREMENT) * PROTO_INCREMENT);

    Class->Prototypes = (PROTO) Erealloc (Class->Prototypes,
      sizeof (PROTO_STRUCT) *
      NewNumProtos);

    Class->MaxNumProtos = NewNumProtos;

    for (i = 0; i < Class->NumConfigs; i++) {
      Config = Class->Configurations[i];
      Class->Configurations[i] = ExpandBitVector (Config, NewNumProtos);

      for (Bit = Class->NumProtos; Bit < NewNumProtos; Bit++)
        reset_bit(Config, Bit);
    }
  }
  NewProto = Class->NumProtos++;
  if (Class->NumProtos > MAX_NUM_PROTOS) {
    tprintf("Ouch! number of protos = %d, vs max of %d!",
            Class->NumProtos, MAX_NUM_PROTOS);
  }
  return (NewProto);
}
示例#2
0
static int __set_gpio_value(uint32_t id, uint8_t pin_num, int value, uint32_t offset)
{
	struct gpio_data *gpio_data = NULL;
	uint32_t addr;
	int width;

	gpio_data = __get_gpio_data_by_id(id);
	if (!gpio_data)
		return -1;

	addr = gpio_data->addr + offset;

	switch(offset) {
	case GPIO_MODER_OFFSET:
	case GPIO_OSPEEDR_OFFSET:
	case GPIO_PUPDR_OFFSET:
		width = 2;
		return set_value(addr, value, pin_num << 1, width);

	case GPIO_AFRL_OFFSET:
	case GPIO_AFRH_OFFSET:
		width = 4;
		return set_value(addr, value, (pin_num % 8) << 2, width);

	default:
		return (value)
			? set_bit(addr, pin_num)
			: reset_bit(addr, pin_num);
	}
}
示例#3
0
文件: ippool.c 项目: duthils/netvirt
static int
free_bit(uint8_t bitmap[], size_t bits, size_t bit)
{
	if (bit <= bits) {
		reset_bit(bitmap, bit);
		return 1;
	}
	return 0;
}
示例#4
0
// Implements section 6.4.1, book 3 of EMV spec
int ProcessingRestrictions::CheckVersion()
{
    int res;

    if (InitStatus == EMV_DATA_ERROR)
        return initError;
    if (InitStatus == EMV_DATA_NOT_INITIALIZED)
    {
        if (initData() != SUCCESS)
            return initError;
    }

    //1 Get an application version number read from the ICC
    DataObject dob_icc;
    res = EnvContext.getTagValue (0x9f08, &dob_icc, true);
    if (res != SUCCESS || dob_icc.len == 0)
    {
        // If Appl Version number is not present in the ICC, simply return
        return SUCCESS;
    }

    //2 Get an application version number from the terminal
    DataObject dob_term;
    res = EnvContext.getTagValue (0x9f09, &dob_term, false);
    if (res != SUCCESS || dob_term.len == 0)
    {
        // If Appl Version number is not present on the terminal, simply return
        return SUCCESS;
    }

    if (dob_icc.len != dob_term.len)
        set_bit (dob_TVR.Data [1], 0x80); // Versions are different
    else if (memcmp(dob_icc.Data, dob_term.Data, dob_icc.len) != 0)
        set_bit (dob_TVR.Data [1], 0x80); // versions are different
    else
    {
        // Versions are identical
        reset_bit (dob_TVR.Data [1], 0x80);
    }

    // Update TVR
    EnvContext.setTagValue (0x95, &dob_TVR, IO_UPDATE);
    return SUCCESS;
}
示例#5
0
static void hw_init(void)
{
    reset_bit(GPIO_OE, 25);
    reset_bit(GPIO_DATAOUT, 25);
}
示例#6
0
文件: aval1.c 项目: magsilva/poketool
void avaliador(AUTOMATO * automatos_inicio, b_vector N[]) {
	AUTOMATO * atual_automato;
	char literal[LITERAL_MAX_SIZE], lit_aux[LITERAL_MAX_SIZE], * ptr_aux;
	int numero;
	int node;
	long seq_exec = 0;
	long no_func_invoc = 0;

	FILE * executed_paths = (FILE *) fopen("path.tes","r");
	if (executed_paths == (FILE *) NULL) {
		error("* * Erro Fatal: Nao consegui abrir o arquivo paths.tes * *");
	}

	/* algoritmo de avaliacao */
	while (fscanf(executed_paths,"%d",&node) != EOF) { /* diferente de fim de arquivo */

		/* controla a sequencia de execucao */
		switch (node) {
			case 0:
				seq_exec = 0;
				break;
			case 1:
				seq_exec = 1;
				no_func_invoc++;
				break;
			default:
				seq_exec++;
		}

		/* verifica os automatos */
		for (atual_automato = automatos_inicio; atual_automato != (AUTOMATO *) NULL; atual_automato = atual_automato->next) {
     			if (atual_automato->estado == Q1 && node != 0) { /* esta' em processo de reconhecimento da expressao regular */
				peg_tok(literal,atual_automato->pos_corrente);

				/* verifica qual acao a ser tomada */
				if ( !strcmp(literal, "N*")) { /* e' igual a N* */
					peg_next_tok(lit_aux, atual_automato->pos_corrente);
					if (lit_aux[0] == '\0') {
				             literal[0] = '\0'; /* nao existe proximo literal;
                                				   fim da expressao regular */
					} else { /* existe proximo literal */
						if (e_numero(lit_aux)) {
							numero = atoi(lit_aux); /* converte ASCII para int */
				               		if (node == numero) {
					        	        /* reconheceu o no'; caminha na expressao regular */
					               		atual_automato->pos_corrente = jump_tok(atual_automato->pos_corrente);
					                } else {
								if (! test_bit(node,&N[atual_automato->criterio])) {
							                  atual_automato->estado = Q2; /* nao pertence a N; nao reconhece */
								}
							}
						}
					}
				} else {
					error("* * Erro Fatal: Descritor nao esta' correto * *");
				}
        
				if (! strcmp(literal,"Nnvlf*")) { /* e' igual a Nnvlf* */
					peg_next_tok(lit_aux, atual_automato->pos_corrente);
					if (lit_aux[0] == '\0') {
						literal[0] = '\0'; /* nao existe proximo literal; fim da expressao regular */
						if (atual_automato->estado == Q1) {
							atual_automato->estado = Q3; /* reconheceu a entrada */
						}
					} else { /* existe proximo literal */
						if (e_numero(lit_aux)) {
							numero = atoi(lit_aux); /* converte ASCII para int */
							if (node == numero) { /* reconheceu o no'; caminha na expressao regular */
								atual_automato->pos_corrente = jump_tok(atual_automato->pos_corrente);
							} else {
								if (! test_bit(node,&(atual_automato->Nnv))) {
									atual_automato->estado = Q2; /* nao pertence a N, nao reconhece */
								}
                					}
						}
					}
				} else {
					error("* * Erro Fatal: Descritor nao esta' correto * *");
				}

				if (! strcmp(literal,"Nnv*")) { /* e' igual a Nnv* */
					peg_next_tok(lit_aux,atual_automato->pos_corrente);
					if (lit_aux[0] == '\0') {
						literal[0] = '\0'; /* nao existe proximo literal; fim da expressao regular */
						if (atual_automato->estado == Q1) {
							atual_automato->estado = Q3; /* reconheceu a entrada */
						}
					} else { /* existe proximo literal */
						if (e_numero(lit_aux)) {
							numero = atoi(lit_aux); /* converte ASCII para int */
							if (node == numero) {
								/* reconheceu o no'; caminha na expressao regular */
								atual_automato->pos_corrente = jump_tok(atual_automato->pos_corrente);
							} else {
								if (!test_bit(node, &(atual_automato->Nnv))) {
									atual_automato->estado = Q2; /* nao pertence a N, nao reconhece */
								}
							}
						} else {
							error("* * Erro Fatal: Descritor nao esta' correto * *");
						}
					}
				}

				if (! strcmp(literal, "Nlf*")) { /* e' igual a Nlf* */
					peg_next_tok(lit_aux,atual_automato->pos_corrente);
					if (lit_aux[0] == '\0') {
				             	literal[0] = '\0'; /* nao existe proximo literal; fim da expressao regular */
				              	if (atual_automato->estado == Q1) {
					                atual_automato->estado = Q3; /* reconheceu a entrada */
						}
					} else { /* existe proximo literal */
						if (e_numero(lit_aux)) {
							numero = atoi(lit_aux); /* converte ASCII para int */
					                if (node == numero) {
						                /* reconheceu o no'; caminha na expressao regular */
						                 atual_automato->pos_corrente = jump_tok(atual_automato->pos_corrente);
					                } else {	
								if (!test_bit(node,&(atual_automato->Nnv))) {
							                  atual_automato->estado = Q2; /* nao pertence a N, nao reconhece */
								}
					                }
						} else {
			        		       error("* * Erro Fatal: Descritor nao esta' correto * *");
						}
					}
				}

				if (e_numero(literal)) { /* e' um numero */
					numero = atoi(literal); /* converte ASCII para int */
					if (numero == node) { /* reconheceu o no'; caminha na expressao regular */
						atual_automato->pos_corrente = apont_next_tok(atual_automato->pos_corrente);
					} else {
						atual_automato->estado = Q2; /* nao reconheceu a entrada */
					}
				}

				if (! strcmp(literal,"[")) {
					/* faz ptr_aux apontar para o token "]" */
					ptr_aux = apont_next_tok(jump_tok(atual_automato->pos_corrente));
					peg_next_tok(lit_aux,ptr_aux);
					if (lit_aux[0] ==  '\0') {
						error("Erro Fatal: Expressao Regular errado no automato");
					} else { /* existe proximo literal */
						if (e_numero(lit_aux)) {
							numero = atoi(lit_aux); /* converte ASCII para int */
					                if (node == numero) {
								/* reconheceu o no'; caminha na expressao regular */
								atual_automato->pos_corrente = jump_tok(ptr_aux);
							} else {
								if (!test_bit(node, &(atual_automato->Nnv))) {
									atual_automato->estado = Q2; /* nao pertence a N, nao reconhece */
								} else {
									atual_automato->pos_corrente = apont_next_tok(atual_automato->pos_corrente);
								}
							}
				                } else {
					               error("* * Erro Fatal: Descritor nao esta' correto * *");
						}
					}
				}

				if (! strcmp(literal,"]*")) {
					peg_next_tok(lit_aux, atual_automato->pos_corrente);
					if (lit_aux[0] ==  '\0') {
						error("Erro Fatal: Expressao Regular errado no automato");
					} else { /* existe proximo literal */
						if (e_numero(lit_aux)) {
							numero = atoi(lit_aux); /* converte ASCII para int */
							if (node == numero) { /* reconheceu o no'; caminha na expressao regular */
								atual_automato->pos_corrente = jump_tok(atual_automato->pos_corrente);
							} else {
								if (!test_bit(node, &(atual_automato->Nnv))) {
									atual_automato->estado = Q2; /* nao pertence a N, nao reconhece */
								} else {
									atual_automato->pos_corrente = apont_prev_tok(apont_prev_tok(atual_automato->pos_corrente));
                						}
							}
						} else {
							error("* * Erro Fatal: Descritor nao esta' correto * *");
						}
					}
				}
     
				if (atual_automato->estado == Q3 || (atual_automato->estado == Q1 && fim_exp_reg(atual_automato->pos_corrente))) {
					/* registra a frequencia */
					atual_automato->estado = Q1;
					atual_automato->freq++;
					atual_automato->pos_corrente = atual_automato->exp_regular;
					if (atual_automato->i == node) {
						atual_automato->pos_corrente = jump_tok(atual_automato->exp_regular);
					}

					if (atual_automato->criterio != PU && atual_automato->criterio != ARCS && atual_automato->criterio != NOS) {
						/* atual_automato->Nnv = atual_automato->Ni; */
						b_vector_cpy(&(atual_automato->Nnv),&(atual_automato->Ni));
					}
				}
    			}
    
			if (atual_automato->estado == Q2 && atual_automato->i == node) { /* "reseta" o automato */
				atual_automato->estado = Q1;
				atual_automato->pos_corrente = jump_tok(atual_automato->exp_regular);
			
				/* se o criterio nao e todos-pot-usos, recupera o conjunto Nnv */
				if (atual_automato->criterio != PU && atual_automato->criterio != ARCS && atual_automato->criterio != NOS) {
					/* atual_automato->Nnv = atual_automato->Ni; */
					b_vector_cpy(&(atual_automato->Nnv),&(atual_automato->Ni));
				}
			}

			switch (atual_automato->freq) {
				case 0:
					/* Primeira ocorrencia do automato, guarda a sequencia de execucao do no i */
					if (atual_automato->i == node) {
						atual_automato->seq_exec_i = seq_exec;
					}
					break;
				case 1:
					/* Primeira ocorrencia do automato, guarda a sequencia de execucao do no j */
					if (atual_automato->seq_exec_j == 0) {
						atual_automato->seq_exec_j = seq_exec;
						atual_automato->no_func_invoc = no_func_invoc;
					}
        				break;
				default:
					/* Ja' foi registrada a primeira ocorrencia da associacao */
					break;
			}

			/* se o criterio nao e todos-pot-usos, retira o no do conjunto Nnv */
			if ((atual_automato->criterio == PDU && atual_automato->criterio == PUDU) && atual_automato != (AUTOMATO *) NULL && strcmp(literal,"N*")) {
				reset_bit(node,&(atual_automato->Nnv));
			}
		}
	}

	/* terminou de avaliar um caso de teste agora ajusta automatos */
	for (atual_automato = automatos_inicio;atual_automato != (AUTOMATO *) NULL; atual_automato = atual_automato->next) {
		if (atual_automato->freq == 0) { /* nao reconheceu a entrada */
			atual_automato->estado = Q1;
			atual_automato->pos_corrente = atual_automato->exp_regular;
		} else {
			if (atual_automato->freq > 0) {
				atual_automato->estado = Q3; /* reconheceu a entrada */
				tot_req_exec[atual_automato->criterio] += atual_automato->freq;
			}
		}
	}

	fclose(executed_paths);
	return;
}