Bonjour,

J'ai créé un petit programme C pour remplacer, dans les fichiers .po de traduction, les apostrophes clavier par l'apostrophe typographique, les espaces simples par des espaces insécables, les trois points de suspension par le caractère point de suspension. Pour cela, les caractères ANSI sont remplacés par des caractères UNICODE codés sur 3 octets.

Ce programme fonctionne parfaitement. MAIS il s'obstine à me fournir, au lieu d'un exécutable, un fichier impossible à ouvrir dont les propriétés montrent qu'il s'agit d'une "bibliothèque partagée" avec la case "Exécuter le fichier comme un programme" cochée.

Cela se produit aussi bien sous CodeBlocks que sous Anjuta.
Je travaille sous Ubuntu-16.04.

Pourquoi ce comportement ? Comment obtenir l'exécutable ?

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <locale.h>
    //Variables globales
    char chaine[200] = "";
    char caract[4]="’"; // Caract contient u2019 sur 4 octets
    char insecable[4] = "*";
    char motif[4] = "";
    int insec=0, nbTraites=0, msgid=0,msgstr=0;
 
void traiteChaine()
// On étudie le caractère envoyé
{
    int pos = 0, i=0, n=0, debut=0;
    int lgChaine=0, lgMotif=0, nbOccur=0;
    int positions[10];
    char dest[100] = "";
 
    //On cherche le nombre d'occurences de motif dans chaine en notant leur position
    nbOccur = 0;
    lgChaine = strlen(chaine);
    lgMotif = strlen(motif);
    for (n=0; n<=lgChaine-lgMotif; n++)
    {
        if((strncmp(&chaine[n], motif, lgMotif) == 0))
        {
           nbOccur++;
           positions[nbOccur] = n;
           n += lgMotif;
        }
    }
 
    if (nbOccur)
    {
        for (n=0; n<nbOccur; n++)
        {
            nbTraites++;
            pos = positions[n+1];
 
            if (msgstr)// Pour éviter les n't et n's anglais
            {
                if  ((motif[0] == 'q') || (motif[0] == 'Q'))
                {
                    //Je commence par coller le début de chaine dans dest
                    strncpy (dest, chaine, pos+2);
                    //J'inscris U2019
                    dest[pos+2+n*2] = caract[0];
                    dest[pos+3+n*2] = caract[1];
                    dest[pos+4+n*2] = caract[2];
 
                    for (i=pos+5+n*2; i<strlen(chaine); i++)  //On copie la fin de la chaine dans dest
                    {
                        dest[i] = chaine[i-2];
                    }
                    dest[i] = '\"';
                    dest[i+1] = '\n';
                    strcpy(chaine, dest);
                }
                else if (insec)
                {
                    strncpy (dest, chaine, pos);
                    dest[pos] = insecable[0];
                    dest[pos+1] = insecable[1];
                    dest[pos+2] = 58;
 
                    for (i=pos+3; i<strlen(chaine)+1; i++)  //On copie la fin de la chaine dans dest
                    {
                        dest[i] = chaine[i-1];
                    }
 
                    strcpy(chaine, dest);
                    insec = 0;
                }
                else if (motif[0] == '.')//Points de suspension
                {
                   if (msgstr)//On évite les ... anglais
                   {
                       strncpy (dest, chaine, pos);
                       dest[pos] = 226;
                       dest[pos+1] = 128;
                       dest[pos+2] = 166;
 
                       for (i=pos+3; i<strlen(chaine)+1; i++)  //On copie la fin de la chaine dans dest
                        {
                            dest[i] = chaine[i];
                        }
                        dest[i] = '\n';
                       strcpy(chaine, dest);
                   }
                }
                else
                {
                    //Je commence par coller le début de chaine dans dest
                    strncpy (dest, chaine, pos+1);
                    //J'inscris U2019
                    debut = pos+1+n*2;
                    dest[debut] = caract[0];
                    dest[debut+1] = caract[1];
                    dest[debut+2] = caract[2];
 
                    for (i=debut+3; i<strlen(chaine)+1; i++)  //On copie la fin de la chaine dans dest
                    {
                        dest[i] = chaine[i-2];
                    }
                    dest[i] = '\n';
                    strcpy(chaine, dest);
                }
            }
        }
    }
}
 
 
int main(int argc, char *argv[])
{
    char caracteres[] = "cdjlmnst:;?!q";
 
    int k=0;
 
    FILE *fichierExport = NULL;
    fichierExport = fopen("po-test-traite.po", "w");
    FILE *fichier = NULL;
    fichier = fopen("po-test.txt", "r+");
 
    while (fgets(chaine, 100, fichier) != NULL) //On prend chaque ligne du fichier une par une
    {
        //On conserve le drapeau msgid ou msgstr sur toute les lignes concernées qui suivent
        if (strncmp("msgid", chaine, 5) == 0)
        {
            msgid=1;
            msgstr=0;
        }
 
        if (strncmp("msgstr", chaine, 6) == 0)
        {
            msgstr=1;
            msgid=0;
        }
 
        // Dans chaque chaine, on étudie les caractères recherchés un par un; on les envoie à traiteChaine
 
        //: -> ! caractères précédés d'une espace insécable
        for (k=8;k<12;k++)
        {
            insec = 1;
            motif[0] = ' ';
            motif[1] = caracteres[k];
            motif[2] = '\0';
            traiteChaine();
            insec = 0;
        }
        //qu
        motif[0] = 'q';
        motif[1] = 'u';
        motif[2] = '\'';
        motif[3] = '\0';
        traiteChaine();
        //Qu
        motif[0] = 'Q';
        motif[1] = 'u';
        motif[2] = '\'';
        motif[3] = '\0';
        traiteChaine ();
 
        //c -> t  caractères suivis de l'apostrophe ANSI
        for (k=0;k<8;k++)
        {
            motif[0] = caracteres[k];
            motif[1] = '\'';
            motif[2] = '\0';
            traiteChaine();
        }
        //C -> T majuscules
        for (k=0;k<8;k++)
        {
            motif[0] = caracteres[k]-32;
            motif[1] = '\'';
            motif[2] = '\0';
            traiteChaine();
        }
        //...
        motif[0] = '.';
        motif[1] = '.';
        motif[2] = '.';
        motif[3] = '\0';
        traiteChaine();
 
        fputs(chaine, fichierExport);
    }
    printf("Nombre de traitements effectués : %d", nbTraites);
    fclose (fichier);
    fclose (fichierExport);
    return 0;
}