Obtendo os nomes das funcoes em um STRING.

1. Obtendo os nomes das funcoes em um STRING.

???
gokernel

(usa Linux Mint)

Enviado em 14/04/2010 - 10:34h

Olá pessoal.

Estou fazendo um EDITOR de textos para uma IDE, mas estou enrrolado em tentar extrair no TEXTO C todo que eh identificado como uma funcao C.

Exemplo do "texto" para extrair funcoes:
-------------------------------------------
void func1(){
//...
}

int func2(){
//...
}

int main(int argc, char argv[]) {
// ...
return 0;
}
------------------------

Neste exemplo acima eu queria pegar todos os nomes tipo como saida:
---------------------------
void func1()
int func2()
int main(int argc, char argv[])
---------------------------

O que eu quero eh algo similar ao "Code blocks" que identifica todas as funcoes em um TEXTO e passa a lista de funçoes para um "menu" ou "algo similar".

Sei que ficou um pouco confuso mas espero que compreendam.

Abraços.

gokernel
gokernel@hotmail.com



  


2. Re: Obtendo os nomes das funcoes em um STRING.

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 14/04/2010 - 15:10h

Você pretende fazer isso na unha mesmo?! Bem, porque com a biblioteca que implementa expressões regulares as coisas já facilitariam para você.

O primeiro fato a analisar seria o padrão de declaração de uma função.

