home *** CD-ROM | disk | FTP | other *** search
/ Frozen Fish 2: PC / frozenfish_august_1995.bin / bbs / d07xx / d0744.lha / FO2 / Sources_FO2 / Check.c < prev    next >
C/C++ Source or Header  |  1992-10-12  |  4KB  |  200 lines

  1. #include "defs.h"
  2.  
  3. Prototype CheckDosStruct();
  4. Prototype explore(WORD bloc,WORD parent);
  5. Prototype CheckHeader(struct DiskList *dlist);
  6. Prototype CheckFList(WORD bloc,WORD fhb);
  7. Prototype CheckLink(WORD dataB,WORD fhB);
  8. Prototype badFile(BYTE *adrName);
  9. Prototype NotSet(WORD bloc,WORD where);
  10.  
  11. CheckDosStruct()
  12. {
  13. struct DiskList *dlist;
  14. WORD n;
  15. struct RootB *adr;
  16. BYTE val;
  17.  
  18.     dlist=whereB(880);
  19.     if (dlist==0) NotSet(880,880);
  20.     else
  21.  
  22.  
  23.     {    adr=(struct RootB *)dlist->dl_AdrB;
  24.         for (n=0;n<72;n++) /* 72 compris puisque n++ */
  25.         {
  26.             if (val=explore(adr->HashTable[n],880))
  27.             {
  28.                 if (val==1) exit(0);
  29.                 if (val==2) return(2);
  30.             }
  31.         }
  32.     }
  33. }
  34.  
  35. /*    explore: suit une chaine de Hash α partir du bloc header en paramΦtre */
  36.  
  37. explore(bloc,parent)
  38. WORD bloc;
  39. WORD parent;
  40. {
  41. struct DiskList *dlist; 
  42. WORD n,nextbloc;
  43. struct UserDirB *adr;
  44. BYTE val;
  45.  
  46.     if (bloc==0) return(0);
  47.     val=HandleIDCMP2(FOWin);
  48.     if (val==2) return(val);
  49.     /*printf("dans explore bloc: %d, parent: %d\n",bloc,parent);*/
  50.     dlist=VarAdr->disklist;
  51.     while (dlist->dl_Bloc!=bloc && dlist!=0)        dlist=dlist->dl_NextB;
  52.  
  53.     if (dlist==0) NotSet(bloc,parent);
  54.     else
  55.  
  56.     if (dlist->dl_Type!=-1 && dlist->dl_Type!=4)
  57.     {
  58.         fprintf (FPointer,"ERR : Block #%d SHOULD BE Header or UserDir block\n",bloc);
  59.         err++;
  60.     }
  61.  
  62.     if (dlist->dl_types.dl_type4.dl_Parent!=parent)
  63.     {
  64.         fprintf(FPointer,"ERR : Link Error between block #%d and #%d\n",bloc,parent);
  65.         err++;
  66.     }
  67.  
  68.     if (dlist->dl_Type==-1) CheckHeader(dlist);
  69.     if (dlist->dl_Type==4) 
  70.     {
  71.         adr=(struct UserDirB *)dlist->dl_AdrB;
  72.         for (n=0;n<72;n++)
  73.         {
  74.             if (val=explore(adr->HashTable[n],bloc))
  75.             {
  76.                 if (val==1) exit(0);
  77.                 if (val==2) return(2);
  78.             }
  79.         }
  80.     }
  81.  
  82.     if (nextbloc=dlist->dl_types.dl_type1.dl_NextHash==0) return(0);
  83.     else explore(nextbloc,parent);
  84. }
  85.  
  86. CheckHeader(dlist)
  87. struct DiskList *dlist;
  88. {
  89. WORD bloc,n;
  90. struct FileHeaderB *adr;
  91. BYTE errfile=0;
  92.  
  93.     bloc=dlist->dl_Bloc;
  94.     /*printf("dans CheckHeader bloc: %d\n",bloc);*/
  95.     adr=dlist->dl_AdrB;
  96.  
  97.     if (FFS==0)
  98.     {
  99.         for (n=0;n<72;n++)
  100.         {
  101.             errfile+=CheckLink(adr->DataTable[n],bloc);
  102.         }
  103.     }
  104.     if (adr->Extension) CheckFList(adr->Extension,bloc);
  105.     
  106.  
  107.     if (errfile) badFile(adr->FileName);
  108.     return(0);
  109. }
  110. CheckFList(bloc,fhb)
  111. WORD bloc,fhb;
  112. {
  113. struct SFileListB *dlistFL;
  114. struct FileListB  *adr;
  115. BYTE   errfile=0;
  116. WORD   n;
  117.  
  118.     dlistFL=whereB(bloc);
  119. /*    printf("dans CheckFList bloc: %d, pour FHB: %d\n",bloc,fhb);*/
  120.     if (dlistFL==0) NotSet(bloc,fhb);
  121.     else{
  122.     if (dlistFL->dl_Type!=13)
  123.     {
  124.         fprintf(FPointer,"ERR : Block #%d SHOULD BE FileList block\n",bloc);
  125.         err++;
  126.         errfile++;
  127.     }
  128.     else
  129.     {
  130.         adr=(struct FileListB *)dlistFL->dl_AdrB;
  131.         if (adr->ParentFH!=fhb)
  132.         {
  133.             fprintf(FPointer,"ERR : Link Error between block #%d and #%d\n",bloc,fhb);
  134.             err++;
  135.         }
  136.         if (FFS==0)
  137.         {
  138.             for (n=0;n<72;n++)
  139.             {
  140.                 errfile+=CheckLink(adr->DataTable[n],fhb);
  141.             }
  142.         }
  143.     }
  144.     if (adr->Extension) errfile+=CheckFList(adr->Extension,fhb);
  145.     }
  146.     return(errfile);
  147. }
  148.  
  149. CheckLink(dataB,fhB)
  150. WORD dataB,fhB;
  151. {
  152. struct SDataB *dlist;
  153. BYTE errdata=0;
  154.  
  155.     if (dataB==0) return(0);
  156. /*    printf("dans CheckLink data : %d, fh : %d\n",dataB,fhB);*/
  157.     dlist=(struct SDataB *)VarAdr->disklist;
  158.     while (dlist->dl_Bloc!=dataB && dlist!=0)        dlist=dlist->dl_NextB;
  159.  
  160.     if (dlist==0) NotSet(dataB,fhB);
  161.     else
  162.  
  163.     if (dlist->dl_Type!=8)
  164.     {
  165.         fprintf(FPointer,"ERR : Block #%d SHOULD BE data block (pointed by FHB #%d)\n",dataB,fhB);
  166.         err++;
  167.         errdata=1;
  168.     }
  169.     else
  170.     if (dlist->dl_type8.dl_FileHeader!=fhB)
  171.     {
  172.         fprintf(FPointer,"ERR : Link Error between block #%d and #%d\n",fhB,dataB);
  173.         err++;
  174.         errdata=1;
  175.     }
  176.     return(errdata);
  177. }
  178.  
  179. badFile(adrName)
  180. BYTE *adrName;
  181. {
  182. BYTE length;
  183. BYTE buff[30];
  184.  
  185.     length=*adrName;
  186.     adrName++;
  187.     strncpy(buff,adrName,length);
  188.     buff[length]=0;
  189.     buff[length+1]='I';
  190.     
  191.     fprintf(FPointer,"File %s contains errors\n",buff);
  192. }
  193.  
  194. NotSet(bloc,where)
  195. WORD bloc,where;
  196. {
  197.     fprintf(FPointer,"Block #%d Not Found ! (not unset in BitMap), in #%d\n",bloc,where);
  198.     err++;
  199. }
  200.