Projet mkd/mkdasm.c

De Wiki EELL.

Version du 19 décembre 2010 à 16:58 par JPL (discuter | contributions)
(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)
Cette page n'est pas finie. Veuillez considérer le plan et le contenu comme incomplets et en préparation, temporaires et sujets à caution. Si vous souhaitez participer, il vous est recommandé de consulter sa page de discussion au préalable.

Retour aux fichiers en développement →

Sommaire

version.h

// utiliser #pragma once pour éviter #endif avec #indef

/**# MKDOC3.C #########################*/ /*H*/
/*U            UTILISATEURS            */ /*H*/
/*O            ORGANIGRAMME            */ /*H*/
/*S              STRUCTURE             */ /*H*/
/*T                TESTS               */ /*H*/
/*P             PROGRAMMEUR            */ /*H*/
/*www     remarques particulieres      */ /*H*/
/**####################################*/ /*H*/

/*O
	NOM DU FICHIER: version.h pour l'ensemble des fonctions de mkd
	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: JPL
	DATE: 10 janvier 2010 
	MODIFICATIONS:
	Le: ../../.... par ... objet de la modification ....
	Le: ../../.... par ... objet de la modification ....
*/

/*D Lang FR
 	version.h
 -----------------------------------------------------------------------------
 ACTION:
	Génie logiciel :
	Le programmeur ayant écrit la documentation en même temps que le code
	source, la fiabilité de la programmation et des modifications s'en
	trouve améliorée.
	Fonction :
	   version.h doit permettre la compilation de l'ensemble du projet mkd
	   pour les différents systèmes d'expoitation UNIX/LINUX WINDOWS MAC

 SYNTAXE:
	#include "version.h"
	   A utiliser en tête de toutes les fonctions du projet mkd.
	   Ce fichier doit être édité afin de valider les conditions de compilation
	   TEST_Unitaire, UNIX, WINDOWS etc.

 PORTABILITE:
	Microsoft Visual studio sous Windows : x86(Win32) x64(Win32 et WIN64)
	gcc sous Linux.

 DESCRIPTION:
	Ce fichier doit être édité afin de valider les conditions de compilation
	(TEST_Unitaire, UNIX, WINDOWS etc.)


 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.
*/

//	Validation du test unitaire
#define TESTS_U
#ifdef TESTS_U    // pour tests unitaires et compilation en ligne de commande
	//#define WINDOWS	// Vesion pour fenêtrage
	//#define SHELL		// Version pour console (main)
	//#define FR		// Langue français France
	//#define EN		// Langue anglaise
#endif

//#define UNIX		/*O Version de compilation UNIX */
#define PC              /*O Version de compilation PC   */  /*H*/

#ifdef PC            	/*H*/
#define PC_ONLY		/*H find_ ne reconnait pas: .s .f .p .sh .csh dans
				les fichiers de projets mkdprj */
#define NL "\r\n"       /*H*/
#endif                  /*H*/
                        /*H*/
#ifdef UNIX             /*H*/
#define UNIX_ONLY       /*H find_ ne reconnait pas: .BAS .PAS .FOR ... 
				dans les fichiers de projets mkdprj */
#define NL "\n"         /*H*/
#endif                  /*H*/
                        /*H*/

/*H	OPTIONS DE COMPILATION (par defaut, caractères redefinissables pour une nouvelle compilation : */
	/*H OPTION 'l': (ligne) */
#define CD1 '%'			/*H CD1 en 1ere colonne  prend fin avec NL */
#define CD2 '-'			/*H CD2 en 1ere colonne          "         */
#define CD3 '#'			/*H CD3 dans la ligne            "         */
						/*H '%' commentaire style postcript */
						/*H '#' commentaire shell ou pour Makefile voir option S
						( le commentaire se termine avec new_line ) */
						/*H '\'' commentaires style Basic */
						/*H ';'  commentaires style assembleur */
						/*H*/
	/*H Option 'p': (page ou plusieurs lignes) */
#define CD4 '\"'		/*H CD4 = "  debut de chaine commentaire */
#define CD5 '\"'		/*H CD5 = "  fin de chaine commentaire */
						/*H*/
						/*H*/

#define FULL_LINE		/*H option de compil. copier toute la ligne    */
						/*H*/
#define VERSION "10.01"	/*H*/
						/*H*/
#define MAX     200		/*H longueur des buffers des path source et doc */
#define STX     0x2		/*H Start Text */
#include <stdio.h>		/*H*/
						/*H*/
#ifdef PC			/*H*/
#include <conio.h>		/*H*/
#include <process.h>		/*H*/
#include <io.h>			/*H*/
#include <stdlib.h>		/*H*/
#include <string.h>		/*H*/
#ifndef TESTS_U
   #ifdef WINDOWS
      //#define WINDOWS doit être défini dans version.h
      //#include <windows.h>
   #endif
