Projet mkd/pascal.c
De Wiki EELL.
Version du 19 décembre 2010 à 14:55 par JPL (discuter | contributions)
Retour aux fichiers en développement →
- pascal.inc.c : Ce fichier est à revoir, il n'est pas indépendant
/*E �C�*/ /** ######################################### # PASCAL # ######################################### */ /* maj R3.0 09/06/89 */ /*P maj R3.1 30/12/90 par JPL */ /*P maj R3.11 09/01/91 par JPL */ void pascal_(FILE * pfdoc, FILE * pnfile) // FILE *pfdoc, *pnfile; { /*S pascal */ extern unsigned char l,n,p,s,t; /*P rappels */ extern char codes[]; unsigned int i, tab; unsigned num; long ll,nl; register int c1; int c2,c3; num = 0; c1 = c2 = c3 = STX; /* Start Text */ /*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 : */ if(c1=='\n') { /*S*/ /*O incr‚menter le num‚ro de ligne */ num++; /*O reperer la position suivant NL dans nl et mettre nb tabulations … 0 */ nl=ftell(pnfile); tab=0; } /*S*/ /*O------ decodage Pascal ---------------------------------------------------*/ /*O si le char est '{' ou si le char est '(' suivi de '*' */ if( (c1=='{') || (c1=='(' && (c2=getc(pnfile))=='*') ) /*O alors: */ { /*S char = d‚but commentaire */ c3=getc(pnfile); /*O si codes[0]=0 ou si d‚but de commentaire est suivi par c3 char code utilisateur */ if(!codes[0]|| c3 == codes[0] || c3 == codes[1] || c3 == codes[2] || c3 == codes[3] || c3 == codes[4] ) /*O alors: */ { /*S traiter le commentaire */ /*O reperer la position commentaire dans la ligne */ if(!codes[0]) ungetc(c3,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 tab que 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 '}' ou '*' suivi de ')', copier le commentaire */ while ( !( (c1=getc(pnfile)) == '}' || ( c1=='*' && (c2=getc(pnfile)) == ')' ) ) ) { /*S commentaire seul */ if (c1=='*') ungetc(c2,pnfile); putc(c1,pfdoc); if(s)putch(c1); /*O si option n et NL ajouter le num‚ro de ligne */ if(n && c1=='\n') { /*S*/ num++; fprintf(pfdoc,"%5d ",num); if(s) printf("%5d ",num); } /*S*/ } /*S commentaire seul */ #ifdef FULL_LINE /*O *** FULL_LINE *** */ /*O si pas option t */ if(!t) { /*S*/ /*O copier les chars y compris code fin de comm. jusqu'en fin de ligne */ if(c1=='*') ungetc(c2,pnfile); ungetc(c1,pnfile); while ( (c1=getc(pnfile)) != '\n' ) { /*S*/ putc(c1,pfdoc); if(s)putch(c1); } /*S*/ } /*S*/ /*O sinon (option t) */ else #endif /*O *** END FULL_LINE *** */ { /*S*/ /*O aller au bout de la ligne sans copier, sauf les 'retour chariot' */ while ( (c1=getc(pnfile)) != '\n' ) if( c1=='\r' ) { /*S*/ putc( c1, pfdoc ); if(s) putch( c1 ); } /*S*/ } /*S*/ putc(c1,pfdoc);if(s)puts(""); /*O copier NL (Cr/Lf ‚cran)*/ ungetc(c1,pnfile); /*O revenir sur NL */ } /*S traiter le commentaire */ /*O sinon: */ else { /*S pas le cas commentaire */ ungetc(c3,pnfile); if (c1=='(') ungetc( c2, pnfile ); } /*S pas le cas commentaire */ } /*S char = d‚but commentaire */ /*O sinon: si char='\t' incrementer tab */ else if(c1=='\t')tab++; } /*S tq !EOF */ } /*S pascal */