Projet mkd/pascal.c
De Wiki EELL.
(Différences entre les versions)
JPL (discuter | contributions) m (!) |
JPL (discuter | contributions) m |
||
Ligne 1 : | Ligne 1 : | ||
<small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | <small>[[Projet mkd/Fichiers en développement|Retour aux fichiers en développement →]]</small> | ||
+ | : pascal.inc.c : Ce fichier est à revoir, il n'est pas indépendant | ||
+ | <pre> | ||
+ | /*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 */ | ||
+ | </pre> | ||
[[Catégorie:Générateurs de documentation]] | [[Catégorie:Générateurs de documentation]] |
Version du 19 décembre 2010 à 14:55
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 */