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; }
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; }
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; }
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; }
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; }