shell-script-pt
[Top][All Lists]
Advanced

[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.
> > >
> > >  
> > >
> > 
> >
>




reply via email to

[Prev in Thread] Current Thread [Next in Thread]