/// Implementação da Extensão GET_METRICS /// Programa que efetua uma busca em todos os nós que atendam aos requisitos do usuário /// Programa feito no codeblocks utilizando compilador GCC /// Criado por Rodolfo Rodovalho // Arquivo de entrada necessário: entrada.txt // Arquivo de saida criado: saida.txt #include #include #include #include #define TAM_CHAR 101 // tamanho de um char qualquer #define MAX 501 // tamanho varariavel de entrada /// Estrutura de parâmetros dos nós do ambiente struct pbsnodes_a { char node[TAM_CHAR]; // Nome do nó //Atributo estatico -> 1 char state[TAM_CHAR]; // Lista o estado do nó //Atributo dinamico -> 2 char np[TAM_CHAR]; // Número de processadores (virtuais) do nó //Atributo estatico -> 1 char opsys[TAM_CHAR]; // Sistema operacional utilizado //Atributo estatico -> 1 char nusers[TAM_CHAR]; // Numero de usuarios //Atributo dinamico -> 2 char totmem[TAM_CHAR]; // Total de memória do nó //Atributo estatico -> 1 char availmem[TAM_CHAR]; // Total disponivel momentaneamente //Atributo dinamico -> 2 struct pbsnodes_a *prox; // Ponteiro para o proximo nó }; /// Estrutura para guardar as condiçoes do where struct condicao { char arg[30]; char sinal[5]; char tipo[30]; struct condicao *prox; }; /// Estrutura de requisitos de busca struct registro_busca { int nParam[7]; // Vetor que guarda os requisitos de saida do nó int get_Type; // Guarda se os atributos que serao mostrados serao estatico ou dinamicos sendo: 1-estatico, 2-dinamico e 3 - * (todos) int tool; // Ferramenta de monitoramento (Apenas PBS) : 1 se for PBS / 2 se for todos / e 0 para qualquer outro int tool_Type; // Host - 1, NetWork - 2, Job -3 / todos - 4 // (Apenas Host) int location; // Local - 1, todos - 2 struct condicao *prox; }; ///Procedimento que inicializa o registro de busca void inic_reg_busca(struct registro_busca **bus) { memset ((*bus)->nParam, 0, sizeof((*bus)->nParam)); (*bus)->get_Type = 0; (*bus)->tool = 0; (*bus)->tool_Type = 0; (*bus)->location = 0; (*bus)->prox = NULL; } /// Inicializa o nó cabeça da lista void inicializa(struct pbsnodes_a **pt) { // Cria o nó *pt = (struct pbsnodes_a*)malloc(sizeof(struct pbsnodes_a)); // Seta parametros do nó strcpy( (*pt)->node , "No_Cabeca" ); strcpy( (*pt)->state, " " ); strcpy( (*pt)->np , " " ); strcpy( (*pt)->opsys , " " ); strcpy( (*pt)->totmem, " " ); strcpy( (*pt)->availmem , " " ); strcpy( (*pt)->nusers , " " ); (*pt)->prox = NULL; } /// Cria um novo registro para guardar as condiçoes de busca (where) informados pelo usuário void cria_condicao(struct registro_busca **bus, char *var1, char *var2, char *sin) { struct condicao *ptt = (struct condicao*) malloc(sizeof(struct condicao)); struct condicao *aux, *aux2; //Guarda os dados passados pela função strcpy(ptt->arg,var1); strcpy(ptt->tipo,var2); strcpy(ptt->sinal,sin); ptt->prox = NULL; if((*bus)->prox == NULL) (*bus)->prox = ptt; else { aux = (*bus)->prox; while(aux!= NULL) { aux2 = aux; aux = aux->prox; } aux2->prox = ptt; } } /// Quebra a palavra onde contem '=' e pega 2ª parte da palavra void divide_parametro2(char **palavra, char* ref) { int i,k; char aux[TAM_CHAR]; i = k = 0; // Acha na string aonde tem o sinal de '=' while((inode , no ); strcpy( ptt->state , estado ); strcpy( ptt->np , nproc ); strcpy( ptt->opsys , sistema ); strcpy( ptt->totmem , total ); strcpy( ptt->availmem , disp ); strcpy( ptt->nusers , user ); ptt->prox = NULL; aux = pt; //Anda com o ponteiro até o final da lista para entao fazer a linkagem do nó criado while(aux != NULL) { aux2 = aux; aux = aux->prox; } //Linka o novo nó no final da lista aux2->prox = ptt; } /// Função que carrega o arquivo pbs nodes nas variaveis locais para depois inserir nos registros de PbsNodes void carrega_arquivo(struct pbsnodes_a **pt) { //Declaração das variaveis locais FILE *pFile; //Ponteiro do arquivo para pbsnodes char node[TAM_CHAR], state[TAM_CHAR], np[TAM_CHAR], opsys[TAM_CHAR], totmem[TAM_CHAR], availmem[TAM_CHAR], nusers[TAM_CHAR]; char parametro[MAX], parametro2[MAX], *parametro1, *aux; int entrar, pos; if (!(pFile = fopen ("entrada.txt","r"))) // Caso ocorra algum erro na abertura do arquivo o programa aborta automaticamente .. { printf("Erro! Impossivel abrir o arquivo!\n"); system("PAUSE"); exit(1); } //Faz a leitura para ver se existe alguma coisa no arquivo de entrada char c = getc(pFile); // Lê o primeiro caracter if (feof(pFile)) // Verifica se o caracter lido é o fim de arquivo { printf("Arquivo Vazio!\n"); system("PAUSE"); exit(1); } //se o arquivo existir e nao for vazio, leio as informaçoes contidas nele else { rewind (pFile); // Isso volta o ponteiro do arquivo para o início //Leitura das linhas do arquivo while(!feof(pFile)) { entrar = 0; do { fscanf(pFile," %500[^\n]s ", parametro); parametro1 = strtok(parametro," "); //só entra quando é o nome do nó if(entrar == 1) { strcpy(node,parametro); entrar = 0; } //altera o valor de 'entrar' para a proxima iteração entrar no nome do nó if(strcmp(parametro1,"[Node]")==0) entrar = 1; else { if(strcmp(parametro1,"state")==0) { parametro1 = strtok(NULL," "); parametro1 = strtok(NULL, "\n"); strcpy(state,parametro1); } else { if(strcmp(parametro1,"np")==0) { parametro1 = strtok(NULL," "); parametro1 = strtok(NULL, "\n"); strcpy(np,parametro1); } else { if(strcmp(parametro1,"status")==0) { parametro1 = strtok(NULL,"= "); strcpy(parametro,parametro1); aux = strtok(NULL,","); do { if(strcmp(parametro1,"opsys")==0) strcpy(opsys,aux); else { if(strcmp(parametro1,"nusers")==0) strcpy(nusers,parametro2); else { if(strcmp(parametro1,"totmem")==0) strcpy(totmem,parametro2); else { //A função Insere é chamada aqui pois este é o ultimo argumento a ser inserido if(strcmp(parametro1,"availmem")==0) { strcpy(availmem,parametro2); insere_no(*pt,node,state,np,opsys,nusers,totmem,availmem); } } } } //le o proximo parametro parametro1 = strtok(NULL,","); pos = strlen(parametro1); //Tratamento de caso quando o parametro nao tem atributo (ex: job=,) if(parametro1[pos-1]=='=') { parametro1[strlen(parametro1)-1] = '\0'; parametro2[0] = ' '; parametro2[1] = '\0'; } else { divide_parametro2(&aux,parametro1); strcpy(parametro2,aux); divide_parametro1(¶metro1); } }while(strcmp(parametro1,"rectime")!=0); parametro1 = strtok(NULL, " "); } } } } // Permanece neste do_while enquanto não achar o final de um nó (End_Node) }while(strcmp(parametro,"[End_Node]")!=0); } } //fecha o arquivo de leitura fclose (pFile); } /// Mostra todos os nós que estão registrados do pbsnode (extra) void mostra_no(struct pbsnodes_a *pt) { struct pbsnodes_a *aux = pt->prox; while(aux != NULL) { printf("Node: %s\n", aux->node); printf("state: %s\n", aux->state); printf("np: %s\n", aux->np); printf("opsys: %s\n", aux->opsys); printf("nusers: %s\n", aux->nusers); printf("totmem: %s\n", aux->totmem); printf("availmem: %s\n\n\n", aux->availmem); aux = aux->prox; } } /// Mostra todos as condiçoes requeridas pelo usuario (extra) void mostra_condicao(struct registro_busca *bus) { struct condicao *aux = (bus)->prox; while(aux != NULL) { printf("arg: %s\n", aux->arg); printf("tipo: %s\n", aux->tipo); printf("sin: %s\n\n", aux->sinal); aux = aux->prox; } } /// Arruma os parametros que serão mostrados pelo get_metrics void organiza_metrica(struct registro_busca **bus) { int i; //Aqui arrumo os parametros que serão mostrados apartir do tipo escolhido (estatico ou dinamico) if((*bus)->get_Type == 1) (*bus)->nParam[1] = (*bus)->nParam[4] = (*bus)->nParam[6] = 0 ; else if((*bus)->get_Type == 2) (*bus)->nParam[0] = (*bus)->nParam[2] = (*bus)->nParam[3] = (*bus)->nParam[5] = 0 ; //Se o tipo escolhido for job ou network não será mostrada nada na saida if(((*bus)->tool_Type==2)||((*bus)->tool_Type==3)) for(i=0;i<7;++i) (*bus)->nParam[i] = 0; } /// Transforma a string inteira em maiuscula void maiuscula(char *palavra) { int i; for(i=0;palavra[i]!='\0';i++) { palavra[i]=toupper(palavra[i]); } } /// Verifca se os sinais (> ; < ; >= ; <= ; = ) existem nos Nós int verifica_sinal(struct condicao *reg, int val1, int val2) { if(strcmp(reg->sinal,"=")==0) { if(val1 != val2) return 1; } else { if(strcmp(reg->sinal,"<")==0) { if(val1 >= val2 ) return 1; } else { if(strcmp(reg->sinal,">")==0) { if(val1 <= val2 ) return 1; } else { if(strcmp(reg->sinal,">=")==0) { if(val1 < val2 ) return 1; } else { if(val1 > val2 ) return 1; } } } } return 0; } /// Verifica se cada Nó atende aos requisitos da condição where void verifica_condicao(struct registro_busca *bus, struct pbsnodes_a *pt) { //Declaração de variaveis FILE *pFile; int i, sair, val1, val2; char char_aux[TAM_CHAR]; struct pbsnodes_a *nod; struct condicao *reg; //abre o arquivo de saida if (!(pFile = fopen ("saida.txt","w"))) { printf("Erro ao abrir arquivo de saida\n"); exit(1); } nod = pt->prox; printf("\n"); //Anda em todos os nós while(nod != NULL ) { reg = bus->prox; sair = 0; //Verifico se o nó esta dentro de todos os requisitos do usuario while((reg != NULL)&&(sair == 0)) { //printf("reg: %s\n",reg->arg); if(strcmp(reg->arg,"NODE")==0) { maiuscula(nod->opsys); if(strcmp(nod->node,reg->tipo)!=0) { sair = 1 ; } } if(strcmp(reg->arg,"STATE")==0) { maiuscula(nod->opsys); if(strcmp(nod->opsys,reg->tipo)!=0) { sair = 1 ; } } if(strcmp(reg->arg,"NP")==0) { val1 = atoi(nod->np); val2 = atoi(reg->tipo); sair = verifica_sinal(reg,val1,val2); } if(strcmp(reg->arg,"OPSYS")==0) { maiuscula(nod->opsys); if(strcmp(nod->opsys,reg->tipo)!=0) { sair = 1 ; } } if(strcmp(reg->arg,"NUSERS")==0) { val1 = atoi(nod->nusers); val2 = atoi(reg->tipo); sair = verifica_sinal(reg,val1,val2); } if(strcmp(reg->arg,"TOTMEM")==0) { strcpy(char_aux,nod->totmem); char_aux[strlen(char_aux)-2] = '\0'; val1 = atoi(char_aux); val2 = atoi(reg->tipo); sair = verifica_sinal(reg,val1,val2); } if(strcmp(reg->arg,"AVAILMEM")==0) { strcpy(char_aux,nod->availmem); char_aux[strlen(char_aux)-2] = '\0'; val1 = atoi(char_aux); val2 = atoi(reg->tipo); sair = verifica_sinal(reg,val1,val2); } reg = reg->prox; } //Se estiver dentro dos requisitos do usuario entao eu mostro o nó if( sair == 0) { for(i=0;i<7;++i) { if(bus->nParam[i] == 1) { switch (i) { // Mostro os nós para o usuario e ja os grava no arquivo de saida case 0: printf("Node: %s\n", nod->node); fprintf(pFile, "Node: %s\n",nod->node); break; case 1: printf("state: %s\n", nod->state); fprintf(pFile, "state: %s\n",nod->state); break; case 2: printf("np: %s\n", nod->np); fprintf(pFile, "np: %s\n",nod->np); break; case 3: printf("opsys: %s\n", nod->opsys); fprintf(pFile, "opsys: %s\n",nod->opsys); break; case 4: printf("nusers: %s\n", nod->nusers); fprintf(pFile, "nusers: %s\n",nod->nusers); break; case 5: printf("totmem: %s\n", nod->totmem); fprintf(pFile, "totmem: %s\n",nod->totmem); break; case 6: printf("availmem: %s\n", nod->availmem); fprintf(pFile, "availmem: %s\n",nod->availmem); break; } } } printf("\n\n"); fprintf(pFile, "\n\n"); } //proximo nó nod = nod->prox; } fclose(pFile); } /// Faz as busca pelos nós que atendem aos requisitos dos usuarios void busca(struct registro_busca **bus, struct pbsnodes_a **pt ) { int i, comecar_busca = 0; organiza_metrica(bus); for(i=0;i<7;++i) if(((*bus)->nParam[i]) == 1 ) comecar_busca = 1; if(comecar_busca == 1) { //comeca a busca verifica_condicao(*bus,*pt); } else { printf(">> Nenhum node se encaixa aos requisitos\n\n"); } } /// Quebra o argumento do Get_metrics em varios argumentos menores void quebra_metrica(struct registro_busca **bus, char **sintaxe, char **pedacos, int *sair, char **copy) { int i; //Quebra a string em varios pedacos menores while(*pedacos != NULL ) { //Analiso se o pedacosen é valido if(strcmp(*pedacos,"TYPE")!=0) { if(strcmp(*pedacos,"*")==0) { for(i=0;i<7;++i) (*bus)->nParam[i] = 1; } else { if(strcmp(*pedacos,"NODE")==0) { (*bus)->nParam[0] = 1; } else { if(strcmp(*pedacos,"STATE")==0) { (*bus)->nParam[1] = 1; } else { if(strcmp(*pedacos,"NP")==0) { (*bus)->nParam[2] = 1; } else { if(strcmp(*pedacos,"OPSYS")==0) { (*bus)->nParam[3] = 1; } else { if(strcmp(*pedacos,"NUSERS")==0) { (*bus)->nParam[4] = 1; } else { if(strcmp(*pedacos,"TOTMEM")==0) { (*bus)->nParam[5] = 1; } else { if(strcmp(*pedacos,"AVAILMEM")==0) { (*bus)->nParam[6] = 1; } else { //se nao for um pedacosen valido exibo mensagem de erro if(strcmp(*pedacos,"TYPE")!=0) { printf("Error: Argumento Invalido: %s\n",*pedacos); *sair = 1; } } } } } } } } } *pedacos = strtok(NULL,", "); } else { *copy = (char*) malloc(sizeof (MAX)); strcpy(*copy,*pedacos); *pedacos = NULL; } } } ///Função que separa os argumentos do WHERE em: argumento, tipo e sinal void separa(char *var, char *var1, char *var2, char *sin) { int achou, i, j, k, pos, tam; achou = i = j = k = pos = 0; tam = strlen(var); while(i': sin[pos++] = '>'; achou = 1; break; case '<': sin[pos++] = '<'; achou = 1; break; case '=': sin[pos++] = '='; achou = 1; break; default: if(achou == 0) var1[j++] = var[i]; else var2[k++] = var[i]; } ++i; } var1[j] = var2[k] = sin[pos] = '\0'; } /// Função que quebra o parametro Where em pedaços menores int quebra_condicao(struct registro_busca **bus, char **sintaxe, char **pedacos) { char var[300], var1[300], var2[300], sin[300]; *pedacos = strtok(NULL,","); if(*pedacos != NULL ) { // quebra a string em varios pedacos menores while(*pedacos != NULL ) { strcpy(var,*pedacos); separa(var, var1, var2, sin); if(strcmp(var1,"NODE")==0) { if(strcmp(sin,"=")==0) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s\n",var1,sin); return 0; } } else { if(strcmp(var1,"STATE")==0) { if(strcmp(sin,"=")==0) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s\n",var1,sin); return 0; } } else { if(strcmp(var1,"NP")==0) { if((strcmp(sin,"=")==0)||(strcmp(sin,">=")==0)||(strcmp(sin,"<=")==0)||(strcmp(sin,">")==0)||(strcmp(sin,"<")==0)) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s\n",var1,sin); return 0; } } else { if(strcmp(var1,"OPSYS")==0) { if(strcmp(sin,"=")==0) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s\n",var1,sin); return 0; } } else { if(strcmp(var1,"NUSERS")==0) { if((strcmp(sin,"=")==0)||(strcmp(sin,">=")==0)||(strcmp(sin,"<=")==0)||(strcmp(sin,">")==0)||(strcmp(sin,"<")==0)) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s\n",var1,sin); return 0; } } else { if(strcmp(var1,"TOTMEM")==0) { if((strcmp(sin,"=")==0)||(strcmp(sin,">=")==0)||(strcmp(sin,"<=")==0)||(strcmp(sin,">")==0)||(strcmp(sin,"<")==0)) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s\n",var1, sin); return 0; } } else { if(strcmp(var1,"AVAILMEM")==0) { if((strcmp(sin,"=")==0)||(strcmp(sin,">=")==0)||(strcmp(sin,"<=")==0)||(strcmp(sin,">")==0)||(strcmp(sin,"<")==0)) { cria_condicao(bus, var1,var2,sin); } else { printf("Em %s sinal nao reconhecido: %s ",var1,sin); return 0; } } else { printf("Error: Argumento Invalido: %s\n",*pedacos); return 0; } } } } } } } *pedacos = strtok(NULL,", "); } } else { printf("Sintaxe Incorreta: Falta de Argumentos\n"); return 0; } return 1; } /// Libera a memória alocada para os Nós ao termino da execução void libera_mem_pt(struct pbsnodes_a **pt) { struct pbsnodes_a *aux; while((*pt) != NULL) { aux = (*pt)->prox; free(*pt); (*pt) = aux; } (*pt) = NULL; } /// Libera a memória alocada para a busca ao termino da busca void libera_mem_bus(struct registro_busca **bus) { struct condicao *aux; while((*bus)->prox != NULL) { aux = (*bus)->prox->prox; free((*bus)->prox); (*bus)->prox = aux; } free(*bus); *bus = NULL; } /// Mostra o cabeçalho de pesquisa void mostra() { printf("\n # Formato da Busca #\n\n"); printf(" GET_METRICS TYPE \n"); printf(" TOOL TYPE \n"); printf(" LOCATION \n"); printf(" [WHERE ]\n\n "); printf("INFO: Digite 'ajuda' para obter mais informacoes\n\n\n"); printf(" # GET_METRICS FOR PBS # \n\n"); } ///Função que mostra uma ajuda para o usuario void ajuda() { printf("\n Digite 'limpa' para limpar a tela\n"); printf(" Digite 'ajuda' para obter ajuda\n"); printf(" Digite 'sair' para sair\n\n"); } ///Procedimento que limpa a tela (usa função do sistema) void limpa() { #ifdef WIN32 system ( "cls" ); #else #ifdef WIN64 system ( "cls" ); #else system ( "clear" ); #endif #endif } /// Analizador de Busca void analisa(struct pbsnodes_a **pt, struct registro_busca **bus ) { char sintaxe[MAX], *pedacos, *aux, *copy = ""; int sair , ir_main; mostra(); do { printf("Digite a sua busca:\n"); ir_main = sair = 0; //Cria um novo nó de busca *bus = (struct registro_busca*) malloc(sizeof (struct registro_busca)); inic_reg_busca(bus); strcpy(sintaxe,""); scanf("%500[^\n]",sintaxe); scanf("%*c"); maiuscula(sintaxe); aux = sintaxe; if(strcmp(sintaxe,"SAIR")!=0) { //limpa a tela e mostra novamente a sintexe de busca if((strcmp(sintaxe,"LIMPA")==0)||(strcmp(sintaxe,"AJUDA")==0)) { if(strcmp(sintaxe,"AJUDA")==0) { ajuda(); } else{ limpa(); mostra(); } } else { if(strcmp(sintaxe,"")!=0) { pedacos = strtok(sintaxe," "); fflush(stdin); if(strcmp(pedacos,"GET_METRICS")==0) { pedacos = strtok(NULL,", "); if(pedacos == NULL) sair = 2; else quebra_metrica(bus, &aux, &pedacos, &sair, ©); if((strcmp(copy,"TYPE")==0)&&(sair == 0)) { pedacos = strtok(NULL," "); if(pedacos != NULL) { if(strcmp(pedacos,"ESTATICO")==0) { (*bus)->get_Type = 1; } else { if(strcmp(pedacos,"DINAMICO")==0) { (*bus)->get_Type = 2; } else { if(strcmp(pedacos,"*")==0) { (*bus)->get_Type = 3; } else { printf("Argumento TYPE desconhecido\n"); exit(1); } } } //Aqui começa a suposta segunda linha de comando pedacos = strtok(NULL," "); if((pedacos != NULL)&&(strcmp(pedacos, "TOOL")==0)) { pedacos = strtok(NULL," "); if(pedacos != NULL) { if(strcmp(pedacos,"PBS")==0) { (*bus)->tool = 1; } else if(strcmp(pedacos,"*")==0) { (*bus)->tool = 2; } else { printf("Argumento TOOL desconhecido\n"); exit(1); } //aqui leio o argumento do TYPE pertencente ao TOOL pedacos = strtok(NULL," "); if((pedacos != NULL)&&(strcmp(pedacos, "TYPE")==0)) { pedacos = strtok(NULL," "); if(pedacos!=NULL) { if(strcmp(pedacos, "HOST")==0) { (*bus)->tool_Type = 1; } else { if(strcmp(pedacos, "NETWORK")==0) { (*bus)->tool_Type = 2; } else { if(strcmp(pedacos, "JOB")==0) { (*bus)->tool_Type = 3; } else { if(strcmp(pedacos, "*")==0) { (*bus)->tool_Type = 4; } else { printf("Argumento TYPE TOOL desconhecido\n"); exit(1); } } } } //aqui começa a suposta terceira linha de comando pedacos = strtok(NULL," "); if((pedacos != NULL)&&(strcmp(pedacos, "LOCATION")==0)) { pedacos = strtok(NULL," "); if(pedacos != NULL) { if(strcmp(pedacos, "LOCAL")==0) { (*bus)->location = 1; } else { if(strcmp(pedacos, "*")==0) { (*bus)->tool_Type = 2; } else { printf("Argumento LOCATION desconhecido\n"); exit(1); } } pedacos = strtok(NULL," "); //Aqui eu analiso se tem ou nao a clausula WHERE if(pedacos == NULL) { busca(bus, pt); } else { if(strcmp(pedacos, "WHERE")==0) { if(quebra_condicao(bus, &aux, &pedacos)==1) busca(bus, pt); } else printf("Sintaxe Incorreta: Esperado -> WHERE\n"); } } else printf("Sintaxe Incorreta: Falta de Argumentos\n"); } else printf("Sintaxe Incorreta: Esperado -> LOCATION\n"); } else printf("Sintaxe Incorreta: Falta de Argumentos\n"); } else printf("Sintaxe Incorreta: Esperado -> TYPE\n"); } else printf("Sintaxe Incorreta: Falta de Argumentos\n"); } else printf("Sintaxe Incorreta: Esperado -> TOOL\n"); } else printf("Sintaxe Incorreta: Falta de Argumentos\n"); } else if(sair == 0) printf("Sintaxe Incorreta: Esperado -> TYPE\n"); else if(sair == 2) printf("Sintaxe Incorreta: Falta de Argumentos\n"); } else printf("\nSintaxe Incorreta: Esperado -> GET_METRICS\n"); printf("\n"); } } } else ir_main = 1; libera_mem_bus(bus); }while(ir_main==0); } /// MAIN int main() { //Declaração das variaveis struct pbsnodes_a *pt; struct registro_busca *bus; inicializa(&pt); // Inicializa o nó cabeça (pt) carrega_arquivo(&pt); // Carrega o arquivo na memória analisa(&pt, &bus); //Faz a análise da busca //mostra_condicao(bus); //mostra todas as condiçoes impostas pelo usuario atraves do where //mostra_no(pt); // mostra todos os nos libera_mem_pt(&pt); return(0); }