Re: comment enlever des #define ?

トップ ページ

このメッセージに返信
著者: Stéphane Morico
日付:  
To: Guilde de grenoble
題目: Re: comment enlever des #define ?
Salut,

Dans ce cas tu peux peut être arriver à quelque chose avec grep...
L'option -v permet d'afficher seulement les lignes ne contenant PAS le
motif...
find include -name "*.h" | xargs -i grep -Hv "^#ifdef" {}
Te sort le contenu des fichiers sans les #ifdef (precedé de leurs nom
(-H) puis ":", donc à extraire pour la sortie*...)

* Là encore awk serait utile avec print, $1 et $2 et après avoir définis
le séparateur mais ça doit être faisable avec autre chose...

En plusieurs passe, tu peux peut être arriver à quelque chose de 
convenable... J'ai un peu testé ça marche pas trop mal... L'expression 
reguliére "^#ifdef" est à amméliorer car dans le code il y a peut être 
des lignes du genre "#    ifdef"...


sed/ed peuvent surement remplacer grep aussi (et editer le fichier "sur
place")...
Sinon c'est vrai qu'awk et perl sont fait pour ça à la base...

Xavier Bestel a écrit :

>On Wed, 2005-07-20 at 11:56, Dominique Colombani wrote:
>
>
>>Bonjour
>>
>>c'est typiquement une opération à faire avec awk ou gawk !!!
>>
>>
>
>Oui, mais je suis nul en awk.
>
>Bon, pour ceux qui auraient à faire la même chose, voilà un petit prog
>en C qui peut rendre service.
>
>A+,
>    Xav

>
>
>------------------------------------------------------------------------
>
>#include <stdio.h>
>#include <stdlib.h>
>#include <string.h>
>
>#ifdef DEBUG
>#define printd(a ...) fprintf(stderr, a)
>#else
>#define printd(a ...) do{}while(0)
>#endif
>
>#define MAXNAMES    20    // maximum number of options
>#define MAXSTACK    100    // maximum level of nested #ifdefs

>
>struct define
>{
>    const char *name;
>    int positive;
>};

>
>struct ifdef
>{
>    int def;
>    int positive;
>    int prevmode;
>};

>
>struct define defs[MAXNAMES];
>struct ifdef stack[MAXSTACK];
>
>int defs_n, stack_n;
>
>int printmode;
>
>char * skipblanks(char* from)
>{
>    while(isspace(*from))
>        from++;
>    return from;
>}

>
>int stackit(char* word, int positive)
>{
>    int wlen;
>    int match = -1;
>    if(word)
>    {
>        int i;
>        wlen = 0;
>        while(word[wlen] && !isspace(word[wlen]))
>            wlen++;
>        for(i = 0; i < defs_n; i++)
>            if(strlen(defs[i].name) == wlen && !strncmp(word, defs[i].name, wlen))
>            {
>                match = i;
>                break;
>            }
>    }
>    stack[stack_n].def = match;
>    stack[stack_n].positive = positive;
>    stack[stack_n].prevmode = printmode;
>    printd("stacking %s\n", (match >= 0) ? defs[match].name : "unknown #define");
>    stack_n++;
>    if(match >= 0)
>    {
>        printmode &= positive ^ ~defs[match].positive;
>        printd("printmode now %d\n", printmode);
>    }
>    if(stack_n >= MAXSTACK)
>    {
>        fprintf(stderr, "Too many nested #ifdefs (%d)\n", MAXSTACK);
>        exit(1);
>    }

>
>    return match >= 0;
>}

>
>int process_line()
>{
>    int res, n = 0;
>    char *line = NULL;
>    res = getline(&line, &n, stdin);
>    if(res < 0)
>        return res;
>    line[res] = 0;
>    if(*line == '#')
>    {
>        char * nextword = skipblanks(line + 1);
>        if(!strncmp(nextword, "ifdef", 5))
>        {
>            nextword = skipblanks(nextword + 5);
>            if((!stackit(nextword, 1)) && printmode)
>                printf("%s", line);
>        }
>        else if(!strncmp(nextword, "ifndef", 6))
>        {
>            nextword = skipblanks(nextword + 6);
>            if((!stackit(nextword, 0)) && printmode)
>                printf("%s", line);
>        }
>        else if(!strncmp(nextword, "if", 2))
>        {
>            stackit(NULL, 0);
>            if(printmode)
>                printf("%s", line);
>        }
>        else if(!strncmp(nextword, "else", 4))
>        {
>            printd("switching %s\n", (stack[stack_n - 1].def >= 0) ? defs[stack[stack_n - 1].def].name : "unknown #define");
>            if(stack[stack_n - 1].def >= 0)
>            {
>                printmode = stack[stack_n - 1].prevmode & (stack[stack_n - 1].positive ^ defs[stack[stack_n - 1].def].positive);
>                printd("printmode now %d\n", printmode);
>            }
>            if(stack[stack_n - 1].def < 0 && printmode)
>                printf("%s", line);
>        }
>        else if(!strncmp(nextword, "endif", 5))
>        {
>            if(stack[stack_n - 1].def < 0 && printmode)
>                printf("%s", line);
>            stack_n--;
>            printmode = stack[stack_n].prevmode;
>            printd("unstacking %s\n", (stack[stack_n].def >= 0) ? defs[stack[stack_n].def].name : "unknown #define");
>            if(stack[stack_n].def >= 0)
>                printd("printmode now %d\n", printmode);
>        }
>        else
>            if(printmode)
>                printf("%s", line);
>    }
>    else if(printmode)
>        printf("%s", line);
>    free(line);
>    return res;
>}

>
>int main(int argc, char *argv[])
>{
>    int i;
>    if(argc >= MAXNAMES)
>        goto badusage;
>    for(i = 1; i < argc; i++)
>    {
>        if(argv[i][0] != '-')
>            goto badusage;
>        switch(argv[i][1])
>        {
>        case 'D':
>            defs[defs_n].positive = 1;
>            defs[defs_n].name = strdup(argv[i] + 2);
>            defs_n++;
>            break;
>        case 'U':
>            defs[defs_n].positive = 0;
>            defs[defs_n].name = strdup(argv[i] + 2);
>            defs_n++;
>            break;
>        default:
>            goto badusage;
>        }
>    }

>
>    for(i = 0; i < defs_n; i++)
>        printd("#%s %s len=%d\n", defs[i].positive ? "define" : "undef", defs[i].name, strlen(defs[i].name));
>    printmode = 1;
>    stackit(NULL, 1);
>    while(process_line() > 0);
>    if(stack_n != 1)
>    {
>        fprintf(stderr, "Error: unbalanced #if... #endif\n");
>        exit(1);
>    }

>
>    return 0;

>
>badusage:
>    fprintf(stderr, "usage: %s [-DDEFINE] [-UDEFINE] ...\n(max. %d options)\n", *argv, MAXNAMES);
>    exit(1);
>}

>
>