Re: 'strings' avec les accents

トップ ページ

このメッセージに返信
著者: Edgar Bonet
日付:  
To: ML Guilde
題目: Re: 'strings' avec les accents
Le vendredi 20 juin, Frederic Mantegazza a écrit :
> > LC_CTYPE=fr strings ton_fichier
>
> Ca marche po :o(


Tu es sûr d'avoir installé les locales ? Parce que chez moi ça marche :

[edgar@pitufo sliv]$ echo àéioù | strings
[edgar@pitufo sliv]$ echo àéioù | LC_CTYPE=fr strings
àéioù
[edgar@pitufo sliv]$ strings --version
GNU strings 2.11.90.0.8
Copyright 1997, 98, 99, 2000, 2001 Free Software Foundation, Inc.
This program is free software; you may redistribute it under the terms of
the GNU General Public License. This program has absolutely no warranty.
[edgar@pitufo sliv]$

> Ou quelqu'un a-t-il un petit script qui fasse ca ?


J'ai écrit un programme C. Il est en pièce jointe.

Edgar.

-- 
Edgar Bonet                         Tél    : 04 76 88 10 96
Laboratoire Louis Néel -- CNRS      Mobile : 06 77 19 79 39
25 av. des Martyrs, BP 166          Fax    : 04 76 88 11 91
38042 Grenoble cedex 9, France      e-mail : guilde@???

#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <locale.h>

#define NON_PT 0
#define DEBUT_PT 1
#define PRINT_PT 2

int interessant(int c)
{
    if (!isprint(c)) return 0;
    if (c < 128) return 1;
    if (c > 252 || c <171) return 0;
    if (c > 171 && c < 187) return 0;
    return 1;
}


int min_len = 4;

int main(int argc, char *argv[])
{
    FILE *input = stdin;
    int arg = 1;
    int etat = NON_PT;
    char *buffer;
    int c, i = 0;


    for (arg = 1; arg < argc ; arg++)
        if (argv[arg][0] == '-') min_len = atoi(argv[arg] + 1);
        else
            input = fopen(argv[arg], "r");
    if (min_len == 0) {
        fprintf(stderr, "min_len = 0\n");
        return -1;
    }
    if (input == NULL) {
        perror("fopen");
        return -1;
    }
    if (setlocale(LC_CTYPE, "") == NULL) {
        perror("setlocale");
        return -1;
    }
    buffer = malloc(min_len);
    if (buffer == NULL) {
        perror("malloc");
        return -1;
    }


    while ((c = fgetc(input)) != EOF)
        if (interessant(c)) switch (etat) {
            case NON_PT :
                etat = DEBUT_PT;
                buffer[i++] = c;
                break;
            case DEBUT_PT :
                buffer[i++] = c;
                if (i == min_len) {
                    fwrite(buffer, i, 1, stdout);
                    etat = PRINT_PT;
                }
                break;
            case PRINT_PT :
                putchar(c);
        } else {
            if (etat == PRINT_PT) putchar('\n');
            i = 0;
            etat = NON_PT;
        }
    return 0;
}