[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Pesquisa de diretivas #if
From: |
Marcio Gil |
Subject: |
Re: Pesquisa de diretivas #if |
Date: |
Mon, 18 Jan 2010 20:13:19 -0000 |
User-agent: |
eGroups-EW/0.82 |
Solução "definitiva", um script que chamei de lsdef:
http://bash.pastebin.com/f633c24c7
Exemplo:
$ lsdef +c -du `find -type f -a -not -name \*~*` >full.tmp
$ lsdef -i `find -type f -a -not -name \*~*` | sort -u | grep -vf full.tmp
PWRDECODER
...
__CONSOLE__
__WIN32__
__unix__
E assim eu posso conferir todas as opções dos meus projetos,
Marcio Gil.
--- Em address@hidden, "Marcio Gil" <marciomgil@...> escreveu
>
> Pessoal, a cinco meses eu fiz uma pergunta sobre separar diretivas
> da linguagem C. O objetivo era verificar se havia alguma opção de
> compilação não utilizada ou escrita incorretamente. Posto aqui a
> minha solução (para o caso de alguém se beneficiar dela).
>
> Como a pesquisa é complexa, eu criei algumas variáveis para me
> permitir brincar mais facilmente:
>
> # Remove comentários:
> $ export rmcomm=':a;/\/\*\([^*]*\(\*[^/]\)*\)*$/{N;s/\n//;ba};\
> s/ *\/\*\([^*]*\(\*[^/]\)*\)*\*\///g;s/ *\/\/.*$//g'
>
> # Pesquisa e junta diretivas de múltiplas linhas em uma só:
> $ export direct=':a;/^ *#.*\\$/{N;s/\\\n//;ba};/^ *# *if.*$/'
>
> # Pesquisa e junta definições (#define):
> $ export define=':a;/^ *#.*\\$/{N;s/\\\n//;ba};/^ *# *define.*$/'
>
> # retira operadores separando as macros com um único espaço:
> $ export spdirect='{s/^ *# *[a-z]* *//;\
> s/ *\(defined\)\?[^A-Za-z0-9_]\+/ /g;\
> s/^ \+\| \+$//g;s/ \+\([^\n]\)/ \1/g;p}'
>
> # retira operadores separando as macros em linhas distintas:
> $ export nldirect='{s/^ *# *[a-z]* *//;\
> s/ *\(defined\)\?[^A-Za-z0-9_]\+/ /g;\
> s/^ \+\| \+$//g;s/ \+\([^\n]\)/\n\1/g;p}'
>
> Exemplos:
>
> # Lista as opções definidas:
> $ sed -n -e "$rmcomm" -e "$define$nldirect" config.h | sort -u |
> grep "\<[A-Z][A-Z0-9_]*\>"
>
> # Lista as opções utilizadas:
> $ sed -n -e "$rmcomm" -e "$direct$nldirect" *.!(*~*) | sort -u |
> grep "\<[A-Z][A-Z0-9_]*\>"
>
> # Lista opções utilizadas e não definidas:
> $ sed -n -e "$rmcomm" -e "$define$nldirect" config.h | sort -u |
> grep "\<[A-Z][A-Z0-9_]*\>" >temp.lst
> $ sed -n -e "$rmcomm" -e "$direct$nldirect" *.!(*~*) | sort -u |
> grep "\<[A-Z][A-Z0-9_]*\>" | grep -vf temp.lst
>
> # Lista opções definidas e não utilizadas:
> $ sed -n -e "$rmcomm" -e "$direct$nldirect" *.!(*~*) | sort -u |
> grep "\<[A-Z][A-Z0-9_]*\>" >temp.lst
> $ sed -n -e "$rmcomm" -e "$define$nldirect" config.h | sort -u |
> grep "\<[A-Z][A-Z0-9_]*\>" | grep -vf temp.lst
>
> Obrigado pelas dicas, aprendi muito sobre shell-script nos últimos
> meses.
>
> Márcio Gil.
>
> > -----Original Message-----
> > From: Julio C. Neves
> > Sent: Wednesday, August 19, 2009 12:23 PM
> >
> > OK Marcio,
> > eu imaginei que vc quisesse todas as linhas, porém quebrando
> > as linhas que
> > contém as diretivas. Se vc que somente esta segunda parte, faça:
> >
> > $ sed -nr '/#if n?defined/p' arq1 | sed -r 's/(\|\||&&)/\\\n\1/'
> >
> > --
> > Abraços,
> > Julio
> > Cursos de Shell e Zenity em 2 fins de semana?
> > - Em SP ligue (11) 2125-4747 (dias 29-30/08 e 12-13/09);
> > - Em DF ligue (61) 3223-3000;
> > - No RJ ligue (21) 2561-0867;
> > - Turmas fechadas em outras cidades ligue (21) 8112-9988.
> > 2009/8/19 Márcio Gil <marciomgil@...>
> >
> > >
> > >
> > > Julio,
> > >
> > > seria interessante se eu pudesse resolver tudo em um único
> comando
> > > (utilizando o sed como grep), mas a linha que você me sugeriu
> > > retornou todas as linhas dos arquivos, e não só as linhas com
> > > diretivas...
> > >
> > >
> > >
> > > > -----Original Message-----
> > > > From: Julio C. Neves
> > > >
> > > > Aê Marcio,
> > > >
> > > > método KISS:
> > > >
> > > > $ sed -r '/#if n?defined/s/(\|\||&&)/\\\n\1/' *.cpp
> > > >
> > > > Essa linha fará tudo que vc quer.
> > >
> > >
> > >
> >
> >
>