#endif
#endif                 /*H*/
                       /*H*/
#ifdef UNIX            /*H*/
/*#define getch() getchar()*/
#include <signal.h>    /*H*/
#include <sys/file.h>  /*H*/
#endif                 /*H*/

#define putch putchar  /*H putch obsolète; Vérifier en version PC (-> ok !) H*/

asm.h

	// asm.h généré par "mkd --C H asm.c asm.h"
	// asm.cpp: 
	extern int asm_ (FILE *pfdoc, FILE *pnfile);


mkdasm.cpp

/*P Lang FR
	NOM DU FICHIER: mkdasm.cpp
		Fichier source d'entrée du programme exécutable en version console
		réduite au module assembleur qui entre dans le projet global mkd.
		Cet exécutable doit être utilisé dans une fenêtre console; 'cmd.exe'
		sous WINDOWS; 'console' sous UNIX/LINUX.
	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: JPL
	DATE: 10 janvier 2010 
	MODIFICATIONS:
	Le: ../../.... par ... objet de la modification ....
	Le: ../../.... par ... objet de la modification ....
*/

/*D Lang FR
        mkdasm.exe : Définit le point d'entrée du programme
 -----------------------------------------------------------------------------
 ACTION:
 		Génie logiciel :
		Le programmeur ou l'éditeur ayant écrit la documentation en même temps
		que le code source, la fiabilité de la programmation ou de l'édition 
		s'en trouve plus claire et plus fiable.

		Fonction : lit les paramètres entrés en ligne de commande, vérifie la 
		validité des paramètres et exécute la commande.

 SYNTAXE:
        mkdasm.exe [--Options(nst)] [-Codes(DHOPSTUw, 5 max)] fichier_source

		Options :
			n : numéro de ligne (ajoute le numéro de ligne en 1ère colonne)
			s : écran (screen) (ajoute le commentaire à l'écran)
			t : texte seul (ne copie pas les caractères de 'Codes')

		Codes : 5 caractères maximum
			Caractères usuels en programmation:
			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
			www: pour Attention (warning)

		source_asm : fichier qui contient le code assembleur

		Le fichier qui sera documenté aura le même nom que le fichier source 
		auquel on aure rajouté l'extension '.txt'

 PORTABILITE:
        x86-Win32	x64-Win64   (LINUX à vérifier)

 VALEUR RETOURNEE:
 		0 en cas de réussite
        -1 en cas d'erreur de syntaxe
		-2 en cas d'erreur d'ouverture ou de fermeture de fichier

 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.
*/

#include "version.h"
#include "asm.h"

// Variables globales
	unsigned char n=0,s=0,t=0,v=1;			/*P*/
	char codes[5] = {0,0,0,0,0};
	//char codes[5] = {' ',' ',' ',' ',' '};	/*P*/

