/* algorithm from "Data structure and algorithm" - AHU p62 */ int dequeue(Queue *queue) { char ch; if (emptyqueue(queue)) { return EMPTYQUE; } else { ch = queue->ch[queue->front]; queue->front = addone(queue,queue->front); (queue->count) --; return ch; } }
void bfs() { int i; ACTRIE * p; root->failure = root; enqueue(&q, root); while (!emptyqueue(&q)) { p = dequeue(&q); for (i = 0; i < MAXN; i++) { if (p->next[i] != NULL) { build_failure(i, p); enqueue(&q, p->next[i]); } } } }
void irqinthandc(int dev){ int ch, f; /* declare variable for int identification*/ struct tty *tty = (struct tty *)(devtab[dev].dvdata); int baseport = devtab[dev].dvbaseport; /* hardware i/o port */ pic_end_int(); /* notify PIC that its part is done */ f=inpt(baseport+UART_IIR); /* interrupt identification register */ switch (f&UART_IIR_ID) /* mask 2-bit id field*/ { case UART_IIR_RDI: /* if receiver interrupt */ ch = inpt(baseport+UART_RX); /* read char, ack the device */ enqueue((tty->rqu), ch); /* enqueue char to input queue */ break; case UART_IIR_THRI: /* if transmitter interrupt */ if(!emptyqueue(tty->tqu)) /* if Tx queue not empty */ outpt( baseport+UART_TX , dequeue(tty->tqu));/* output char to com port*/ break; } }
main(int argc, char *argv[]) { CLIENT *cl; int result; // utilizado nos resultados de chamadas do servidor para verificar status da execução string usuario, ipServidor; // parâmetros vindos do terminal string comando; // comando digitado pelo usuário durante a execução do programa string nomeArquivo; iniciaLista; qtArquivos = 0; //inicia contador da lista de espera para upload em zero // Verifica se parâmetros passados na chamada do programa estão corretos if (argc != 3) { // se não foi passado exatamente 2 parâmetros cout << " " << endl; cout << "Use: " << argv[0] << " <usuario> <IPservidor>" << endl; exit(1); } if (strlen(argv[1]) > TAM_MAX_NOME_USER){ // se nome usuário muito grande cout << " " << endl; cout << "Nome do usuário não pode ter mais de " << TAM_MAX_NOME_USER << " caracteres." << endl; exit(1); } usuario = (string)argv[1]; ipServidor = (string)argv[2]; // Em relação ao diretório do usuário if(mkdir(usuario.c_str(), 0777) == -1){ // se ocorrer um erro na criação, 0777 é o tipo de permissão do diretório if (errno != 17){ // se este erro não for sinalizando que o diretório já existe cout << " " << endl; cout << "Não foi possível criar um diretório com o nome do usuário '" << usuario.c_str() << "' devido ao erro: " << strerror(errno) << endl; exit(1); } } // Verifica se é possível a conexão com o servidor if (!(cl = clnt_create(ipServidor.c_str(), SHARECENTERPROG,SHAREVERSION,"tcp"))) { clnt_pcreateerror(ipServidor.c_str()); exit(1); } // Verifica usuário if((result = *conectuser_args_1(toStringRPC(usuario),cl))){ switch(result){ case ERRO_MAX_CON: cout << " " << endl; cout << "Número máximo de conexões atingidas no servidor. Total de usuários já conectados: " << NUM_MAX_CON << "." << endl; break; case ERRO_JA_CON: cout << " " << endl; cout << "Usuário '" << usuario << "' já conectado ao servidor." << endl; break; default: cout << " " << endl; cout << "Resposta inesperada ou conexão perdida com o servidor." << endl; } exit(1); } // Exibição de menu cout << " " << endl; cout << "---------------------------------------------------Share Center---------------------------------------------------" << endl; cout << " " << endl; cout << "Digite um comando:" << endl; cout << "\\share <nome_do_arquivo>\tCompartilha um arquivo." << endl; cout << "\\list\t\t\t\tSolicita a lista de todos os arquivos compartilhados." << endl; cout << "\\download <nome_do_arquivo>\tBaixa um arquivo que esteja compartilhado no servidor." << endl; cout << "\\emptyqueue\t\t\tTenta fazer o envio dos arquivos que estão na fila de espera de um dado cliente." << endl; cout << "\\leave\t\t\t\tTermina a conexão com o servidor e finaliza o programa." << endl << endl; cout << "------------------------------------------------------------------------------------------------------------------" << endl; cout << " " << endl; do{ cout << "\\"; getline(cin,comando); // espera por comandos if(!comando.find("share ")){ // depois que o usuario digitar o comando // comando.find_first_of(" ")+1 // procura pela posição onde existe espaço em branco e adiciona 1 posição // comando.substr( n ) // retorna string de n até o fim nomeArquivo = comando.substr( comando.find_first_of(" ")+1 ); share(usuario, nomeArquivo, cl); } else if(!comando.compare("list")){ list(cl); } else if(!comando.find("download ")){ nomeArquivo = comando.substr( comando.find_first_of(" ")+1 ); download(usuario, nomeArquivo, cl); } else if(!comando.compare("emptyqueue")){ emptyqueue(usuario, cl); } else if(comando.compare("leave")!=0){ cout << " " << endl; cout << "Comando desconhecido." << endl; } }while(comando.compare("leave")!=0); // Desconecta usuário do servidor if((result = *desconectuser_args_1(toStringRPC(usuario),cl))){ cout << " " << endl; cout << "Resposta inesperada ou conexão perdida com o servidor." << endl; exit(1); } cout << " " << endl; cout << "Programa e conexão finalizados pelo usuário." << endl; }