示例#1
0
文件: ep1sh.c 项目: yoshiomori/ep1so
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;
}
示例#2
0
文件: principal.c 项目: gbsf/mc202
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);
}