int main(int argc, char *argv[])
{ /*O main Test */
	printf("Epreuve (Test, debug) de asm.cpp\n");
//	char *fprj= "";					/*P nom fichier projet s'il existe		*/
	char fdoc[MAX];					/*P nom fichier documentaire en sortie	*/
//	char fdoc[] = "ASM_doc.txt";	/*P nom fichier documentaire en sortie	*/

	char fsrc[MAX];					/*P nom fichier source a documenter		*/
//	char fsrc[] = ".\\ASM_FILE.a";	/*P nom fichier source a documenter		*/
	extern  char codes[];			/*P codes */
	extern unsigned char A,B,C,F,P,S,a,f,j,l,n,p,s,t,v,w;	/*P rappels options booleennes */

/*O	init options par defaut */
	{n=0,s=0;t=0;v=1;} /*O option v (verbose) de compilation */
//	 O=0; /* Option=0 */

	int i=0;		/*P compteurs */
	int k=0;
	char isource=0;		/*P position nom du fichier source dans path source */
	char itarget=0;		/*P position fin du path_target avec '*' ou ':'(PC) */
	char ktar=0;		/*P position du '.' dans p_target */
	static char O;		/*P booleen =1 si option validee */
	static char L;		/*P booleen =1 si option langage */
	register int c=0;	/*P char (variable) */
	int c1=0;			/*P char (variable) pour version PC */

//	FILE *pfprj;  /*P FICHIER PROJET			*/
	FILE *pnfile; /*P FICHIER SOURCE A TRIER	*/
    FILE *pfdoc;  /*P FICHIER A DOCUMENTER		*/

	printf("argv[0] = %s\n",argv[0]); 				/*T*/
	if (argc > 1) printf("argv[1] = %s\n",argv[1]);	/*T*/
	if (argc > 2) printf("argv[2] = %s\n",argv[2]);	/*T*/
	if (argc > 3) printf("argv[3] = %s\n",argv[3]);	/*T*/
		
/*O	Si la syntaxe n'est pas correcte (arrgc <2) "mkdasm [--nst] [-Code(DHOPSTUw)] Source_asm" */
	if (argc < 2) 
/*O	Alors Préciser la syntaxe et quitter sur erreur de syntaxe -1*/
	{ /*S syntaxe intégrée */
//#ifdef FR
		printf("Syntaxe : %s [--Options(nst)] [-5 Codes(DHOPSTUw)] source_asm\n",argv[0]);
		printf("Appuyer sur la touche 'Entree' pour quitter.\n\n");
//#endif
//#ifdef EN
		printf("Syntax: %s [--Options(nst)] [-5 Codes(DHOPSTUw)] asm_source\n",argv[0]);
		printf("Press 'Enter' to quit.\n");
//#endif
		getc(stdin); // attente touche 'Entrée' */ 
		exit(-1);
	} /*S syntaxe intégrée */
/*O si argc = 2 (source asm en premier paramètre) */
	if (argc == 2)
	{ /*S argc = 2 */
		if (strcpy_s(fsrc,argv[1])!=0)
		{
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		}
		else
		{ /*S*/
			strcpy_s(fdoc,argv[1]); /*O strcpy_s : évite l'erreur overflow */
			strcat_s(fdoc,".txt");
			printf("SRC = %s\n",fsrc);	/*T*/
			printf("DST = %s\n",fdoc);	/*T*/
			printf("argc=2 - Options n=%d,s=%d,t=%d,v=%d Codes %c,%c,%c,%c,%c\n",n,s,t,v,codes[0],codes[1],codes[2],codes[3],codes[4]);	/*T*/
		} /*S*/
	} /*S argc = 2 */

/*O si argc = 3 (option ou code) */
	if (argc == 3)
	{ /*S argc = 3 */
		if (argv[1][0]=='-' && argv[1][1]=='-')	/*O Options */
		{ /*S Options */
			int i;
			// printf("argv[1][0]=%c - argv[1][1]=%c\n",argv[1][0],argv[1][1]);	/*T*/
			for (i=0 ; i<3 && (argv[1][(i+2)]!=0) ; i++) 
            { /*S*/
				if (argv[1][(i+2)]=='n') n=1;	/*O n,s,t sont des variables globales */
				else if (argv[1][(i+2)]=='s') s=1;
					else if (argv[1][(i+2)]=='t') t=1;
				// printf("argv[1][%d]=%c & n=%c, s=%c, t=%c\n",(i+2), argv[1][i+2],n,s,t);	/*T*/
			} /*S*/
		} /*S Options */
		else if (argv[1][0]=='-' && argv[1][1]!='-') /*O Codes */
		{ /*S Codes */
			int i;
			for (i=0 ; i<5 && (argv[1][i+1]!=0) ; i++) codes[i]=argv[1][i+1];		
		} /*S Codes */
		else /*O erreur de syntaxe */
		{ /*S*/
			puts("Options ? || Codes ?\n");
			exit(-1);
		} /*S*/
		if (strcpy_s(fsrc,argv[2])!=0)
		{ /*S*/
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		} /*S*/
		else
		{ /*S*/
			strcpy_s(fdoc,argv[2]);
			strcat_s(fdoc,".txt");
			printf("SRC = %s\n",fsrc);	/*T*/
			printf("DST = %s\n",fdoc);	/*T*/
			printf("argc=3 - Options n=%d,s=%d,t=%d,v=%d Codes %c,%c,%c,%c,%c\n",n,s,t,v,codes[0],codes[1],codes[2],codes[3],codes[4]);	/*T*/
		} /*S*/
	} /*S argc = 3 */

/*O si argc = 4 (options et code) */
	if (argc == 4)
	{ /*S argc = 4 */
		if (argv[1][0]=='-' && argv[1][1]=='-') /*O Options */
		{ /*S Options */
			int i;
			for (i=0 ; i<3 && (argv[1][i+2]!=0) ; i++) 
            { /*S*/
				if (argv[1][i+2]=='n') n=1; /*O n,s,t sont des variables globales */
				else if (argv[1][i+2]=='s') s=1;
					else if (argv[1][i+2]=='t') t=1;
			} /*S*/
		} /*S Options */
		else
		{ /*S err */
			puts("Options ?\n");
			exit(-1);
		} /*S err */
		if (argv[2][0]=='-' && argv[2][1]!='-') /*O Codes */
		{ /*S Codes */
			int i;
			for (i=0 ; i<5 && (argv[2][i+1]!=0) ; i++) codes[i]=argv[2][i+1];		
		} /*S Codes */
		else /*O erreur de syntaxe */
		{ /*S*/
			puts("Codes ?\n");
			exit(-1);
		} /*S*/
		if (strcpy_s(fsrc,argv[3])!=0)
		{ /*S*/
			printf("Err SRC : %d chars max\n",MAX);
			exit(-1);
		} /*S*/
		else
		{ /*S*/
			strcpy_s(fdoc,argv[3]);
			strcat_s(fdoc,".txt");
			printf("SRC = %s\n",fsrc);	/*T*/
			printf("DST = %s\n",fdoc);	/*T*/
			printf("argc=4 - Options n=%d,s=%d,t=%d,v=%d Codes %c,%c,%c,%c,%c\n",n,s,t,v,codes[0],codes[1],codes[2],codes[3],codes[4]);	/*T*/
		} /*S*/
	} /*S argc = 4 */

/*O ouvrir le fichier source en lecture binaire*/
	{ /*S demarrage du test */
/*O		si l'ouverture du fichier source n'est pas correcte */
		// old syntax : if  (( pnfile = fopen ( fsrc,"rb" )) == 0 )		
		if (fopen_s(&pnfile, fsrc,"rb") !=0 )
		{ /*S ! open source pnfile */
	
/*O			ecrire fichier "nomfich" non trouvé ou erreur d'ouverture */
			printf ("fichier \'%s\' : non trouvé ou erreur d'ouverture\n",fsrc);
			puts("Tapez sur la touche 'Entrée' pour quitter\n\n");
			printf ("file \'%s\' : non found or open error\n",fsrc);
			puts("Press 'Enter' to quit.\n");
			getchar();
			exit(2);
		} /*S ! open source pnfile */
/*O		sinon, ouvrir le fichier à documenter en écriture ou réécriture */
		else
		{ /*S open pfdoc write */
/*O			si il y a une erreur à l'ouverture l'ecrire et sotir et renvoyer le code 2 */
			if((fopen_s(&pfdoc,fdoc,"wb")) != 0)
			// old syntax : if((pfdoc = fopen(fdoc,"wb")) == NULL)
			{ /*S si err à l'ouverture de pfdoc*/
				printf("fichier \'%s\' : erreur d'ouverture en écriture\n",fdoc);
				puts("Tapez sur la touche 'Entrée' pour quitter\n\n");
				printf("file \'%s\' : open error\n",fdoc);
				puts("Press 'Enter' to quit.\n");
				getchar();
				exit(-2);
			} /*S si err à l'ouverture de pfdoc*/
			else
			{ /*S sinon*/
/*O				si options n ou t ou s écrire le nom du fichier lu */
				if(n||t||s)
				{ /*S si n ou t ou s valide */
					fprintf(pfdoc,"%s\n(file %s :)", NL, fsrc );
					if( v || s ) printf("\n\n(file %s :)\n",fsrc);
					fprintf (pfdoc," Options n=%d s=%d t=%d verbose=%d",n,s,t,v);
					fprintf (pfdoc, "%s", NL );
				} /*S si n ou t ou s valide */
			} /*S sinon*/
		} /*S open pfdoc write */

		asm_(pfdoc,pnfile);

/*O		fermer le fichier source et en cas d'erreur écrire "Erreur de fermeture */
		if (fclose(pnfile))
		{ /*S si*/
			printf("Erreur de fermeture : \'%s\'\n",fsrc);
			printf("Error on closed : \'%s\'\n",fsrc);
			exit(2);
		} /*S fin si*/
/*O		Fermer tous les autres fichiers */
		{ /* fermer */
			int numclosed = _fcloseall( );
			printf( "Nombre de fichiers fermés par _fcloseall : %u\n", numclosed );
			printf( "Number of files closed by _fcloseall: %u\n", numclosed );
		} /* fermer */
	} /*S demarrage du test */
	puts("Tapez sur la touche 'Entrée' pour quitter\n");
	puts("Press 'Enter' to quit.\n");
	getchar();	
	return 0;
} /*O main Test */


version de asm.cpp utilisée

/*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: JPL
	DATE: 10 janvier 2010 
	MODIFICATIONS:
	Le: ../../.... par ... objet de la modification ....
	Le: ../../.... par ... objet de la modification ....
*/

/*D Lang FR
        fonction asm_
 -----------------------------------------------------------------------------
 ACTION:
 		Génie logiciel :
		Le programmeur ayant écrit la documentation en même temps que le code
		source, la fiabilité de la programmation et des modifications s'en
		trouve améliorée.
		Fonction :
        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.h généré par "mkd --C H asm.c asm.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;  /*H 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