int main(){ char *pcwd; char *arg[ARG_MAX]; pid_t childPid; char *entrada = mallocSafe(NUM_MAX_CARAC_A_LER * sizeof(char)); char *str; int i, ii; /* Iterador */ while(1){ /* 1. Imprimir o diretório */ pcwd = getcwd(NULL, 0); printf("[%s] ", pcwd); /* 2. Ler entrada do usuário */ leLinha(entrada, NUM_MAX_CARAC_A_LER, stdin); /* le ateh NUM_MAX_CARAC_A_LER - 1 caracteres, jogando fora os demais caracteres */ /* 3. Parsear entrada */ i = 0; str = strtok(entrada, " \n"); while(str && i < ARG_MAX - 1){ arg[i++] = str; str = strtok(NULL, " \n"); } arg[i] = NULL; /* neste ponto, vale * arg[0] == comando ou binario, arg[1] == primeiro argumento, ..., * arg[i-1] == (i-1)-esimo argumento, ..., arg[i] == NULL */ /* 4. Executar comando/binario */ /* 4.1 Comando cd */ if(!strcmp("cd", arg[0])) { /* TESTE COMECA printf("Executa cd "); for(ii = 0; ii < i; ii++) printf("%s ", args[ii]); printf("\n"); TESTE TERMINA */ chdir(arg[1]); } /* 4.2 Comando pwd */ else if(!strcmp("pwd", arg[0])) { printf("%s\n", pcwd); } /* 4.3 Binario (/bin/ls ou ./ep1) */ else { switch (childPid = fork()){ case -1: perror("fork falhou"); exit(1); break; case 0: /* Processo filho */ /* 4.3.1 Binario /bin/ls -1 */ if(!strcmp("/bin/ls", arg[0]) && !strcmp("-1", arg[1])){ printf("vou executar /bin/ls com o seguinte arg:"); for(ii = 0; ii <= i; ii++) { printf("%s,", arg[ii]); } printf("\n"); execve(arg[0], arg, 0); perror("execve"); exit(EXIT_FAILURE); } /* 4.3.2 Binario ./ep1 */ else if(!strcmp("./ep1", arg[0])){ // TODO: Interpretação do ./ep1 /* TESTE COMECA printf("Executa ep1 "); for(ii = 0; ii < i; ii++) printf("%s ", args[ii]); printf("\n"); TESTE TERMINA */ } exit(0); /* nao achamos o que executar, entao nos matamos */ break; default: /* Processo pai */ free(entrada); wait(NULL); break; } } } return 0; }
int main() { Trie trie; Boolean fim = false; char *cadeia; char acao; do { cadeia = leLinha(&acao); switch(acao) { case 'c': case 'C': trie = CriaAD(); break; case '#': case ' ': break; case 'i': case 'I': if (!insereAD(trie,cadeia)) printf("A cadeia já ocorre na árvore\n"); break; case 'v': case 'V': if (consultaAD(trie,cadeia)) printf("A cadeia ocorre na árvore\n"); else printf("A cadeia não ocorre na árvore\n"); break; case 'r': case 'R': if (!removeAD(trie,cadeia)) printf("A cadeia não ocorre na árvore\n"); break; case 'p': case 'P': percorreAD(trie,visita); break; case 'n': case 'N': printf("Nos: %d\n",numNosAD(trie)); break; case 'a': case 'A': printf("Altura: %d\n",alturaAD(trie)); break; case 'k': case 'K': printf("Cadeias: %d\n",numCadeiasAD(trie)); break; case 'l': case 'L': liberaAD(trie); break; case 'h': case 'H': printf("# : comentário.\n"); printf("c : cria e devolve uma AD vazia\n"); printf("i s : insere a cadeia s na AD\n"); printf("v s : verifica se a cadeia s está na AD\n"); printf("r s : remove a a cadeia s está da AD\n"); printf("p : visita as cadeias da AD em ordem alfabética\n"); printf("n : imprime o número de nós da AD\n"); printf("a : imprime a altura da AD\n"); printf("k : imprime o número de cadeias da AD\n"); printf("l : libera a memória dinâmica ocupada pela AD\n"); printf("h : imprime resumo.\n"); printf("x : término.\n"); printf("q : término.\n"); break; case 'x': case 'X': case 'q': case 'Q': fim = true; break; default: printf("Acao invalida\n"); break; } /* switch */ } while (!fim); bapply(bprint); printf("Processamento terminado\n"); return 0; } /* main */
void TestLeLinha(CuTest *tc){ char linha[50]; leLinha("test_input.txt", linha); CuAssertStrEquals(tc, "1: 1 3, 10, 2 1, 1 1, 9 1, 8 0, 2 2, 2 2, 2 2, 2 2", linha); }