home *** CD-ROM | disk | FTP | other *** search
/ CBM Funet Archive / cbm-funet-archive-2003.iso / cbm / programming / msdos / xa214f.lzh / xa214f / misc / uncpk.c < prev   
C/C++ Source or Header  |  1997-01-03  |  4KB  |  177 lines

  1. /*
  2.     XA65 - 6502 CROSS ASSEMBLER AND UTILITY SUITE
  3.     UNCPK - HANDLE CPK ARCHIVE FILES
  4.     cOPYRIGHT (c) 1997 aNDR{$e9} fACHAT (A.FACHAT@PHYSIK.TU-CHEMNITZ.DE)
  5.  
  6.     tHIS PROGRAM IS FREE SOFTWARE; YOU CAN REDISTRIBUTE IT AND/OR MODIFY
  7.     IT UNDER THE TERMS OF THE gnu gENERAL pUBLIC lICENSE AS PUBLISHED BY
  8.     THE fREE sOFTWARE fOUNDATION; EITHER VERSION 2 OF THE lICENSE, OR
  9.     (AT YOUR OPTION) ANY LATER VERSION.
  10.  
  11.     tHIS PROGRAM IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL,
  12.     BUT without any warranty; WITHOUT EVEN THE IMPLIED WARRANTY OF
  13.     merchantability OR fitness for a particular purpose.  sEE THE
  14.     gnu gENERAL pUBLIC lICENSE FOR MORE DETAILS.
  15.  
  16.     yOU SHOULD HAVE RECEIVED A COPY OF THE gnu gENERAL pUBLIC lICENSE
  17.     ALONG WITH THIS PROGRAM; IF NOT, WRITE TO THE fREE sOFTWARE
  18.     fOUNDATION, iNC., 675 mASS aVE, cAMBRIDGE, ma 02139, usa.
  19. */
  20.  
  21. #INCLUDE <STDIO.H>
  22. #INCLUDE <STRING.H>
  23.  
  24. #DEFINE MAX(A,B)(((A)>(B))?(A):(B))
  25. #DEFINE MIN(A,B)(((A)<(B))?(A):(B))
  26.  
  27. file *FP;
  28. CHAR NAME[100];
  29. CHAR *S;
  30.  
  31. VOID USAGE(INT ER) {$7b}
  32. PRINTF("UNCPK: HANDLE C64 ARCHIVES\N"
  33.        "  UNCPK [X{$7c}L][V] ARCHIVE-NAME\N"
  34.        "  UNCPK [A{$7c}C][V] ARCHIVE-NAME FILE1 [FILE2 [FILE3 ...]]\N");
  35. EXIT(ER);
  36. {$7d}
  37.  
  38. INT LIST=0,VERBOSE=0,ADD=0,CREATE=0;
  39.  
  40. INT MAIN(INT ARGC, CHAR *ARGV[]){$7b}
  41. INT I,C,C2,FILEOK, NC;
  42. SIZE_T N,N2;
  43. file *FP,*FPO=null;
  44.  
  45. IF(ARGC<=1) {$7b}
  46.   USAGE(1);
  47. {$7d}
  48.  
  49. IF(STRCHR(ARGV[1],(INT)'L')) {$7b}
  50.   LIST=1;
  51. {$7d}
  52. IF(STRCHR(ARGV[1],(INT)'V')) {$7b}
  53.   VERBOSE=1;
  54. {$7d}
  55. IF(STRCHR(ARGV[1],(INT)'A')) {$7b}
  56.   ADD=1;
  57. {$7d}
  58. IF(STRCHR(ARGV[1],(INT)'C')) {$7b}
  59.   CREATE=1;
  60. {$7d}
  61.  
  62. IF(ADD{$7c}{$7c}CREATE) {$7b}
  63.  IF (ARGC<=3) {$7b}
  64.    USAGE(1);
  65.  {$7d}
  66.  IF(ADD) {$7b}
  67.    FPO=FOPEN(ARGV[2],"AB");
  68.  {$7d} ELSE 
  69.  IF(CREATE) {$7b}
  70.    FPO=FOPEN(ARGV[2],"WB");
  71.  {$7d}
  72.  IF(FPO) {$7b}
  73.    IF(!ADD) FPUTC(1,FPO);/* vERSION bYTE */
  74.    FOR(I=3;I<ARGC;I++) {$7b}
  75.      IF(VERBOSE) PRINTF("%S\N",ARGV[I]);
  76.      FP=FOPEN(ARGV[I],"RB");
  77.      IF(FP) {$7b}
  78.        WHILE((S=STRCHR(ARGV[I],':'))) *S='/';
  79.        FPRINTF(FPO,"%S",ARGV[I]);
  80.        FPUTC(0,FPO);
  81.        C=FGETC(FP);
  82.        WHILE(C!=eof) {$7b}
  83.  N=1;
  84.          WHILE((C2=FGETC(FP))==C) {$7b}
  85.    N++;
  86.  {$7d}
  87.  WHILE(N) {$7b}
  88.    IF(N>=4 {$7c}{$7c} C==0XF7) {$7b}
  89.      N2=MIN(255,N);
  90.      FPRINTF(FPO,"\XF7%C%C",(CHAR)N2,(CHAR)C);
  91.      N-=N2;
  92.    {$7d} ELSE {$7b}
  93.      FPUTC(C,FPO);
  94.      N--;
  95.    {$7d}
  96.  {$7d}
  97.  C=C2; 
  98.        {$7d}
  99.        FCLOSE(FP); 
  100.        FPUTC(0XF7,FPO); FPUTC(0,FPO);
  101.      {$7d} ELSE {$7b}
  102.        FPRINTF(STDERR,"cOULDN'T OPEN FILE '%S' FOR READING!",ARGV[I]);
  103.      {$7d}
  104.    {$7d}
  105.    FCLOSE(FPO);
  106.  {$7d} ELSE {$7b}
  107.    FPRINTF(STDERR,"cOULDN'T OPEN FILE '%S' FOR WRITING!",ARGV[1]);
  108.  {$7d} 
  109. {$7d} ELSE {$7b}
  110.  IF (ARGC!=3) {$7b}
  111.     USAGE(1);
  112.  {$7d}
  113.  FP=FOPEN(ARGV[2],"RB");
  114.  IF(FP){$7b}
  115.   IF(FGETC(FP)==1){$7b}
  116.     DO{$7b}
  117.       /* READ NAME */
  118.       I=0;
  119.       WHILE((C=FGETC(FP))){$7b}
  120.         IF(C==eof) BREAK;
  121.         NAME[I++]=C;
  122.       {$7d}
  123.       NAME[I++]='\0';
  124.       IF(!C){$7b}/* END OF ARCHIVE ? */
  125.         WHILE((S=STRCHR(NAME,'/'))) *S=':';
  126.  
  127.         IF(VERBOSE+LIST) PRINTF("%S\N",NAME);
  128.  
  129.         IF(!LIST) {$7b} 
  130.   FPO=FOPEN(NAME,"WB");
  131.           IF(!FPO) {$7b}
  132.      FPRINTF(STDERR,"cOULDN'T OPEN OUTPUT FILE %S !\N",NAME);
  133.           {$7d}
  134.         {$7d}
  135. FILEOK=0;
  136.         WHILE((C=FGETC(FP))!=eof){$7b}
  137.   /* TEST IF 'COMPRESSED' */
  138.           IF(C==0XF7){$7b}
  139.             NC=FGETC(FP);
  140.             IF(!NC) {$7b}
  141.       FILEOK=1;
  142.               BREAK;
  143.             {$7d}
  144.             C=FGETC(FP);
  145.             IF(FPO) {$7b}/* EXTRACT */
  146.               IF(NC!=eof && C!=eof) {$7b}
  147. NC &= 255;
  148.                 WHILE(NC--) {$7b}
  149.                   FPUTC(C,FPO);
  150.                 {$7d}
  151.               {$7d}
  152.     {$7d}
  153.           {$7d} ELSE {$7b}
  154.             IF(FPO) {$7b}
  155.               FPUTC(C,FPO);
  156.             {$7d}
  157.           {$7d}
  158.         {$7d}
  159.         IF(FPO) {$7b}
  160.           FCLOSE(FPO);
  161.           FPO=null;
  162.         {$7d}
  163. IF(!FILEOK) {$7b}
  164.   FPRINTF(STDERR,"uNEXPECTED END OF FILE!\N");
  165. {$7d}
  166.       {$7d} 
  167.        {$7d} WHILE(C!=eof);
  168.   {$7d} ELSE
  169.     FPRINTF(STDERR,"wRONG vERSION!\N");
  170.   FCLOSE(FP);
  171.  {$7d} ELSE {$7b}
  172.   FPRINTF(STDERR,"fILE %S NOT FOUND!\N",ARGV[1]);
  173.  {$7d} 
  174. {$7d}
  175. RETURN(0);
  176. {$7d}
  177.