From: <AAl...@am...> - 2000-10-08 05:33:01
|
Aquilo que você fez está certo. O que acontece é que você realiza a mesma rotina nas três funções. A idéia que tenho é mudar a get_token para não procurar o "=" e sim retornar o conteudo total das seções e então usar a get_token para fazer o trabalho. Ou também mudar uma das funções que você fez e torná-la genérica e as outras chamam ela. Da maneira como está feito podemos ter problemas no futuro. Vamos dizer que por uma fatalidade temos que mudar o formato do arquivo de configuração, ao invés de usarmos "[" vamos usar "{" por exemplo. Dessa forma teremos que mudar todas as ocorrências de "[" para "{" em todas as funções que fazem acesso ao arq configuracao. A idéia da função generica é facilitar a manutenção no futuro. O exemplo abaixo encapsula as três funções numa só, o exemplo é meio ruim (tem erros de sintaxe e de variáveis e precisa ser otimizado) mas ilustra a idéia. #include <stdio.h> #include <string.h> /*#include "lc.h" */ /* Verifica se o provedor especificado em 'isp' está cadastrado no arquivo 'filename' */ int generic_check(char *filename, char *isp,char *token,int option /*qual operação deve fazer*/,int* retorno /*retorno de check_isp*/) { FILE *conf; char fstemp[200]; short int flag; char *sigual; char value[1000]; char *list[]; char *fstemp[200]; unsigned short count = 0, k = 0; /* Abre o arquivo de configuração */ conf = fopen(filename, "r"); if (!conf) return -1; /* Se der falha na abertura do arquivo retorna -1 */ /* procura a seção */ while (!feof(conf)) { fscanf(conf, "%s", fstemp); if ((strchr(fstemp, '[')) && (strchr(fstemp, ']'))) { switch (option) case 0:/*get_conf*/ if (strstr(stemp, isp)) { /*procura o campo até encontrar o final do arquivo ou até a proxima seção*/ while ((!feof(conf)) || ((strchr(fstemp,'[')) && (strchr(fstemp,']')))) { fscanf(conf, "%s", fstemp); if (strstr(fstemp, token)) { sigual = strchr(fstemp, '='); sigual++; strcpy(value, sigual); break; } } } break; case 1:/*check_isp*/ if (strstr(stemp, isp)) flag = 0; else flag = 1; break; case 2:/*list_isp*/ if ((strchr(fstemp, '[')) && (strchr(fstemp, ']'))) { for (count = 0; count < strlen(fstemp); count++) { if ((fstemp[count] == '[') || (fstemp[count] == ']')) { fstemp[count] = NULL; count++; } } /* Verifica se é ou não a seção 'global' */ if (!strcmp(fstemp, "GLOBAL") { list[k] = (char *) malloc(sizeof(fstemp)); strcpy(list[k], fstemp); k++; /* Atualiza o contador */ } } break; } } /* Fecha o arquivo de configurações */ fclose(conf); switch (option) { case 0: return &value; break; case 1: if (flag == 0) { *retorno=1; return null; } else { *retono=0; return null; } break; case 2: return list; break; } } Amauri Albuquerque Engenheiro de Telecomunicações Centro de Supervisão e Controle de Rede - CSCR Americel 329-6811 > ----- Mensagem original ----- > De: André Casteliano [SMTP:al...@br...] > Enviada em: Sábado, 7 de Outubro de 2000 17:42 > Para: lin...@li... > Assunto: Re: [Linuxcall] RES: [Linuxcall] Funções de acesso > aoarq. de config. > > AAl...@am... wrote: > > > > André me manda um arquivo de configurção seu, acho que as funções podem > > ficar mais simples se a gente usar a get_token. > > O arquivo tá indo em anexo... só tem hum provedor cadastrado... > > Como assim mais simples Amauri ??? > > Eu tou pensando em criar funções menores cara... mais específicas... eu > acho melhor do que uma super-função cheia de recursos... :-) > > Explica melhor isso aí... :-) > > []'s > > -- > André Casteliano > Analista de Sistemas - al...@br... > +---------------------------------------------+ > | Linux User: # 178853 Machine: # 79923 | > | Linux Heavy User - Powered by Slackware 7.1 | > | http://www.geocities.com/andre_casteliano/ | > +---------------------------------------------+ > | LinuxCall - The Linux Dialer | > | http://linuxcall.sourceforge.net | > +---------------------------------------------+ << Arquivo: isp.conf >> |