/************************************************************************* * Ultima Modificacao: 27/04/2005 - Renatha Oliva Capua * * Last edited on 2005-05-26 17:43:33 by stolfi * * * * Universidade Federal Fluminense * * Mestrado em Computacao * * Aluna: Renatha Oliva Capua * * Orientadores: Helena Cristina da Gama Leitao * * Jorge Stolfi * * * * biblioteca.c - Programa biblioteca com algumas funcoes genericas de * * tratamento de strings e arquivos * *************************************************************************/ #include /************************************************************************** * Procedimento para consumir o cabecalho com informacoes de um arquivo, se* * ele possuir * **************************************************************************/ void consumir_cabecalho(FILE **pt, char *letra){ /*para consumir o cabecalho*/ if ((*letra) == '>'){ /* Pula resto desta linha: */ while((!feof(*pt))&&((*letra)!='\n')){ fscanf(*pt, "%c", letra); } fscanf(*pt,"%c", letra); // le a primeira letra da linha seguinte */ } }//fim do consumir_cabecalho /************************************************************************** * Procedimento para converter para maiuscula uma string contida na * * variavel destino. * **************************************************************************/ void str_up(char *destino){ while (*destino != '\0'){ switch(*destino){ case 'a': *destino='A'; break; case 't': *destino='T'; break; case 'c': *destino='C'; break; case 'g': *destino='G'; break; } destino++; } }//fim do str_up /************************************************************************** * Procedimento para converter para maiuscula uma string contida na * * variavel destino. * **************************************************************************/ void str_chr_up(char *destino){ switch(*destino){ case 'a': *destino='A'; break; case 't': *destino='T'; break; case 'c': *destino='C'; break; case 'g': *destino='G'; break; } }//fim do str_up /**************************************************************************** * Procedimento para acrescentar um caracter no final de uma string * ****************************************************************************/ void str_cat(char *destino, char caracter){ while(*destino != '\0') /*para deslocar ate a ultima posicao de destino*/ destino++; *destino = caracter; /*a ultima posicao de destino recebe caracter*/ destino++; *destino = '\0'; }//fim do str_cat /**************************************************************************** * Procedimento para acrescentar um caracter no final de uma string, o * * tamanho tam da string e' passada como parametro. Quando a string atinge o * * tamanho tam, o primeiro caracter e' retirado e todos os outros sao * * deslocados um caracter para frente para a inclusao do ultimo. * ****************************************************************************/ void str_ncat(char *destino, char caracter, int tam){ char caracter_aux; /*variavel auxiliar*/ if (strlen(destino)== tam){ /*se destino ja' esta' com tamanho igual a tam, devo retirar o primeiro caracter de destino para acrescentar a variavel caracter no final*/ while(*destino != '\0'){ /*para deslocar todos os caracteres de destino um caracter a frente*/ destino++; caracter_aux = *destino; destino--; *destino = caracter_aux; destino++; }//fim do while destino--; }else{ /*se destino tem tamanho < tam(tamanho maximo de destino) preciso apenas posicionar a variavel destino na ultima posicao*/ while(*destino != '\0') /*para deslocar ate a ultima posicao de destino*/ destino++; } str_chr_up(&caracter); *destino = caracter; /*a ultima posicao de destino recebe caracter*/ destino++; *destino = '\0'; }//fim do str_ncat /************************************************************************* * Procedimento que concatena um caracter no começo de uma string * *************************************************************************/ void str_ncat_ini(char *destino, char caracter, int tam){ int cnt = 0; char caracter_atual = '\0'; char caracter_anterior = caracter; int tam_atual = strlen(destino); if ((tam - tam_atual) != 0){ tam_atual++; } while (cnt < tam_atual){ caracter_atual = *destino; *destino = caracter_anterior; caracter_anterior = caracter_atual; destino++; cnt++; }//fim do for *destino = '\0'; }//fim do str_ncat_ini /************************************************************************** Procedimento que copia de str_origem uma string de tamanho tam, comecando em i, para outra string chamada str_destino **************************************************************************/ void str_incpy(char *str_origem, char *str_destino, int i, int tam){ int cont = 0; /* contador para manipulacao de str_origem ate' a posicao i */ char caracter_aux; /* para posicionar a str_origem na posicao i */ while((*str_origem != '\0')&&(cont!= i)){ str_origem++; cont++; }//fim do while /* para copiar a string de str_origem, para str_destino */ cont = 0; while ((cont!= tam)&&(*str_origem != '\0')){ caracter_aux = *str_origem; *str_destino = caracter_aux; /*copia caracter a caracter de str_origem*/ str_destino++; str_origem++; cont++; }//fim do while *str_destino = '\0'; }//fim do strincpy /************************************************************************* * Procedimento que inverte os caracteres de uma string (casa -> asac) * *************************************************************************/ char *inverter_str(char *string){ int tam = 0, cnt = 0; char *string_inv; tam = strlen(string); string_inv = (char*) malloc ((tam+1) * sizeof(char)); strcpy(string_inv, "\0"); /*avança o ponteiro para o final de string*/ for (cnt = 0; cnt < tam - 1; cnt++) { string++; } for (cnt = 0 ; cnt < tam ; cnt++) { *string_inv = *string; string_inv++; string--; }//fim do for *string_inv = '\0'; /*volta o ponteiro para o começo de string_inv*/ for (cnt = 0; cnt < tam; cnt++) { string_inv--; } return(string_inv); }//fim do inverter_str /**************************************************************** Procedimento para abrir um arquivo ****************************************************************/ void abrir_arq(char *nome_arq, FILE **pt, char *modo){ *pt = fopen(nome_arq,modo); if (!pt){ printf("ERRO AO TENTAR ABRIR OU CRIAR O ARQUIVO: %s", nome_arq); exit(1); } }//fim de abrir_arq /************************************************************************* Procedimento que testa se a tripla possui somente caracteres A,C,T e G ou a,c,t e g. Retorna 0 em caso afirmativo, senao retorna 1. *************************************************************************/ int caracter_valido(char *tupla){ while(*tupla != '\0'){ if ((*tupla == 'A')||(*tupla == 'a')||(*tupla == 'C')||(*tupla == 'c')||(*tupla == 'T')||(*tupla == 't') || (*tupla == 'G') ||(*tupla == 'g')||(*tupla == '*')){ tupla++; }else return(1); }//fim do while return(0); }//fim do caracter_valido /************************************************************************* * Procedimento para calcular o tempo que o programa fica executando na * * CPU. Tempo inicial menos o tempo final. * *************************************************************************/ void tempoCPU(struct tms tempo, float *tempoCPU){ *tempoCPU = ((float)(tempo.tms_utime + tempo.tms_stime) / (float)(CLK_TCK)); }