Sempre tem um tipo + um ou mais espaços + o nome alfanumérico (mas não pode começar com números) + ( + zero ou mais parâmetros + ) + { (sendo que esse caractere pode estar linhas abaixo )

É meio complicado até para expressões regulares ainda mais quando o padrão de declaração de funções é variável e cada usuário implementa de um jeito.

Ajudaria se todas as funções de seu programa seguissem um mesmo padrão, por exemplo:

tipo + espaço + nome + ( parametros ) + {

Assim seria mais fácil implementar a regexp! É o seu caso?

Espero ter ajudado.
t+


3. OK.

???
gokernel

(usa Linux Mint)

Enviado em 14/04/2010 - 17:47h

Obrigado pelo retorno.

Ainda bem que vc entendeu o meu objetivo.

Eu tinha uma funcao FRAQUINHA mas pretento melhorar:

ASSIM FUNCIONA:
----------------------------------------
int func_alguma_coisa() {
//...
}
----------------------------------------

AGORA ASSIM NAO NAO FUNCIONA:
----------------------------------------
int func_alguma_coisa()
{
//...
}
----------------------------------------

Veja aqui:
http://sourceforge.net/projects/libas/files/

Em um desses arquivos, na pasta libas\as-ide:
libAS_0.5.2_AS-IDE_bin_src_WINDOWS.zip
ou
libAS_0.5.2_AS-IDE_bin_src_LINUX.tar.gz

OBS: Esse versao eh antiga.

Abraços.

gokernel
gokernel@hotmail.com



4. Re: Obtendo os nomes das funcoes em um STRING.

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 15/04/2010 - 15:22h

De boa gokernel.. baixei e olhei +/- os fontes só que não encontrei a função que implementa tal operação.

Em que arquivo está?

Se a função for pequena é só colar aqui que já facilita pra todo mundo xD

t+




5. No arquivo as_medit.c

???
gokernel

(usa Linux Mint)

Enviado em 16/04/2010 - 07:26h


Vc baixou esse arquivo? Pois a IDE(editor) estha nesta verssão antiga:
libAS_0.5.2_AS-IDE_bin_src_LINUX.tar.gz

A funcao estha em:
ARQUIVO: as_medit.c
FUNCAO: void AS_medit_menu_function(struct AS_obj *O, int x, int y);
LINHA: 49.


LINHA 114
ESSA PARTE EH REFERENTE AS FUNCOES C NO EDITOR
... Esta acrescenta itens em um MENU.
... TARTE DO CODIGO.
---------------------------------------------------
AS_menu_iten_add(AS_menu_general, "#C FUNCTIONS");
//---------------------------
// Find the text: ") {"
//---------------------------
*s='{TTEXTO}'; find = str;
for(;;) {

find = strstr(find, ") {"); /* find end of line = '10' ascii code */
if ( find ) {
*s='{TTEXTO}';

/*========================================
** Position of ") {"
**======================================*/
loop= abs( strlen(str) - strlen(find) );

/*========================================
** Decrement "loop" at the START of LINE
**======================================*/
for(;;) {
if ( loop==0 || str[loop] == '\n' ) break;
if ( str[loop] != '\n' ) { loop--; }
}
loop++;

count=0;
// Acrescenta o index a um NOVO ITEN
if ( str[loop] != ' ' && str[loop] != '*' &&
str[loop] != '/' && str[loop] != '}'
)
for(cc=loop; str[cc]; cc++) {
s[count] = str[cc];
if ( str[cc] == '\n' ) { s[count]='{TTEXTO}'; AS_menu_iten_add(AS_menu_general, s); break; }
if (count > 100) break;
count++;
}
find++;
}// if ( find )
else break;

}// for(;;)
---------------------------------------------------

E obrigado por se interessar no assunto... aqui também estou empenhado(melhorando) EXATAMENTE NESTA FUNCAO.


Abraços.

gokernel
gokernel@hotmail.com



6. Só acrescentando.

???
gokernel

(usa Linux Mint)

Enviado em 16/04/2010 - 07:34h


Só acrescentando...

Sobre parte do código postado... NÃO CORRESPONTE ao que COLEI...

Resumindo... O SITE NÃO AJUDA NA PUBLICAÇÃO DE CÓDIGOS.

Abraços.

gokernel
gokernel@hotmail.com



7. O codigo.

???
gokernel

(usa Linux Mint)

Enviado em 16/04/2010 - 17:52h

Depois de muitas tentativas...

E obrigado pela intenção de ajudar.

O CODIGO LEGIVEL AQUI, ARQUIVO(functions.c):
http://www.4shared.com/account/dir/24056491/7a5bc050/sharing.html?rnd=93

THE CODE:
//-------------------------------------------------------------------
//
// Demonstracao programa... extraindo funcoes em uma STRING.
//
// E GLORIA A DEUS EM CRISTO JESUS.
//
// BY: gokernel - gokernel@hotmail.com
//-------------------------------------------------------------------

#include <stdio.h>
#include <string.h>


char *text_code =
"//########################################################\n"
"void func1 (int v) {\n"
" for(v=1; v < 10; v++){\n"
" }\n"
"}\n"

"\nint funcao_segunda (void){\n"
" return 0;\n"
"}\n"

"\nvoid terceira ()\n"
"{\n"
" int c;\n"
" for (c=1; c<10; c++) {\n"
"\n"
" }\n"
"}\n"

"\nint main (int argc, char *argv[]) {\n"
"\n"
" return 0;\n"
"}\n"
"//########################################################\n";


void display_func_in_code(){
char *find = text_code;

for(;;){

find = strstr (find, "{");

if(find){
int pos = strlen(text_code) - strlen(find);
int backup = pos;
char *text = text_code;

if(text_code[pos-1]==')' || // "){"
text_code[pos-2]==')' // ") {" or ")\n{"
){
int v=0;
char *str = find;
while(*str){
if(*str=='{') v++;
if(*str=='}') v--;
if(v==0) { find = str; break; }
*str++;
}
v=0;
while(text[pos]){
if(text[pos]=='(') v=1;
if(v && text[pos]=='\n'){ // The start of line

//------------------------------------------------------
// AQUI EU ADICIONARIA EM UM MENU... AGORA EH COMIGO :).
//------------------------------------------------------
for(v=pos; v!=backup+1; v++){
if(text[v] != '\n')
printf("%c", text[v]);
}
printf("\n");
break;
}
pos--;
}
}
find++;
}
else break;

}
}


int main (void) {

printf("\nEXIBINDO O CODIGO DE UM PROGRAMA\n");
printf(text_code);


printf("\nEXIBINDO TODAS AS FUNCOES NO CODIGO\n");
printf("----------------------------------------\n");
display_func_in_code();
printf("----------------------------------------\n");

return 0;
}





8. Re: Obtendo os nomes das funcoes em um STRING.

Marcos Paulo Ferreira
Daemonio

(usa Slackware)

Enviado em 16/04/2010 - 19:17h

De boa cara!! Vamos ver se fazemos esse negócio. =D

Baixei o seu código mas ainda estou entendendo ele aqui. O problema é que ele ficou muito geral, digo, coloquei um "if ( a < b ) {" lah de bobeira e ele o identificou como função.

Você terá que descobrir um padrão que só existe em uma declaração de função.. coisas que não existem nos blocos if, for, while, etc ..

Agora, vou acabar de ver o código aqui!
t+



9. LOL.

???
gokernel

(usa Linux Mint)

Enviado em 17/04/2010 - 09:29h

Daemonio disse:
-------------------------------------------------------
... digo, coloquei um "if ( a < b ) {" lah de bobeira e ele o identificou como função.
-------------------------------------------------------

LOL.

Vamos rir para nao chorar.

EMPLEMENTANDO...

Abraços.

gokernel
gokernel@hotmail.com







Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts