Article View: fr.comp.lang.c
Article #15206Re: rot13 [Was : Re: conjugaison et autres ...]
From: Charlie Gordon
Date: Wed, 05 Oct 2005 08:32
Date: Wed, 05 Oct 2005 08:32
182 lines
7231 bytes
7231 bytes
"Harpo" <trashcan@hotmail.com> wrote in message
news:4340cabe$0$27448$8fcfb975@news.wanadoo.fr...
> Richard Delorme wrote:
>
> >
> > Je crois qu'il y a quelque subtilit� si l'on veut tenir compte du
> > signe du type char, et avoir un truc portable.
>
> Il faut en effet faire attention au signe des char.
Tr�s important �a ! Que ceux qui ne savent pas ce que cette remarque implique
se renseignent, les char sont pi�geux.
> > �a pourrait ressembler � :
>
> Pour pinailler, je dirais que l'init ne devrait pas se faire dans le
> programme mais en amont lors de la g�n�ration/installation du programme
> pour la plateforme.
> De plus la variable static rend la fonction 'non fil sauf'.
Telle que l'initialisation est �crite, cette fonction n'est effectivement pas
thread-safe. Mais on peut y rem�dier facilement en retardant le positionnement
de init � 1 � la fin du code d'initialisation. Ainsi le code d'initialisation
s'executera eventuellement plusieurs fois dans des threads concurrents, mais
l'utilisation du tableau crypt se fera toujours apr�s son initialisation. Ma
proposition de supprimer la variable init dans un autre post ne permet pas une
initialisation thread-safe.
> Je verrais plut�t :
>
> -------------------------------------------------
> // tr.h
> void tr( unsigned char *table, unsigned char *str );
void tr(const unsigned char *table, const char *str);
cette fonction ne modifie pas le tableau de substitution, ni la chaine
parametre, et elle s'applique � des chaines standard, donc des char *, de plus
elle devrait prendre en argument le stream (FILE *) sur lequel produire les
caract�res convertis.
> //EOF
>
> -------------------------------------------------
> // rot13.h
> // FILE GENERATED BY INSTALLATION PROGRAM, DO *NOT* EDIT
> // *INDENT-OFF*
> static unsigned char rot13[256] =
C'est vraiment d�geulasse de mettre des d�finitions dans un header. Cela ne
manquera pas de t'�tre reproch� par le compilateur si tu ne te sers pas de ce
tableau. De plus ce nom est un peu court, on ne reconnait pas facilement une
table de translation, rot13 fait plutot penser � une fonction... Utilise plutot
un module s�par� pour la table rot13_table d�finie comme suit:
// rot13.h
extern unsigned char const rot13_table[];
// rot13_table.c
// DO NOT MODIFY, COMPUTER GENERATED FILE FOR ASCII
unsigned char const rot13_table[256] = {
...
};
De plus tu devrais mettre dans ce rot13.c g�n�r� par programme une indication de
l'architecture cible.
> {
>
0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0a,0x0b,0x0c,0x0d,0x0e,0x0f,
>
0x10,0x11,0x12,0x13,0x14,0x15,0x16,0x17,0x18,0x19,0x1a,0x1b,0x1c,0x1d,0x1e,0x1f,
> 0x20,'!' ,'"' ,'#' ,'$' ,'%' ,'&' ,0x27,'(' ,')' ,'*' ,'+' ,',' ,'-' ,'.' ,'/'
,
> '0' ,'1' ,'2' ,'3' ,'4' ,'5' ,'6' ,'7' ,'8' ,'9' ,':' ,';' ,'<' ,'=' ,'>' ,'?'
,
> '@' ,'N' ,'O' ,'P' ,'Q' ,'R' ,'S' ,'T' ,'U' ,'V' ,'W' ,'X' ,'Y' ,'Z' ,'A' ,'B'
,
> 'C' ,'D' ,'E' ,'F' ,'G' ,'H' ,'I' ,'J' ,'K' ,'L' ,'M' ,'[' ,0x5c,']' ,'^' ,'_'
,
> '`' ,'n' ,'o' ,'p' ,'q' ,'r' ,'s' ,'t' ,'u' ,'v' ,'w' ,'x' ,'y' ,'z' ,'a' ,'b'
,
> 'c' ,'d' ,'e' ,'f' ,'g' ,'h' ,'i' ,'j' ,'k' ,'l' ,'m' ,'{' ,'|' ,'}' ,'~'
,0x7f,
>
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
>
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,
>
0xa0,0xa1,0xa2,0xa3,0xa4,0xa5,0xa6,0xa7,0xa8,0xa9,0xaa,0xab,0xac,0xad,0xae,0xaf,
>
0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9,0xba,0xbb,0xbc,0xbd,0xbe,0xbf,
>
0xc0,0xc1,0xc2,0xc3,0xc4,0xc5,0xc6,0xc7,0xc8,0xc9,0xca,0xcb,0xcc,0xcd,0xce,0xcf,
>
0xd0,0xd1,0xd2,0xd3,0xd4,0xd5,0xd6,0xd7,0xd8,0xd9,0xda,0xdb,0xdc,0xdd,0xde,0xdf,
>
0xe0,0xe1,0xe2,0xe3,0xe4,0xe5,0xe6,0xe7,0xe8,0xe9,0xea,0xeb,0xec,0xed,0xee,0xef,
>
0xf0,0xf1,0xf2,0xf3,0xf4,0xf5,0xf6,0xf7,0xf8,0xf9,0xfa,0xfb,0xfc,0xfd,0xfe,0xff
> };
> // *INDENT-ON*
C'est quoi ce truc ?
> //EOF
>
> -------------------------------------------------
> // tr.c
> #include <stdio.h>
> #include "tr.h"
>
> void tr( unsigned char *table, unsigned char *str )
> {
> size_t c;
> unsigned char *p;
> for ( p = str; ( c = *(p++) ); putchar( *( table + c ) ) );
> }
Cette fonction ne modifie pas les tableaux arguments, qui ne sont pas du bon
type, et devrait prendre la FILE* en argument aussi pour etre un peu generique.
L'utilisation de size_t comme type de c est extr�mement surprenante, pourquoi
des variables interm�diaires d'ailleurs ?
void tr(const unsigned char *table, const char *str, FILE *fp) {
while (*str) {
putc(table[(unsigned char)(*str)], fp);
str++;
}
}
> //EOF
>
> -------------------------------------------------
> // rot13.c
> #include <stdlib.h>
> #include <stdio.h>
> #include "rot13.h"
> #include "tr.h"
>
> int main( int argc, char ** argv )
> {
> char ** parg;
> char * str;
>
> (void) argc; // Yep !
> for ( parg = argv; ( str = *(++parg) ) ; ) {
> tr( rot13, str );
> putchar( ' ' );
> }
Nope ! utilise plutot une boucle plus simple et plus lisible qui utilise argc et
argv:
int i;
for (i = 1; i < argc; i++) {
tr(rot13_table, argv[i], stdout);
putchar(' ');
}
> putchar( '\n' );
> return( EXIT_SUCCESS ) ;
bouh les parenth�ses !
> }
> //EOF
>
> -------------------------------------------------
>
> Une autre solution, meilleure, serait de compiler s�par�ment la table et
> de la mettre dans une biblioth�que avec laquelle on linkerait le
> programme rot13.
Ou simplement dans un module compil� avec, on a d�j� plusieurs modules dans ce
petit programme :
cc -o rot13 rot13.c tr.c rot13_table.c
--
Chqrlie.
Technical Details
Message-ID:
<43438f4d$0$21032$636a55ce@news.free.fr>Path:
arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!infeed-4.proxad.net!nnrp4-1.free.fr!not-for-mailReferences:
<1126342327.583568.21420@g43g2000cwa.googlegroups.com> <4329e5d4$0$7846$8fcfb975@news.wanadoo.fr> <dge4b6$fqa$1@reader1.imaginet.fr> <432ab809$0$1734$8fcfb975@news.wanadoo.fr> <mn.84b07d59016a857b.31483@laposte.net> <433f16ac$0$27406$8fcfb975@news.wanadoo.fr> <mn.10907d5a55119e84.15512@YOURBRAnoos.fr> <433f9cb1$0$7821$8fcfb975@news.wanadoo.fr> <mn.128c7d5aa5238de0.15512@YOURBRAnoos.fr> <43403203$0$5388$8fcfb975@news.wanadoo.fr> <43403d27$0$306$7a628cd7@news.club-internet.fr> <4340cabe$0$27448$8fcfb975@news.wanadoo.fr>Show Full Headers
Complete Article Headers
X-Google-Thread: f9822,b21b26167a936e28 X-Google-Attributes: gidf9822,public X-Google-Language: FRENCH,ASCII Path: arc1-ca.pugleaf.net!g2news1.google.com!news1.google.com!proxad.net!infeed-4.proxad.net!nnrp4-1.free.fr!not-for-mail From: "Charlie Gordon" <news@chqrlie.org> Newsgroups: fr.comp.lang.c References: <1126342327.583568.21420@g43g2000cwa.googlegroups.com> <4329e5d4$0$7846$8fcfb975@news.wanadoo.fr> <dge4b6$fqa$1@reader1.imaginet.fr> <432ab809$0$1734$8fcfb975@news.wanadoo.fr> <mn.84b07d59016a857b.31483@laposte.net> <433f16ac$0$27406$8fcfb975@news.wanadoo.fr> <mn.10907d5a55119e84.15512@YOURBRAnoos.fr> <433f9cb1$0$7821$8fcfb975@news.wanadoo.fr> <mn.128c7d5aa5238de0.15512@YOURBRAnoos.fr> <43403203$0$5388$8fcfb975@news.wanadoo.fr> <43403d27$0$306$7a628cd7@news.club-internet.fr> <4340cabe$0$27448$8fcfb975@news.wanadoo.fr> Subject: Re: rot13 [Was : Re: conjugaison et autres ...] Date: Wed, 5 Oct 2005 10:32:22 +0200 X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2800.1506 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2800.1506 Lines: 184 Message-ID: <43438f4d$0$21032$636a55ce@news.free.fr> Organization: Guest of ProXad - France NNTP-Posting-Date: 05 Oct 2005 10:31:10 MEST NNTP-Posting-Host: 81.57.219.236 X-Trace: 1128501070 nnrp4-1.free.fr 21032 81.57.219.236:43870 X-Complaints-To: abuse@proxad.net