Projet mkd/asm.c
De Wiki EELL.
(Différences entre les versions)
JPL (discuter | contributions) m (!!!) |
JPL (discuter | contributions) m (Mise à jour) |
||
| Ligne 1 : | Ligne 1 : | ||
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | <small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | ||
: Les tabulations posent parfois quelques problèmes de lisibilité. | : Les tabulations posent parfois quelques problèmes de lisibilité. | ||
| - | + | {{Boîte déroulante/début|titre=asm.c 2013-04-28}} | |
<pre> | <pre> | ||
| - | /* | + | /*P |
| - | + | NOM DU FICHIER: asm.c pour console | |
| - | + | ||
| - | + | PROJET: mkd | |
| - | + | Générer la documentation pré-écrite dans les fichiers de sources multiples. | |
| - | + | Cette commande n'est pas intégrée dans les distributions standards UNIX / LINUX | |
| - | + | ||
| - | + | PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX. Projet obsolète. | |
| - | + | ||
| - | + | DOSSIER: extractdoc 04/12/2009 | |
| - | + | ||
| - | + | MODIFICATIONS: | |
| - | + | Date: ../../1986 by JPL Initial programming for MSDOS and UNIX on SUN | |
| - | + | Date: ../../1991 by JPL mkdoc 3.12 for PC and UNIX | |
| - | + | .... | |
| + | Le: 10/01/2010 par Clara objet de la modification: contrôle de l'accentuation | ||
| + | des commentaires en ISO-8859-1 | ||
| + | Le: 10/03/2010 par JPL objet de la modification: simplification de l'entête | ||
| + | Le: 17/03/2012 par JPL objet de la modification: corrections au format UTF-8 | ||
| + | Date: 28/04/2013 by GC Mise en conformité avec les nouvelles directives EELL | ||
*/ | */ | ||
| - | / | + | // Date: ../../.... by ... purpose of the modification .... |
| - | + | ||
| - | + | /*T | |
| - | + | NOM DU FICHIER: asm.c pour console | |
| - | + | ||
| - | + | Directives de tests unitaires version alpha 2013: | |
| - | + | ------------------------------------------------- | |
| - | + | Vérifiez les options n, s et t séparément: | |
| - | + | Vérifiez que la numérotation des lignes est correcte dans tous les cas de | |
| - | + | décodage de lignes. n, ns. nt, nst. | |
| + | Vérifiez que le texte reste à la bonne place dans tous les cas de décodage: | ||
| + | avec ou sans numérotation des lignes, avec ou sans l'option texte seul. | ||
| + | -- Vérifiez que les tabulations sont bien prises en charge dans tous les | ||
| + | cas, décodage en début des lignes, et 'dans' les lignes. | ||
| + | -- Vérifiez de même pour les espaces. | ||
| + | La fonction doit être éprouvée de telle sorte qu'un commentaire qui se | ||
| + | termine par le caractère de fin de fichier soit entièrement copié dans le | ||
| + | fichier cible. | ||
| + | |||
| + | Le caractère de fin de fichier (EOF) NE DOIT JAMAIS APPARAÎTRE DANS LE | ||
| + | TEXTE DU FICHIER CIBLE. | ||
| + | |||
| + | Ajouté le 18 avril 2013: | ||
| + | Vérifiez que l'extraction de tous les commentaires avec pour code de | ||
| + | décodage '**' soient copiés et que ceux-ci soient à la bonne place. | ||
| + | |||
*/ | */ | ||
| Ligne 35 : | Ligne 56 : | ||
fonction asm_ | fonction asm_ | ||
----------------------------------------------------------------------------- | ----------------------------------------------------------------------------- | ||
| - | + | NOM DU FICHIER: asm.c pour console, asm.cc pour intégration en c++ | |
| - | + | ( Format texte UTF-8 ) | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | SYNTAXE: | + | SYNTAXE, SYNOPSIS: |
| - | + | #include "version.h" | |
| - | + | #include "asm.h" | |
| - | + | int asm_(FILE *pfdoc, FILE *pnfile); | |
| + | FILE *pfdoc: pointe sur le fichier cible ouvert (ou créé) par la fonction | ||
| + | appelante. | ||
| + | FILE *pnfile: pointe sur le fichier source ouvert par la fonction appelante. | ||
| - | + | ACTION, DESCRIPTION: | |
| - | + | La fonction asm_() lit le fichier écrit en assembleur et extrait les | |
| + | commentaires; de structure, d'organigramme, de documents destinés aux | ||
| + | programmeurs, le fichier d'entête (.h) ou encore, de documents destinés à | ||
| + | l'utilisateur final. | ||
| + | On utilise habituellement les 'Codes' d'identification des commentaires à | ||
| + | extraire suivants : | ||
| + | ;D pour la documentation générale | ||
| + | ;H pour générer le fichier d'entête (header, .h ou .hpp) | ||
| + | ;O pour générer l'organigramme | ||
| + | ;S pour le contrôle de la structure du programme | ||
| + | ;T pour les points de tests | ||
| + | ;U pour la documentation utilisateur | ||
| + | On peut aussi extraire tous les commentaires avec pour 'Code' le double | ||
| + | étoile entouré de simples cotes : '**' | ||
| + | Description des 'Options' d'extraction: | ||
| + | -n : pour ajouter le numéro de la ligne du commentaire. | ||
| + | -s : pour ajouter le commentaire extrait à la sortie standard; l'écran. | ||
| + | -t : pour n'extraire que le commentaire. (Par défaut, toute la ligne) | ||
| - | + | CONFORME À, CONFORMING TO: | |
| - | + | POSIX, ANSI C, BSD, ISO/IEC 9899:2011; gcc, MS-Vc10; UTF-8. | |
| - | + | ||
| + | PORTABILITY: | ||
| + | LINUX-Debian-systems, LINUX-Red-Hat, UNIX, gcc. | ||
| + | Microsoft Visual studio under Windows : x86(Win32) x64(Win32 and WIN64) | ||
VALEUR RETOURNEE: | VALEUR RETOURNEE: | ||
| - | + | Ne retourne rien | |
DROIT DE COPIE: | DROIT DE COPIE: | ||
| - | + | © EELL, Éditeurs Européens de Logiciels Libres, EUPL 2007. | |
| - | + | Association à but non lucratif selon l'Article 11 de la convention | |
| - | + | européenne des droits de l'homme. | |
| - | + | Concédée sous licence EUPL, version 1.1 ou – dès leur approbation par la | |
| - | + | Commission européenne - versions ultérieures de l’EUPL (la «Licence»). | |
| + | Vous ne pouvez utiliser la présente œuvre que conformément à la Licence. | ||
| + | Vous pouvez obtenir une copie de la Licence à l’adresse suivante: | ||
| + | http://ec.europa.eu/idabc/eupl5 | ||
| + | Sauf obligation légale ou contractuelle écrite, le logiciel distribué sous la | ||
| + | Licence est distribué «en l’état», SANS GARANTIES OU CONDITIONS QUELLES | ||
| + | QU’ELLES SOIENT, expresses ou implicites. | ||
| + | Consultez la Licence pour les autorisations et les restrictions linguistiques | ||
| + | spécifiques relevant de la Licence. | ||
| - | + | AUTEURS, AUTHORS: | |
| + | © Contact: http://edeulo.free.fr/contacts/formmail.php | ||
| + | Designer: intial JP Louyot (JPL) | ||
| + | Updates : JPL, Clara Jimenez, and GC | ||
| + | Traducteurs: Clara | ||
| + | |||
| + | RESSOURCES: | ||
| + | (gtkmm with mkdw future widowed version.) | ||
| + | |||
| + | NOTES: | ||
| + | Mise à jour: 2013 Conforme aux nouvelles directives avec UTF-8. | ||
| + | Correction du défaut de fin de fichier. | ||
| + | Correction de l'extraction des commentaires dans la ligne, avec l'option -t | ||
| + | |||
| + | BUGS: | ||
| + | See bugs reports http://edeulo.free.fr/phpBB3 | ||
| + | |||
| + | SEE ALSO MANUAL: | ||
| + | Man(3) attached in English. | ||
| + | Command line : man 3 asm_ | ||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
| - | |||
*/ | */ | ||
| Ligne 93 : | Ligne 144 : | ||
#include "version.h" | #include "version.h" | ||
| + | #include "asm.h" | ||
| + | /*O asm_ */ | ||
| + | int asm_(FILE *pfdoc, FILE *pnfile) | ||
| + | { /*S asm */ | ||
| + | /*P options bool à définir dans main() ou winmain() */ | ||
| + | extern unsigned char n,s,t; | ||
| + | extern char codes[]; | ||
| + | unsigned int tab; | ||
| + | unsigned num = 0; | ||
| + | long ll,nl; | ||
| + | int c1,c2,c3; | ||
| + | |||
| + | c1 = c2 = c3 = STX; /* Start Text */ | ||
| + | |||
| + | /*O tant que pas fin de fichier source (c1, c2, c3 différents de EOF)*/ | ||
| + | while ( c1 != EOF && c2 != EOF && c3 != EOF ) | ||
| + | { /*S w1 tq !EOF */ | ||
| + | /*O si début de texte faire c1=LF */ | ||
| + | if (c1==STX) c1='\n'; | ||
| + | /*O sinon prendre pour c1 le char suivant */ | ||
| + | else c1=getc(pnfile); | ||
| + | /*O si le char est NL repérer la position du fichier qui suit 'NL' */ | ||
| + | if(c1=='\n') | ||
| + | { /*S reperage debut de ligne */ | ||
| + | num++; | ||
| + | nl=ftell(pnfile); | ||
| + | tab=0; | ||
| + | } /*S reperage debut de ligne */ | ||
| - | + | /*P -- si le char c1 est NL -------------------------------------------------*/ | |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | /*O si le catractère est NL: */ | |
| + | if (c1=='\n') | ||
| + | { /*S ; en colonne 1 */ | ||
| + | c2 = getc(pnfile); | ||
| + | if (c2==EOF) break; | ||
| + | c3 = getc(pnfile); | ||
| + | if (c3==EOF) break; | ||
| + | /*O si c1 est suivi par c2 = ';' et | ||
| + | 'Codes' NULL ( cad tous les commentaires à copier ) | ||
| + | ou suivi par un des 5 charactères 'Codes' d'extraction */ | ||
| + | if ( c2 == ';' && | ||
| + | ( | ||
| + | !codes[0]|| | ||
| + | c3 == codes[0] || | ||
| + | c3 == codes[1] || | ||
| + | c3 == codes[2] || | ||
| + | c3 == codes[3] || | ||
| + | c3 == codes[4] | ||
| + | ) | ||
| + | ) | ||
| + | /*O alors copier les caractères dans le fichier doc, | ||
| + | et si option s ajouter à la sortie standard */ | ||
| - | /* | + | /*P-- sinon si c1 = ';' est en première colonne -----------------------------*/ |
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | ||
| - | + | { /*S copier */ | |
| - | + | /*O si option n insérer le numéro de ligne | |
| - | + | et si option s l'ajouter à la sortie standard */ | |
| - | + | if(n) | |
| - | + | { /*S n */ | |
| - | + | fprintf( pfdoc, "%5d ", num); | |
| - | + | if(s) printf( "%5d ", num); | |
| - | + | } /*S n */ | |
| - | + | /*O si l'option t texte seul n'est pas validée */ | |
| - | + | if(!t) | |
| - | + | { /*S !t */ | |
| - | + | /*O copier le début de ligne */ | |
| - | + | putc(c2,pfdoc); // ; | |
| - | + | putc(c3,pfdoc); // caractère de d'extraction | |
| - | + | /*O si option s copier aussi les 2 caractères à la sortie std */ | |
| - | + | if(s) | |
| - | + | { /*S si opt s */ | |
| - | + | putch(c2); | |
| - | /*O | + | putch(c3); |
| - | + | } /*S si opt s */ | |
| - | + | } /*S !t */ | |
| - | + | /*w sinon, option t vraie et copier tous les caractères | |
| - | + | reculer de 1 caractère */ | |
| - | + | //w else if(!codes[0])ungetc(c3,pnfile); | |
| - | /*O | + | /*O sinon, option t, remplacer les deux premiers caractères par 2 espaces */ |
| - | + | if(t) | |
| - | + | { /*S t true */ | |
| - | /*O | + | putc (' ',pfdoc); |
| - | + | putc (' ',pfdoc); | |
| - | /*O | + | if(s) |
| - | + | { /*S s true */ | |
| - | + | putch(' '); | |
| - | + | putch(' '); | |
| - | + | } /*S s true */ | |
| - | + | } /*S t true */ | |
| - | + | /*O tant que l'on a pas trouvé le caractère fin de ligne NL ('\n')*/ | |
| - | /* | + | while ( (c1 = getc(pnfile)) != '\n' && c1 != EOF) |
| - | + | { /*S w2 copy line */ | |
| - | /*O | + | /*O copier les caractères de la ligne */ |
| - | + | putc (c1,pfdoc); | |
| - | + | if(s) putch(c1); | |
| - | /*O | + | } /*S w2 copy line */ |
| - | + | if (c1==EOF) break; // du while w1 | |
| - | + | /*O copier aussi le caractère c1=NL, | |
| - | + | et avec l'option s envoyer le NL au terminal */ | |
| - | /*O | + | putc (c1,pfdoc); |
| - | + | if(s) putch(c1); | |
| - | + | /*O revenir sur LF du fichier source */ | |
| - | /*O | + | ungetc(c1,pnfile); |
| - | + | } /*S copier */ | |
| - | + | /*O sinon restituer les deux derniers caractères */ | |
| - | /*O | + | else |
| - | + | { /*S sinon pas début de commentaire en 1ère colonne */ | |
| - | + | ungetc(c3,pnfile); | |
| - | + | ungetc(c2,pnfile); | |
| - | + | } /*S sinon pas début de commentaire en 1ère colonne */ | |
| - | + | } /*S ; en colonne 1 */ | |
| - | + | ||
| - | /* | + | /*P--------- sinon si c1 = ';' est dans la ligne ----------------------------*/ |
| - | + | else | |
| - | + | { /*S else */ | |
| - | /* | + | /*P si c1 est tabulation incrémenter tab */ |
| - | + | //P if (c1=='\t')tab++; | |
| - | /* | + | /*P sinon si c1 = ; */ |
| - | + | //P else | |
| - | /*O | + | if (c1==';') |
| - | + | /*O alors: */ | |
| - | + | { /*S char = ; */ | |
| - | /*O | + | c2=getc(pnfile); |
| - | + | /*O si codes[0]=0 ( tous les commentaires ) | |
| - | + | ou si suivi par c2 = 'Code' to extract the comment */ | |
| - | + | if( !codes[0] || | |
| - | + | c2 == codes[0] || | |
| - | + | c2 == codes[1] || | |
| - | + | c2 == codes[2] || | |
| - | + | c2 == codes[3] || | |
| - | /*O | + | c2 == codes[4] |
| - | + | ) | |
| - | /*O | + | /*O alors: */ |
| - | + | { /*S comment inline */ | |
| - | + | /*O repérer la position de début de commentaire, le ; */ | |
| - | /*O | + | //w if(!codes[0])ungetc(c2,pnfile); (tous les commentaires) |
| - | + | ll=ftell(pnfile); // retour avec repérage sur ; | |
| - | + | /*O si l'option booléenne t est fausse (pas de texte seul) */ | |
| - | /*O | + | if(!t) |
| - | + | { /*S !t */ | |
| - | + | /*O se positionner en début de ligne */ | |
| - | /*O | + | /*T fseek ou: fseek(pnfile,(nl-ftell(pnfile)),1); */ |
| - | + | fseek(pnfile,nl,0); | |
| - | + | /*O si l'option n est vraie, insérer le numéro de ligne */ | |
| - | + | if(n) | |
| - | /*O | + | { /*S n (numéro de ligne) */ |
| - | + | fprintf( pfdoc, "%5d ", num); | |
| - | + | /*O si option s vraie, ajouter le numéro de ligne à l'écran */ | |
| - | /*O | + | if(s) printf( "%5d ", num); // screen |
| - | + | } /*S n */ | |
| - | + | /*O copier toute la ligne tq pas NL LF, dans le fichier doc */ | |
| - | + | while ( (c1=getc(pnfile)) != '\n' && c1!=EOF) | |
| - | + | { /*S w3 */ | |
| - | + | putc(c1,pfdoc); | |
| - | + | if(s)putch(c1); | |
| - | /*O | + | } /*S w3 */ |
| - | + | /*O en cas de fin de fichier arrêter la boucle while w1 */ | |
| - | + | if (c1==EOF) break; | |
| - | /*O | + | } /*S !t */ |
| - | + | /*O si option t */ | |
| - | + | if (t) | |
| - | /*O | + | { /*S option t */ |
| - | + | /*O se positionner en dedut de ligne */ | |
| - | + | /*T fseek ou: fseek(pnfile,(nl-ftell(pnfile)),1); */ | |
| - | + | fseek(pnfile,nl,0); | |
| - | /*O | + | /*O si option n vraie, insérer le numéro de ligne */ |
| - | + | if(n) | |
| - | + | { /*S n (numero de ligne) */ | |
| - | / | + | fprintf( pfdoc, "%5d ", num); |
| - | + | /*O si s ajouter le numéro de ligne à l'écran */ | |
| - | + | if(s) printf( "%5d ", num); // screen | |
| - | + | } /*S n */ | |
| - | + | //P copier autant de tabulations qu'il y en a dans le source */ | |
| - | + | //P for(i=0;i<tab;i++) | |
| - | /*O | + | //P { /*S tabs */ |
| - | + | //P putc('\t',pfdoc); | |
| - | + | //P if(s)putch('\t'); | |
| - | + | //P } /*S tabs */ | |
| - | + | /*O copier toute la ligne jusqu'à la position commentaire */ | |
| - | + | while ( (c1=getc(pnfile)) != ';' && c1!=EOF) | |
| - | /*O | + | { /*S w */ |
| - | + | putc(' ',pfdoc); | |
| - | + | if(s)putch(' '); | |
| - | + | } /*S w*/ | |
| - | + | if (c1==EOF) break; // w1 | |
| - | + | /*O ajouter un espace pour remplacer le caractère ';' */ | |
| - | /*O | + | // for(i=(int)(ll-nl-tab);i>0;i--) |
| - | + | { /*S espaces */ | |
| - | + | putc(' ',pfdoc); | |
| - | + | if(s)putch(' '); | |
| - | + | c1=getc(pnfile); // command 'Code' true | |
| - | + | if(c1!=' ') | |
| - | + | { /*S if 'Code' is true */ | |
| - | + | putc(' ',pfdoc); // replace Code with space | |
| - | + | if(s)putch(' '); | |
| - | + | } /*S if 'Code' is true */ | |
| - | /*O | + | } /*S espaces */ |
| - | + | /*O puis copier le commentaire tant que NL n'est pas trouvé */ | |
| - | + | while ( (c1=getc(pnfile)) != '\n' && c1!=EOF) | |
| - | + | { /*S copier commentaire */ | |
| - | + | putc(c1,pfdoc); | |
| - | + | if(s)putch(c1); | |
| - | + | } /*S copier commentaire */ | |
| - | + | if(c1==EOF)break; // w1 | |
| - | + | } /*S option t */ | |
| - | + | putc('\n',pfdoc);if(s)putch('\n'); /*O copier NL */ | |
| + | ungetc(c1,pnfile); /*O revenir sur NL */ | ||
| + | } /*S comment inline */ | ||
| + | /*O sinon: */ | ||
| + | else | ||
| + | { /*S*/ | ||
| + | /*O renenir un caractère en arrière */ | ||
| + | ungetc(c2,pnfile); | ||
| + | } /*S*/ | ||
| + | } /*S char = ; */ | ||
| + | } /*S else */ | ||
| + | } /*S tq !EOF */ | ||
| + | return 0; | ||
| + | } /*S asm */ | ||
| + | </pre> | ||
| + | {{boîte déroulante/fin}} | ||
Version du 29 avril 2013 à 15:26
Retour aux fichiers en développement →
- Les tabulations posent parfois quelques problèmes de lisibilité.

