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

  • Fm4lloc 9:35 pm em 25 de April de 2015 Link Permanente | Resposta
    Tags: C, , , , 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 4:10 pm em 2 de February de 2015 Link Permanente | Resposta
    Tags: C, encoder, , projeto   

    Projeto Cryptus 

    Sobre o projeto

    Cryptus é um multi-encoder que estou escrevendo em C. A ideia nasceu com um script arcaico feito em Perl contendo características parecidas, gostei tanto dele que achei interessante criar algo mais robusto e com uma interface gráfica.

    O Cryptus foi publicado no github, muitas funções já então funcionando, nos meus tempos livres estarei atualizando o código.

    https://github.com/fm4lloc/cryptus

    cryptus

    Como compilar no Debian e derivados

    1. Instale as dependências:

    $ sudo apt-get install build-essential pkg-config libgtk2.0-dev libgdk-pixbuf2.0-dev libssl-dev git
    

    2. Obtenha os sources:

    $ git clone https://github.com/fm4lloc/cryptus.git
    $ cd ./cryptus
    

    3. Compile:

    $ make
    
     
    • ZACHARiAS 10:23 am em 24 de fevereiro de 2015 Link Permanente | Resposta

      oi, bom dia.
      encoder de quê comopanheiro? obrigado por seguires o meu cantinho também.

      • fm4lloc 8:44 pm em 17 de abril de 2015 Link Permanente | Resposta

        É um multi-encoder de strings. É usado para codificar e criptografar strings. Também conta com ferramentas variadas e de utilidade rotineira para ofuscar scripts, links e textos em geral.

        Ainda estou escrevendo! Não esta 100% funcional.

  • Fm4lloc 10:32 pm em 27 de January de 2015 Link Permanente | Resposta
    Tags: C, generico, makefile   

    Makefile genérico para projetos pequenos 

    Escrever Makefiles para projetos pequenos em C no Linux é uma tarefa cansativa, naqueles onde os arquivos estão jogados em varias pastas é pior. A minha ideia foi agilizar essas compilações escrevendo um Makefile bem genérico e que consiga entrar em sub-diretórios, construir vários arquivos e juntar tudo. O trabalho é esta obra prima do horror, munida de más praticas.

    Nota: Crie uma pasta chamada src para colocar os arquivos-fonte do seu projeto. O Makefile fica no mesmo diretório dela.

    Observe:
    tree

    # Simple generic Makefile 1.0 - (Fm4lloc)
    #
    # ======================================================================
    # This Makefile was written with bad practices. Not recommend  using 
    # it on big projects.
    # ======================================================================
    #
     
    #-----------------------------------------------------------------------
    # EDIT HERE
    #-----------------------------------------------------------------------
    RM          = /bin/rm -f
    CC          = gcc
    DEFS        = -O3 -Wall -fmessage-length=0
    PROGNAME    = generic
    INCLUDES    = 
    LIBS        = 
    #-----------------------------------------------------------------------
     
    DEFINES     = $(INCLUDES) $(DEFS)
    CFLAGS      = $(DEFINES)
     
    SRC         = $(wildcard src/*.c) $(wildcard src/**/*.c)
    HEADERS     = $(wildcard src/*.h) $(wildcard src/**/*.h)
    OBJS        = $(SRC:.c=.o)
     
    DATE        = $(shell date +%Y-%d-%m)
     
    .c.o:
        @echo 'Building file: $<'
        @echo 'Invoking: Cross GCC Compiler'
        $(CC) $(CFLAGS) -c $*.c -o $*.o
        @echo 'Finished building: $<'
        @echo ' '
         
    all: $(PROGNAME)
     
    $(PROGNAME) : $(OBJS)
        @echo 'Building target: $@'
        @echo 'Invoking: Cross GCC Linker'
        $(CC) $(LIBS) $(OBJS) -o $(PROGNAME)
        @echo 'Finished building target: $@'
        @echo ' '
         
    .PHONY: clean tar
    clean:
        $(RM) $(PROGNAME) $(OBJS)
        @echo ' '
         
    tar:
        tar cvjf $(PROGNAME)_src_$(DATE).tar.bz2 $(SRC) $(HEADERS) Makefile
        @echo ' '
    
     
  • Fm4lloc 6:57 pm em 5 de February de 2014 Link Permanente | Resposta
    Tags: C, , 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
    
     
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