/* for removing .Z suffix from certain HREFs, needed because some mirror sites like to publish compressed files and some sites don't. */ /* Eric Grosse 30 Jul 1995 */ #include #include #include #include int NR = 0; /* line number, for error messages */ char *FN; #define SMAX 4096 char* findfile(char*filename,char*right) { char *f, *e; *filename = 0; f = right; if(*f=='"'){ f++; for(e = f; *e!='#' && *e!='"'; e++) if(*e==0){ fprintf(stderr,"unmatched \" at %s:%d\n",FN,NR); return(e); } }else{ for( e = f; *e!='#' && *e!='>' && *e!=' '; e++) if(*e==0){ fprintf(stderr,"unterminated HREF at %s:%d\n",FN,NR); return(e); } } strncpy(filename,f,e-f); filename[e-f] = 0; return(e); } /* returns length of compression suffix (e.g. 2 for ".Z") if pointer should apparently be to uncompressed file, else returns 0 */ int suffix(char*filename) { int n, suff = 0; if(*filename==0 || strchr(filename,':')) return(0); n = strlen(filename); if(strcmp(filename+n-2,".Z")==0) suff = 2; else if(strcmp(filename+n-3,".gz")==0) suff = 3; if(suff==0 || access(filename,R_OK)==0) return(0); filename[n-suff] = 0; if(access(filename,R_OK)==0) return(suff); return(0); } char* match_assn(char *pat, char *text) { while(*pat){ if(*pat==*text || isupper(*text) && *pat==tolower(*text) ){ pat++; text++; }else return(0); } while(*text==' ') text++; if(*text!='=') return(0); text++; while(*text==' ') text++; return(text); } int main(int argc, char**argv) { FILE *I, *Z; char *Ztmp, line[SMAX], *left, *right, *href, filename[SMAX]; int suff; if(argc!=2) exit(1); FN = argv[1]; if(right = strrchr(FN,'/')){ *right = 0; chdir(FN); /* cd to local dir, so relative HREFs work */ FN = right+1; } I = fopen(FN,"r"); if(I==NULL){ fprintf(stderr,"can't open %s\n",FN); exit(3); } Ztmp = tmpnam(0); Z = fopen(Ztmp,"w"); if(Z==NULL){ fprintf(stderr,"can't open %s\n",Ztmp); exit(3); } while(fgets(line,sizeof(line),I)!=NULL){ NR++; left = right = line; while(*right){ if(href = match_assn("href",right)){ right = findfile(filename,href); suff = suffix(filename); fwrite(left,1,right-left-suff,Z); left = right; }else right++; } if(left!=right){ fwrite(left,1,right-left,Z); } } fclose(I); I = fopen(FN,"w"); if(I==NULL){ fprintf(stderr,"can't reopen %s for writing\n",FN); exit(3); } fclose(Z); Z = fopen(Ztmp,"r"); if(Z==NULL){ fprintf(stderr,"can't reopen %s\n",Ztmp); exit(3); } while(fgets(line,sizeof(line),Z)!=NULL) fputs(line,I); fclose(I); fclose(Z); remove(Ztmp); exit(0); }