Ver Mensaje Individual
  #1 (permalink)  
Antiguo 26/05/2013, 12:22
Avatar de guzzano
guzzano
 
Fecha de Ingreso: julio-2010
Ubicación: Isla de Margarita
Mensajes: 162
Antigüedad: 14 años, 3 meses
Puntos: 13
Optimización de una función

Buenos días, programé una función, pero me siento un poco satisfecha con ella, quizá sea la mejor forma, pero quisiera otra perspectiva que sea un poco más simple. Si tienen alguna idea o me ayudarían con la lógica, sería perfecto.

Código C:
Ver original
  1. /*             Saca la información de w0rm.conf
  2.  *
  3.  * Este programa es software libre: usted puede redistribuirlo y/o
  4.  * modificarlo bajo los términos de la Licencia Pública General de
  5.  * GNU  según es publicada por la Free Software Foundation, bien
  6.  * sea la versión 3 de la Licencia, o (a su elección) cualquier
  7.  * versión posterior.
  8.  *
  9.  * Este programa se distribuye con la esperanza de que sea útil,
  10.  * pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
  11.  * COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte
  12.  * la GNU General Public License para más detalles.
  13.  *
  14.  * Debería haber recibido una copia de la Licencia Pública General de GNU
  15.  * junto con este programa. Si no, véase <http://www.gnu.org/licenses/>.
  16.  *
  17.  * Escrito por Alberto 'guzzan0' José Guilarte para w0rmlinux
  18.  */
  19.  
  20.  
  21. #define DIR_CONFIG "/etc/w0rm.conf"
  22.  
  23. struct wormcfg {
  24.   char servidor_espejo[256]; /* RFC 1035 */
  25.   char protocolo_espejo[5]; /*FTP o HTTP */
  26.   char repositorios[20]; /* Base, opcional, comunidad */
  27.  
  28.   char directorio_db[256]; /* DB con los paquetes */
  29.  
  30. } cfg_w = {"guzzano2.web44.net", "http", "Base",
  31.            "/home/guzzano/Escritorio/w0rm/packages_db"};
  32.  
  33. /* Realiza una comprobación para ver si no existe en la variable
  34.  * algún dato que no sea necesario. Espacios, comillas, errores de tecleo
  35.  * o salto de líneas.
  36.  */
  37.  
  38. static int comprobar_datos (char * cadena_opciones, char ** resultado) {
  39.   char * tmp_r = cadena_opciones;
  40.   char * tmp_c = NULL;
  41.  
  42.   while ((!(isalpha(*tmp_r)) && !(isdigit(*tmp_r))) && *tmp_r != '\0')
  43.     tmp_r += 1;
  44.  
  45.   if (*tmp_r == '\0' || *tmp_r == '\n')
  46.     return -1;
  47.  
  48.   if ((tmp_c = strchr(tmp_r, '\n')) != NULL)
  49.     tmp_c = '\0';
  50.  
  51.   *resultado = tmp_r;
  52.  
  53.   return 0;
  54. }
  55.  
  56. int cargar_configuracion (void) {
  57.   const char * opciones[4] = {"servidor_espejo", "protocolo_espejo", "repositorios_activos",
  58.                   "directorio_db"};
  59.   char cadena_config[256];
  60.   char * tmp = NULL;
  61.   char * tmp2 = NULL;
  62.  
  63.   int opciones_c;
  64.   int tamano_c = 0;
  65.  
  66.   FILE * config_archivo = fopen(DIR_CONFIG, "a+");
  67.  
  68.   if (config_archivo == NULL) {
  69.     fprintf(stderr, "[Error] no se pudo cargar el archivo de configuración");
  70.     return -1;
  71.   }
  72.  
  73.   while (fgets(cadena_config, sizeof(cadena_config)-1, config_archivo) != NULL) {
  74.     if (cadena_config[0] == '#' || cadena_config[0] == '\n')
  75.       continue;
  76.    
  77.     for (opciones_c = 0 ; opciones_c < sizeof(opciones)/sizeof(char *) ; opciones_c++) {
  78.       if (strncmp(opciones[opciones_c], cadena_config, strlen(opciones[opciones_c])) == 0) {
  79.     if (strtok_r(cadena_config, "=", &tmp) == NULL)
  80.       break;
  81.    
  82.     if (comprobar_datos(tmp, &tmp2) != 0)
  83.       break;
  84.    
  85.     switch (opciones_c) {
  86.       case 0:
  87.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.servidor_espejo))-1 ? strlen(tmp2) : sizeof(cfg_w.servidor_espejo)-1; /* Evito buffer overflow */
  88.         strncpy(cfg_w.servidor_espejo, tmp2, tamano_c);
  89.        
  90.         break;
  91.      
  92.       case 1:
  93.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.protocolo_espejo))-1 ? strlen(tmp2) : sizeof(cfg_w.protocolo_espejo)-1;
  94.         strncpy(cfg_w.protocolo_espejo, tmp2, tamano_c);
  95.        
  96.         break;
  97.        
  98.       case 2:
  99.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.repositorios))-1 ? strlen(tmp2) : sizeof(cfg_w.repositorios)-1;
  100.         strncpy(cfg_w.repositorios, tmp2, tamano_c);
  101.        
  102.         break;
  103.      
  104.       case 3:
  105.         tamano_c = (strlen(tmp2) < sizeof(cfg_w.directorio_db))-1 ? strlen(tmp2) : sizeof(cfg_w.directorio_db)-1;
  106.         strncpy(cfg_w.directorio_db, tmp2, tamano_c);
  107.        
  108.         break;
  109.     }  
  110.       }
  111.     }
  112.    
  113.   }
  114.  
  115.   fclose(config_archivo);
  116.   return 0;
  117. }

Se me hace un poco incomodo y cuando se necesitan más variables de configuración el archivo C será realmente pesado y la comparación también.

Saludos.