#include #include #include #define MAX 1000 #define NTAG 107 struct tag { char *mot; int cpt; } tabtag[] = { "!--",1, "A",2, "ABBREV",2, "ACRONYM",2, "ADDRESS",2, "APPLET",2, "AREA",1, "AU",2, "AUTHOR",2, "B",2, "BANNER",2, "BASE",1, "BASEFONT",1, "BGSOUND",1, "BIG",2, "BLINK",2, "BLOCKQUOTE",2, "BODY",2, "BQ",2, "BR",1, "CAPTION",2, "CENTER",2, "CITE",2, "CODE",2, "COL",2, "COLGROUP",2, "CREDIT",2, "DD",1, "DEL",2, "DFN",2, "DIR",2, "DIV",2, "DL",2, "DT",1, "EM",2, "EMBED",2, "FIG",2, "FONT",2, "FORM",2, "FRAME",1, "FRAMESET",2, "H1",2, "H2",2, "H3",2, "H4",2, "H5",2, "H6",2, "HEAD",2, "HR",1, "HTML",2, "I",2, "IFRAME",2, "IMG",1, "INPUT",1, "INS",2, "ISINDEX",2, "KBD",2, "LANG",2, "LAYER",2, "LI",1, "LINK",1, "LISTING",2, "MAP",2, "MARQUEE",2, "MATH",2, "MENU",2, "META",1, "NOBR",2, "NOFRAMES",2, "NOTE",2, "OL",2, "OPTION",1, "OVERLAY",2, "P",1, "PARAM",1, "PERSON",2, "PLAINTEXT",2, "PRE",2, "Q",2, "RANGE",2, "SAMP",2, "SCRIPT",2, "SELECT",2, "SMALL",2, "SPACER",1, "SPAN",2, "SPOT",2, "STRIKE",2, "STRONG",2, "STYLE",2, "SUB",2, "SUP",2, "TAB",2, "TABLE",2, "TD",2, "TEXTAREA",2, "TEXTFLOW",1, "TFOOT",2, "TH",2, "TITLE",2, "TR",2, "TT",2, "U",2, "UL",2, "VAR",2, "WBR",1, "XMP",2 }; char pile[MAX]; int analise(FILE *); char veriftag(FILE *fpe,int ); char allerfintag(FILE *,char ,int); void analisetagsortie(char s[],int ); int dicho(char * , struct tag tab[], int ); void empiler(int f); int depiler(void); main(int argc, char *argv[]) { FILE *fp; int n; if(argc == 1 ) printf("ahtml file : analyse HTML files"); else while(--argc > 0) if ((fp = fopen(*++argv,"r")) == NULL) {printf("ahtml : can't open %s\n",*argv); return 1; } else { n=1; n=analise(fp); fclose(fp); printf("file %s - %d ligns\n",*argv,n); } return 0; } /*###############################################################*/ int analise(FILE *fpe) { int c,n=1; while((c=fgetc(fpe))!=EOF) { if(c=='\n') n++; if(c=='<') c=veriftag(fpe,n); if(c==EOF) exit(0); } return n; } /*#################################################################*/ char veriftag(FILE *fpe,int n) { char mottag[13]; char c=fgetc(fpe); int k,i=0; if (c=='/') { while((c=fgetc(fpe))!='>' && c!=EOF && c!=' ' && i<11 && c!='\n') { mottag[i++] = toupper(c); } if(c=='\n') n++; mottag[i]='\0'; if(i>10) {printf("L%d: <%s> tag unknown\n",n,mottag); return 0;} else if(c==EOF) { printf("L%d: strange end of file\n",n); return EOF; } else { analisetagsortie(mottag,n); return allerfintag(fpe,c,n); } } else { mottag[i++] = toupper(c); while(( c=fgetc(fpe))!='>' && c!=EOF && c!=' ' && i<11 && c!='\n') mottag[i++] = toupper(c); mottag[i]='\0'; if(c=='\n') n++; if(i>10) {printf("L%d: <%s> tag unknown\n",n,mottag); return 0;} else if(c==EOF) { printf("L%d: strange end of file\n",n); return EOF; } else { if((k=dicho(mottag,tabtag,NTAG))<0) { printf("L%d: <%s> tag unknown\n",n,mottag); } else { if((tabtag[k].cpt)>1) empiler(k); } return allerfintag(fpe,c,n); } } } char allerfintag(FILE *fpe,char d,int n) { while((d!='>') && (d!=EOF)) { if(d=='\n') n++; d=fgetc(fpe); } return d; } void analisetagsortie(char s[],int t) { int k,dep2,dep=depiler(); char *u[13]; if((k=dicho(s,tabtag,NTAG))!=dep) { if(tabtag[k].cpt==1) {empiler(dep); printf("L%d: unexpected.\n",t,tabtag[k].mot);} else { if((dep2=depiler())==k) { if(dep<0) *u="Unknown"; else *u=tabtag[dep].mot; printf("L%d: expected.\n",t,*u); } else { if(k<0) *u="Unknown"; else *u=tabtag[k].mot; empiler(dep2); empiler(dep); printf("L%d: not opened\n",t,*u); } } } } int dicho(char *mot, struct tag tab[], int n) { int cond,bas=0,haut=n-1,milieu; while(bas <= haut) { milieu = (bas+haut)/2; if ((cond = strcmp(mot,tab[milieu].mot)) < 0) haut = milieu - 1; else if (cond >0) bas = milieu + 1; else return milieu; } return -1; } #define MAXVAL 200 int pp = 0; int val[MAXVAL]; void empiler(int f) { if(pp 0) return val[--pp]; else { return -2; } }