/* for removing .Z suffix from certain HREFs, needed because some mirror
sites like to publish compressed files and some sites don't. */
/* Eric Grosse <ehg@research.att.com> 30 Jul 1995 */
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <unistd.h>
nt NR = 0;
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 */
nt
{
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);
}
nt
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);
}
.