home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 15 / AACD15.ISO / AACD / Utilities / UnRAR / src_amiga / comment.c < prev    next >
Encoding:
C/C++ Source or Header  |  1999-11-15  |  4.1 KB  |  186 lines

  1. void ViewComment(void)
  2. {
  3.   extern unsigned char PN1,PN2,PN3;
  4.   long CurPos;
  5.   UWORD CommLen,UnpCommLen;
  6.   if (!MainComment)
  7.     return;
  8.   CurPos=ftell(ArcPtr);
  9.   if (ArcFormat==OLD)
  10.     CommLen=getc(ArcPtr)+(getc(ArcPtr)<<8);
  11.   else
  12.   {
  13.     if (ReadHeader(COMM_HEAD)<7 || CommHead.HeadType!=COMM_HEAD || CommHead.HeadSize<7)
  14.       return;
  15.     if (CommHead.HeadCRC!=(UWORD)~HeaderCRC)
  16.     {
  17.       mprintf("\n%s\n",MLogCommHead);
  18.       tseek(ArcPtr,CurPos,SEEK_SET);
  19.       return;
  20.     }
  21.     CommLen=CommHead.HeadSize-SIZEOF_COMMHEAD;
  22.   }
  23.   if (!Opt.DisableComment)
  24.     mprintf("\n");
  25.   if (ArcFormat==OLD && (OldMhd.Flags & MHD_PACK_COMMENT) || ArcFormat==NEW && CommHead.Method != 0x30)
  26.   {
  27.     if (ArcFormat==NEW && (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || CommHead.Method > 0x35))
  28.     {
  29.       tseek(ArcPtr,CurPos,SEEK_SET);
  30.       return;
  31.     }
  32.     if ((UnpMemory=malloc(UNP_MEMORY))==NULL)
  33.     {
  34.       mprintf(MViewCmtOutMem);
  35.       tseek(ArcPtr,CurPos,SEEK_SET);
  36.       return;
  37.     }
  38.     TestMode=2;
  39.     UnpVolume=0;
  40.     if (ArcFormat==OLD)
  41.     {
  42.       UnpCommLen=getc(ArcPtr)+(getc(ArcPtr)<<8);
  43.       CommLen-=2;
  44.       PN1=0;
  45.       PN2=7;
  46.       PN3=77;
  47.       Encryption=13;
  48.     }
  49.     else
  50.     {
  51.       Encryption=0;
  52.       UnpCommLen=CommHead.UnpSize;
  53.     }
  54.     DestUnpSize=UnpCommLen;
  55.     UnpPackedSize=CommLen;
  56.     UnpFileCRC=0xFFFFFFFFL;
  57.     RdUnpPtr=ArcPtr;
  58.     UnpSolid=0;
  59.     Suspend=0;
  60.     Repack=0;
  61.     SkipUnpCRC=0;
  62.     tunpack(UnpMemory,0,(CommHead.UnpVer <= 15) ? OLD_UNPACK:NEW_UNPACK);
  63.     if (ArcFormat==NEW && (UWORD)~UnpFileCRC!=CommHead.CommCRC)
  64.       mprintf("\n%s",MLogCommBrk);
  65.     else
  66.       ShowComment(UnpWrAddr,UnpWrSize);
  67.     free(UnpMemory);
  68.     UnpMemory=NULL;
  69.   }
  70.   else
  71.   {
  72.     if ((TempMemory=malloc(CommLen))==NULL)
  73.     {
  74.       mprintf(MViewCmtOutMem);
  75.       tseek(ArcPtr,CurPos,SEEK_SET);
  76.       return;
  77.     }
  78.     tread(ArcPtr,TempMemory,CommLen);
  79.     if (ArcFormat==NEW && CommHead.CommCRC!=(UWORD)~CRC(0xFFFFFFFFL,TempMemory,CommLen,CRC32))
  80.       mprintf("\n%s",MLogCommBrk);
  81.     else
  82.       ShowComment(TempMemory,CommLen);
  83.     free(TempMemory);
  84.     TempMemory=NULL;
  85.   }
  86.   tseek(ArcPtr,CurPos,SEEK_SET);
  87. }
  88.  
  89.  
  90. void ViewFileComment(void)
  91. {
  92.   long CurPos;
  93.   UWORD CommLen;
  94.   if (!(NewLhd.Flags & LHD_COMMENT) || Opt.DisableComment)
  95.     return;
  96.   if ((CommMemory=malloc(0x8000))==NULL)
  97.     return;
  98.   mprintf("\n");
  99.   CurPos=ftell(ArcPtr);
  100.   if (ArcFormat==OLD)
  101.   {
  102.     CommLen=getc(ArcPtr)+(getc(ArcPtr)<<8);
  103.     tread(ArcPtr,CommMemory,CommLen);
  104.     fwrite(CommMemory,1,CommLen,stdout);
  105.     fflush(stdout);
  106.   }
  107.   else
  108.   {
  109.     if (ReadHeader(COMM_HEAD)<7 || CommHead.HeadType!=COMM_HEAD || CommHead.HeadSize<7)
  110.       return;
  111.     if (CommHead.HeadCRC!=(UWORD)~HeaderCRC)
  112.     {
  113.       mprintf("\n%s",MLogCommHead);
  114.       tseek(ArcPtr,CurPos,SEEK_SET);
  115.       free(CommMemory);
  116.       CommMemory=NULL;
  117.       return;
  118.     }
  119.     if (CommHead.UnpVer < 15 || CommHead.UnpVer > UNP_VER || CommHead.Method > 0x30)
  120.     {
  121.       tseek(ArcPtr,CurPos,SEEK_SET);
  122.       free(CommMemory);
  123.       CommMemory=NULL;
  124.       return;
  125.     }
  126.     tread(ArcPtr,CommMemory,CommHead.UnpSize);
  127.     if (CommHead.CommCRC!=(UWORD)~CRC(0xFFFFFFFFL,CommMemory,CommHead.UnpSize,CRC32))
  128.       mprintf("\n%s",MLogBrokFCmt);
  129.     else
  130.     {
  131.       fwrite(CommMemory,1,CommHead.UnpSize,stdout);
  132.       fflush(stdout);
  133.     }
  134.   }
  135.   tseek(ArcPtr,CurPos,SEEK_SET);
  136.   free(CommMemory);
  137.   CommMemory=NULL;
  138. }
  139.  
  140.  
  141. void ShowComment(UBYTE *Addr,int Size)
  142. {
  143. #ifdef _WIN_32
  144.   char *ChPtr;
  145.   if ((ChPtr=memchr(Addr,0x1A,Size))!=NULL)
  146.     Size=(int)(ChPtr-Addr);
  147. #endif
  148.   if (!Opt.DisableComment)
  149.   {
  150.     switch(KbdAnsi(Addr,Size))
  151.     {
  152.       case 1:
  153.         ShowAnsiComment(Addr,Size);
  154.         break;
  155.       case 2:
  156.         return;
  157.       default:
  158.         fwrite(Addr,1,Size,stdout);
  159.         fflush(stdout);
  160.         break;
  161.     }
  162.   }
  163. }
  164.  
  165.  
  166. int KbdAnsi(UBYTE *Addr,int Size)
  167. {
  168.   int RetCode=0;
  169.   UBYTE *ChPtr;
  170.   while (Size--)
  171.   {
  172.     if (*Addr==27 && *(Addr+1)==91)
  173.     {
  174.       RetCode=1;
  175.       ChPtr=Addr+2;
  176.       while (!(*ChPtr>=65 && *ChPtr<=90 || *ChPtr>=97 && *ChPtr<=122))
  177.         if (*(ChPtr++)==34)
  178.           return(2);
  179.       if (*ChPtr==80 || *ChPtr==112)
  180.         return(2);
  181.     }
  182.     Addr++;
  183.   }
  184.   return(RetCode);
  185. }
  186.