/** * Executar Comandos * @arg l, ponteiro para a lista de comandos do sergento * @return, um inteiro representando os giros no sentido horário do soldado **/ int executarComandos(char *l) { // 'D', representa girar um passo no sentido horário if(*l == 'D') { return executarComandos((l + 1)) + 1; } // 'E', representa girar três passos no sentido horário else if(*l == 'E') { return executarComandos((l + 1)) + 3; } // '\0', não há giro else { return 0; } }
/** * Volver * @arg n, quantidade de comandos dito pelo sargento. * @arg l, vetor com os comandos dito pelo sargento. * @return a direção para o qual o recruta deve ter sua face voltada após executar a série de comandos. Nessa etapa deve conter os caracteres 'N', 'L', 'S' e 'S' para representar os quatro pontos cardeais. **/ char volver(int n, char *l) { char rosaDosVentos[4] = {'N', 'L', 'S', 'O'}; // Executa os comando do sargento unsigned int direcaoDaFace = executarComandos(l) % 4; // Descobre a direção da face, a partir da Rosa dos Ventos return rosaDosVentos[direcaoDaFace]; }
int main(int argc , char* argv[]) { char* fim = "fim"; char** args; char argumentos[512]; int qntPipes,tmp_entrada,tmp_saida,bg=0; char* prompt = "Quais são suas ordens ? "; pid_t processo,w; int fileOpen,status; fileOpen = open(argv[1],O_RDONLY); /* Open File For Standard Input */ if( ( fileOpen ) == 0 ){ printf( "Cannot Open File ") ; exit( 1 ) ; } if( fileOpen != 0 ){ dup2( fileOpen, 0 ); /* Make fp stdin */ close( fileOpen ) ; /* Close original fp */ } //Valida o que for escrito pelo usuario printf("%s",prompt); while(fgets(argumentos,512,stdin) != NULL){ strtok(argumentos,"\n"); args = parseCommands(argumentos); localizaRedirecionamentos(args,&tmp_entrada,&tmp_saida,&bg); if(bg != 0){ removeSimboloBackground(args,bg); } qntPipes = quantidadePipes(args); processo = fork(); if (processo == 0){ if(bg != 0)printf("[1] %ld\n", (long) getpid()); executarComandos(args,qntPipes); _exit(EXIT_SUCCESS); }else{ if(bg != 0){ do { w = waitpid(processo, &status, WUNTRACED | WCONTINUED); if (w == -1) { perror("waitpid"); exit(EXIT_FAILURE); } if (WIFEXITED(status)) { printf("Concluido status=%d\n", WEXITSTATUS(status)); } else if (WIFSIGNALED(status)) { printf("killed by signal %d\n", WTERMSIG(status)); } else if (WIFSTOPPED(status)) { printf("stopped by signal %d\n", WSTOPSIG(status)); } else if (WIFCONTINUED(status)) { printf("continued\n"); } } while (!WIFEXITED(status) && !WIFSIGNALED(status)); }else{ wait(NULL); //exit(EXIT_SUCCESS); } } if(strcmp(argumentos,fim) == 0) exit(EXIT_SUCCESS); printf("%s",prompt); } return 0; }