Mostrando entradas con la etiqueta fichero. Mostrar todas las entradas
Mostrando entradas con la etiqueta fichero. Mostrar todas las entradas

domingo, 29 de marzo de 2015

Autocompletado de ruta de directorios y ficheros en Sublime Text

Si quieres que Sublime Text autocomplete la ruta de ficheros y directorios a medida que los vas escribiendo debes instalar el plugin AutoFileName. 


Para hacerlo buehhh coño ya te di el nombre del plugin, ahora instalalo con Package Control. Si no tienes Package Control instalado debes instalarlo XD 



domingo, 15 de marzo de 2015

Ejemplo libconfig con QtCreator: Leer y escribir en el fichero de configuración

En esta entrada veremos un ejemplo de uso de libconfig en linux para trabajar con ficheros de configuración. Usaremos QtCreator como ide.

Lo primero es instalar el paquete libconfig

Desde debian:
apt-get install libconfig

Desde fedora:
yum install libconfig libconfig-devel


Luego debemos linkear la librería desde nuestro IDE. Para ello damos clic derecho al titulo del proyecto y luego en Add Library. Luego colocamos la dirección de el fichero libconfig.so. 
Por lo general está en /usr/lib64/libconfig.so si es un so de 64 bits
Por lo general está en /usr/lib/libconfig.so     si es un so de 32 bits


Puedes hacer el paso anterior de forma manual agregando la siguiente linea a tu fichero .pro
LIBS += -lconfig

Para este ejemplo utilizamos el siguiente fichero de configuración (example.cfg):

// Nombre
nombre = "Libros, Películas y mas";

// Inventario
inventario =
{
  libros = ( { titulo  = "Treasure Island";
              autor = "Robert Louis Stevenson";
              precio  = 29.99;
              qty    = 5; },
            { titulo  = "Snow Crash";
              autor = "Neal Stephenson";
              precio  = 9.99;
              qty    = 8; }
          );

  peliculas = ( { titulo = "Brazil";
               media = "DVD";
               precio = 19.99;
               qty = 11; },
             { titulo = "MEMEMTO";
               media = "VHS";
               precio = 18.99;
               qty = 5; }
           );
};





Este código lee el fichero, muestra su contenido y cambia el valor de la preferencia 'nombre' a Totona.

#include <stdio.h>
#include <stdlib.h>
#include <libconfig.h>


/* Este ejemplo lee el fichero de configuracion example.cfg
 * y muestra su contenido
 */
int main(int argc, char **argv)
{
    static const char *output_file = "updated.cfg";
    static const char *input_file  = "example.cfg";
    config_t cfg;
    config_setting_t *setting;
    const char *str;

    config_init(&cfg);

    /* Lee el fichero, si hay error lo muestra y sale */
    if(! config_read_file(&cfg, input_file))
    {
        fprintf(stderr, "%s:%d - %s\n", config_error_file(&cfg),
                config_error_line(&cfg), config_error_text(&cfg));
        config_destroy(&cfg);
        return(EXIT_FAILURE);
    }    
    

    /* Obtenemos el nombre. */
    if(config_lookup_string(&cfg, "nombre", &str))
        printf("nombre: %s\n\n", str);
    else
        fprintf(stderr, "No hay un campo 'nombre' en example.cfg.\n");

    /* Mostramos todos los libros del inventerio. */
    setting = config_lookup(&cfg, "inventario.libros");
    if(setting != NULL)
    {
        int count = config_setting_length(setting);
        int i;

        printf("%-30s  %-30s   %-6s  %s\n", "titulo", "autor", "precio", "QTY");

        for(i = 0; i < count; ++i)
        {
            config_setting_t *libro = config_setting_get_elem(setting, i);

            const char *titulo, *autor;
            double precio;
            int qty;

            if(!(config_setting_lookup_string(libro, "titulo", &titulo)
                 && config_setting_lookup_string(libro, "autor", &autor)
                 && config_setting_lookup_float(libro, "precio", &precio)
                 && config_setting_lookup_int(libro, "qty", &qty)))
                continue;

            printf("%-30s  %-30s  $%6.2f  %3d\n", titulo, autor, precio, qty);
        }
        putchar('\n');
    }

    /* Muestra todas las peliculas en inventario. */
    setting = config_lookup(&cfg, "inventario.peliculas");
    if(setting != NULL)
    {
        unsigned int count = config_setting_length(setting);
        unsigned int i;

        printf("%-30s  %-10s   %-6s  %s\n", "Titulo", "Media", "Precio", "QTY");
        for(i = 0; i < count; ++i)
        {
            config_setting_t *movie = config_setting_get_elem(setting, i);

            const char *titulo, *media;
            double precio;
            int qty;

            if(!(config_setting_lookup_string(movie, "titulo", &titulo)
                 && config_setting_lookup_string(movie, "media", &media)
                 && config_setting_lookup_float(movie, "precio", &precio)
                 && config_setting_lookup_int(movie, "qty", &qty)))
                continue;

            printf("%-30s  %-10s  $%6.2f  %3d\n", titulo, media, precio, qty);
        }
        putchar('\n');
    }
    
    /** Actualizamos el valor del nombre **/    
    config_setting_t *root,*nombre;

    root = config_root_setting(&cfg);
    nombre=config_setting_get_member(root,"nombre");

    // Cambiamos el valor del nombre y le colocamos
    config_setting_set_string(nombre,"Totona");

    /* Escribimos el fichero de salida*/
    if(! config_write_file(&cfg, output_file))
    {
        fprintf(stderr, "Error escribiendo en el fichero.\n");
        config_destroy(&cfg);
        return(EXIT_FAILURE);
    }

    fprintf(stderr, "Se ha actualizado el fichero %s y se ha guardado en: %s\n",
            input_file,output_file);


    config_destroy(&cfg);
    return(EXIT_SUCCESS);
}



