home *** CD-ROM | disk | FTP | other *** search
/ BBS 1 / BBS#1.iso / document / mn894.ha / BUIANOV.TXT < prev    next >
Encoding:
Text File  |  1994-09-28  |  29.4 KB  |  961 lines

  1. Ä»¿ßδóáÑΓß∩ ¡«óδ⌐ »«Γ«τ¡δ⌐ á½ú«α¿Γ¼ ßªáΓ¿∩ ñá¡¡δσ - áßß«µ¿áΓ¿ó¡δ⌐
  2. ¬«ñ¿α«óΘ¿¬, »«ºó«½∩εΘ¿⌐ ñ«ßΓ¿úáΓ∞ óδß«¬«ú« ¬«φΣΣ¿µ¿Ñ¡Γá ßªáΓ¿∩
  3. ñó«¿τ¡δσ ñá¡¡δσ, »«½πτÑ¡¡δσ «Γ ¿ßΓ«τ¡¿¬á ¡Ñ¿ºóÑßΓ¡«⌐ »α¿α«ñδ
  4. (»ÑαѼѡ¡á∩ αáºα∩ñ¡«ßΓ∞ íπ¬ó ó ¡Ñ¿ºóÑßΓ¡«¼ á½Σáó¿ΓÑ).
  5. Åα¿¼Ñα 1. é«ßßΓá¡áó½¿óáѼá∩ ßΓ᫬á í«½∞ΦÑ
  6.  
  7. êºóÑßΓ¡«:
  8.  
  9. á) ßΓ᫬á S1;
  10.  
  11. í) ßΓ᫬á S1 ½Ñ¬ß¿¬«úαáΣ¿τÑ߬¿ ¼½áñΦÑ ßΓ᫬¿ S2 (í¿Γ αẽ¿τ¿∩ "1");
  12.  
  13. ó) ¬«½¿τÑßΓó« ¡π½Ñ⌐ n = 9 - ñ½¿¡á "óδΓ∩ª¬¿";
  14.  
  15. é«ßßΓá¡«ó¿Γ∞ S2:
  16.  
  17. S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
  18.  
  19. S2 = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  20.  
  21. é«ßßΓá¡«ó½Ñ¡¿Ñ ßΓ᫬¿ S2:
  22.  
  23. a) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ñÑó∩Γ«ú« ¡π½Ñó«ú« í¿Γá ßΓ᫬¿ S1
  24. ó¬½ετ¿Γѽ∞¡«.
  25.  
  26. S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
  27.  
  28. S2 = 0 1 0 1 0 1 0 0 0 1 0 0 0 ? ? ? ?
  29.  
  30. .............................^-------- n = 9
  31.  
  32. í) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ß½ÑñπεΘÑú« ¡π½Ñó«ú« í¿Γá ßΓ᫬¿ S1.
  33.  
  34. S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
  35.  
  36. S2 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 ? ?
  37.  
  38. .................................^
  39.  
  40. ó) ºáóÑαΦáѼ ßΓ᫬π S2 í¿Γ«¼ αẽ¿τ¿∩.
  41.  
  42. S1 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 0 0
  43.  
  44. S2 = 0 1 0 1 0 1 0 0 0 1 0 0 0 1 1 1 ?
  45.  
  46. ...................................^
  47.  
  48. æΓ᫬á S2 ó«ßßΓá¡«ó½Ñ¡á.
  49.  
  50. Åα¿¼Ñα 2. é«ßßΓá¡áó½¿óáѼá∩ ßΓα«¬á ¼Ñ¡∞ΦÑ
  51.  
  52. êºóÑßΓ¡«:
  53.  
  54. á) ßΓ᫬á S1;
  55.  
  56. í) ßΓ᫬á S1 ½Ñ¬ß¿¬«úαáΣ¿τÑ߬¿ ßΓáαΦÑ ßΓ᫬¿ S2 (í¿Γ αẽ¿τ¿∩-"0");
  57.  
  58. ó) ¬«½¿τÑßΓó« Ññ¿¡¿µ n = 6 - "ñ½¿¡á óδΓ∩ª¬¿";
  59.  
  60. é«ßßΓá¡«ó¿Γ∞ S2:
  61.  
  62. S2 = ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
  63.  
  64. S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
  65.  
  66. é«ßßΓá¡«ó½Ñ¡¿Ñ ßΓ᫬¿ S2:
  67.  
  68. á) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ΦÑßΓ«ú« Ññ¿¡¿τ¡«ú« í¿Γá ßΓ᫬¿ S1
  69. ó¬½ετ¿Γѽ∞¡«.
  70.  
  71. S2 = 0 1 0 1 0 1 0 0 0 1 0 1 1 ? ? ? ?
  72.  
  73. S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
  74.  
  75. .............................^-------- n = 6
  76.  
  77. í) ¬«»¿απѼ ßΓ᫬π S1 ó S2 ñ« ß½ÑñπεΘÑú« Ññ¿¡¿τ¡«ú« í¿Γá ßΓ᫬¿ S1:
  78.  
  79. S2 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 ? ?
  80.  
  81. S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
  82.  
  83. .................................^
  84.  
  85. ó) ºáóÑαΦáѼ ßΓ᫬π S2 í¿Γ«¼ αẽ¿τ¿∩:
  86.  
  87. S2 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 0 ?
  88.  
  89. S1 = 0 1 0 1 0 1 0 0 0 1 0 1 1 0 0 1 0
  90.  
  91. ...................................^
  92.  
  93. æΓ᫬á S2 ó«ßßΓá¡«ó½Ñ¡á.
  94.  
  95. ï¿ßΓ¿¡ú 1
  96.  
  97. /* Ac.c - äѼ«¡ßΓαᵿ∩ á½ú«α¿Γ¼á ßªáΓ¿∩ ñá¡¡δσ
  98. ¼ÑΓ«ñ«¼ áßß«µ¿áΓ¿ó¡«ú« ¬«ñ¿α«óá¡¿∩.
  99. Æαá¡ß½∩µ¿∩: ZTC -mx -o+time ac.c div.asm
  100. (ñ½∩ Zortech_C v.3.0r ¿ MS MASM v5.0)
  101. ï¿ßΓ¿¡ú 2 - div.asm
  102. çá»π߬ »α«úαá¼¼δ:
  103. π»á¬«ó¬á      AC c ¿ßσ«ñ¡δ⌐_ Σá⌐½ π»á¬«óá¡¡δ⌐_Σá⌐½ [Kc] [bNN]
  104. αá߻ᬫó¬á    AC d π»á¬«óá¡¡δ⌐_Σá⌐½ ¿ßσ«ñ¡δ⌐_Σá⌐½ [Kc] [bNN] */
  105. #include <<stdlib.h>>
  106. #include <<stdio.h>>
  107. #include <<string.h>>
  108. #include <<time.h>>
  109. extern unsigned _stack = 32767;
  110. typedef unsigned char   byte;
  111. typedef signed char     sbyte;
  112. typedef unsigned int    word;
  113. typedef signed int      sword;
  114. typedef unsigned long   ulong;
  115. typedef signed long     slong;
  116. typedef signed short    sshort;
  117. typedef unsigned short  ushort;
  118. /* Ä»αÑñѽѡ¿∩ ¡áßΓα«⌐¬¿ á½ú«α¿Γ¼á */
  119. /* 128 - »Ñαóá∩ »«½«ó¿¡á Γáí½¿µδ ASCII. 256 - full*/
  120. #define LTC     256
  121. /* 256 îá¬ß¿¼á½∞¡á∩ ñ½¿¡á »α«ú¡«º¿απѼ«⌐ ßΓ᫬¿ */
  122. #define MaxLen  256
  123. /* 2048 îá¬ß¿¼á½∞¡á∩ Φ¿α¿¡á ó«α«¡¬¿ á¡á½«ú¿⌐ */
  124. #define Wight   2048
  125. /* 10 èóá¡Γ τáßΓ«Γ¡«ú« αáß»αÑñѽѡ¿∩ ñ½¿¡ */
  126. #define StepL   10
  127. /* 10 èóá¡Γ τáßΓ«Γ¡«ú« αáß»αÑñѽѡ¿∩ ß¿¼ó«½«ó */
  128. #define StepC   10
  129. /*2048 ÉẼÑα ¬áñαá áñá»Γ¿ó¡«ú« ¬«ñ¿α«óá¡¿∩ ß¿¼ó«½«ó*/
  130. #define STC     2048
  131. /* 1024  ÉẼÑα ¬áñαá áñá»Γ¿ó¡«ú« ¬«ñ¿α«óá¡¿∩ ñ½¿¡ */
  132. #define STL     1024
  133. /* ÉẼÑα áßß«µ¿áΓ¿ó¡«⌐ Γáí½¿µδ 1024 ... 262144 */
  134. #define LSDEF32 262144
  135. /*Log2int(791*Ld/500) âαá¡¿µá íѽ«ú« Φπ¼á*/
  136. #define SB(Ld)  Log2int(Kc*Ld/500)
  137. /* éÑß »«º¿µ¿¿ ó ó«α«¡¬Ñ á¡á½«ú¿⌐ */
  138. #define EVR(l,p) (Log2int(l))?(((l+Lg)>>>>3)+\
  139. Wight/2/(p)+((l+Lg+1)&7))*Log2int(1+((l+Lg)>>>>3)):0
  140. /*éÑß ºáóÑαΦáεΘÑú« ¬«ñá ó ºáó¿ß¿¼«ßΓ¿ «Γ »αÑñδßΓ«α¿¿*/
  141. #define EVRFB(l) (Log2int(l>>>>1))?(l+Lg)*\
  142. Log2int(l+Lg):0
  143. /* 11 éÑασ¡∩∩ úαá¡¿µá πß»ÑΦ¡«ßΓ¿ »α«ú¡«º«ó */
  144. #define Sucsess 11
  145. /* öπ¡¬µ¿¿ ¼«ñπ½∩ Div.asm ¿º ½¿ßΓ¿¡úá 2 */
  146. extern ulong    _pascal Dvc(ulong A,ulong B,ulong C);
  147. extern ulong    _pascal Dvd(ulong A,ulong B,ulong C);
  148. extern word     _pascal Log2int(word);
  149. extern word     _pascal Log2ie(word);
  150. extern word     _pascal SetBit(byte *,word);
  151. extern word     _pascal GetBit(byte *,word);
  152. //éÑασ¡∩∩ ¿ ¡¿ª¡∩∩ úαá¡¿µδ áα¿Σ¼ÑΓ¿τÑ߬«⌐ ¬«¼»αÑßß¿¿
  153. typedef struct  {   unsigned long L;
  154.                     unsigned long H;
  155.                 }   BND;
  156. static  BND     Bp;
  157. /* æΓαπ¬Γπαá «»¿ßá¡¿∩ πº½á Γáí½¿µδ óÑα«∩Γ¡«ßΓÑ⌐ */
  158. typedef struct  {   ulong   P;  /* ùáßΓ«Γá  */
  159.                     sshort  V;  /* ç¡áτÑ¡¿Ñ */
  160.                 }   UNIT;
  161. /* ôñá½Ñ¡¡δÑ ¿º ¬«ñ¿α«óá¡¿∩ ß¿¼ó«½δ */
  162. typedef struct { word L;      /* ù¿ß½« πñá½Ñ¡¡δσ */
  163.                  UNIT D[LTC]; /* æ»¿ß«¬ πñá½Ñ¡¡δσ */
  164.                 byte M[32];/*ü¿Γ«óδ⌐ «íαẠπñá½Ñ¡¡δσ*/
  165.                } DLCR;
  166. /* ìÑ¿º¼Ñ¡∩ѼδÑ «»αÑñѽѡ¿∩ */
  167. #define Convert(v)  Wight/2-1+(-v)
  168. #define DeConvert(v) ((v<<=Wight/2-1)?v:Wight/2-1-v)
  169. static  byte    *In,*Out,*InTop,*InB;
  170. static  byte    **PtrIn,**PtrTop;
  171. static  word    Swch;
  172. static  word    Kc,Sbt,LS;
  173. // ÉáßτÑΓ µ¿¬½¿τÑ߬«ú« ¬«ñá »« ¿ºíδΓ«τ¡«ßΓ¿ (CRC)
  174. word crc(word sz,byte *buf,word nl,word gp)
  175. {   byte    a;
  176.     word    i,j;
  177. for(i=0;i<<sz;i++)
  178.  for(a=*(buf+i),j=8;j;j--,a<<<<=1)
  179.   if(((sbyte)a<<0 && (sword)nl>>=0) ||
  180.      ((sbyte)a>>=0 && (sword)nl<<0)) {nl<<<<=1;nl^=gp;}
  181.   else  nl<<<<=1;
  182. return(nl);
  183. }
  184. /* é«ºóαáΘÑ¡¿Ñ ñ½¿¡δ ß«ó»áñÑ¡¿∩ ßΓ᫬ ó í¿Γáσ. y>>x */
  185. sword _pascal BitCmpLn(register byte *x,
  186.                        register byte *y,word bnd)
  187. {   register word   t;
  188. x-=sizeof(word)-sizeof(byte);
  189. y-=sizeof(word)-sizeof(byte);
  190. if((sword)(t=(sizeof(word)<<<<3)-
  191.     Log2ie(*(word *)x^*(word *)y)-1)<<bnd || x<<InB)
  192.                         return(0);
  193. if(t!=(sizeof(word)*8)) return(t-bnd);
  194. t=1; while(*--(word *)x==*--(word *)y && x>>=InB &&
  195.                         t<<MaxLen/sizeof(word)) t++;
  196. bnd=(t<<<<5)+(sizeof(word)<<<<3)-
  197.                Log2ie(*(word *)x^*(word *)y)-1-bnd;
  198. if((sword)bnd<<0)    return(0);
  199. return(bnd);
  200. }
  201. /* æαáó¡Ñ¡¿Ñ ßΓ᫬. key >> *elem */
  202. int _pascal F_Cmp(const void *key,const void *elem)
  203. {   register word *a;
  204.     register word *b;
  205. a=(word *)(*(byte **)elem-sizeof(word)+sizeof(byte));
  206. b=(word *)((byte *)key-sizeof(word)+sizeof(byte));
  207. if((byte **)elem<<PtrIn)  return(1);
  208. if((byte **)elem>>PtrTop) return(-1);
  209. while(*b==*a && (void *)a>>(void *)In) {--a;--b;}
  210. if(*b<<*a)  return(-1);
  211. if(*b>>*a)   return(1);
  212. return(0);
  213. }
  214. /* üδßΓαδ⌐ »«¿ß¬ (ñ¿σ«Γ«¼¿∩) */
  215. byte **Find(byte **Base,word Len,byte *str)
  216. {
  217. word    bot,top,dim,a,b;
  218. bot=NULL;top=Len-1;
  219. while(top!=bot+1)
  220.  { dim=(bot+top)>>>>1;
  221.   if(str==*(Base+dim)) return(Base+dim);
  222.    if((a=*(word *)(str-sizeof(word)+1))>>
  223.       (b=*(word *)(*(Base+dim)-sizeof(word)+1)))
  224.                 bot=dim;
  225.    else if(a<<b) top=dim;
  226.         else    if(F_Cmp(str,Base+dim)>>0) bot=dim;
  227.                     else top=dim;
  228.     }
  229. return(Base+bot);
  230. }
  231. typedef struct  {   byte    **Ip;
  232.                     byte     *Vl;
  233.                 }   TB_tag;
  234. int FcmpTB(const void *a,const void *b)
  235. {   byte    *x,*y,**Ix,**Iy;
  236.     Ix=((TB_tag *)a)->>Ip;
  237.     Iy=((TB_tag *)b)->>Ip;
  238.     if(Ix>>Iy)   return(1);
  239.     if(Ix<<Iy)   return(-1);
  240. /*ìÑ߬«½∞¬« ¬á¡ñ¿ñáΓ«ó ¡á «ñ¡« ¼ÑßΓ«*/
  241.     y=((TB_tag *)b)->>Vl;
  242.     x=((TB_tag *)a)->>Vl;
  243.     if(x>>y) return(F_Cmp(x,&y));
  244.     return(-F_Cmp(y,&x));
  245. }
  246. word  _pascal StrFrcL(byte *,byte *,byte *);
  247. /* éßΓáó¬á ¡«óδσ π¬áºáΓѽÑ⌐ ¿½¿ ¼«ñ¿Σ¿¬áµ¿∩ ¬áñαá */
  248. word InsPtr(word Ld,sshort Ln,word *Ltp)
  249. {   TB_tag  TB[MaxLen+1];
  250.     byte    **top;
  251.     sshort  i;
  252.     word    l1,l2;
  253. for(PtrTop=PtrIn+*Ltp-1,i=0;i<<Ln;i++)
  254.   { TB[i].Ip=Find(PtrIn-1,*Ltp+2,In+Ld+i);
  255.     TB[i].Vl=In+Ld+i;
  256.   }
  257. if(Ln>>1)    qsort(TB,Ln,sizeof(TB_tag),FcmpTB);
  258. if(*Ltp<<=LS)
  259.   for(top=PtrTop,*Ltp=Ld+Ln,PtrTop=PtrIn+*Ltp-1,
  260.                                 i=Ln;i;top=TB[i].Ip)
  261.    { i--;
  262.      memmove(TB[i].Ip+i+2,TB[i].Ip+1,
  263.              (top-TB[i].Ip)*sizeof(void *));
  264.      *(TB[i].Ip+i+1)=TB[i].Vl;
  265.    }
  266. else for(i=0;i<<Ln;i++)
  267.      {
  268.      if(TB[i].Ip==PtrTop) {*PtrTop=TB[i].Vl;continue;}
  269.      if(TB[i].Ip<<PtrIn)   {*PtrIn =TB[i].Vl;continue;}
  270.      if((l1=StrFrcL(In+Ld,TB[i].Vl,*TB[i].Ip))<<
  271.         (l2=StrFrcL(In+Ld,TB[i].Vl,*(TB[i].Ip+1))))
  272.                         {*TB[i].Ip=TB[i].Vl;continue;}
  273.      if(l1!=l2)  {*(TB[i].Ip+1)=TB[i].Vl;continue;}
  274.      if(*TB[i].Ip<<*(TB[i].Ip+1)) *TB[i].Ip=TB[i].Vl;
  275.      else                    *(TB[i].Ip+1)=TB[i].Vl;
  276.      }
  277. return(Ld+Ln);
  278. }
  279. //-------Çα¿Σ¼ÑΓ¿τÑ߬á∩ ¬«¼»αÑßß¿∩-------
  280. /* ä«ºá»¿ß∞ ¬«ñá »α¿ πúα«ºÑ ß«Ññ¿¡Ñ¡¿∩ úαá¡¿µ
  281.    »α¿ áα¿Σ¼ÑΓ¿τÑ߬«⌐ ¬«¼»αÑßß¿¿ */
  282. word    WriteEnd(word Lo)
  283. {   word    a,b,sb;
  284. sb=Sbt;a=b=1;Bp.L<<<=1;Bp.H<<<<=1;
  285. while(sb--) {a++;if((slong)Bp.L>>=0L) break; Bp.L<<<<=1;}
  286. sb=Sbt;
  287. while(sb--) {b++;if((slong)Bp.H<< 0L) break; Bp.H<<<<=1;}
  288. Bp.L=0x7fffffffL;if(a>>b)    {a=b;Bp.L=~Bp.L;}
  289. while(a--)  {   if((slong)Bp.L<<0L) SetBit(Out,Lo);
  290.                 Lo++;Bp.L<<<<=1;Sbt--;
  291.             }
  292. Bp.L=0L;Bp.H=-1L;
  293. return(Lo);
  294. }
  295. static  ulong   P; //èáñα ñÑΦ¿Σα¿απѼ«ú« ¬«ñá
  296. //CodAH-áα¿Σ¼ÑΓ¿τÑ߬á∩ ¬«¼»αÑßß¿∩ ¡á »«½¡«¼ ¼¡«ªÑßΓóÑ
  297. sshort  CodAH(UNIT *TabP,word Lt,sshort val,
  298.               word *Loc,slong Sum)
  299. {   UNIT    *b,*bp;
  300.     ulong   S,D,F;
  301.     word    Lo,j;
  302. if(Lt==1)   return(TabP->>V);
  303. Lo=*Loc;b=TabP;D=Bp.H-Bp.L;S=0L;
  304. if(D<<Sum)   {Lo=WriteEnd(Lo);D=-1L;}
  305. if(val>>=0)  while(b->>V!=val)    S+=b++->>P;
  306. else {  for(j=Lo+Sbt,Sbt=32-Sbt;Sbt--;
  307.                    P<<<<=1,P+=GetBit(Out,j++));
  308.         F=Dvd(P-Bp.L,Sum,D);
  309.         for(bp=b;S<<=F;S+=b++->>P) bp=b;
  310.         S-=bp->>P;b=bp;
  311.      }
  312. Bp.H=Bp.L+Dvc(S+b->>P,D,Sum);Bp.L+=Dvc(S,D,Sum)+1;
  313. S=Bp.H^Bp.L;Sbt=32;
  314. while((slong)S>>0L)
  315.  { if((slong)(Bp.L)<<0L) SetBit(Out,Lo);
  316.    Lo++;Sbt--;Bp.L<<<<=1;Bp.H<<<<=1;Bp.H++;S<<<<=1;
  317.  }
  318. *Loc=Lo; return(b->>V);
  319. }
  320. /* CodAH_D - áα¿Σ¼ÑΓ¿τÑ߬á∩ ¬«¼»αÑßß¿∩ ¡á »α«αѪѡ¡«¼
  321.    ¼¡«ªÑßΓóÑ */
  322.  /* Åα¿ßó«Ñ¡¿Ñ óÑαΦ¿¡δ */
  323. UNIT *QT(UNIT *t) {while(!(t--)->>P); return(t+1);}
  324.  /* Åα¿ßó«Ñ¡¿Ñ ñ¡á */
  325. UNIT *QB(UNIT *b) {while(!(b++)->>P); return(b-1);}
  326.  /* äó¿ªÑ¡¿Ñ ñ¡á óóÑασ */
  327. UNIT *AB(UNIT *b) {while(!(++b)->>P); return(b);}
  328. sshort  CodAH_D(UNIT *TabP,word Lt,sshort val,
  329.                 word *Loc,slong Sum)
  330. {   UNIT    *b,*bp;
  331.     ulong   S,D,F;
  332.     word    Lo,j;
  333. b=QB(TabP); if(Lt==1)   return(b->>V);
  334. Lo=*Loc;S=0L;D=Bp.H-Bp.L;
  335. if(D<<Sum)   {Lo=WriteEnd(Lo);D=-1L;}
  336. if(val>>=0)  while(b->>V!=val)    {S+=b->>P;b=AB(b);}
  337. else { for(j=Lo+Sbt,Sbt=32-Sbt;Sbt--;
  338.                P<<<<=1,P+=GetBit(Out,j++));
  339.        F=Dvd(P-Bp.L,Sum,D);
  340.        for(bp=b;S<<=F;S+=b->>P,b=AB(b)) bp=b;
  341.        S-=bp->>P;b=bp;
  342.      }
  343. Bp.H=Bp.L+Dvc(S+b->>P,D,Sum);Bp.L+=Dvc(S,D,Sum)+1;
  344. S=Bp.H^Bp.L;Sbt=32;
  345. while((slong)S>>0L)
  346.   {   if((slong)(Bp.L)<<0L) SetBit(Out,Lo);
  347.       Lo++;Sbt--;Bp.L<<<<=1;Bp.H<<<<=1;Bp.H++;S<<<<=1;
  348.   }
  349. *Loc=Lo; return(b->>V);
  350. }
  351. /*  Stk - «αúá¡¿ºáµ¿∩ ¬«½∞µÑó«ú« ßΓѬá LIFO
  352.     é ß½πτáÑ, Ñß½¿ ßΓѬ ¡Ñ ¡áßδΘÑ¡, ó«ºóαáΘáÑΓ -1,
  353.     ¿¡áτÑ óδΓÑߡѡ¡«Ñ º¡áτÑ¡¿Ñ.
  354.     æΓαπ¬Γπαá ¬«½∞µÑó«ú« ßΓѬá: */
  355. typedef struct  {   word    L; /* ä½¿¡á ßΓѬá */
  356.                     word    O; /* Å«º¿µ¿∩ ó ßΓѬѠ*/
  357.                     sshort  *S;
  358.                 } STACK;
  359. sshort  Stk(STACK *St,sshort Ins)
  360. {   sshort  t;
  361.  t=*(St->>S+St->>O); *(St->>S+St->>O)=Ins; St->>O++;
  362.  if(St->>O==St->>L) St->>O=0;
  363.  return(t);
  364. }
  365. /* î«ñ¿Σ¿¬áµ¿∩ áñá»Γ¿ó¡«⌐ Γáí½¿µδ αáß»αÑñѽѡ¿∩
  366.    τáßëà(ñ½¿¡, ¬«ñ«ó) */
  367. slong InitTabAH(STACK *Stck,UNIT **Ix_TP,UNIT *TP,
  368.               word Lt,sshort Val,slong Sm,ulong Stp)
  369. {   UNIT    *U,tmp;
  370. for(U=*(Ix_TP+Val),U->>P+=Stp;
  371.                     U->>P >>= (U-1)->>P && U>>TP;U--)
  372.     { tmp=*U;*U=*(U-1);*(U-1)=tmp; *(Ix_TP+U->>V)=U;
  373.       *(Ix_TP+(U-1)->>V)=U-1;
  374.     }
  375. if((Val=Stk(Stck,Val))<<(sshort)0)   return(Sm+Stp);
  376. for(U=*(Ix_TP+Val),U->>P-=Stp;
  377.                  U->>P << (U+1)->>P && U+1<<TP+Lt;U++)
  378.     { tmp=*U;*U=*(U+1);*(U+1)=tmp; *(Ix_TP+U->>V)=U;
  379.       *(Ix_TP+(U+1)->>V)=U+1;
  380.     }
  381. return(Sm);
  382. }
  383. /* é«ºóαáΘÑ¡¿Ñ ñ½¿¡δ ß«ó»áñÑ¡¿∩ ñóπσ ßΓ᫬ ó íá⌐Γáσ
  384.    ¿ ¬«»¿α«óá¡¿Ñ b->>a (a>>b) */
  385. sshort  _pascal CopyByte(sshort Ls,byte *a,byte *b)
  386. {   sshort t;
  387. for(t=0;t<<Ls;t++) *(a++)=*(b++);
  388. if(t>>MaxLen)    t=MaxLen;
  389. return(t);
  390. }
  391. /* é«ºóαáΘÑ¡¿Ñ ñ½¿¡δ ß«ó»áñÑ¡¿∩ ñóπσ ßΓ᫬ (a>>b) */
  392. word _pascal StrFrc(register byte *a,register byte *b)
  393. {   register word   t;
  394.     byte    *top;
  395. if(*a!=*b || b>>=a || a>>=InTop)  return(0);
  396. for(top=a,t=1;*(++a)==*(++b) && b<<top && a<<InTop;t++);
  397. if(t>>MaxLen)   t=MaxLen;
  398. return(t);
  399. }
  400. word _pascal StrFrcL(byte *top,byte *a,byte *b)
  401. {   register word   t;
  402. if(!b || *a!=*b || a>>=top || b>>=top) return(0);
  403. for(t=1;*(++a)==*(++b) && b<<top && a<<top;t++);
  404. if(t>>MaxLen)   t=MaxLen;
  405. return(t);
  406. }
  407. word _pascal StrFrc2(byte *top,byte *a,byte *b)
  408. {   register word   t;
  409. if(a<<b) {(word)a^=(word)b;
  410.          (word)b^=(word)a;(word)a^=(word)b;
  411.         }
  412. if(*a!=*b || a>>=top) return(0);
  413. for(t=1;*(++a)==*(++b) && a<<top;t++);
  414. return(t);
  415. }
  416. /* ì«α¼á½¿ºáµ¿∩ τáßΓ«Γ¡«ú« αáß»αÑñѽѡ¿∩ */
  417. slong   NormSum(UNIT *Tmp,word Lg,slong SmC)
  418. {   word    i;
  419. while(SmC<<0L) for(SmC=0L,i=0;i<<Lg;i++)
  420.                 {   (Tmp+i)->>P=((Tmp+i)->>P>>>>1)+1;
  421.                     SmC+=(Tmp+i)->>P;
  422.                 }
  423. return(SmC);
  424. }
  425. /* Å«ßΓα«Ñ¡¿Ñ ó«α«¡¬¿ á¡á½«ú¿⌐ c »«¿ß¬«¼
  426.    ¼á¬ß¿¼á½∞¡«ú« »α«ú¡«ºá */
  427. sshort LoadLst(DLCR *Dc,UNIT **I_TPL,UNIT *TPL,
  428.                word Ld,word Ltp,slong SmL,word *Lo,
  429.                sshort Rg,sshort *Pr)
  430. {   word Lg,l1,l2,bl1,bl2;
  431.     byte    **ptr,**ptr1,**ptr2,**bptr;
  432.     word    Lf,Max,Lt,Pr_L,f;
  433.     slong   SmP;
  434.     sshort  rk,pz1,pz2,pzs1,pzs2;
  435.     UNIT    TPP[Wight];
  436.     UNIT    TmL[MaxLen];
  437. Dc->>L=0;
  438. memset(Dc->>M,0,32);
  439. if(Ld<<4)    return(-1);
  440. bptr=ptr=Find(PtrIn-1,Ltp+2,In+Ld-1);
  441. Lg=SB(Ltp);
  442. pzs1=pzs2=0;bl1=bl2=l1=l2=0;
  443. if(ptr>>PtrIn)
  444.      {l1=BitCmpLn(*(ptr-1),In+Ld-1,Lg);pzs1=-1;}
  445. if(ptr<<PtrTop)
  446.      {l2=BitCmpLn(*(ptr+1),In+Ld-1,Lg);pzs2= 1;}
  447. if(!(l1+l2))    return(-1);
  448. if(pzs1)    bl1=l1=EVR(l1,-pzs1);
  449. if(pzs2)    bl2=l2=EVR(l2,pzs2);
  450. if(!(l1+l2))    return(-1);
  451. memset(TmL,0,MaxLen*sizeof(UNIT));
  452. ptr2=ptr+1;ptr1=ptr-1;
  453. for(SmP=0L,Lt=1,Pr_L=Lf=Max=0,pz1=pz2=rk=0;
  454.                                    l1 || l2;Lt++)
  455.  { if(l2>>=l1)
  456.     { pz2=pzs2;TPP[Lt].V=pzs2; TPP[Lt].P=l2; SmP+=l2;
  457.       if(Rg>>0)
  458.         if((Lf=StrFrc(In+Ld,*ptr2+1))>>Max)
  459.          { Pr_L=Max,rk=pzs2;ptr=ptr2;Max=Lf;
  460.            Dc->>L=0;memset(Dc->>M,0,32);
  461.            memset(TmL,0,MaxLen*sizeof(UNIT));
  462.            if(*ptr2+1+Lf<<In+Ld)
  463.             { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
  464.                      (sshort)*(*ptr2+1+Lf));
  465.               Dc->>L++;
  466.             }
  467.          }
  468.         else
  469.          {if(Lf==Max && !GetBit(Dc->>M,*(*ptr2+1+Lf))
  470.                                  && *ptr2+1+Lf<<In+Ld)
  471.            { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
  472.                          (sshort)*(*ptr2+1+Lf));
  473.              Dc->>L++;
  474.            }
  475.           if((Lf=StrFrcL(In+Ld,*ptr2+1,*ptr+1))>>Pr_L)
  476.               TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
  477.          }
  478.       if(pzs2<<(Wight/2-1))    pzs2++;
  479.       else    {l2=0;continue;}
  480.       if(++ptr2>>PtrTop)   l2=0;
  481.       else {l2=BitCmpLn(*ptr2,In+Ld-1,Lg);
  482.             l2=EVR(l2,pzs2);
  483.            }
  484.     }
  485.    else
  486.     { pz1=pzs1;TPP[Lt].V=Convert(pzs1);
  487.       TPP[Lt].P=l1; SmP+=l1;
  488.       if(Rg>>0)
  489.         if((Lf=StrFrc(In+Ld,*ptr1+1))>>Max)
  490.           { Pr_L=Max,rk=Convert(pzs1);ptr=ptr1;
  491.             Max=Lf;Dc->>L=0;memset(Dc->>M,0,32);
  492.             memset(TmL,0,MaxLen*sizeof(UNIT));
  493.             if(*ptr1+1+Lf<<In+Ld)
  494.              {   SetBit(Dc->>M,Dc->>D[Dc->>L].V=
  495.                            (sshort)*(*ptr1+1+Lf));
  496.                  Dc->>L++;
  497.              }
  498.           }
  499.         else
  500.           { if(Lf==Max && !GetBit(Dc->>M,*(*ptr1+1+Lf))
  501.                        && *ptr1+1+Lf<<In+Ld)
  502.              {   SetBit(Dc->>M,Dc->>D[Dc->>L].V=
  503.                                (sshort)*(*ptr1+1+Lf));
  504.                  Dc->>L++;
  505.              }
  506.            if((Lf=StrFrcL(In+Ld,*ptr1+1,*ptr+1))>>Pr_L)
  507.                 TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
  508.           }
  509.       if(pzs1>>(-Wight/2))      pzs1--;
  510.       else {l1=0;continue;}
  511.       if(--ptr1<<PtrIn) l1=0;
  512.       else { l1=BitCmpLn(*ptr1,In+Ld-1,Lg);
  513.              l1=EVR(l1,-pzs1);
  514.            }
  515.     }
  516.  }
  517. if(SmP<<0L)  SmP=NormSum(TPP,Lt,SmP);
  518. TPP[0].V=0;
  519. TPP[0].P=(5+Sucsess-Swch)*(SmP/Lt+(Sucsess-Swch)/
  520.                         Log2int(Lt+1)+Sucsess-Swch);
  521. SmP+=TPP[0].P;
  522. if(SmP<<0L)  SmP=NormSum(TPP,Lt,SmP);
  523. if(Rg<<0)    rk=-1;
  524. else    if(Max==MaxLen) {Dc->>L=0;memset(Dc->>M,0,32);}
  525. rk=CodAH(TPP,Lt,rk,Lo,SmP);
  526. if(!rk) {   if(Swch)    Swch--;
  527.             if(Rg>>0)    return(-1);
  528.             Max=0;goto m;
  529.         }
  530. if(Swch<<Sucsess)    Swch++;
  531. if(Rg>>0)
  532.  { *Pr=Pr_L;
  533.    for(SmL=0L,Lg=l1=0;l1<<MaxLen;l1++)
  534.       if((TPL+l1)->>V+Pr_L<<In+Ld-*ptr-1)
  535.           { if(TmL[l1].P)
  536.               { TmL[l1].P-=TmL[l1].P>>>>2;
  537.                 TmL[Lg].P=(TPL+l1)->>P+STL*TmL[l1].P;
  538.                 TmL[Lg].V=(TPL+l1)->>V;
  539.               }
  540.             else  TmL[Lg]=*(TPL+l1);
  541.             SmL+=TmL[Lg++].P;
  542.           }
  543.    if(SmL<<0L)  SmL=NormSum(TmL,Lg,SmL);
  544.    return(Pr_L+CodAH(TmL,Lg,CopyByte((sshort)Max,
  545.                      In+Ld,*ptr+1)-Pr_L-1,Lo,SmL));
  546.  }
  547. ptr+=(rk=DeConvert(rk));l1=bl1;
  548. l2=bl2;ptr2=bptr+1;ptr1=bptr-1;
  549. for(f=1,Pr_L=Lf=0,pzs1=-1,pzs2=1;l1 || l2 ;)
  550.  { if(l2>>=l1)
  551.     {if(pzs2==rk) f=0;
  552.      else if(f)
  553.            {
  554.            if((Lf=StrFrc2(In+Ld,*ptr+1,*ptr2+1))>>Pr_L)
  555.                                               Pr_L=Lf;
  556.            }
  557.           else
  558.            if((Lf=StrFrcL(In+Ld,*ptr2+1,*ptr+1))>>Pr_L)
  559.                       TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
  560.      if(pzs2<<(Wight/2-1))    pzs2++;
  561.      else    {l2=0;continue;}
  562.      if(++ptr2>>PtrTop)   l2=0;
  563.      else { l2=BitCmpLn(*ptr2,In+Ld-1,Lg);
  564.             l2=EVR(l2,pzs2);
  565.           }
  566.     }
  567.    else
  568.     {if(pzs1==rk) f=0;
  569.      else if(f)
  570.            {
  571.            if((Lf=StrFrc2(In+Ld,*ptr+1,*ptr1+1))>>Pr_L)
  572.                                               Pr_L=Lf;
  573.            }
  574.           else
  575.            if((Lf=StrFrcL(In+Ld,*ptr1+1,*ptr+1))>>Pr_L)
  576.                       TmL[*(I_TPL+Lf-Pr_L-1)-TPL].P++;
  577.      if(pzs1>>(-Wight/2))     pzs1--;
  578.      else    {l1=0;continue;}
  579.      if(--ptr1<<PtrIn)    l1=0;
  580.      else { l1=BitCmpLn(*ptr1,In+Ld-1,Lg);
  581.             l1=EVR(l1,-pzs1);
  582.           }
  583.     }
  584.  }
  585. for(*Pr=Pr_L,SmL=0L,Lg=l1=0;l1<<MaxLen;l1++)
  586.   if((TPL+l1)->>V+Pr_L<<In+Ld-*ptr-1)
  587.     { if(TmL[l1].P)
  588.        { TmL[l1].P-=TmL[l1].P>>>2;
  589.          TmL[Lg].P=(TPL+l1)->>P+TmL[l1].P*STL;
  590.          TmL[Lg].V=(TPL+l1)->>V;
  591.        }
  592.       else  TmL[Lg]=*(TPL+l1);
  593.       SmL+=TmL[Lg++].P;
  594.     }
  595. if(SmL<<0L)  SmL=NormSum(TmL,Lg,SmL);
  596. Max=CopyByte(Pr_L+1+CodAH(TmL,Lg,-1,Lo,SmL),
  597.              In+Ld,*ptr+1);
  598. if(Max==MaxLen) {Dc->>L=0;memset(Dc->>M,0,32);}
  599. else
  600. m: { while(pz1)
  601.       { if(StrFrc(In+Ld,*(bptr+pz1)+1)>>=Max)
  602.          if(!GetBit(Dc->>M,*(*(bptr+pz1)+1+Max)) &&
  603.                            *(bptr+pz1)+1+Max<<In+Ld)
  604.             { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
  605.                      (sshort)*(*(bptr+pz1)+1+Max));
  606.               Dc->>L++;
  607.             }
  608.         pz1++;
  609.       }
  610.      while(pz2)
  611.       { if(StrFrc(In+Ld,*(bptr+pz2)+1)>>=Max)
  612.          if(!GetBit(Dc->>M,*(*(bptr+pz2)+1+Max)) &&
  613.                            *(bptr+pz2)+1+Max<<In+Ld)
  614.             { SetBit(Dc->>M,Dc->>D[Dc->>L].V=
  615.                      (sshort)*(*(bptr+pz2)+1+Max));
  616.               Dc->>L++;
  617.             }
  618.         pz2--;
  619.       }
  620.    }
  621. return(Max-1);
  622. }
  623. /* è«ñ¿α«óá¡¿Ñ/ñѬ«ñ¿α«óá¡¿Ñ ºáóÑαΦáεΘÑú« ß¿¼ó«½á
  624.    ß πτÑΓ«¼ »α«ú¡«ºá */
  625. sshort Cod_Forecast(UNIT **I_TPC,UNIT *TPC,word Ld,
  626.        word Ltp,word Ls,word *Lo,slong SmC,sshort Rg)
  627. {   UNIT    Tmp[LTC],*Tu;
  628.     word    Lg,l1,l2;
  629.     byte    **ptr,**ptr1,**ptr2;
  630.     sshort  pzs1,pzs2;
  631.     slong   SPr;
  632. if(!Ld) return(CodAH_D(TPC,LTC,(Rg<<0)?-1:
  633.                         (sshort)*(In+Ld+Ls),Lo,SmC));
  634. ptr=Find(PtrIn-1,Ltp+2,In+Ld+Ls-1);
  635. Lg=SB(Ltp);
  636. pzs1=pzs2=0;l1=l2=0;
  637. if(ptr>>PtrIn)
  638.  {l1=BitCmpLn(*(ptr-1),In+Ld+Ls-1,Lg);pzs1=-1;}
  639. if(ptr<<PtrTop)
  640.  {l2=BitCmpLn(*(ptr+1),In+Ld+Ls-1,Lg);pzs2= 1;}
  641. if(!(l1+l2)) return(CodAH_D(TPC,LTC,(Rg<<0)?-1:
  642.                        (sshort)*(In+Ld+Ls),Lo,SmC));
  643. l1=EVRFB(l1);   l2=EVRFB(l2);
  644. memset(Tmp,0,LTC*sizeof(UNIT));
  645. for(SPr=0L,ptr2=ptr+1,ptr1=ptr-1;l1 || l2;)
  646.   { if(l2>>=l1)
  647.       { if((Tu=*(I_TPC+*(*ptr2+1)))->>P)
  648.                     {Tmp[Tu-TPC].P+=l2;SPr+=l2;}
  649.         if(pzs2<<(Wight/2-1))    pzs2++;
  650.         else    {l2=0;continue;}
  651.         if(++ptr2>>PtrTop)   l2=0;
  652.         else  { l2=BitCmpLn(*ptr2,In+Ld+Ls-1,Lg);
  653.                 l2=EVRFB(l2);
  654.               }
  655.       }
  656.     else { if((Tu=*(I_TPC+*(*ptr1+1)))->>P)
  657.                      {Tmp[Tu-TPC].P+=l1;SPr+=l1;}
  658.            if(pzs1>>(-Wight/2))      pzs1--;
  659.            else {l1=0;continue;}
  660.            if(--ptr1<<PtrIn) l1=0;
  661.            else { l1=BitCmpLn(*ptr1,In+Ld+Ls-1,Lg);
  662.                   l1=EVRFB(l1);
  663.                 }
  664.          }
  665.   }
  666.   { slong Lsmc;
  667. for(Lsmc=SmC,Lg=l1=0;l1<<LTC;l1++)
  668.  if((TPC+l1)->>P)
  669.   if(Tmp[l1].P)
  670.    { SmC-=(TPC+l1)->>P;
  671.      SmC+=(Tmp[Lg].P=(TPC+l1)->>P+
  672.      (Log2int(Tmp[l1].P>>>>11)+1)*
  673.      Dvc(Lsmc,Tmp[l1].P,SPr));
  674.      Tmp[Lg++].V=(TPC+l1)->>V;
  675.    }
  676.   else  Tmp[Lg++]=*(TPC+l1);
  677.   }
  678. if(SmC<<0L)  SmC=NormSum(Tmp,Lg,SmC);
  679. return(CodAH(Tmp,Lg,(Rg<<0)?-1:
  680.                   (sshort)*(In+Ld+Ls),Lo,SmC));
  681. }
  682. /* öπ¡¬µ¿∩ π»á¬«ó¬¿/αá߻ᬫó¬¿:
  683.     Ñß½¿ Lc==-1, π»á¬«ó¬á, else +1
  684.     Ln - αẼÑα ¡Ñπ»á¬«óá¡¡δσ ñá¡¡δσ (ó íá⌐Γáσ).
  685.     é«ºóαáΘÑ¡¿Ñ ñ½¿¡δ óδσ«ñ¡δσ ñá¡¡δσ (ó íá⌐Γáσ) */
  686. word    pac_unpac(word Ln,word Lc)
  687. {   word    Lo,Ld,Ltp,i;
  688.     sshort  Pr,Ls,Lst,Rg;
  689.     byte    **Pb;
  690.     slong   SmC,SmL;
  691.     UNIT    *TPL,**I_TPL,*TPC,**I_TPC;
  692.     STACK   SC,SL; /* Çñá»Γ¿ó¡δ⌐ íπΣÑα ¬«ñ«ó, ñ½¿¡ */
  693.     DLCR    Dc; /* ü¿Γ«óá∩ ¼á߬ᠿ߬½ετÑ¡¡δ󠬫ñ«ó */
  694. Ld=0; if(Ln>>0x00ffffff)   goto m1;
  695. *(ulong *)InB&=0XFF000000L;
  696. if(LS>>Ln)   LS=Ln;
  697. if(NULL==(Pb=malloc((LS+MaxLen+2)*sizeof(void **))))
  698.         goto m1;
  699. if(NULL==(SC.S=(sshort *)malloc(STC*sizeof(sshort))))
  700.        goto m2;
  701. if(NULL==(SL.S=(sshort *)malloc(STL*sizeof(sshort))))
  702.        goto m3;
  703. if(NULL==(TPC=(UNIT *)malloc(LTC*sizeof(UNIT))))
  704.             goto m4;
  705. if(NULL==(I_TPC=(UNIT **)malloc(LTC*sizeof(UNIT *))))
  706.        goto m5;
  707. if(NULL==(TPL=(UNIT *)malloc(MaxLen*sizeof(UNIT))))
  708.          goto m6;
  709. if(NULL==(I_TPL=(UNIT**)malloc(MaxLen*sizeof(UNIT*))))
  710.     goto m7;
  711. for(SmC=LTC,i=0;i<<LTC;i++)
  712.      {(TPC+i)->>P=1L;(TPC+i)->>V=i;*(I_TPC+i)=TPC+i;}
  713. for(SmL=(slong)MaxLen,i=0;i<<MaxLen;i++)
  714.      {(TPL+i)->>P=1;(TPL+i)->>V=i;*(I_TPL+i)=TPL+i;}
  715. Bp.L=0L;Bp.H=-1L;*Pb=NULL;--*Pb;InTop=In+Ln;Ls=0;
  716. memset(SC.S,-1,STC*sizeof(sshort));
  717. memset(SL.S,-1,STL*sizeof(sshort));
  718. SC.L=STC;SL.L=STL;SC.O=SL.O=0;
  719.  { word b[6]={45,13,10,7,5,4};
  720.    sshort j;
  721.    for(j=0;j<<6;j++) for(i=b[j];i;i--)
  722.     SmL=InitTabAH(&SL,I_TPL,TPL,MaxLen,j,SmL,StepL);
  723.  }
  724. for(Rg=(Lc+1)?-1:1,PtrTop=PtrIn=Pb+1,
  725.     Sbt=Swch=Ltp=Lo=Ld=0;Ld<<Ln;Ld=InsPtr(Ld,Ls,&Ltp))
  726.  {if((Ls=LoadLst(&Dc,I_TPL,TPL,Ld,Ltp,
  727.                      SmL,&Lo,Rg,&Pr))>>=(sshort)0)
  728.    { SmL=InitTabAH(&SL,I_TPL,TPL,MaxLen,
  729.                    Ls-Pr,SmL,StepL);
  730.      Ls++;
  731.    }
  732.   else    Ls=0;
  733.   if(In+Ld+Ls<<InTop && (!Ls || Dc.L))
  734.     { slong   SmC_L;
  735.     if(Dc.L)
  736.      { for(SmC_L=SmC,i=0;i<<Dc.L;i++)
  737.         { SmC_L-=(Dc.D[i].P=(*(I_TPC+Dc.D[i].V))->>P);
  738.           (*(I_TPC+Dc.D[i].V))->>P=0L;
  739.         }
  740.        if(!Ls)
  741.         Lst=(sshort)(*(In+Ld+Ls)=
  742.             (byte)CodAH_D(TPC,LTC,(Rg<<0)?-1:
  743.                     (sshort)*(In+Ld+Ls),&Lo,SmC_L));
  744.        else
  745.         Lst=(sshort)(*(In+Ld+Ls)=
  746.             (byte)Cod_Forecast(I_TPC,TPC,Ld,
  747.                               Ltp,Ls,&Lo,SmC_L,Rg));
  748.        for(i=0;i<<Dc.L;i++)
  749.          (*(I_TPC+Dc.D[i].V))->>P=Dc.D[i].P;
  750.      }
  751.     else
  752.      Lst=(sshort)(*(In+Ld+Ls)=
  753.          (byte)CodAH(TPC,LTC,(Rg<<0)?-1:
  754.                      (sshort)*(In+Ld+Ls),&Lo,SmC));
  755.     Ls++;
  756.     SmC=InitTabAH(&SC,I_TPC,TPC,LTC,Lst,SmC,StepC);
  757.     }
  758.   if(!((Lo>>>>3) & 0x3F))
  759.     printf("P= %-2u D= %-8u\r",Lo*100/((Ld+Ls)<<<<3),
  760.                                         Ln-(Ld+Ls));
  761.  }
  762. Lo=WriteEnd(Lo);
  763. if(Rg>>0) *(ulong *)(Out-sizeof(ulong)+1)|=(ulong)Ln;
  764.     free(I_TPL);
  765. m7: free(TPL);
  766. m6: free(I_TPC);
  767. m5: free(TPC);
  768. m4: free(SL.S);
  769. m3: free(SC.S);
  770. m2: free(Pb);
  771. m1: if(!Ld) return(0);
  772. if(Rg>>0)    return(((Lo-1)>>>>3)+sizeof(ulong));
  773. return(Ln);
  774. }
  775. /* öπ¡¬µ¿∩ π»á¬«ó¬¿:
  776. éσ«ñ: Buf - ñá¡¡δÑ, Ln - ñ½¿¡á (ó íá⌐Γáσ),
  777.       kg - ¬«φΣΣ¿µ¿Ñ¡Γ ßªáΓ¿∩ [0..9999], 0 - ¼á¬ß¿¼á½∞¡«Ñ,
  778.       ls - αẼÑα ¬áñαá (ó íá⌐Γáσ).
  779. éδσ«ñ: Buf - ñá¡¡δÑ, ó«ºóαáΘáÑΓ ñ½¿¡π (ó íá⌐Γáσ).
  780. àß½¿ ßó«í«ñ¡«⌐ »á¼∩Γ¿ ¡Ññ«ßΓáΓ«τ¡«, ó«ºóαáΘáÑΓß∩ 0.*/
  781. word pac(byte *Buf,word Ln,sword kg,word ls)
  782. {
  783. Out=Buf+sizeof(ulong)-1;Kc=17+kg;LS=ls;
  784. if(NULL==(InB=(byte *)malloc(Ln+sizeof(ulong)-1)))
  785.                                          return(0);
  786. In=InB+sizeof(ulong)-1;
  787. memcpy(In,Buf,Ln);
  788. memset(Buf,0,Ln+sizeof(ulong)-1+(Ln>>>>6));
  789. Ln=pac_unpac(Ln,(word)(-1));
  790. free(InB);
  791. return(Ln);
  792. }
  793. /* öπ¡¬µ¿∩ αá߻ᬫó¬¿:
  794. éσ«ñ: Buf - ñá¡¡δÑ, *Lni - ñ½¿¡á (ó íá⌐Γáσ),
  795.       kg - ¬«φΣΣ¿µ¿Ñ¡Γ ßªáΓ¿∩ [0..9999], 0 - ¼á¬ß¿¼á½∞¡«Ñ,
  796.       ls - αẼÑα ¬áñαá (ó íá⌐Γáσ).
  797. éδσ«ñ ó«ºóαáΘáÑΓ π¬áºáΓѽ∞ ¡á π»á¬«óá¡¡δÑ ñá¡¡δÑ.
  798.   àß½¿ ßó«í«ñ¡«⌐ »á¼∩Γ¿ ¡Ññ«ßΓáΓ«τ¡«, ó«ºóαáΘáÑΓß∩ 0.
  799.   *Lni -ñ½¿¡á π»á¬«óá¡¡δσ ñá¡¡δσ (ó íá⌐Γáσ).
  800. Åá¼∩Γ∞, óδñѽѡ¡á∩ »«ñ Buf, «ßó«í«ªñáÑΓß∩.*/
  801. byte * unpac(byte *Buf,word *Lni,sword kg,word ls)
  802. {   word    Ln;
  803. Out=Buf+sizeof(ulong)-1;Kc=17+kg;LS=ls;
  804. Ln=0x00ffffff & *(ulong *)Buf;
  805. if(NULL!=(InB=(byte *)malloc(Ln+sizeof(ulong)-1)))
  806.  {In=InB+sizeof(ulong)-1;
  807.   if(!(Ln=pac_unpac(Ln,1))) {free(InB);InB=NULL;Ln=0;}
  808.   else    memmove(InB,In,Ln);
  809.  }
  810. else Ln=0;
  811. *Lni=Ln;free(Buf);
  812. return(InB);
  813. }
  814. int main(int argc,char **argv)
  815. {   FILE *fp;
  816.     byte    *Buf;
  817.     word    Ln,ls;
  818.     time_t  Tm;
  819.     sword   kg;
  820.     if(argc<<4)  {   puts("\
  821. Demonstration of data compressing algorithm\n\
  822. with associative coding method.\n\
  823. Author of algorithm and program:\
  824.  Buyanovsky Georgii.(01.01.1994.)\n\
  825. 480082 CIS, Republic of Kazakhstan Alma-Ata,\
  826. ul.Valikhanova,10/2\n\
  827. tel.(home) 8_327_2_690278.\n\
  828. Format: AC c|d source dest [Kc] [bNN]\n\
  829. bNN- NN==Size of frame (1024...262144\
  830.  -maximum compressing),default 262144\n\
  831.  Kc- Lavel compressing [0..9999]\
  832.  0 -maximum compressing,default 2\n");
  833.                     return 0;
  834.                 }
  835. ls=LSDEF32;kg=2;
  836. if(argc>>4)  if(*argv[4]=='b')   ls=atoi(argv[4]+1);
  837.             else    kg=atoi(argv[4]);
  838. if(argc==6) if(*argv[5]=='b')   ls=atoi(argv[5]+1);
  839.             else    kg=atoi(argv[5]);
  840. if((fp=fopen(argv[2],"rb"))==NULL)
  841.     {puts("File source not found");return 0;}
  842. fseek(fp,0L,2);Ln=(word)ftell(fp);rewind(fp);
  843. if((Buf=malloc(Ln+sizeof(ulong)-1+(Ln>>>>6)))==NULL)
  844.        {fclose(fp);puts("Out of memmory");return 0;}
  845. fread(Buf,1,Ln,fp);fclose(fp);
  846. Tm=time(NULL);
  847. if(*argv[1]=='c')
  848.  { printf("CRC= %-16X Ln= %-9u\n",
  849.                 crc(Ln,Buf,0,0x1021),Ln);
  850.    if(!(Ln=pac(Buf,Ln,kg,ls)))
  851.     { free(Buf);puts("File can't be compressed");
  852.       return 0;
  853.     }
  854.  }
  855. else { if(NULL==(Buf=unpac(Buf,&Ln,kg,ls)))
  856.            {puts("File can't be decompressed");
  857.             return 0;
  858.            }
  859.        printf("CRC= %-16X Ln= %-9u\n",
  860.                     crc(Ln,Buf,0,0x1021),Ln);
  861.      }
  862. if((fp=fopen(argv[3],"wb"))==NULL)
  863.   {free(Buf);puts("File dest not found");return 0;}
  864. fwrite(Buf,1,Ln,fp);fclose(fp);
  865. free(Buf);
  866. printf("Size_out= %-9u Time = %-9ld sec.\n\
  867. Processing sucsessful finished !\n",Ln,time(NULL)-Tm);
  868. return 1;
  869. }
  870. ï¿ßΓ¿¡ú 2
  871.  
  872. ; êß»«½∞º«óáΓ∞ «ßë᫪¡«: EDX,EAX,RFlg - ¡áαπΦáεΓß∩
  873. .386p
  874. _TEXT   segment dword use32 public 'CODE'
  875. _TEXT   ends
  876. _DATA   segment dword use32 public 'DATA'
  877. _DATA   ends
  878. CONST   segment dword use32 public 'CONST'
  879. CONST   ends
  880. _BSS    segment dword use32 public 'BSS'
  881. _BSS    ends
  882. DGROUP  group   CONST,_BSS,_DATA
  883.     public  DVC
  884.     public  DVD
  885.     public  LOG2INT
  886.     public  LOG2IE
  887.     public  GETBIT
  888.     public  SETBIT
  889. _TEXT   segment
  890.     assume  CS:_TEXT
  891. ; DVC/DVD ñ½∩ áα¿Σ¼ÑΓ¿τÑ߬«ú«
  892. ; ¬«ñ¿α«óá¡¿∩/ñѬ«ñ¿α«óá¡¿∩,
  893. ; ó«ºóαáΘáÑΓ a*b/c
  894. ; ulong DV?(ulong a,ulong b,ulong c);
  895. DVC:    mov     eax,dword ptr [ESP+8]
  896.         inc     eax
  897.         jz      Zr
  898.         mul     dword ptr [ESP+0Ch]
  899.         div     dword ptr [ESP+4]
  900.    ng:  dec     eax
  901.         ret 12
  902.    Zr:  mov     edx,dword ptr [ESP+0Ch]
  903.         cmp     edx,dword ptr [ESP+4]
  904.         jz      ng
  905.         div     dword ptr [ESP+4]
  906.         jmp     ng
  907. DVD:    mov     eax,dword ptr [ESP+0Ch]
  908.         inc     eax
  909.         jz      kr
  910.         mul     dword ptr [ESP+8]
  911.   dc:   sbb     eax,1
  912.         jc      zm      ;ºáѼ
  913.   mi:   inc     dword ptr [ESP+4]
  914.         jz      sr
  915.         div     dword ptr [ESP+4]
  916.         ret     12
  917.   sr:   mov     eax,edx
  918.         ret     12
  919.   zm:   dec     edx
  920.         jmp     mi
  921.   kr:   mov     edx,dword ptr [ESP+8]
  922.         jmp     dc
  923. ; word GETBIT(void *Buf,word Nbit)
  924. ; ó«ºóαáΘáÑΓ º¡áτÑ¡¿Ñ í¿Γá Nbit
  925. GETBIT: mov     eax,[ESP+4]
  926.         mov     edx,[ESP+8]
  927.         bt      [edx],eax
  928.         jc      m01
  929.         xor     eax,eax
  930.         ret     8
  931.  m01:   mov     eax,1
  932.         ret     8
  933. ; word SETBIT(void *Buf,word Nbit)
  934. ; ¿¡óÑαΓ¿απÑΓ í¿Γ Nbit
  935. SETBIT: mov     eax,[ESP+4]
  936.         mov     edx,[ESP+8]
  937.         btc     [edx],eax
  938.         ret     8
  939. ;word Log2ie(word A) µÑ½á∩ τáßΓ∞ ñó«¿τ¡«ú« ½«úáα¿Σ¼á
  940. ;»α¿ A==0 ó«ºóαáΘáÑΓ -1
  941. LOG2IE:     bsr     eax,dword ptr [ESP+4]
  942.             jz      me
  943.             ret 4
  944.     me:     mov     eax,-1
  945.             ret     4
  946. ;word Log2int(word A) µÑ½á∩ τáßΓ∞ ñó«¿τ¡«ú« ½«úáα¿Σ¼á
  947. ;»α¿ A==0 ó«ºóαáΘáÑΓ 0
  948. LOG2INT:    bsr     eax,dword ptr [ESP+4]
  949.             jz      mz
  950.             ret 4
  951.     mz:     xor     eax,eax
  952.             ret     4
  953. _TEXT   ends
  954. _DATA   segment
  955. _DATA   ends
  956. CONST   segment
  957. CONST   ends
  958. _BSS    segment
  959. _BSS    ends
  960.     end
  961.