Projet mkd/basic.c
De Wiki EELL.
Version du 19 décembre 2010 à 14:15 par JPL (discuter | contributions)
- La présentation de ce fichier est à revoir, notament son entête non conforme. Il est obligatoire de préciser ce que fait le fichier et de donner les indications pour le fichier d'entête basic.h
/*E */ /*F ######################################### # BASIC # ######################################### */ /* 09/02/89 */ /*P maj R3.12 12/02/91 par JPL */ void basic_(FILE * pfdoc, FILE * pnfile) // FILE *pfdoc, *pnfile; { /*S basic */ extern unsigned char l,p,s,t; extern char codes[]; unsigned int num, tab, i; long ll,nl; register int c1; int c2,c3,c4; num = 0; c1 = c2 = c3 = c4 = STX; /* Start Text */ /*### DECODAGE BASIC OU SIMILAIRES ##########################################*/ /*O tant que pas fin de fichier source */ 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 suivant NL dans nl */ if(c1=='\n') { /*S*/ num++; nl=ftell(pnfile); tab=0; } /*S*/ /*O si le char est 'R' ou '\'' */ if(c1=='\''||c1=='R') /*O alors: */ { /*S voir si decoder */ /*O si c1='\'' ou si ( c1='R' et c2='E' et c3='M') */ if(c1=='\''||(c1=='R'&& (c2=getc(pnfile))=='E'&& (c3=getc(pnfile))=='M')) /*O alors: */ { /*S decoder */ c4=getc(pnfile); /*O si codes[0]=0 ou si c4 char code utilisateur */ if(!codes[0]|| c4 == codes[0] || c4 == codes[1] || c4 == codes[2] || c4 == codes[3] || c4 == codes[4] ) /*O alors: */ { /*S traiter le commentaire */ /*O reperer la position commentaire */ if(!codes[0]) ungetc(c2,pnfile); ll=ftell(pnfile); /*O si option n ins‚rer le num‚ro de ligne */ if(n) { /*S*/ fprintf( pfdoc, "%5d ", num ); if(s) printf( "%5d ",num ); } /*S*/ /*O si pas option t */ if(!t) { /*S!t*/ /*O se positionner en dedut de ligne */ fseek(pnfile,nl,0); /*w ou: fseek(pnfile,(nl-ftell(pnfile)),1); */ /*O copier la ligne jusqu'au commentaire, dans le fichier doc */ for(i=(int)(ll-nl);i>0;--i) { /*S*/ c1=getc(pnfile); putc(c1,pfdoc); if(s)putch(c1); } /*S*/ } /*S!t*/ /*O sinon: (option t) */ else { /*St*/ /*O copier autant de tabulations qu'il y en a dans le source */ for (i=0;i<tab;i++) { /*S*/ putc('\t',pfdoc); if(s)putch('\t'); } /*S*/ /*O puis copier des blancs jusqu'a la position commentaire */ for(i=(int)(ll-nl-tab);i>0;i--) { /*S*/ putc(' ',pfdoc); if(s)putch(' '); } /*S*/ } /*St*/ /*O puis tq ne rencontre pas le char '\n', copier le commentaire */ while ( (c1=getc(pnfile)) != '\n' ) { /*S*/ putc(c1,pfdoc); if(s)putch(c1); } /*S*/ putc('\n',pfdoc);if(s)putch('\n'); /*O copier NL */ ungetc(c1,pnfile); /*O revenir sur NL */ } /*S traiter le commentaire */ /*O sinon: */ else { /*S pas le cas */ ungetc(c4,pnfile); } /*S pas le cas*/ } /*S decoder */ /*O sinon: */ { /*S*/ /*O si c1='R' renvoyer c3 et c2 */ if(c1=='R') { ungetc(c3,pnfile); ungetc(c2,pnfile); } } /*S*/ } /* voir si decoder */ /*O sinon si c1 =tabulation incrementer tab */ else if(c1=='\t')tab++; } /*S tq !EOF */ } /*S basic */