Projet mkd/asm.c

De Wiki EELL.

(Différences entre les versions)
m (!)
m (!!!)
Ligne 1 : Ligne 1 :
 +
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement &rarr;]]</small>
: Les tabulations posent parfois quelques problèmes de lisibilité.
: Les tabulations posent parfois quelques problèmes de lisibilité.

Version du 19 décembre 2010 à 14:25

Retour aux fichiers en développement →

Les tabulations posent parfois quelques problèmes de lisibilité.
/*O
	NOM DU FICHIER: asm.cpp
	PROJET: mkd 
 		Générer la documentation préécrite dans les fichiers de sources multiples.
	PROJET INITIAL: mkdoc 1989 pour MS-DOS et UNIX, devenu obsolète.
	DOSSIER: extractdoc 04/12/2009
	PROGRAMMEUR: JP LOUYOT
	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 */
Outils personnels