home *** CD-ROM | disk | FTP | other *** search
- Ä»¿ßδóáÑΓß∩ ¡«óδ⌐ »«Γ«τ¡δ⌐ á½ú«α¿Γ¼ ߪáΓ¿∩ ñá¡¡δσ - áßß«µ¿áΓ¿ó¡δ⌐
- ¬«ñ¿α«óΘ¿¬, »«ºó«½∩εΘ¿⌐ ñ«ßΓ¿úáΓ∞ óδß«¬«ú« ¬«φΣΣ¿µ¿Ñ¡Γá ߪáΓ¿∩
- ñó«¿τ¡δσ ñá¡¡δσ, »«½πτÑ¡¡δσ «Γ ¿ßΓ«τ¡¿¬á ¡Ñ¿ºóÑßΓ¡«⌐ »α¿α«ñδ
- (»ÑαѼѡ¡á∩ αáºα∩ñ¡«ßΓ∞ íπ¬ó ó ¡Ñ¿ºóÑßΓ¡«¼ á½Σáó¿ΓÑ).
- Åα¿¼Ñα 1. é«ßßΓá¡áó½¿óáѼá∩ ßΓ᫬á í«½∞ΦÑ
-
- êºóÑßΓ¡«:
-
- á) ßΓ᫬á S1;
-
- í) ßΓ᫬á S1 ½Ñ¬ß¿¬«úαáΣ¿τÑ߬¿ ¼½áñΦÑ ßΓ᫬¿ S2 (í¿Γ αẽ¿τ¿∩ "1");
-
- ó) ¬«½¿τÑßΓó« ¡π½Ñ⌐ n = 9 - ñ½¿¡á "óδΓ∩ª¬¿";
-
- é«ßßΓá¡«ó¿Γ∞ S2:
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
-
- S2 = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
-
- é«ßßΓá¡«ó½Ñ¡¿Ñ ßΓ᫬¿ S2:
-
- a) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ñÑó∩Γ«ú« ¡π½Ñó«ú« í¿Γá ßΓ᫬¿ S1
- ó¬½ετ¿Γѽ∞¡«.
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
-
- S2 = 0 1 0 1 0 1 0 0 0 1 0 0 0 ? ? ? ?
-
- .............................^-------- n = 9
-
- í) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ß½ÑñπεΘÑú« ¡π½Ñó«ú« í¿Γá ßΓ᫬¿ S1.
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
-
- S2 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 ? ?
-
- .................................^
-
- ó) ºáóÑαΦáѼ ßΓ᫬π S2 í¿Γ«¼ αẽ¿τ¿∩.
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
-
- S2 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 ?
-
- ...................................^
-
- æΓ᫬á S2 ó«ßßΓá¡«ó½Ñ¡á.
-
- Åα¿¼Ñα 2. é«ßßΓá¡áó½¿óáѼá∩ ßΓα«¬á ¼Ñ¡∞ΦÑ
-
- êºóÑßΓ¡«:
-
- á) ßΓ᫬á S1;
-
- í) ßΓ᫬á S1 ½Ñ¬ß¿¬«úαáΣ¿τÑ߬¿ ßΓáαΦÑ ßΓ᫬¿ S2 (í¿Γ αẽ¿τ¿∩-"0");
-
- ó) ¬«½¿τÑßΓó« Ññ¿¡¿µ n = 6 - "ñ½¿¡á óδΓ∩ª¬¿";
-
- é«ßßΓá¡«ó¿Γ∞ S2:
-
- S2 = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
-
- é«ßßΓá¡«ó½Ñ¡¿Ñ ßΓ᫬¿ S2:
-
- á) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ΦÑßΓ«ú« Ññ¿¡¿τ¡«ú« í¿Γá ßΓ᫬¿ S1
- ó¬½ετ¿Γѽ∞¡«.
-
- S2 = 0 1 0 1 0 1 0 0 0 1 0 1 1 ? ? ? ?
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
-
- .............................^-------- n = 6
-
- í) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ß½ÑñπεΘÑú« Ññ¿¡¿τ¡«ú« í¿Γá ßΓ᫬¿ S1:
-
- S2 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 ? ?
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
-
- .................................^
-
- ó) ºáóÑαΦáѼ ßΓ᫬π S2 í¿Γ«¼ αẽ¿τ¿∩:
-
- S2 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 ?
-
- S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
-
- ...................................^
-
- æΓ᫬á S2 ó«ßßΓá¡«ó½Ñ¡á.
-
- ï¿ßΓ¿¡ú 1
-
- /* Ac.c - äѼ«¡ßΓαᵿ∩ á½ú«α¿Γ¼á ߪáΓ¿∩ ñá¡¡δσ
- ¼ÑΓ«ñ«¼ áßß«µ¿áΓ¿ó¡«ú« ¬«ñ¿α«óá¡¿∩.
- Æαá¡ß½∩µ¿∩: ZTC -mx -o+time ac.c div.asm
- (ñ½∩ Zortech_C v.3.0r ¿ MS MASM v5.0)
- ï¿ßΓ¿¡ú 2 - div.asm
- çá»π߬ »α«úαá¼¼δ:
- π»á¬«ó¬á AC c ¿ßσ«ñ¡δ⌐_ Σá⌐½ π»á¬«óá¡¡δ⌐_Σá⌐½ [Kc] [bNN]
- αá߻ᬫó¬á AC d π»á¬«óá¡¡δ⌐_Σá⌐½ ¿ßσ«ñ¡δ⌐_Σá⌐½ [Kc] [bNN] */
- #include <<stdlib.h>>
- #include <<stdio.h>>
- #include <<string.h>>
- #include <<time.h>>
- extern unsigned _stack = 32767;
- typedef unsigned char byte;
- typedef signed char sbyte;
- typedef unsigned int word;
- typedef signed int sword;
- typedef unsigned long ulong;
- typedef signed long slong;
- typedef signed short sshort;
- typedef unsigned short ushort;
- /* Ä»αÑñѽѡ¿∩ ¡áßΓα«⌐¬¿ á½ú«α¿Γ¼á */
- /* 128 - »Ñαóá∩ »«½«ó¿¡á Γáí½¿µδ ASCII. 256 - full*/
- #define LTC 256
- /* 256 îá¬ß¿¼á½∞¡á∩ ñ½¿¡á »α«ú¡«º¿απѼ«⌐ ßΓ᫬¿ */
- #define MaxLen 256
- /* 2048 îá¬ß¿¼á½∞¡á∩ Φ¿α¿¡á ó«α«¡¬¿ á¡á½«ú¿⌐ */
- #define Wight 2048
- /* 10 èóá¡Γ τáßΓ«Γ¡«ú« αáß»αÑñѽѡ¿∩ ñ½¿¡ */
- #define StepL 10
- /* 10 èóá¡Γ τáßΓ«Γ¡«ú« αáß»αÑñѽѡ¿∩ ß¿¼ó«½«ó */
- #define StepC 10
- /*2048 ÉẼÑα ¬áñαá áñá»Γ¿ó¡«ú« ¬«ñ¿α«óá¡¿∩ ß¿¼ó«½«ó*/
- #define STC 2048
- /* 1024 ÉẼÑα ¬áñαá áñá»Γ¿ó¡«ú« ¬«ñ¿α«óá¡¿∩ ñ½¿¡ */
- #define STL 1024
- /* ÉẼÑα áßß«µ¿áΓ¿ó¡«⌐ Γáí½¿µδ 1024 ... 262144 */
- #define LSDEF32 262144
- /*Log2int(791*Ld/500) âαá¡¿µá íѽ«ú« Φπ¼á*/
- #define SB(Ld) Log2int(Kc*Ld/500)
- /* éÑß »«º¿µ¿¿ ó ó«α«¡¬Ñ á¡á½«ú¿⌐ */
- #define EVR(l,p) (Log2int(l))?(((l+Lg)>>>>3)+\
- Wight/2/(p)+((l+Lg+1)&7))*Log2int(1+((l+Lg)>>>>3)):0
- /*éÑß ºáóÑαΦáεΘÑú« ¬«ñá ó ºáó¿ß¿¼«ßΓ¿ «Γ »αÑñδßΓ«α¿¿*/
- #define EVRFB(l) (Log2int(l>>>>1))?(l+Lg)*\
- Log2int(l+Lg):0
- /* 11 éÑασ¡∩∩ úαá¡¿µá πß»ÑΦ¡«ßΓ¿ »α«ú¡«º«ó */
- #define Sucsess 11
- /* öπ¡¬µ¿¿ ¼«ñπ½∩ Div.asm ¿º ½¿ßΓ¿¡úá 2 */
- extern ulong _pascal Dvc(ulong A,ulong B,ulong C);
- extern ulong _pascal Dvd(ulong A,ulong B,ulong C);
- extern word _pascal Log2int(word);
- extern word _pascal Log2ie(word);
- extern word _pascal SetBit(byte *,word);
- extern word _pascal GetBit(byte *,word);
- //éÑασ¡∩∩ ¿ ¡¿ª¡∩∩ úαá¡¿µδ áα¿Σ¼ÑΓ¿τÑ߬«⌐ ¬«¼»αÑßß¿¿
- typedef struct { unsigned long L;
- unsigned long H;
- } BND;
- static BND Bp;
- /* æΓαπ¬Γπαá «»¿ßá¡¿∩ πº½á Γáí½¿µδ óÑα«∩Γ¡«ßΓÑ⌐ */
- typedef struct { ulong P; /* ùáßΓ«Γá */
- sshort V; /* ç¡áτÑ¡¿Ñ */
- } UNIT;
- /* ôñá½Ñ¡¡δÑ ¿º ¬«ñ¿α«óá¡¿∩ ß¿¼ó«½δ */
- typedef struct { word L; /* ù¿ß½« πñá½Ñ¡¡δσ */
- UNIT D[LTC]; /* 滿߫¬ πñá½Ñ¡¡δσ */
- byte M[32];/*ü¿Γ«óδ⌐ «íαẠπñá½Ñ¡¡δσ*/
- } DLCR;
- /* ìÑ¿º¼Ñ¡∩ѼδÑ «»αÑñѽѡ¿∩ */
- #define Convert(v) Wight/2-1+(-v)
- #define DeConvert(v) ((v<<=Wight/2-1)?v:Wight/2-1-v)
- static byte *In,*Out,*InTop,*InB;
- static byte **PtrIn,**PtrTop;
- static word Swch;
- static word Kc,Sbt,LS;
- // ÉáßτÑΓ µ¿¬½¿τÑ߬«ú« ¬«ñá »« ¿ºíδΓ«τ¡«ßΓ¿ (CRC)
- word crc(word sz,byte *buf,word nl,word gp)
- { byte a;
- word i,j;
- for(i=0;i<<sz;i++)
- for(a=*(buf+i),j=8;j;j--,a<<<<=1)
- if(((sbyte)a<<0 && (sword)nl>>=0) ||
- ((sbyte)a>>=0 && (sword)nl<<0)) {nl<<<<=1;nl^=gp;}
- else nl<<<<=1;
- return(nl);
- }
- /* 髺óαáΘÑ¡¿Ñ ñ½¿¡δ ß«ó»áñÑ¡¿∩ ßΓ᫬ ó í¿Γáσ. y>>x */
- sword _pascal BitCmpLn(register byte *x,
- register byte *y,word bnd)
- { register word t;
- x-=sizeof(word)-sizeof(byte);
- y-=sizeof(word)-sizeof(byte);
- if((sword)(t=(sizeof(word)<<<<3)-
- Log2ie(*(word *)x^*(word *)y)-1)<<bnd || x<<InB)
- return(0);
- if(t!=(sizeof(word)*8)) return(t-bnd);
- t=1; while(*--(word *)x==*--(word *)y && x>>=InB &&
- t<<MaxLen/sizeof(word)) t++;
- bnd=(t<<<<5)+(sizeof(word)<<<<3)-
- Log2ie(*(word *)x^*(word *)y)-1-bnd;
- if((sword)bnd<<0) return(0);
- return(bnd);
- }
- /* æαáó¡Ñ¡¿Ñ ßΓ᫬. key >> *elem */
- int _pascal F_Cmp(const void *key,const void *elem)
- { register word *a;
- register word *b;
- a=(word *)(*(byte **)elem-sizeof(word)+sizeof(byte));
- b=(word *)((byte *)key-sizeof(word)+sizeof(byte));
- if((byte **)elem<<PtrIn) return(1);
- if((byte **)elem>>PtrTop) return(-1);
- while(*b==*a && (void *)a>>(void *)In) {--a;--b;}
- if(*b<<*a) return(-1);
- if(*b>>*a) return(1);
- return(0);
- }
- /* üδßΓαδ⌐ »«¿ß¬ (ñ¿σ«Γ«¼¿∩) */
- byte **Find(byte **Base,word Len,byte *str)
- {
- word bot,top,dim,a,b;
- bot=NULL;top=Len-1;
- while(top!=bot+1)
- { dim=(bot+top)>>>>1;
- if(str==*(Base+dim)) return(Base+dim);
- if((a=*(word *)(str-sizeof(word)+1))>>
- (b=*(word *)(*(Base+dim)-sizeof(word)+1)))
- bot=dim;
- else if(a<<b) top=dim;
- else if(F_Cmp(str,Base+dim)>>0) bot=dim;
- else top=dim;
- }
- return(Base+bot);
- }
- typedef struct { byte **Ip;
- byte *Vl;
- } TB_tag;
- int FcmpTB(const void *a,const void *b)
- { byte *x,*y,**Ix,**Iy;
- Ix=((TB_tag *)a)->>Ip;
- Iy=((TB_tag *)b)->>Ip;
- if(Ix>>Iy) return(1);
- if(Ix<<Iy) return(-1);
- /*ìÑ߬«½∞¬« ¬á¡ñ¿ñáΓ«ó ¡á «ñ¡« ¼ÑßΓ«*/
- y=((TB_tag *)b)->>Vl;
- x=((TB_tag *)a)->>Vl;
- if(x>>y) return(F_Cmp(x,&y));
- return(-F_Cmp(y,&x));
- }
- word _pascal StrFrcL(byte *,byte *,byte *);
- /* éßΓáó¬á ¡«óδσ π¬áºáΓѽÑ⌐ ¿½¿ ¼«ñ¿Σ¿¬áµ¿∩ ¬áñαá */
- word InsPtr(word Ld,sshort Ln,word *Ltp)
- { TB_tag TB[MaxLen+1];
- byte **top;
- sshort i;
- word l1,l2;
- for(PtrTop=PtrIn+*Ltp-1,i=0;i<<Ln;i++)
- { TB[i].Ip=Find(PtrIn-1,*Ltp+2,In+Ld+i);
- TB[i].Vl=In+Ld+i;
- }
- if(Ln>>1) qsort(TB,Ln,sizeof(TB_tag),FcmpTB);
- if(*Ltp<<=LS)
- for(top=PtrTop,*Ltp=Ld+Ln,PtrTop=PtrIn+*Ltp-1,
- i=Ln;i;top=TB[i].Ip)
- { i--;
- memmove(TB[i].Ip+i+2,TB[i].Ip+1,
- (top-TB[i].Ip)*sizeof(void *));
- *(TB[i].Ip+i+1)=TB[i].Vl;
- }
- else for(i=0;i<<Ln;i++)
- {
- if(TB[i].Ip==PtrTop) {*PtrTop=TB[i].Vl;continue;}
- if(TB[i].Ip<<PtrIn) {*PtrIn =TB[i].Vl;continue;}
- if((l1=StrFrcL(In+Ld,TB[i].Vl,*TB[i].Ip))<<
- (l2=StrFrcL(In+Ld,TB[i].Vl,*(TB[i].Ip+1))))
- {*TB[i].Ip=TB[i].Vl;continue;}
- if(l1!=l2) {*(TB[i].Ip+1)=TB[i].Vl;continue;}
- if(*TB[i].Ip<<*(TB[i].Ip+1)) *TB[i].Ip=TB[i].Vl;
- else *(TB[i].Ip+1)=TB[i].Vl;
- }
- return(Ld+Ln);
- }
- //-------Çα¿Σ¼ÑΓ¿τÑ߬á∩ ¬«¼»αÑßß¿∩-------
- /* 䫺ỿß∞ ¬«ñá »α¿ πúα«ºÑ ß«Ññ¿¡Ñ¡¿∩ úαá¡¿µ
- »α¿ áα¿Σ¼ÑΓ¿τÑ߬«⌐ ¬«¼»αÑßß¿¿ */
- word WriteEnd(word Lo)
- { word a,b,sb;
- sb=Sbt;a=b=1;Bp.L<<<=1;Bp.H<<<<=1;
- while(sb--) {a++;if((slong)Bp.L>>=0L) break; Bp.L<<<<=1;}
- sb=Sbt;
- while(sb--) {b++;if((slong)Bp.H<< 0L) break; Bp.H<<<<=1;}
- Bp.L=0x7fffffffL;if(a>>b) {a=b;Bp.L=~Bp.L;}
- while(a--) { if((slong)Bp.L<<0L) SetBit(Out,Lo);
- Lo++;Bp.L<<<<=1;Sbt--;
- }
- Bp.L=0L;Bp.H=-1L;
- return(Lo);
- }
- static ulong P; //èáñα ñÑΦ¿Σα¿απѼ«ú« ¬«ñá
- //CodAH-áα¿Σ¼ÑΓ¿τÑ߬á∩ ¬«¼»αÑßß¿∩ ¡á »«½¡«¼ ¼¡«ªÑßΓóÑ
- sshort CodAH(UNIT *TabP,word Lt,sshort val,
- word *Loc,slong Sum)
- { UNIT *b,*bp;
- ulong S,D,F;
- word Lo,j;
- if(Lt==1) return(TabP->>V);
- Lo=*Loc;b=TabP;D=Bp.H-Bp.L;S=0L;
- if(D<<Sum) {Lo=WriteEnd(Lo);D=-1L;}
- if(val>>=0) while(b->>V!=val) S+=b++->>P;
- else { for(j=Lo+Sbt,Sbt=32-Sbt;Sbt--;
- P<<<<=1,P+=GetBit(Out,j++));
- F=Dvd(P-Bp.L,Sum,D);
- for(bp=b;S<<=F;S+=b++->>P) bp=b;
- S-=bp->>P;b=bp;
- }
- Bp.H=Bp.L+Dvc(S+b->>P,D,Sum);Bp.L+=Dvc(S,D,Sum)+1;
- S=Bp.H^Bp.L;Sbt=32;
- while((slong)S>>0L)
- { if((slong)(Bp.L)<<0L) SetBit(Out,Lo);
- Lo++;Sbt--;Bp.L<<<<=1;Bp.H<<<<=1;Bp.H++;S<<<<=1;
- }
- *Loc=Lo; return(b->>V);
- }
- /* CodAH_D - áα¿Σ¼ÑΓ¿τÑ߬á∩ ¬«¼»αÑßß¿∩ ¡á »α«αѪѡ¡«¼
- ¼¡«ªÑßΓóÑ */
- /* Åα¿ßó«Ñ¡¿Ñ óÑαΦ¿¡δ */
- UNIT *QT(UNIT *t) {while(!(t--)->>P); return(t+1);}
- /* Åα¿ßó«Ñ¡¿Ñ ñ¡á */
- UNIT *QB(UNIT *b) {while(!(b++)->>P); return(b-1);}
- /* äó¿ªÑ¡¿Ñ ñ¡á óóÑασ */
- UNIT *AB(UNIT *b) {while(!(++b)->>P); return(b);}
- sshort CodAH_D(UNIT *TabP,word Lt,sshort val,
- word *Loc,slong Sum)
- { UNIT *b,*bp;
- ulong S,D,F;
- word Lo,j;
- b=QB(TabP); if(Lt==1) return(b->>V);
- Lo=*Loc;S=0L;D=Bp.H-Bp.L;
- if(D<<Sum) {Lo=WriteEnd(Lo);D=-1L;}
- if(val>>=0) while(b->>V!=val) {S+=b->>P;b=AB(b);}
- else { for(j=Lo+Sbt,Sbt=32-Sbt;Sbt--;
- P<<<<=1,P+=GetBit(Out,j++));
- F=Dvd(P-Bp.L,Sum,D);
- for(bp=b;S<<=F;S+=b->>P,b=AB(b)) bp=b;
- S-=bp->>P;b=bp;
- }
- Bp.H=Bp.L+Dvc(S+b->>P,D,Sum);Bp.L+=Dvc(S,D,Sum)+1;
- S=Bp.H^Bp.L;Sbt=32;
- while((slong)S>>0L)
- { if((slong)(Bp.L)<<0L) SetBit(Out,Lo);
- Lo++;Sbt--;Bp.L<<<<=1;Bp.H<<<<=1;Bp.H++;S<<<<=1;
- }
- *Loc=Lo; return(b->>V);
- }
- /* Stk - «αúá¡¿ºáµ¿∩ ¬«½∞µÑó«ú« ßΓѬá LIFO
- é ß½πτáÑ, Ñß½¿ ßΓѬ ¡Ñ ¡áßδΘÑ¡, ó«ºóαáΘáÑΓ -1,
- ¿¡áτÑ óδΓÑߡѡ¡«Ñ º¡áτÑ¡¿Ñ.
- æΓαπ¬Γπαá ¬«½∞µÑó«ú« ßΓѬá: */
- typedef struct { word L; /* 使¡á ßΓѬá */
- word O; /* Å«º¿µ¿∩ ó ßΓÑ¬Ñ */
- sshort *S;
- } STACK;
- sshort Stk(STACK *St,sshort Ins)
- { sshort t;
- t=*(St->>S+St->>O); *(St->>S+St->>O)=Ins; St->>O++;
- if(St->>O==St->>L) St->>O=0;
- return(t);
- }
- /* î«ñ¿Σ¿¬áµ¿∩ áñá»Γ¿ó¡«⌐ Γáí½¿µδ αáß»αÑñѽѡ¿∩
- τáßëà (ñ½¿¡, ¬«ñ«ó) */
- slong InitTabAH(STACK *Stck,UNIT **Ix_TP,UNIT *TP,
- word Lt,sshort Val,slong Sm,ulong Stp)
- { UNIT *U,tmp;
- for(U=*(Ix_TP+Val),U->>P+=Stp;
- U->>P >>= (U-1)->>P && U>>TP;U--)
- { tmp=*U;*U=*(U-1);*(U-1)=tmp; *(Ix_TP+U->>V)=U;
- *(Ix_TP+(U-1)->>V)=U-1;
- }
- if((Val=Stk(Stck,Val))<<(sshort)0) return(Sm+Stp);
- for(U=*(Ix_TP+Val),U->>P-=Stp;
- U->>P << (U+1)->>P && U+1<<TP+Lt;U++)
- { tmp=*U;*U=*(U+1);*(U+1)=tmp; *(Ix_TP+U->>V)=U;
- *(Ix_TP+(U+1)->>V)=U+1;
- }
- return(Sm);
- }
- /* 髺óαáΘÑ¡¿Ñ ñ½¿¡δ ß«ó»áñÑ¡¿∩ ñóπσ ßΓ᫬ ó íá⌐Γáσ
- ¿ ¬«»¿α«óá¡¿Ñ b->>a (a>>b) */
- sshort _pascal CopyByte(sshort Ls,byte *a,byte *b)
- { sshort t;
- for(t=0;t<<Ls;t++) *(a++)=*(b++);
- if(t>>MaxLen) t=MaxLen;
- return(t);
- }
- /* 髺óαáΘÑ¡¿Ñ ñ½¿¡δ ß«ó»áñÑ¡¿∩ ñóπσ ßΓ᫬ (a>>b) */
- word _pascal StrFrc(register byte *a,register byte *b)
- { register word t;
- byte *top;
- if(*a!=*b || b>>=a || a>>=InTop) return(0);
- for(top=a,t=1;*(++a)==*(++b) && b<<top && a<<InTop;t++);
- if(t>>MaxLen) t=MaxLen;
- return(t);
- }
- word _pascal StrFrcL(byte *top,byte *a,byte *b)
- { register word t;
- if(!b || *a!=*b || a>>=top || b>>=top) return(0);
- for(t=1;*(++a)==*(++b) && b<<top && a<<top;t++);
- if(t>>MaxLen) t=MaxLen;
- return(t);
- }
- word _pascal StrFrc2(byte *top,byte *a,byte *b)
- { register word t;
- if(a<<b) {(word)a^=(word)b;
- (word)b^=(word)a;(word)a^=(word)b;
- }
- if(*a!=*b || a>>=top) return(0);
- for(t=1;*(++a)==*(++b) && a<<top;t++);
- return(t);
- }
- /* ì«α¼á½¿ºáµ¿∩ τáßΓ«Γ¡«ú« αáß»αÑñѽѡ¿∩ */
- slong NormSum(UNIT *Tmp,word Lg,slong SmC)
- { word i;
- while(SmC<<0L) for(SmC=0L,i=0;i<<Lg;i++)
- { (Tmp+i)->>P=((Tmp+i)->>P>>>>1)+1;
- SmC+=(Tmp+i)->>P;
- }
- return(SmC);
- }
- /* Å«ßΓα«Ñ¡¿Ñ ó«α«¡¬¿ á¡á½«ú¿⌐ c »«¿ß¬«¼
- ¼á¬ß¿¼á½∞¡«ú« »α«ú¡«ºá */
- sshort LoadLst(DLCR *Dc,UNIT **I_TPL,UNIT *TPL,
- word Ld,word Ltp,slong SmL,word *Lo,
- sshort Rg,sshort *Pr)
- { word Lg,l1,l2,bl1,bl2;
- byte **ptr,**ptr1,**ptr2,**bptr;
- word Lf,Max,Lt,Pr_L,f;
- slong SmP;
- sshort rk,pz1,pz2,pzs1,pzs2;
- UNIT TPP[Wight];
- UNIT TmL[MaxLen];
- Dc->>L=0;
- memset(Dc->>M,0,32);
- if(Ld<<4) return(-1);
- bptr=ptr=Find(PtrIn-1,Ltp+2,In+Ld-1);
- Lg=SB(Ltp);
- pzs1=pzs2=0;bl1=bl2=l1=l2=0;
- if(ptr>>PtrIn)
- {l1=BitCmpLn(*(ptr-1),In+Ld-1,Lg);pzs1=-1;}
- if(ptr<<PtrTop)
- {l2=BitCmpLn(*(ptr+1),In+Ld-1,Lg);pzs2= 1;}
- if(!(l1+l2)) return(-1);
- if(pzs1) bl1=l1=EVR(l1,-pzs1);
- if(pzs2) bl2=l2=EVR(l2,pzs2);
- if(!(l1+l2)) return(-1);
- memset(TmL,0,MaxLen*sizeof(UNIT));
- ptr2=ptr+1;ptr1=ptr-1;
- for(SmP=0L,Lt=1,Pr_L=Lf=Max=0,pz1=pz2=rk=0;
- l1 || l2;Lt++)
- { if(l2>>=l1)
- { pz2=pzs2;TPP[Lt].V=pzs2; TPP[Lt].P=l2; SmP+=l2;
- if(Rg>>0)
- if((Lf=StrFrc(In+Ld,*ptr2+1))>>Max)
- { Pr_L=Max,rk=pzs2;ptr=ptr2;Max=Lf;
- Dc->>L=0;memset(Dc->>M,0,32);
- memset(TmL,0,MaxLen*sizeof(UNIT));
- if(*ptr2+1+Lf<<In+Ld)
- { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
- (sshort)*(*ptr2+1+Lf));
- Dc->>L++;
- }
- }
- else
- {if(Lf==Max && !GetBit(Dc->>M,*(*ptr2+1+Lf))
- && *ptr2+1+Lf<<In+Ld)
- { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
- (sshort)*(*ptr2+1+Lf));
- Dc->>L++;
- }
- if((Lf=StrFrcL(In+Ld,*ptr2+1,*ptr+1))>>Pr_L)
- TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
- }
- if(pzs2<<(Wight/2-1)) pzs2++;
- else {l2=0;continue;}
- if(++ptr2>>PtrTop) l2=0;
- else {l2=BitCmpLn(*ptr2,In+Ld-1,Lg);
- l2=EVR(l2,pzs2);
- }
- }
- else
- { pz1=pzs1;TPP[Lt].V=Convert(pzs1);
- TPP[Lt].P=l1; SmP+=l1;
- if(Rg>>0)
- if((Lf=StrFrc(In+Ld,*ptr1+1))>>Max)
- { Pr_L=Max,rk=Convert(pzs1);ptr=ptr1;
- Max=Lf;Dc->>L=0;memset(Dc->>M,0,32);
- memset(TmL,0,MaxLen*sizeof(UNIT));
- if(*ptr1+1+Lf<<In+Ld)
- { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
- (sshort)*(*ptr1+1+Lf));
- Dc->>L++;
- }
- }
- else
- { if(Lf==Max && !GetBit(Dc->>M,*(*ptr1+1+Lf))
- && *ptr1+1+Lf<<In+Ld)
- { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
- (sshort)*(*ptr1+1+Lf));
- Dc->>L++;
- }
- if((Lf=StrFrcL(In+Ld,*ptr1+1,*ptr+1))>>Pr_L)
- TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
- }
- if(pzs1>>(-Wight/2)) pzs1--;
- else {l1=0;continue;}
- if(--ptr1<<PtrIn) l1=0;
- else { l1=BitCmpLn(*ptr1,In+Ld-1,Lg);
- l1=EVR(l1,-pzs1);
- }
- }
- }
- if(SmP<<0L) SmP=NormSum(TPP,Lt,SmP);
- TPP[0].V=0;
- TPP[0].P=(5+Sucsess-Swch)*(SmP/Lt+(Sucsess-Swch)/
- Log2int(Lt+1)+Sucsess-Swch);
- SmP+=TPP[0].P;
- if(SmP<<0L) SmP=NormSum(TPP,Lt,SmP);
- if(Rg<<0) rk=-1;
- else if(Max==MaxLen) {Dc->>L=0;memset(Dc->>M,0,32);}
- rk=CodAH(TPP,Lt,rk,Lo,SmP);
- if(!rk) { if(Swch) Swch--;
- if(Rg>>0) return(-1);
- Max=0;goto m;
- }
- if(Swch<<Sucsess) Swch++;
- if(Rg>>0)
- { *Pr=Pr_L;
- for(SmL=0L,Lg=l1=0;l1<<MaxLen;l1++)
- if((TPL+l1)->>V+Pr_L<<In+Ld-*ptr-1)
- { if(TmL[l1].P)
- { TmL[l1].P-=TmL[l1].P>>>>2;
- TmL[Lg].P=(TPL+l1)->>P+STL*TmL[l1].P;
- TmL[Lg].V=(TPL+l1)->>V;
- }
- else TmL[Lg]=*(TPL+l1);
- SmL+=TmL[Lg++].P;
- }
- if(SmL<<0L) SmL=NormSum(TmL,Lg,SmL);
- return(Pr_L+CodAH(TmL,Lg,CopyByte((sshort)Max,
- In+Ld,*ptr+1)-Pr_L-1,Lo,SmL));
- }
- ptr+=(rk=DeConvert(rk));l1=bl1;
- l2=bl2;ptr2=bptr+1;ptr1=bptr-1;
- for(f=1,Pr_L=Lf=0,pzs1=-1,pzs2=1;l1 || l2 ;)
- { if(l2>>=l1)
- {if(pzs2==rk) f=0;
- else if(f)
- {
- if((Lf=StrFrc2(In+Ld,*ptr+1,*ptr2+1))>>Pr_L)
- Pr_L=Lf;
- }
- else
- if((Lf=StrFrcL(In+Ld,*ptr2+1,*ptr+1))>>Pr_L)
- TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
- if(pzs2<<(Wight/2-1)) pzs2++;
- else {l2=0;continue;}
- if(++ptr2>>PtrTop) l2=0;
- else { l2=BitCmpLn(*ptr2,In+Ld-1,Lg);
- l2=EVR(l2,pzs2);
- }
- }
- else
- {if(pzs1==rk) f=0;
- else if(f)
- {
- if((Lf=StrFrc2(In+Ld,*ptr+1,*ptr1+1))>>Pr_L)
- Pr_L=Lf;
- }
- else
- if((Lf=StrFrcL(In+Ld,*ptr1+1,*ptr+1))>>Pr_L)
- TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
- if(pzs1>>(-Wight/2)) pzs1--;
- else {l1=0;continue;}
- if(--ptr1<<PtrIn) l1=0;
- else { l1=BitCmpLn(*ptr1,In+Ld-1,Lg);
- l1=EVR(l1,-pzs1);
- }
- }
- }
- for(*Pr=Pr_L,SmL=0L,Lg=l1=0;l1<<MaxLen;l1++)
- if((TPL+l1)->>V+Pr_L<<In+Ld-*ptr-1)
- { if(TmL[l1].P)
- { TmL[l1].P-=TmL[l1].P>>>2;
- TmL[Lg].P=(TPL+l1)->>P+TmL[l1].P*STL;
- TmL[Lg].V=(TPL+l1)->>V;
- }
- else TmL[Lg]=*(TPL+l1);
- SmL+=TmL[Lg++].P;
- }
- if(SmL<<0L) SmL=NormSum(TmL,Lg,SmL);
- Max=CopyByte(Pr_L+1+CodAH(TmL,Lg,-1,Lo,SmL),
- In+Ld,*ptr+1);
- if(Max==MaxLen) {Dc->>L=0;memset(Dc->>M,0,32);}
- else
- m: { while(pz1)
- { if(StrFrc(In+Ld,*(bptr+pz1)+1)>>=Max)
- if(!GetBit(Dc->>M,*(*(bptr+pz1)+1+Max)) &&
- *(bptr+pz1)+1+Max<<In+Ld)
- { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
- (sshort)*(*(bptr+pz1)+1+Max));
- Dc->>L++;
- }
- pz1++;
- }
- while(pz2)
- { if(StrFrc(In+Ld,*(bptr+pz2)+1)>>=Max)
- if(!GetBit(Dc->>M,*(*(bptr+pz2)+1+Max)) &&
- *(bptr+pz2)+1+Max<<In+Ld)
- { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
- (sshort)*(*(bptr+pz2)+1+Max));
- Dc->>L++;
- }
- pz2--;
- }
- }
- return(Max-1);
- }
- /* è«ñ¿α«óá¡¿Ñ/ñѬ«ñ¿α«óá¡¿Ñ ºáóÑαΦáεΘÑú« ß¿¼ó«½á
- ß πτÑΓ«¼ »α«ú¡«ºá */
- sshort Cod_Forecast(UNIT **I_TPC,UNIT *TPC,word Ld,
- word Ltp,word Ls,word *Lo,slong SmC,sshort Rg)
- { UNIT Tmp[LTC],*Tu;
- word Lg,l1,l2;
- byte **ptr,**ptr1,**ptr2;
- sshort pzs1,pzs2;
- slong SPr;
- if(!Ld) return(CodAH_D(TPC,LTC,(Rg<<0)?-1:
- (sshort)*(In+Ld+Ls),Lo,SmC));
- ptr=Find(PtrIn-1,Ltp+2,In+Ld+Ls-1);
- Lg=SB(Ltp);
- pzs1=pzs2=0;l1=l2=0;
- if(ptr>>PtrIn)
- {l1=BitCmpLn(*(ptr-1),In+Ld+Ls-1,Lg);pzs1=-1;}
- if(ptr<<PtrTop)
- {l2=BitCmpLn(*(ptr+1),In+Ld+Ls-1,Lg);pzs2= 1;}
- if(!(l1+l2)) return(CodAH_D(TPC,LTC,(Rg<<0)?-1:
- (sshort)*(In+Ld+Ls),Lo,SmC));
- l1=EVRFB(l1); l2=EVRFB(l2);
- memset(Tmp,0,LTC*sizeof(UNIT));
- for(SPr=0L,ptr2=ptr+1,ptr1=ptr-1;l1 || l2;)
- { if(l2>>=l1)
- { if((Tu=*(I_TPC+*(*ptr2+1)))->>P)
- {Tmp[Tu-TPC].P+=l2;SPr+=l2;}
- if(pzs2<<(Wight/2-1)) pzs2++;
- else {l2=0;continue;}
- if(++ptr2>>PtrTop) l2=0;
- else { l2=BitCmpLn(*ptr2,In+Ld+Ls-1,Lg);
- l2=EVRFB(l2);
- }
- }
- else { if((Tu=*(I_TPC+*(*ptr1+1)))->>P)
- {Tmp[Tu-TPC].P+=l1;SPr+=l1;}
- if(pzs1>>(-Wight/2)) pzs1--;
- else {l1=0;continue;}
- if(--ptr1<<PtrIn) l1=0;
- else { l1=BitCmpLn(*ptr1,In+Ld+Ls-1,Lg);
- l1=EVRFB(l1);
- }
- }
- }
- { slong Lsmc;
- for(Lsmc=SmC,Lg=l1=0;l1<<LTC;l1++)
- if((TPC+l1)->>P)
- if(Tmp[l1].P)
- { SmC-=(TPC+l1)->>P;
- SmC+=(Tmp[Lg].P=(TPC+l1)->>P+
- (Log2int(Tmp[l1].P>>>>11)+1)*
- Dvc(Lsmc,Tmp[l1].P,SPr));
- Tmp[Lg++].V=(TPC+l1)->>V;
- }
- else Tmp[Lg++]=*(TPC+l1);
- }
- if(SmC<<0L) SmC=NormSum(Tmp,Lg,SmC);
- return(CodAH(Tmp,Lg,(Rg<<0)?-1:
- (sshort)*(In+Ld+Ls),Lo,SmC));
- }
- /* öπ¡¬µ¿∩ π»á¬«ó¬¿/αá߻ᬫó¬¿:
- Ñß½¿ Lc==-1, π»á¬«ó¬á, else +1
- Ln - αẼÑα ¡Ñπ»á¬«óá¡¡δσ ñá¡¡δσ (ó íá⌐Γáσ).
- 髺óαáΘÑ¡¿Ñ ñ½¿¡δ óδσ«ñ¡δσ ñá¡¡δσ (ó íá⌐Γáσ) */
- word pac_unpac(word Ln,word Lc)
- { word Lo,Ld,Ltp,i;
- sshort Pr,Ls,Lst,Rg;
- byte **Pb;
- slong SmC,SmL;
- UNIT *TPL,**I_TPL,*TPC,**I_TPC;
- STACK SC,SL; /* Çñá»Γ¿ó¡δ⌐ íπΣÑα ¬«ñ«ó, ñ½¿¡ */
- DLCR Dc; /* ü¿Γ«óá∩ ¼áß¬á ¿ß¬½ετÑ¡¡δσ ¬«ñ«ó */
- Ld=0; if(Ln>>0x00ffffff) goto m1;
- *(ulong *)InB&=0XFF000000L;
- if(LS>>Ln) LS=Ln;
- if(NULL==(Pb=malloc((LS+MaxLen+2)*sizeof(void **))))
- goto m1;
- if(NULL==(SC.S=(sshort *)malloc(STC*sizeof(sshort))))
- goto m2;
- if(NULL==(SL.S=(sshort *)malloc(STL*sizeof(sshort))))
- goto m3;
- if(NULL==(TPC=(UNIT *)malloc(LTC*sizeof(UNIT))))
- goto m4;
- if(NULL==(I_TPC=(UNIT **)malloc(LTC*sizeof(UNIT *))))
- goto m5;
- if(NULL==(TPL=(UNIT *)malloc(MaxLen*sizeof(UNIT))))
- goto m6;
- if(NULL==(I_TPL=(UNIT**)malloc(MaxLen*sizeof(UNIT*))))
- goto m7;
- for(SmC=LTC,i=0;i<<LTC;i++)
- {(TPC+i)->>P=1L;(TPC+i)->>V=i;*(I_TPC+i)=TPC+i;}
- for(SmL=(slong)MaxLen,i=0;i<<MaxLen;i++)
- {(TPL+i)->>P=1;(TPL+i)->>V=i;*(I_TPL+i)=TPL+i;}
- Bp.L=0L;Bp.H=-1L;*Pb=NULL;--*Pb;InTop=In+Ln;Ls=0;
- memset(SC.S,-1,STC*sizeof(sshort));
- memset(SL.S,-1,STL*sizeof(sshort));
- SC.L=STC;SL.L=STL;SC.O=SL.O=0;
- { word b[6]={45,13,10,7,5,4};
- sshort j;
- for(j=0;j<<6;j++) for(i=b[j];i;i--)
- SmL=InitTabAH(&SL,I_TPL,TPL,MaxLen,j,SmL,StepL);
- }
- for(Rg=(Lc+1)?-1:1,PtrTop=PtrIn=Pb+1,
- Sbt=Swch=Ltp=Lo=Ld=0;Ld<<Ln;Ld=InsPtr(Ld,Ls,&Ltp))
- {if((Ls=LoadLst(&Dc,I_TPL,TPL,Ld,Ltp,
- SmL,&Lo,Rg,&Pr))>>=(sshort)0)
- { SmL=InitTabAH(&SL,I_TPL,TPL,MaxLen,
- Ls-Pr,SmL,StepL);
- Ls++;
- }
- else Ls=0;
- if(In+Ld+Ls<<InTop && (!Ls || Dc.L))
- { slong SmC_L;
- if(Dc.L)
- { for(SmC_L=SmC,i=0;i<<Dc.L;i++)
- { SmC_L-=(Dc.D[i].P=(*(I_TPC+Dc.D[i].V))->>P);
- (*(I_TPC+Dc.D[i].V))->>P=0L;
- }
- if(!Ls)
- Lst=(sshort)(*(In+Ld+Ls)=
- (byte)CodAH_D(TPC,LTC,(Rg<<0)?-1:
- (sshort)*(In+Ld+Ls),&Lo,SmC_L));
- else
- Lst=(sshort)(*(In+Ld+Ls)=
- (byte)Cod_Forecast(I_TPC,TPC,Ld,
- Ltp,Ls,&Lo,SmC_L,Rg));
- for(i=0;i<<Dc.L;i++)
- (*(I_TPC+Dc.D[i].V))->>P=Dc.D[i].P;
- }
- else
- Lst=(sshort)(*(In+Ld+Ls)=
- (byte)CodAH(TPC,LTC,(Rg<<0)?-1:
- (sshort)*(In+Ld+Ls),&Lo,SmC));
- Ls++;
- SmC=InitTabAH(&SC,I_TPC,TPC,LTC,Lst,SmC,StepC);
- }
- if(!((Lo>>>>3) & 0x3F))
- printf("P= %-2u D= %-8u\r",Lo*100/((Ld+Ls)<<<<3),
- Ln-(Ld+Ls));
- }
- Lo=WriteEnd(Lo);
- if(Rg>>0) *(ulong *)(Out-sizeof(ulong)+1)|=(ulong)Ln;
- free(I_TPL);
- m7: free(TPL);
- m6: free(I_TPC);
- m5: free(TPC);
- m4: free(SL.S);
- m3: free(SC.S);
- m2: free(Pb);
- m1: if(!Ld) return(0);
- if(Rg>>0) return(((Lo-1)>>>>3)+sizeof(ulong));
- return(Ln);
- }
- /* öπ¡¬µ¿∩ π»á¬«ó¬¿:
- éσ«ñ: Buf - ñá¡¡δÑ, Ln - ñ½¿¡á (ó íá⌐Γáσ),
- kg - ¬«φΣΣ¿µ¿Ñ¡Γ ߪáΓ¿∩ [0..9999], 0 - ¼á¬ß¿¼á½∞¡«Ñ,
- ls - αẼÑα ¬áñαá (ó íá⌐Γáσ).
- éδσ«ñ: Buf - ñá¡¡δÑ, ó«ºóαáΘáÑΓ ñ½¿¡π (ó íá⌐Γáσ).
- àß½¿ ßó«í«ñ¡«⌐ »á¼∩Γ¿ ¡Ññ«ßΓáΓ«τ¡«, ó«ºóαáΘáÑΓß∩ 0.*/
- word pac(byte *Buf,word Ln,sword kg,word ls)
- {
- Out=Buf+sizeof(ulong)-1;Kc=17+kg;LS=ls;
- if(NULL==(InB=(byte *)malloc(Ln+sizeof(ulong)-1)))
- return(0);
- In=InB+sizeof(ulong)-1;
- memcpy(In,Buf,Ln);
- memset(Buf,0,Ln+sizeof(ulong)-1+(Ln>>>>6));
- Ln=pac_unpac(Ln,(word)(-1));
- free(InB);
- return(Ln);
- }
- /* öπ¡¬µ¿∩ αá߻ᬫó¬¿:
- éσ«ñ: Buf - ñá¡¡δÑ, *Lni - ñ½¿¡á (ó íá⌐Γáσ),
- kg - ¬«φΣΣ¿µ¿Ñ¡Γ ߪáΓ¿∩ [0..9999], 0 - ¼á¬ß¿¼á½∞¡«Ñ,
- ls - αẼÑα ¬áñαá (ó íá⌐Γáσ).
- éδσ«ñ ó«ºóαáΘáÑΓ π¬áºáΓѽ∞ ¡á π»á¬«óá¡¡δÑ ñá¡¡δÑ.
- àß½¿ ßó«í«ñ¡«⌐ »á¼∩Γ¿ ¡Ññ«ßΓáΓ«τ¡«, ó«ºóαáΘáÑΓß∩ 0.
- *Lni -ñ½¿¡á π»á¬«óá¡¡δσ ñá¡¡δσ (ó íá⌐Γáσ).
- Åá¼∩Γ∞, óδñѽѡ¡á∩ »«ñ Buf, «ßó«í«ªñáÑΓß∩.*/
- byte * unpac(byte *Buf,word *Lni,sword kg,word ls)
- { word Ln;
- Out=Buf+sizeof(ulong)-1;Kc=17+kg;LS=ls;
- Ln=0x00ffffff & *(ulong *)Buf;
- if(NULL!=(InB=(byte *)malloc(Ln+sizeof(ulong)-1)))
- {In=InB+sizeof(ulong)-1;
- if(!(Ln=pac_unpac(Ln,1))) {free(InB);InB=NULL;Ln=0;}
- else memmove(InB,In,Ln);
- }
- else Ln=0;
- *Lni=Ln;free(Buf);
- return(InB);
- }
- int main(int argc,char **argv)
- { FILE *fp;
- byte *Buf;
- word Ln,ls;
- time_t Tm;
- sword kg;
- if(argc<<4) { puts("\
- Demonstration of data compressing algorithm\n\
- with associative coding method.\n\
- Author of algorithm and program:\
- Buyanovsky Georgii.(01.01.1994.)\n\
- 480082 CIS, Republic of Kazakhstan Alma-Ata,\
- ul.Valikhanova,10/2\n\
- tel.(home) 8_327_2_690278.\n\
- Format: AC c|d source dest [Kc] [bNN]\n\
- bNN- NN==Size of frame (1024...262144\
- -maximum compressing),default 262144\n\
- Kc- Lavel compressing [0..9999]\
- 0 -maximum compressing,default 2\n");
- return 0;
- }
- ls=LSDEF32;kg=2;
- if(argc>>4) if(*argv[4]=='b') ls=atoi(argv[4]+1);
- else kg=atoi(argv[4]);
- if(argc==6) if(*argv[5]=='b') ls=atoi(argv[5]+1);
- else kg=atoi(argv[5]);
- if((fp=fopen(argv[2],"rb"))==NULL)
- {puts("File source not found");return 0;}
- fseek(fp,0L,2);Ln=(word)ftell(fp);rewind(fp);
- if((Buf=malloc(Ln+sizeof(ulong)-1+(Ln>>>>6)))==NULL)
- {fclose(fp);puts("Out of memmory");return 0;}
- fread(Buf,1,Ln,fp);fclose(fp);
- Tm=time(NULL);
- if(*argv[1]=='c')
- { printf("CRC= %-16X Ln= %-9u\n",
- crc(Ln,Buf,0,0x1021),Ln);
- if(!(Ln=pac(Buf,Ln,kg,ls)))
- { free(Buf);puts("File can't be compressed");
- return 0;
- }
- }
- else { if(NULL==(Buf=unpac(Buf,&Ln,kg,ls)))
- {puts("File can't be decompressed");
- return 0;
- }
- printf("CRC= %-16X Ln= %-9u\n",
- crc(Ln,Buf,0,0x1021),Ln);
- }
- if((fp=fopen(argv[3],"wb"))==NULL)
- {free(Buf);puts("File dest not found");return 0;}
- fwrite(Buf,1,Ln,fp);fclose(fp);
- free(Buf);
- printf("Size_out= %-9u Time = %-9ld sec.\n\
- Processing sucsessful finished !\n",Ln,time(NULL)-Tm);
- return 1;
- }
- ï¿ßΓ¿¡ú 2
-
- ; êß»«½∞º«óáΓ∞ «ßë᫪¡«: EDX,EAX,RFlg - ¡áαπΦáεΓß∩
- .386p
- _TEXT segment dword use32 public 'CODE'
- _TEXT ends
- _DATA segment dword use32 public 'DATA'
- _DATA ends
- CONST segment dword use32 public 'CONST'
- CONST ends
- _BSS segment dword use32 public 'BSS'
- _BSS ends
- DGROUP group CONST,_BSS,_DATA
- public DVC
- public DVD
- public LOG2INT
- public LOG2IE
- public GETBIT
- public SETBIT
- _TEXT segment
- assume CS:_TEXT
- ; DVC/DVD ñ½∩ áα¿Σ¼ÑΓ¿τÑ߬«ú«
- ; ¬«ñ¿α«óá¡¿∩/ñѬ«ñ¿α«óá¡¿∩,
- ; ó«ºóαáΘáÑΓ a*b/c
- ; ulong DV?(ulong a,ulong b,ulong c);
- DVC: mov eax,dword ptr [ESP+8]
- inc eax
- jz Zr
- mul dword ptr [ESP+0Ch]
- div dword ptr [ESP+4]
- ng: dec eax
- ret 12
- Zr: mov edx,dword ptr [ESP+0Ch]
- cmp edx,dword ptr [ESP+4]
- jz ng
- div dword ptr [ESP+4]
- jmp ng
- DVD: mov eax,dword ptr [ESP+0Ch]
- inc eax
- jz kr
- mul dword ptr [ESP+8]
- dc: sbb eax,1
- jc zm ;ºáѼ
- mi: inc dword ptr [ESP+4]
- jz sr
- div dword ptr [ESP+4]
- ret 12
- sr: mov eax,edx
- ret 12
- zm: dec edx
- jmp mi
- kr: mov edx,dword ptr [ESP+8]
- jmp dc
- ; word GETBIT(void *Buf,word Nbit)
- ; ó«ºóαáΘáÑΓ º¡áτÑ¡¿Ñ í¿Γá Nbit
- GETBIT: mov eax,[ESP+4]
- mov edx,[ESP+8]
- bt [edx],eax
- jc m01
- xor eax,eax
- ret 8
- m01: mov eax,1
- ret 8
- ; word SETBIT(void *Buf,word Nbit)
- ; ¿¡óÑαΓ¿απÑΓ í¿Γ Nbit
- SETBIT: mov eax,[ESP+4]
- mov edx,[ESP+8]
- btc [edx],eax
- ret 8
- ;word Log2ie(word A) µÑ½á∩ τáßΓ∞ ñó«¿τ¡«ú« ½«úáα¿Σ¼á
- ;»α¿ A==0 ó«ºóαáΘáÑΓ -1
- LOG2IE: bsr eax,dword ptr [ESP+4]
- jz me
- ret 4
- me: mov eax,-1
- ret 4
- ;word Log2int(word A) µÑ½á∩ τáßΓ∞ ñó«¿τ¡«ú« ½«úáα¿Σ¼á
- ;»α¿ A==0 ó«ºóαáΘáÑΓ 0
- LOG2INT: bsr eax,dword ptr [ESP+4]
- jz mz
- ret 4
- mz: xor eax,eax
- ret 4
- _TEXT ends
- _DATA segment
- _DATA ends
- CONST segment
- CONST ends
- _BSS segment
- _BSS ends
- end