Marcado como: code Ativar/desativar aninhamento de comentários | Atalhos do Teclado

  • Fm4lloc 9:35 pm em 25 de April de 2015 Link Permanente | Resposta
    Tags: , code, , , parser, url   

    Simple parse-url in C 

    Simples URL parser que escrevi em C para exercitar o uso de expressões regulares.

    Modo de usar: ./parseurl url

    Exemplo de uso:

    $ ./parseurl 'scheme://username:password@subdomain.domain.tld:80/path/file-name.suffix?query-string#hash'
    

    Saída:

    +SCHEME: scheme
    +AUTHORITY: username:password@subdomain.domain.tld:80
     +USERINFO: username:password
      -USERNAME: username
      -PASSWORD: password
     -HOST: subdomain.domain.tld
     -PORT: 80
      +PATH: /path/file-name.suffix
       -FILENAME: file-name.suffix
       -QUERY: query-string
       -FRAGMENT: hash
    

    O código esta no Github. Para baixar use o comando:

    $ git clone https://github.com/fm4lloc/parse-url.git
    

    ou acesse a página https://github.com/fm4lloc/parse-url

    Após o download do código entre na pasta parse-url e compile.

    $ cd ./parse-url && make
    

    Recomendo ler esse post que escrevi sobre expresões regulares para entender melhor o funcionamento do programa: https://fm4lloc.wordpress.com/2014/01/06/usando-expressoes-regulares-em-c/

     
  • Fm4lloc 6:57 pm em 5 de February de 2014 Link Permanente | Resposta
    Tags: , code, examplo, gnome, libxml2, , mit, , parse, parsing, xml   

    Analisando arquivos XML locais e remotos com libxml2. 

    libxml2 é uma biblioteca de software feita para  analisar documentos XML , escrita em C e disponibilizada sob a licença MIT. Mesmo construído em  C, fornece “ligações” para outras linguagens.

    A biblioteca também é conhecida pela portabilidade, compilação fácil e alta velocidade.

    A instalação através dos repositórios do Debian fica:

    $ sudo apt-get install libxml2-dev
    

    O código abaixo foi escrito para analisar arquivos remotos ou locais, ele fazia parte de um projeto que eu estava desenvolvendo para buscar músicas no site 4shared, mas foi descontinuado.

    Como a postagem não trata-se de tutorial, vou dispensar as explicações. O código é pequeno e de fácil compreensão após breve exercício mental.

    Recomendo a leitura da documentação oficial da libxml2.

    Para compilar:

    $ gcc $(xml2-config --cflags --libs) ./parse.c -o ./parse
    

    O layout do arquivo XML analisado pelo código é:

    <!-- ROOT -->
    <search-result>
    	<!-- MAIN -->
    	<query/>
    	<total-files>8975</total-files>
    	<page-number>1</page-number>
    	<pages-total>897</pages-total>
    	<start>0</start>
    	<files-per-page>10</files-per-page>
    	<files-approx-count>16219367</files-approx-count>
    	<!-- FILE -->
    	<result-files>
    		<file>
    			<name>Foo</name>
    		</file>
    		<file>
    			<name>Bar</name>
    		</file>
    		<file>
    			<name>Qux</name>
    		</file>
    	</result-files>
    </search-result>
    

    O mesmo modelo é usado no documento gerado na página: https://search.4shared.com/network/searchXml.jsp

    O programa:

    #include <stdio.h>
    #include <stdlib.h>
     
    #include <libxml/tree.h>
    #include <libxml/parser.h>
     
    /*
     * Copyright (C) 2014 Fm4lloc <fm4lloc@gmail.com>
     *
     * This program is free software: you can redistribute it and/or modify
     * it under the terms of the GNU General Public License as published by
     * the Free Software Foundation, either version 3 of the License, or
     * (at your option) any later version.
     *
     */
     
    void cleanAll(xmlDocPtr doc)
    {
        xmlFreeDoc (doc);
        /*
         * Free the global variables that may
         * have been allocated by the parser.
         */
        xmlCleanupParser ();
    }
     
    void printXmlContent (xmlDocPtr doc, xmlNodePtr cur)
    {
        xmlChar *key = NULL;
     
        if ((key = xmlNodeListGetString (doc,
            cur->xmlChildrenNode, 1)))
        {
            printf("%s\n", key);
            xmlFree (key);
        }
    }
     
    static void eachFile (xmlDocPtr doc, xmlNodePtr cur)
    {
        cur = cur->xmlChildrenNode;
        while (cur != NULL)
        {
            /* <search-result>
             *      ...
             *      <result-files>
             *          <file>
             *              <name>
             */
            if ((!xmlStrcmp (cur->name, (const xmlChar *) "name")))
                printXmlContent (doc, cur);
     
            cur = cur->next;
        }
    }
     
    static void parseFile (xmlDocPtr doc, xmlNodePtr cur)
    {
        cur = cur->xmlChildrenNode;
        while (cur != NULL)
        {
            if ((!xmlStrcmp (cur->name, (const xmlChar *) "file")))
                eachFile (doc, cur);
     
            cur = cur->next;
        }
    }
     
    static void parseMainInfo (xmlDocPtr doc, xmlNodePtr cur)
    {
        cur = cur->xmlChildrenNode;
        while (cur != NULL)
        {
                if (cur->type == XML_ELEMENT_NODE)
                {
                    /* Stop when you find the node: result-files */
                    if ((!xmlStrcmp (cur->name, (const xmlChar *) "result-files")))
                        break;
     
                    printXmlContent (doc, cur);
                }       
     
            cur = cur->next;
        }
    }
     
    /**
     * parseDoc:
     * @filename: A filename or an URL
     *
     * Parse XML
     *
     * Returns int
     */
    static int parseDoc (const char *filename)
    {
        xmlDocPtr  doc = NULL;
        xmlNodePtr cur = NULL;
     
        doc = xmlReadFile (filename, NULL, 0);
        if (doc == NULL)
        {
                fprintf (stderr, "Document not parsed.\n");
                return 1;
        }
     
        /* Get the root element node */
        cur = xmlDocGetRootElement(doc);
        if (cur == NULL)
        {
                fprintf (stderr,"empty document\n");
                cleanAll (doc);
                return 1;
        }
     
        /* Check if node root == "search-result" */
        if (xmlStrcmp (cur->name, (const xmlChar *) "search-result"))
        {
                fprintf (stderr,"document of the wrong type, root node != %s\n", cur->name);
                cleanAll (doc);
                return 1;
        }
     
        /* <search-result> */
        parseMainInfo (doc, cur);
     
        /* <search-result>
         *      ...
         *      <result-files> */
        cur = cur->xmlChildrenNode;
        while (cur != NULL)
        {
            if ((!xmlStrcmp (cur->name, (const xmlChar *) "result-files")))
            {
            /* <search-result>
             *      <result-files>
             *          <file>
             */
                parseFile (doc, cur);
            }
     
            cur = cur->next;
        }
     
        cleanAll (doc);
     
        return 0;
    }
     
    int main(void)
    {
        if (parseDoc ("./content.xml") != 0)
            return -1;
     
        return 0;
    }
    

    Saída padrão:

    8975
    1
    897
    0
    10
    16219367
    Foo
    Bar
    Qux
    
     
  • Fm4lloc 1:08 am em 21 de December de 2013 Link Permanente | Resposta
    Tags: , backup, , calendário, code, contatos, despertador, e-mail, sh, sms   

    Script: Fast Backup Android – backup de mensagens sms, contatos, calendário, despertador e e-mails 

    Escrevi esse script para automatizar o backup de dados considerados importantes no meu Android e exercitar um pouco de shellscript.

    Para tudo funcionar corretamente será necessário alterar a linha sequente com localização do adb (Android Debug Bridge).

    declare -r ADB_BIN="/usr/local/bin/adb"
    

    Para obter mais informações execute o script acompanhado do parâmetro -h ou –help.

    #!/bin/bash
     
    #  Automates the backup process android.
    #
    #  Written by: Fernando Magalhães (fm4lloc) <fm4lloc@gmail.com>
    #
    #  This program is free software; you can redistribute it and/or modify
    #  it under the terms of the GNU General Public License as published by
    #  the Free Software Foundation; either version 3 of the License, or
    #  (at your option) any later version.
    #  
     
    declare -r NAME="Fast Backup Android"
    declare -r VERSION="0.12.4"
     
    #  [SETTINGS] - full path to the binary: adb
    #
    declare -r ADB_BIN="/usr/local/bin/adb"
     
    #  [SETTINGS] - add the path of files or folders to backup.
    #
    #  ATTENTION! remove the bar (/) end.
    #  change this  : /a/b/c/
    #  for this     : /a/b/c
    #
    declare -r PATH_FILES=(
        "/data/data/com.android.providers.contacts/databases/contacts2.db"
        "/data/data/com.android.providers.telephony/databases/mmssms.db"
        "/data/data/com.android.providers.settings/databases/settings.db"
        "/data/data/com.android.providers.calendar/databases/calendar.db"
        "/data/data/com.android.deskclock/databases/alarms.db"
        "/data/data/com.android.email/databases"
        "/data/data/com.android.settings"
    )
     
    function help()
    {
        version
        echo -e \
        "\n  -b [<local>] | --backup [<local>]  - create backup."\
        "\n                                    "\
        "A folder will be created automatically if none is specified."\
        "\n  -r <local> | --restore <local>     - restore backup."\
        "\n  -h | --help                        - show this help message."\
        "\n  -v | --version                     - show version num."
    }
     
    function version()
    {
        echo "${NAME} version ${VERSION}"
    }
     
    function create_dir()
    {
        if [ "$1" == "" ]; then
            local -r dir_name="bkp-`date +%Y%m%d-%I%M%S`"
        else
            local -r dir_name="$1"
        fi
     
        if [ -d "$dir_name" ]; then
            echo "Error: $dir_name already exists. Run $0 again."
            exit -1
        else
            mkdir -v "$dir_name"
        fi
     
        backup_data
    }
     
    function backup_data()
    {
        echo "Started..."
        for (( i = 0 ; i < ${#PATH_FILES[@]} ; i++ )) do
            mkdir -p `expr "${dir_name}${PATH_FILES[$i]}" : '\(.*\/\)'`
            $ADB_BIN pull "${PATH_FILES[$i]}" "${dir_name}${PATH_FILES[$i]}"
        done
        echo "Finished!"
    }
     
    function check_restore()
    {
        local -r dir_restore=`echo "$1" | sed -e 's/\/$//g'`
        if [ -d "$dir_restore" ]
        then
            echo "Proceed with the restore? [N/y]"
            read -n 1 -r
            if [[ $REPLY =~ ^[Yy]$ ]]; then
                restore_data
            else
                exit -1
            fi
        else
            echo "Error: \"$dir_restore\" does not exists. :-("
            exit -1
        fi
    }
     
    function restore_data()
    {
        echo "Restoring..."
        for (( i = 0 ; i < ${#PATH_FILES[@]} ; i++ )) do
            $ADB_BIN push "${dir_restore}${PATH_FILES[$i]}" "${PATH_FILES[$i]}"
        done
        echo "Finished"
     
        echo "sync..."
        $ADB_BIN shell sync
        echo "reboot device..."
        $ADB_BIN shell reboot
        echo "Finished!"
    }
     
    # MAIN
        case $1 in
    -b | --backup)
        create_dir "$2"
        exit 0
        ;;
    -r | --restore)
        check_restore "$2"
        exit 0
        ;;
    -h | --help)
        help
        exit 0
        ;;
    -v | --version)
        version
        exit 0
        ;;
    *)
        echo -e "Try $0 -h' or $0 --help' for more information."
        exit 0
        ;;
    esac
    
     
c
escrever novo post
j
post seguinte/ comentário seguinte
k
post anterior/comentário anterior
r
Resposta
e
Editar
o
mostrar/esconder comentários
t
voltar ao topo
l
vá para login
h
mostrar/ocultar ajuda
shift + esc
Cancelar