コード例 #1
0
std::string CintaTransportadora6::obtenerMensajeEstado() {
    char buffer[TAM_BUFFER];
    CintaTransportadora_6 cintaTransportadora;
    
    semaforoAcceso.wait(this->idCinta);
    {
        cinta.readInfo(&cintaTransportadora);
    }
    semaforoAcceso.signal(this->idCinta);
    
    sprintf(buffer, "|");
    for (int i = BUFF_SIZE_CINTA_6-1; i >= 0; --i) {
        if (cintaTransportadora.lugarVacio[(cintaTransportadora.puntoLectura + i) % BUFF_SIZE_CINTA_6]) {
            strcat(buffer, "o|");
        }
        else {
            strcat(buffer, "x|");
        }
    }
    std::string retorno(buffer);
    return retorno;
}
コード例 #2
0
ファイル: util.cpp プロジェクト: tfc2/if680
dVector subtracao(dVector u, dVector v){
	dVector retorno(v.size());
	for (int i = 0; i < v.size(); i++)
		retorno[i] = u[i] - v[i];
	return retorno;
}
コード例 #3
0
ファイル: util.cpp プロジェクト: tfc2/if680
dVector soma(dVector u, dVector v){
	dVector retorno(v.size());
	for (int i = 0; i < v.size(); i++)
		retorno[i] = u[i] + v[i];
	return retorno;
}
コード例 #4
0
ファイル: gera.c プロジェクト: GabrielSiq/INF1018
void gera(FILE *f, void **code, funcp *entry){
    int linha = 1, // controle de leitura das linhas
        pos = 0, // controle da posição do vetor com código de entrada
        numFuncoes = 0; //controle da posição do vetor de endereço das funções
    unsigned int funcoes[10]; // *funções é um vetor com os endereços de cada função no código de entrada
    unsigned char *codigo; // *codigo é um vetor com os códigos de máquina
    char c;
    
    // Separar espaço para o código
    codigo = (unsigned char *)malloc(MAXT);
    
    // Enquanto não chegamos ao fim do arquivo, ler cada caracter e interpretar
    while ((c = fgetc(f)) != EOF) {
        switch (c) {
            case 'f': {  /* function */
                char c0;
                if (fscanf(f, "unction%c", &c0) != 1) 
                    error("comando invalido", linha);
                else
                    prologo(codigo, &pos, funcoes, &numFuncoes);
                break;
            }
            case 'e': {  /* end */
                char c0[3];
                if (fscanf(f, "%3c", c0) != 1)
                    error("comando invalido", linha);
                else
                    finalizacao(codigo, &pos);
                break;
            }
            case 'v': case 'p': {  /* atribuicao */
                int i0;
                char v0 = c, c0;
        
                if (fscanf(f, "%d = %c", &i0, &c0) != 2)
                    error("comando invalido", linha);
        
                if (c0 == 'c') { /* call */
                    int n, i1;
                    char v1;
                    if (fscanf(f, "all %d %c%d", &n, &v1, &i1) != 3) 
                        error("comando invalido", linha);
                    else
                        call(n, v0, i0, v1, i1, funcoes, codigo, &pos);
                }
                else { /* operacao aritmetica */
                    int i1, i2;
                    char v2, op;
                    if (fscanf(f, "%d %c %c%d", &i1, &op, &v2, &i2) != 4)
                        error("comando invalido", linha);
                    else
                        operacao(v0, i0, c0, i1, op, v2, i2, codigo, &pos);
                }
                break;
            }
            
            case 'r': {  /* ret */
                int i0, i1;
                char v0, v1;
                if (fscanf(f, "et? %c%d %c%d", &v0, &i0, &v1, &i1) != 4)
                   error("comando invalido", linha);
                else
                    retorno(v0, i0, v1, i1, codigo, &pos); 
                break;
            }
            default: error("comando desconhecido", linha);
        }
        linha++;
        fscanf(f, " ");
        
    } 

    *entry = (funcp) funcoes[numFuncoes-1];
    *code = (void*) codigo;
}
コード例 #5
0
ファイル: compila.c プロジェクト: amk1710/SBT2
funcp compila (FILE *f)
{
	funcp funcao;
	char cmd[4]; /* recebe comandos sb */
	char varpc1[12]; /* 12 = número de digitos de maxint + '\n' + '$' */
	char varpc2[12];
	char op; /* recebe um operador */
	int tpos; /* usado para voltar no vetor de char sem perder pos */
	int n1, n2, n3; /* as linhas para onde se desvia o fluxo em um if */
	int nlinhas;
	int retornoleitura;
	Intchar bvar; /* usado para calcular os bytes necessários para variaveis usadas */
	int protelado; /* numero de if's protelados */
	unsigned char *area = (unsigned char*) malloc(1300 * sizeof(unsigned char));
// 1300 = 50 * 26.  26 é o número de posições necessárias para a maior instrução, um if. 50 é o número máximo de linhas.
	for(nlinhas = 0; nlinhas < 20; nlinhas++) { alocada[nlinhas] = 0; }
	for(nlinhas = 0; nlinhas < 50; nlinhas++) { ses[nlinhas] = -1; }
	pos = 0;
	nlinhas = 0;
	protelado = 0;
	retornoleitura = fscanf(f, "%s", cmd);
	
	
	area[0] = 0x55; /* pushq %rbp */
	area[1] = 0x48; /* movq %rsp, %rbp */
	area[2] = 0x89;
	area[3] = 0xe5; /* */
	area[4] = 0x48; /* sub $x, %rsp */
	area[5] = 0x83;
	area[6] = 0xec;
	area[7] = 0x00; /* será mudado depois para o valor correto conforme o numero de variaveis usadas */
	
	pos += 8;
	
	
	while(retornoleitura != EOF && nlinhas <= 50){
		switch(cmd[0]){
			case 'r': /* retorno */
				posdalinha[nlinhas] = pos;
				fscanf(f, "%s", varpc1);
				retorno(varpc1, area);
				
				nlinhas++;
				break;
			case 'v': /* atribuição */
				posdalinha[nlinhas] = pos;
				fscanf(f, "%s", varpc1); /* lê o '=' */
				fscanf(f, "%s %c %s", varpc1, &op, varpc2);
				atribuicao(cmd, varpc1, op, varpc2, area);
				nlinhas++;
				break;
			case 'i': /* if */
				
				posdalinha[nlinhas] = pos;
				ses[protelado] = pos;
				fscanf(f, "%s %d %d %d", varpc1, &n1, &n2, &n3);
				
				pos += 26; /* tamanho do comando if */
				protelado++;
				nlinhas++;
				break;
			default: /* comando não reconhecido */
				printf("Comando não reconhecido %s na linha %d \n", cmd, nlinhas);

		}
		retornoleitura = fscanf(f, "%s", cmd);
	}
	rewind(f);
	fscanf(f, "%s", cmd);
	protelado = 0;
	
	while(ses[protelado] != -1){
		while(cmd[0] != 'i'){
			fscanf(f, "%s", cmd);
		}
		fscanf(f, "%s %d %d %d", varpc1, &n1, &n2, &n3);
		fscanf(f, "%s", cmd);
		tpos = ses[protelado];
		protelado++;
		se(varpc1, n1, n2, n3, area, tpos);
	}
	
	// corrige o sub $0, %rsp
	
	for(bvar.i = 20; bvar.i > 0 && alocada[bvar.i] != 1; bvar.i = bvar.i - 1){
	
	}
	bvar.i = bvar.i * 4;
	
	while(bvar.i % 16 != 0){
		bvar.i = bvar.i + 4;
	}
		
	area[7] = bvar.c[0];
	
	//****
	
	area = realloc(area, (pos-1)*sizeof(unsigned char)); /* muda o tamanho da memoria alocada para o tamanho necessário */
	funcao = (funcp)area;
	return funcao;
}