home *** CD-ROM | disk | FTP | other *** search
/ PC World 1999 June / PCWorld_1999-06_cd.bin / Komunik / Offline / RFAT / Rfat.exe / RFAT.CPP < prev    next >
C/C++ Source or Header  |  1997-10-20  |  10KB  |  364 lines

  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <alloc.h>
  4. #include <io.h>
  5. #include <string.h>
  6. #include <conio.h>
  7. #include <dos.h>
  8. #include <dir.h>
  9. #define INPUTNAME "fat.db"
  10. #define URL_OFFSET 8
  11. #define DOS_OFFSET 33
  12. #define TYPE_OFFSET 71
  13. #define strncpy0(dst,src,c) strncpy(dst,src,c);*((dst)+(c))=0;
  14.  
  15. typedef struct { char *sch,*loc,*pth,*fil,*prt;} Turl;
  16.  
  17. typedef struct Tpol *Ppol;
  18. struct Tpol{ char *url,*dos;
  19.              char HTML;
  20.              Ppol nxt;};
  21. Ppol first=NULL;
  22. Turl urla;
  23.  
  24. int searchfor (char *what,char *from,char **to)
  25. {
  26.  int i;
  27.  *to=from;
  28.  do {
  29.     for (i=0;i<=strlen(what);i++) if (**to==what[i]) return(**to);
  30.     (*to)++;
  31.  }while (1);
  32. }
  33.  
  34. void urlsplit (char *urls,Turl *surl)
  35. {
  36.  char *pos,*urle;
  37.  int zn;
  38.  memset(surl,0,sizeof(*surl));
  39.  zn=searchfor (":/#",urls,&urle);
  40.  if (zn==':') {
  41.     surl->sch=(char*)malloc(urle-urls+1);
  42.     strncpy0(surl->sch,urls,urle-urls);
  43.     urls=urle+1;
  44.     zn=searchfor("/#",urls,&urle);
  45.  }
  46.  if (zn=='/' && (*(urle+1)=='/')) {
  47.     urls=urle+2;
  48.     zn=searchfor ("/#",urls,&urle);
  49.     surl->loc=(char*)malloc (urle-urls+1);
  50.     strncpy0 (surl->loc,urls,urle-urls);
  51.     urls=urle;
  52.  }
  53.  urle=urls;pos=NULL;
  54.  while (*urle) if (*urle++=='/') pos=urle-1;
  55.  if (pos!=NULL) {
  56.     surl->pth=(char*)malloc (pos-urls+2);
  57.     strncpy0 (surl->pth,urls,pos-urls+1);
  58.     urls=pos+1;
  59.  }
  60.  urle=urls;
  61.  while (*urle && *urle!='#') urle++;
  62.  if (urle-urls) {
  63.     surl->fil=(char*)malloc (urle-urls+1);strncpy0 (surl->fil,urls,urle-urls);
  64.  }
  65.  if (*urle=='#') surl->prt=strdup (urle+1);
  66.  return;
  67. }
  68.  
  69.  
  70. Turl urls;
  71.  
  72. void Rename (char *url, char *dos)
  73. { char name[20]={0},c;
  74.   Turl urlx;
  75.   int i;
  76.   urlsplit (url,&urlx);
  77.   for (i=0;urlx.fil[i] && urlx.fil[i]!='.' && i<8;i++) name[i]=urlx.fil[i];
  78.   if (urlx.fil[i]) {
  79.      for (int ii=strlen(urlx.fil);urlx.fil[ii]!='.' && ii;ii--);
  80.      if (ii) strncpy(name+i,urlx.fil+ii,4);
  81.   }
  82.   for (c='0';rename(dos,name) && c<='9';c++) name[0]=c;
  83.   if (c<='9') strcpy (dos,name);
  84. }
  85.  
  86. void addpol (char *url,char *dos,char *typ)
  87. { Ppol p;
  88.   char name[50];
  89.   if ( (p=(Tpol*)malloc(sizeof(*p))) ==NULL) {
  90.      printf ("Not enough memory!\n");
  91.      exit(1);
  92.   }
  93.   strcpy (name,dos);
  94.   Rename (url,name);
  95.   p->url=strdup(url);
  96.   p->dos=strdup(name);
  97.   p->HTML=!strcmpi("text/html",typ);
  98. //  printf ("%-12s %s\n",p->dos,p->url);
  99.   p->nxt=first;
  100.   first=p;
  101. }
  102.  
  103. void readblock (char *name)
  104. { FILE *f;
  105.   char ldc[4]={'|','/','-','\\'};
  106.   unsigned char *buf;
  107.   typedef struct {
  108.           unsigned int URL,DOS;} Tblck;
  109.   Tblck *blck;
  110.   int i,cnt;
  111.  
  112.   printf ("Reading %s ...",name);
  113.   if ((f=fopen (name,"rb"))==NULL) {
  114.      printf ("File %s not found\n",name);
  115.      exit (1);
  116.   }
  117.   fseek (f,0x1000,SEEK_SET);
  118.   buf=(unsigned char*)malloc (0x1000);
  119.   while (fread (buf,0x1000,1,f)) {
  120.         if (*buf>200) continue;
  121.         cnt=*buf/2;
  122. //        if (*buf%2!=0) {printf ("!!!");};
  123.         blck=(Tblck*)(buf+2);
  124.         for (i=0;i<cnt;i++) {
  125.             if (!access(buf+blck[i].DOS+DOS_OFFSET,0x00))
  126.                addpol (buf+blck[i].URL+URL_OFFSET,buf+blck[i].DOS+DOS_OFFSET,buf+blck[i].DOS+TYPE_OFFSET+strlen(buf+blck[i].DOS+DOS_OFFSET));
  127.             putchar (ldc[i%4]);putchar (0x8);
  128.         }
  129.   }
  130.   fclose (f);
  131.   printf ("done.\n");
  132. }
  133.  
  134.  
  135. Turl url;
  136. FILE *fi,*fo,*fm;
  137.  
  138. void list ()
  139. { Ppol p=first;
  140.   while (p!=NULL) {
  141.         fprintf (fm,"%s %s\n",p->dos,p->url);
  142.         p=p->nxt;
  143.   }
  144.   fprintf (fm,"\n");
  145. }
  146.  
  147. enum Tlem {VYK,EQ,STR,STP,ATR} lem;
  148. char lematr[200];
  149. char symb;
  150.  
  151. void readchar (int cpy)
  152. { if (cpy) fputc(symb,fo);
  153.   symb=fgetc(fi);
  154. }
  155.  
  156. enum Tlem la (int cpy)
  157. {
  158.  int i;
  159.  while (symb==' '||symb=='\n') readchar(1);
  160.  switch (symb) {
  161.         case '=':readchar(1);return EQ;
  162.         case '>':fputc('>',fo);case -1:return STP;
  163.         case '!':fputc('!',fo);return VYK;
  164.         case '"':i=0;
  165.                  readchar(cpy);
  166.                  while (symb!=-1&&symb!='"') {
  167.                        lematr[i++]=symb;
  168.                        readchar(cpy);
  169.                  }
  170.                  lematr[i]=0;
  171.                  readchar(cpy);
  172.                  return STR;
  173.         default:i=0;
  174.                 while (symb!=-1&&symb!='>'&&symb!='='&&symb!=' '&&symb!='\n') {
  175.                       lematr[i++]=symb;
  176.                       readchar(cpy);
  177.                 }
  178.                 lematr[i]=0;
  179.                 if (i>200) sound (1000);
  180.                 return ATR;
  181.  }
  182. }
  183.  
  184. void freeurl (Turl x)
  185. {
  186.   if (x.sch!=NULL) free (x.sch);
  187.   if (x.loc!=NULL) free (x.loc);
  188.   if (x.pth!=NULL) free (x.pth);
  189.   if (x.fil!=NULL) free (x.fil);
  190.   if (x.prt!=NULL) free (x.prt);
  191. }
  192.  
  193.  
  194. void makepth (char *a, char *r,char *ret)
  195. {
  196.  char tmp[200],*f,*fs;
  197.  strcpy(tmp,a);
  198.  strcat (tmp,r);
  199.  f=tmp;
  200.  while (*f) {
  201.        if (!strncmp(f,"/./",3)) strcpy (f,f+2);
  202.        f++;
  203.  }
  204.  while ((f=strstr(tmp,"/../"))!=NULL) {
  205.        fs=f-1;
  206.        while (fs>=tmp&&*fs!='/') fs--;
  207.        if (fs<tmp) break;
  208.        strcpy (fs,f+3);
  209.        f=fs;
  210.  }
  211.  strcpy (ret,tmp);
  212. }
  213.  
  214.  
  215.  
  216.  
  217. char * findurl (Turl urla,Turl urlr,char *dos)
  218. {
  219.   Ppol p=first;
  220.   char tmp [200],tmp2[200];
  221. //  printf ("pamet:%u\n",coreleft());
  222.   if (urlr.sch==NULL) urlr.sch=strdup(urla.sch);
  223.   if (urlr.loc==NULL) {
  224.      urlr.loc=strdup(urla.loc);
  225.      if (urlr.pth==NULL) {
  226.         urlr.pth=strdup(urla.pth);
  227.         if (urlr.fil==NULL) urlr.fil=strdup(urla.fil);
  228.      } else if (urlr.pth[0]!='/') {
  229.        strcpy(tmp,urlr.pth);
  230.        if (urlr.fil!=NULL) strcat (strcat (tmp,urlr.fil),"/");
  231.        makepth(urla.pth,tmp,tmp2);
  232.        urlr.pth=(char*)realloc(urlr.pth,strlen(tmp2)+1);
  233.        strcpy (urlr.pth,tmp2);
  234.        *urlr.fil=0;
  235.      }
  236.   }
  237.   strcat (strcpy (tmp,urlr.sch),"://");
  238.   if (urlr.loc!=NULL) strcat (tmp,urlr.loc);
  239.   if (urlr.pth!=NULL) strcat (tmp,urlr.pth);
  240.   if (urlr.fil!=NULL) strcat (tmp,urlr.fil);
  241.   strcpy (tmp2,tmp);
  242.   if (tmp[strlen(tmp2)-1]!='/') strcat (tmp2,"/"); else tmp2[strlen(tmp2)-1]=0;
  243. //  printf ("\n Looking for:%s\n%s\n",tmp,tmp2);
  244.   while (p!=NULL) {
  245.         if (!strcmp(tmp,p->url)) break;
  246.         if (!strcmp(tmp2,p->url)) break;
  247.         p=p->nxt;
  248.   }
  249.   if (p!=NULL){
  250. //     printf ("Found %s\n",p->url);
  251.      strcpy (dos,p->dos);
  252.      if (urlr.prt!=NULL) strcat (strcat (dos,"#"),urlr.prt);
  253.      freeurl (urlr);
  254.      return dos;
  255.   } else {
  256.     fprintf (fm,"NF: %s %s\n",tmp,tmp2);
  257.     freeurl (urlr);
  258.     return NULL;
  259.   }
  260. }
  261.  
  262. void searchforatr (char *atr)
  263. {
  264.   char dosnm[200];
  265.   Turl urlr;
  266.   while (lem!=STP)
  267.         if ((lem=la(1))==ATR&& !strcmpi(lematr,atr))
  268.            if ((lem=la(1))==EQ) {lem=la(0);
  269.               if (lem==STR || lem==ATR) {
  270.                  urlsplit (lematr,&urlr);
  271.                  if (findurl (urla,urlr,dosnm)!=NULL) {
  272.                     printf ("y");
  273.                     fprintf (fo,"\"%s\"",dosnm);
  274.                  } else {
  275.                    printf ("N");
  276.                    fprintf(fo,"\"%s\"",lematr);
  277.                  }
  278.               }
  279.            }
  280. }
  281.  
  282. void changelinks ()
  283. {
  284.  Ppol p=first;
  285.  int c;
  286.  char dosnm[50];
  287.  mkdir ("NEW");
  288.  while (p!=NULL) {
  289.        if (p->HTML) {
  290.           printf ("DOS: %s\nURL: %s\n",p->dos,p->url);
  291.           fi=fopen (p->dos,"r");
  292.           strcat (strcpy (dosnm,"NEW\\"),p->dos);
  293.           fo=fopen (dosnm,"w");
  294.           urlsplit (p->url,&urla);
  295.           while ( (c=fgetc(fi)) !=-1) {
  296.                 if (c=='<') {
  297.                    fputc(c,fo);
  298.                    symb=fgetc(fi);
  299.                    lem=la(1);
  300.                    switch (lem) {case VYK:do fputc(c=fgetc(fi),fo);
  301.                                              while (c!='>');
  302.                                              break;
  303.                    case ATR:
  304.                    if (!strcmpi(lematr,"BASE")) {
  305.                       while (lem!=STP)
  306.                             if ((lem=la(1))==ATR&& !strcmpi(lematr,"HREF"))
  307.                                if ((lem=la(1))==EQ) {lem=la(0);
  308.                                   if (lem==STR || lem==ATR) {
  309.                                      freeurl(urla);
  310.                                      urlsplit (lematr,&urla);
  311.                                      fprintf (fo,"\"/.\"");
  312.                                   }
  313.                                }
  314.                    } else if (!strcmpi(lematr,"A"))
  315.                      searchforatr ("HREF");
  316.                    else if (!strcmpi(lematr,"IMG"))
  317.                      searchforatr ("SRC");
  318.                    else if (!strcmpi(lematr,"BODY"))
  319.                      searchforatr ("BACKGROUND");
  320.                    else if (!strcmpi(lematr,"AREA"))
  321.                      searchforatr ("HREF");
  322.                    else if (!strcmpi(lematr,"FRAME"))
  323.                      searchforatr ("SRC");
  324.                    else while (lem!=STP) lem=la(1);
  325.                    }
  326.                 } else fputc (c,fo);
  327.           }
  328.           fclose (fi);
  329.           fclose (fo);
  330.           freeurl(urla);
  331.           printf ("\n");
  332.        }
  333.        p=p->nxt;
  334.  }
  335. }
  336.  
  337.  
  338.  
  339. void main (int argc, char *argv[])
  340. {
  341.   printf (" RFAT 1.0ß 1997\n");
  342.   /*
  343.   urlsplit (argv[1],&url);
  344.   if (url.sch!=NULL) printf ("SCH:  %s\n",url.sch);
  345.   if (url.loc!=NULL) printf ("LOC:  %s\n",url.loc);
  346.   if (url.pth!=NULL) printf ("PTH:  %s\n",url.pth);
  347.   if (url.fil!=NULL) printf ("FIL:  %s\n",url.fil);
  348.   if (url.prt!=NULL) printf ("PRT:  %s\n",url.prt);
  349.   exit(1);
  350.   */
  351.   if (argc==1) readblock (INPUTNAME); else
  352.   readblock (argv[1]);
  353.   printf ("Free mem :%u\n",coreleft());
  354. //  getch();
  355.   if ((fm=fopen ("msg.txt","w"))==NULL) {
  356.      printf ("Can't open MSG file\n");
  357.      exit (1);
  358.   }
  359.   list ();
  360.   changelinks ();
  361.   printf ("\Free mem :%u\n",coreleft());
  362.   fclose (fm);
  363. }
  364.