Projet mkd/asm.c
De Wiki EELL.
(Différences entre les versions)
JPL (discuter | contributions) m (!!!) |
JPL (discuter | contributions) m (!!!) |
||
Ligne 3 : | Ligne 3 : | ||
<pre> | <pre> | ||
+ | /* | ||
+ | * © mkd, version 2009.12 et ultérieures | ||
+ | * | ||
+ | * 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 oeuvre 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. | ||
+ | */ | ||
+ | |||
/*O | /*O | ||
NOM DU FICHIER: asm.cpp | NOM DU FICHIER: asm.cpp | ||
- | PROJET: mkd | + | PROJET : mkd http://edeulo.free.fr/wiki/index.php/Portail:mkd |
- | + | ||
PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète. | PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète. | ||
- | DOSSIER: | + | DOSSIER: http://edeulo.free.fr/wiki/index.php/Projet_mkd |
- | PROGRAMMEUR: | + | PROGRAMMEUR: http://edeulo.free.fr/wiki/index.php/Utilisateut:JPL |
DATE: 10 janvier 2010 | DATE: 10 janvier 2010 | ||
MODIFICATIONS: | MODIFICATIONS: |
Version du 19 décembre 2010 à 15:39
Retour aux fichiers en développement →
- Les tabulations posent parfois quelques problèmes de lisibilité.
/* * © mkd, version 2009.12 et ultérieures * * 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 oeuvre 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. */ /*O NOM DU FICHIER: asm.cpp PROJET : mkd http://edeulo.free.fr/wiki/index.php/Portail:mkd PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète. DOSSIER: http://edeulo.free.fr/wiki/index.php/Projet_mkd PROGRAMMEUR: http://edeulo.free.fr/wiki/index.php/Utilisateut:JPL DATE: 10 janvier 2010 MODIFICATIONS: Le: 10/03/2010 par JPL objet de la modification simplification de l'entête Le: ../../.... par ... objet de la modification .... */ /*D fonction asm_ ----------------------------------------------------------------------------- ACTION: La fonction asm_ lit le fichier écrit en assembleur et extrait les renseignements de structure, l'organigramme, la documentation destinée aux programmeurs, au fichier d'entête (.h) ou à la documentation destinée à l'utilisateur etc. On utilise généralement les caractères codes suivants : D: pour la documentation générale sur les fonctions (listing) H: pour générer le fichier d'entête .h O: pour l'organigramme S: pour le contrôle de la structure du programme T: pour les points de tests U: pour la documentation utilisateur Options : n : numéro de ligne (ajoute du numéro de ligne) s : écran (ajoute le commentaire à l'écran) t : texte seul (ne copie pas les caractères de repérage) SYNTAXE: #include "version.h" #include "asm.h" int asm_(FILE *pfdoc, FILE *pnfile); PORTABILITE: Win32 Win64 (UNIX à vérifier) DESCRIPTION: FILE *pfdoc : pointeur sur le flux du fichier de destination File *pnfile : pointeur sur le flux du fichier source VALEUR RETOURNEE: Ne retourne rien DROIT DE COPIE: © mkd, 20074 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 oeuvre 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. */ /*H // asm.cpp: extern int asm_(FILE *pfdoc, FILE *pnfile); */ /* --------------------------------------------*/ #include "version.h" int asm_(FILE *pfdoc, FILE *pnfile) { /*S asm */ extern unsigned char n,s,t; /*www rappels: options booleennes à définir dans main() ou winmain() */ 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 tq !EOF */ /*O si debut 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 reperer la position qui suit 'NL' (repérer dans l'entier long nl) */ if(c1=='\n') { /*S reperage debut de ligne */ num++; nl=ftell(pnfile); tab=0; } /*S reperage debut de ligne */ /*O--------- si le char est NL ---------------------------------------------*/ if (c1=='\n') { /*S ; en colonne 1 */ c2 = getc(pnfile); c3 = getc(pnfile); /*O si c1 est suivi par c2 = ';' et si codes[0]=0 ou si suivi par un des 5 char code d'utilisateur */ 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 opt s ajouter à l'écran: */ { /*S copier */ /*O si option n insérer le numéro de ligne et si s l'ajouter a l'écran */ if(n) { /*S n */ fprintf( pfdoc, "%5d ", num); if(s) printf( "%5d ", num); } /*S n */ /*O si pas option t texte seul */ if(!t) { /*S !t */ /*O copier le debut de ligne */ putc (c2,pfdoc); putc(c3,pfdoc); /*O si option s copier le commentaire a l'ecran */ if(s) { /*S si opt s */ putch(c2); putch(c3); } /*S si opt s */ } /*S !t */ /*O sinon si il ne faut pas copier tout le commentaire: 1 pas arrière*/ else if(!codes[0])ungetc(c3,pnfile); /*O tant que : pas en fin de ligne */ while ( (c1 = getc(pnfile)) != '\n') { /*S w copy line */ /*O copier la ligne */ putc (c1,pfdoc); if(s) putch(c1); } /*S w copy line */ /*O copier aussi le dernier caractere et si option s retour : chariot à l'écran */ putc (c1,pfdoc); if(s) putch('\n'); /*O revenir sur LF du fichier source */ ungetc(c1,pnfile); } /*S copier */ /*O sinon restituer les deux derniers caracteres */ else { /*S sinon */ ungetc(c3,pnfile); ungetc(c2,pnfile); } /*S sinon */ } /*S ; en colonne 1 */ /*O--------- sinon si c1 = ';' dans la ligne --------------------------------*/ else { /*S else */ /*O si c1 est tabulation incrementer tab */ if (c1=='\t')tab++; /*O sinon si c1 = ; */ else if (c1==';') /*O alors: */ { /*S char = ; */ c2=getc(pnfile); /*O si codes[0]=0 ou si suivi par c2 = char code utilisateur */ if ( !codes[0]|| c2 == codes[0] || c2 == codes[1] || c2 == codes[2] || c2 == codes[3] || c2 == codes[4] ) /*O alors: */ { /*S commentaire page */ /*O reperer la position commentaire */ if(!codes[0])ungetc(c2,pnfile); ll=ftell(pnfile); /*O si pas option t (texte seul) */ if(!t) { /*S !t */ /*O se positionner en dedut de ligne */ fseek(pnfile,nl,0); /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */ /*O si option n 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 */ /*O copier toute la ligne tq pas NL LF, dans le fichier doc */ while ( (c1=getc(pnfile)) != '\n') { /*S w */ putc(c1,pfdoc); if(s)putch(c1); } /*S w*/ } /*S !t */ /*O sinon: (option t) */ else { /*S option t */ /*O se positionner en dedut de ligne */ fseek(pnfile,nl,0); /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */ /*O si option n 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 */ /*wwwO copier autant de tabulations qu'il y en a dans le source */ // for(i=0;i<tab;i++) // { /*S tabs */ // putc('\t',pfdoc); // if(s)putch('\t'); //} /*S tabs */ /*O copier toute la ligne jusqu'à la position commentaire */ while ( (c1=getc(pnfile)) != ';') { /*S w */ putc(c1,pfdoc); if(s)putch(c1); } /*S w*/ /*O ajouter un espace pour remplacer le caractère ';' */ // for(i=(int)(ll-nl-tab);i>0;i--) { /*S espaces */ putc(' ',pfdoc); if(s)putch(' '); } /*S espaces */ /*O puis copier le commentaire tq pas NL */ while ( (c1=getc(pnfile)) != '\n') { /*S copier commentaire */ putc(c1,pfdoc); if(s)putch(c1); } /*S copier commentaire */ } /*S option t */ putc('\n',pfdoc);if(s)putch('\n'); /*O copier NL */ ungetc(c1,pnfile); /*O revenir sur NL */ } /*S commentaire page */ /*O sinon: */ else { /*S*/ ungetc(c2,pnfile); } /*S*/ } /*S char = ; */ } /*S else */ } /*S tq !EOF */ return 0; } /*S asm */