[C/LINUX] BALISAGE HTML DE FICHIERS SOURCE C/C++

Signaler
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006
-
aminesoft1
Messages postés
9
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
16 juin 2008
-
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38489-c-linux-balisage-html-de-fichiers-source-c-c

aminesoft1
Messages postés
9
Date d'inscription
mardi 11 mars 2008
Statut
Membre
Dernière intervention
16 juin 2008

good job
cs_samana
Messages postés
8
Date d'inscription
vendredi 7 mai 2004
Statut
Membre
Dernière intervention
12 septembre 2006

Concrètement, sans rentrer ds les détails techniques du code (manip de chaîne de caractères, portabilité windows<->unix ...) c'est une sorte de parseur (comme pour les fichiers XML avec stylsheet XSL en gros).
Joli travail. Je le mets de côté au cas où...ça peut être utile.
cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

Effectivement free() s'en moque... Mais le sprintf NON !! et va foutre le bordel à l'addresse pointée par ficout.... Et le free générer eventuellement une erreur car sprintf aura ecrit plus d'octets que prévu ou insérer des valeurs tordues et donc le free() sous certaines implémentations (dont VC) aura parfois du mal à libérer la mémoire car celle ci n'est plus valide...
BruNews
Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
16
free() se moque de savoir ce qu'il y a à l'adresse spécifiée, le désallocateur system libère le bloc partant de l'adresse donnée à free et basta, aucun besoin que soit une chaine avec zero final ou autre.
cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

Quelques petites remarques ... :

* BOOL n'est pas un type de donnée ni une classe d'allocation mais juste une macro... Est il donc nécessaire de l'inclure dans le tableau MotType ?

* Fonction main : l'appel direct à argv[1] sans avoir tester le argc est franco ! En effet, 99% des implémentations usuelles placeront, si aucun paramètre n'est fourni, un pointeur null dans argv[1]. Mais ce comportement n'est pas prévu et défini par la norme et sous un quelconque compilo C venu de mars, cela peut planter l'appli...

* dans la fonction BaliserFichier() :
..
ficout= (char*) malloc(strlen(fichier)+4);
sprintf(ficout, "%s.htm", fichier);
..
AIE ! lors du free(ficout), sous VC++ crash en debug ! Pourquoi ? car le buffer ficout ne contient pas de zéro terminal. Il faut faire :
malloc(strlen(fichier)+4 + 1)......

* dans la fonction Envoi() :
..
memset(mot,0,200); -> vaut mieux : memset(mot,0,sizeof(mot));
..

* pareil pour les taille de MotsCles (17) et MotsTypes (19) : ces valeurs sont utilisées à plusieurs endroits... Un define ou un static const serait moins source d'erreurs lors d'enrichissement ultérieurs de la source.

Ce sont des petits détails ... mais bon ca peut toujours servir !
Sinon j'aurai bien vu un tableau de structure avec comme champs le caractère, le code couleur, le code fonction à appeller afin de minimiser la liste des else if de la boucle principale....
katsankat
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Super. En ce sens et sur ce point, GCC est plus tolérant, et VC++ plus conforme.

On n'a oublié aucun compilateur ni aucune plateforme? Test:
// Retourne 1 si le mot est pourpre, 2 s'il est bleu, 0 si mot normal (noir)
unsigned short EstUnMotCle(char* str)
{
unsigned short m;
for (m=0; m<17; m++) if (strcmp(MotsCles[m] ,str)==0) return 1;
for (m=0; m<19; m++) if (strcmp(MotsTypes[m],str)==0) return 2;
return 0;
}
cs_vicenzo
Messages postés
179
Date d'inscription
mardi 16 août 2005
Statut
Membre
Dernière intervention
25 août 2010

Le code compile sous VC++ en apportant une légère modification du source... On peut critiquer VC++ a bien des niveaux (surtout au niveau du support C++ , de l'implémentation des librairies standard, etc...) mais son compilateur C est tout de même pas mal fichu...

Le code de la source plante sous VC car il n'est pas "ANSI C". En effet, dans la fonction BaliserFichier() un tableau de char est déclaré en fin de bloc (char ficout[strlen(fichier)+4];)... Ce qui est strictement illégal en ANSI C où toutes les déclarations doivent être effectuée avant toute expression exécutable... En remontant la déclaration du tableau en début de bloc, tout compile et fonctionne correctement. Mais dans ce cas, on appelle strlen() avant même d'avoir tester le pointer "fichier"... Donc revoir un peu le code de début de fonction....

J'espère que cela peut aider...
katsankat
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
memset() est défini dans string.h, pas besoin de macro c'est une fonction ANSI.

Chers Code::Blockers si vous essayez la mise à jour faudra virer GetTimeOfDay(), en attendant la prochaine MAJ, qui sera portable.
CADRATURE
Messages postés
26
Date d'inscription
mercredi 26 novembre 2003
Statut
Membre
Dernière intervention
13 juin 2009

Avec CodeBlocks 1.0 (et mingw32-gcc.exe 3.4.4) , ça marche.
En ajoutant ceci: ....

/*
Pour faciliter le portage d'application UNIX ou pour faciliter le
travail de développeurs habitués au monde UNIX, les macros suivantes
permettront une 'migration' aisée :


#include <memory.h> // Prototypes des fonctions memcpy et memset

#define bcopy(source, dest, len) memcpy(dest, source, len)
#define bzero(area, len) memset(area, 0, len)

VOIR
http://support.microsoft.com/default.aspx?scid=kb%3Bfr%3B458620
*/
katsankat
Messages postés
571
Date d'inscription
vendredi 30 décembre 2005
Statut
Membre
Dernière intervention
12 juillet 2012
3
Salut :)
Allons-y pour memset(), bien vu. Pour win32, je me penche sur la question dès que la version linux est solide. Essaye de débuguer en modifiant la routine cout().

Bonne remarque sur la colorisation des chiffres, en cours d' implémentation!

Merci Kaid, ça marche super (ici il traite 8600 octets en 4 ms, soit 2150 octets par milliseconde).

J'ai corrigé quelques erreurs, mise à jour bientôt, hisoire de mériter la note!
psyphi
Messages postés
51
Date d'inscription
lundi 16 août 2004
Statut
Membre
Dernière intervention
12 août 2010

Source intéressante, qui peut se révélée bien utile.
Remarque sur le code: remplace tout tes bzero par memset(&mot,0, 255*sizeof(char)).
Regarde dans la man page de bzero, dans le paragraphe conformité, il conseil d'utilisé memset.
Pour ce qui est de l'utilisation, ca se compile bien avec codeblocks sous windows, mais quand j'utilise le programme il me génère un fichier .html de 0 ko :/ .
cs_neria
Messages postés
320
Date d'inscription
vendredi 21 février 2003
Statut
Membre
Dernière intervention
16 février 2009

C'est un code très interessant. Par conte ce serait sympa que ton prog charge un fichier de config personalisable qui contient les couleurs des mots clés, chaînes, nombres ...
cs_Kaid
Messages postés
949
Date d'inscription
mardi 2 octobre 2001
Statut
Membre
Dernière intervention
8 juillet 2006

Si ton objectif est de trouver un équivalent à GetTickCount() pour connaitre le temps d'exécution de ton programme, tu peux utiliser la fonction gettimeofday() qui retourne la date du système en secondes et micro-secondes.