Links de interés:
http://jpmens.net/2009/09/17/reading-configuration-files-with-libconfig/

miércoles, 2 de enero de 2013

Crear estructuras en Okteta

Síntesis rápida
Necesita crear dos ficheros en el directorio /home/NOMBREDEUSUARIO/.kde/share/apps/okteta/structures/NOMBRE_X

- Un NOMBRE_X.osd donde guardará toda la información de la estructura
- Un NOMBRE_X.desktop para la presentación visual (No es tan importante).
(NOMBRE_X Es cualquier nombre que usted le quiera dar)
Ejemplo de como puede ser la estructura del fichero NOMBRE_X.osd: 

<?xml version="1.0" encoding="UTF-8"?>
<data>
     <struct name="NombreDeLaEstructura">
<primitive name="UnChar" type="Char"/>
<primitive name="UnEntero" type="Int32"/>
      </struct>
</data>

La anterior es una estructura que tiene dos campos primitivos: un carácter y un entero, que en C/C++ equivaldría a algo así:

struct NombreDeLaEstructura{
   char UnChar;
   int UnEntero;
}

El fichero NOMBRE_X.desktop puede ser algo así:

[Desktop Entry]
Encoding=UTF-8
Icon=code-context
Type=Service
ServiceTypes=KPluginInfo

Name[es]=Prueba

X-KDE-PluginInfo-Author=Hector Oliveros
X-KDE-PluginInfo-Email=hector.oliveros.leon@gmail.com
X-KDE-PluginInfo-Name=Prueba
X-KDE-PluginInfo-Version=1.0
X-KDE-PluginInfo-Website=http://www.plugin.org/
X-KDE-PluginInfo-Category=structure
X-KDE-PluginInfo-License=LGPL
X-KDE-PluginInfo-EnabledByDefault=true


Luego lo guarda y ya puede agregar la estructura 


Ejemplo:

Imaginemos que queremos analizar un fichero binario que contenga, internamente, varias de estas estructuras

struct BCP{ 
  int idControl;
  int pid;  
  pid_t ppid;  
  int gradoDePrioridad;  
  int consumoAcumuladoDeCPU;  
  int rafagasDeEjecucion[20]; 
 
  struct Bloqueo{    
    int idControlProceso;     
    uint tiempoDeBloqueo;    
    int idRecurso;    
  } bloqueos[20];    
  
  int instanteDeLlegada;

  enum TipoDeProceso{
    BATCH  = 0,
    TIEMPO_REAL  = 1,
    INTERACTIVOS = 2
  } tipoDeProceso;  
};


En este caso el fichero .osd sería algo así:


<?xml version="1.0" encoding="UTF-8" ?>
<data>  
  <enumDef name="Tipo_De_Proceso" type="Int32">
      <entry name="BATCH"        value="0" />
      <entry name="TIEMPO_REAL"  value="1" />
      <entry name="INTERACTIVOS" value="2" />      
   </enumDef>        
  <struct name="BCP">
    <primitive name="IDControl" type="Int32" />    
    <primitive name="PID" type="Int32" />    
    <primitive name="PPID" type="Int32" />        
    <primitive name="GradoDePrioridad" type="Int32" />    
    <primitive name="ConsumoAcumuladoDeCpu" type="Int32" />    
    <array name="RafagasDeEjecucion" length="20">
      <primitive type="Int32" />
    </array>    
    <array name="Bloqueos" length="20">
      <struct name="Bloqueo">
 <primitive name="IDControl" type="Int32" />
 <primitive name="TiempodeBloqueo" type="Int32" />
 <primitive name="IDRecurso" type="Int32" />
      </struct> 
    </array>    
    <primitive name="InstanteDeLlegada" type="Int32" />     
    <enum name="TipoDeProceso" enum="Tipo_De_Proceso" type="Int32" />    
  </struct> 
</data>



Aquí puede descargar este ejemplo completo

Solo debe pegarlo en la ruta: 
/home/NOMBREDEUSUARIO/.kde/share/apps/okteta/structures/