1275793eaSopenharmony_ci#include <stdio.h>
2275793eaSopenharmony_ci#include <stdlib.h>
3275793eaSopenharmony_ci#include <windows.h>
4275793eaSopenharmony_ci
5275793eaSopenharmony_ci#include "zlib.h"
6275793eaSopenharmony_ci
7275793eaSopenharmony_ci
8275793eaSopenharmony_civoid MyDoMinus64(LARGE_INTEGER *R,LARGE_INTEGER A,LARGE_INTEGER B)
9275793eaSopenharmony_ci{
10275793eaSopenharmony_ci    R->HighPart = A.HighPart - B.HighPart;
11275793eaSopenharmony_ci    if (A.LowPart >= B.LowPart)
12275793eaSopenharmony_ci        R->LowPart = A.LowPart - B.LowPart;
13275793eaSopenharmony_ci    else
14275793eaSopenharmony_ci    {
15275793eaSopenharmony_ci        R->LowPart = A.LowPart - B.LowPart;
16275793eaSopenharmony_ci        R->HighPart --;
17275793eaSopenharmony_ci    }
18275793eaSopenharmony_ci}
19275793eaSopenharmony_ci
20275793eaSopenharmony_ci#ifdef _M_X64
21275793eaSopenharmony_ci// see http://msdn2.microsoft.com/library/twchhe95(en-us,vs.80).aspx for __rdtsc
22275793eaSopenharmony_ciunsigned __int64 __rdtsc(void);
23275793eaSopenharmony_civoid BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
24275793eaSopenharmony_ci{
25275793eaSopenharmony_ci //   printf("rdtsc = %I64x\n",__rdtsc());
26275793eaSopenharmony_ci   pbeginTime64->QuadPart=__rdtsc();
27275793eaSopenharmony_ci}
28275793eaSopenharmony_ci
29275793eaSopenharmony_ciLARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
30275793eaSopenharmony_ci{
31275793eaSopenharmony_ci    LARGE_INTEGER LIres;
32275793eaSopenharmony_ci    unsigned _int64 res=__rdtsc()-((unsigned _int64)(beginTime64.QuadPart));
33275793eaSopenharmony_ci    LIres.QuadPart=res;
34275793eaSopenharmony_ci   // printf("rdtsc = %I64x\n",__rdtsc());
35275793eaSopenharmony_ci    return LIres;
36275793eaSopenharmony_ci}
37275793eaSopenharmony_ci#else
38275793eaSopenharmony_ci#ifdef _M_IX86
39275793eaSopenharmony_civoid myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
40275793eaSopenharmony_ci{
41275793eaSopenharmony_ci    DWORD dwEdx,dwEax;
42275793eaSopenharmony_ci    _asm
43275793eaSopenharmony_ci    {
44275793eaSopenharmony_ci        rdtsc
45275793eaSopenharmony_ci        mov dwEax,eax
46275793eaSopenharmony_ci        mov dwEdx,edx
47275793eaSopenharmony_ci    }
48275793eaSopenharmony_ci    pbeginTime64->LowPart=dwEax;
49275793eaSopenharmony_ci    pbeginTime64->HighPart=dwEdx;
50275793eaSopenharmony_ci}
51275793eaSopenharmony_ci
52275793eaSopenharmony_civoid BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
53275793eaSopenharmony_ci{
54275793eaSopenharmony_ci    myGetRDTSC32(pbeginTime64);
55275793eaSopenharmony_ci}
56275793eaSopenharmony_ci
57275793eaSopenharmony_ciLARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
58275793eaSopenharmony_ci{
59275793eaSopenharmony_ci    LARGE_INTEGER LIres,endTime64;
60275793eaSopenharmony_ci    myGetRDTSC32(&endTime64);
61275793eaSopenharmony_ci
62275793eaSopenharmony_ci    LIres.LowPart=LIres.HighPart=0;
63275793eaSopenharmony_ci    MyDoMinus64(&LIres,endTime64,beginTime64);
64275793eaSopenharmony_ci    return LIres;
65275793eaSopenharmony_ci}
66275793eaSopenharmony_ci#else
67275793eaSopenharmony_civoid myGetRDTSC32(LARGE_INTEGER * pbeginTime64)
68275793eaSopenharmony_ci{
69275793eaSopenharmony_ci}
70275793eaSopenharmony_ci
71275793eaSopenharmony_civoid BeginCountRdtsc(LARGE_INTEGER * pbeginTime64)
72275793eaSopenharmony_ci{
73275793eaSopenharmony_ci}
74275793eaSopenharmony_ci
75275793eaSopenharmony_ciLARGE_INTEGER GetResRdtsc(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
76275793eaSopenharmony_ci{
77275793eaSopenharmony_ci    LARGE_INTEGER lr;
78275793eaSopenharmony_ci    lr.QuadPart=0;
79275793eaSopenharmony_ci    return lr;
80275793eaSopenharmony_ci}
81275793eaSopenharmony_ci#endif
82275793eaSopenharmony_ci#endif
83275793eaSopenharmony_ci
84275793eaSopenharmony_civoid BeginCountPerfCounter(LARGE_INTEGER * pbeginTime64,BOOL fComputeTimeQueryPerf)
85275793eaSopenharmony_ci{
86275793eaSopenharmony_ci    if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(pbeginTime64)))
87275793eaSopenharmony_ci    {
88275793eaSopenharmony_ci        pbeginTime64->LowPart = GetTickCount();
89275793eaSopenharmony_ci        pbeginTime64->HighPart = 0;
90275793eaSopenharmony_ci    }
91275793eaSopenharmony_ci}
92275793eaSopenharmony_ci
93275793eaSopenharmony_ciDWORD GetMsecSincePerfCounter(LARGE_INTEGER beginTime64,BOOL fComputeTimeQueryPerf)
94275793eaSopenharmony_ci{
95275793eaSopenharmony_ci    LARGE_INTEGER endTime64,ticksPerSecond,ticks;
96275793eaSopenharmony_ci    DWORDLONG ticksShifted,tickSecShifted;
97275793eaSopenharmony_ci    DWORD dwLog=16+0;
98275793eaSopenharmony_ci    DWORD dwRet;
99275793eaSopenharmony_ci    if ((!fComputeTimeQueryPerf) || (!QueryPerformanceCounter(&endTime64)))
100275793eaSopenharmony_ci        dwRet = (GetTickCount() - beginTime64.LowPart)*1;
101275793eaSopenharmony_ci    else
102275793eaSopenharmony_ci    {
103275793eaSopenharmony_ci        MyDoMinus64(&ticks,endTime64,beginTime64);
104275793eaSopenharmony_ci        QueryPerformanceFrequency(&ticksPerSecond);
105275793eaSopenharmony_ci
106275793eaSopenharmony_ci
107275793eaSopenharmony_ci        {
108275793eaSopenharmony_ci            ticksShifted = Int64ShrlMod32(*(DWORDLONG*)&ticks,dwLog);
109275793eaSopenharmony_ci            tickSecShifted = Int64ShrlMod32(*(DWORDLONG*)&ticksPerSecond,dwLog);
110275793eaSopenharmony_ci
111275793eaSopenharmony_ci        }
112275793eaSopenharmony_ci
113275793eaSopenharmony_ci        dwRet = (DWORD)((((DWORD)ticksShifted)*1000)/(DWORD)(tickSecShifted));
114275793eaSopenharmony_ci        dwRet *=1;
115275793eaSopenharmony_ci    }
116275793eaSopenharmony_ci    return dwRet;
117275793eaSopenharmony_ci}
118275793eaSopenharmony_ci
119275793eaSopenharmony_ciint ReadFileMemory(const char* filename,long* plFileSize,unsigned char** pFilePtr)
120275793eaSopenharmony_ci{
121275793eaSopenharmony_ci    FILE* stream;
122275793eaSopenharmony_ci    unsigned char* ptr;
123275793eaSopenharmony_ci    int retVal=1;
124275793eaSopenharmony_ci    stream=fopen(filename, "rb");
125275793eaSopenharmony_ci    if (stream==NULL)
126275793eaSopenharmony_ci        return 0;
127275793eaSopenharmony_ci
128275793eaSopenharmony_ci    fseek(stream,0,SEEK_END);
129275793eaSopenharmony_ci
130275793eaSopenharmony_ci    *plFileSize=ftell(stream);
131275793eaSopenharmony_ci    fseek(stream,0,SEEK_SET);
132275793eaSopenharmony_ci    ptr=malloc((*plFileSize)+1);
133275793eaSopenharmony_ci    if (ptr==NULL)
134275793eaSopenharmony_ci        retVal=0;
135275793eaSopenharmony_ci    else
136275793eaSopenharmony_ci    {
137275793eaSopenharmony_ci        if (fread(ptr, 1, *plFileSize,stream) != (*plFileSize))
138275793eaSopenharmony_ci            retVal=0;
139275793eaSopenharmony_ci    }
140275793eaSopenharmony_ci    fclose(stream);
141275793eaSopenharmony_ci    *pFilePtr=ptr;
142275793eaSopenharmony_ci    return retVal;
143275793eaSopenharmony_ci}
144275793eaSopenharmony_ci
145275793eaSopenharmony_ciint main(int argc, char *argv[])
146275793eaSopenharmony_ci{
147275793eaSopenharmony_ci    int BlockSizeCompress=0x8000;
148275793eaSopenharmony_ci    int BlockSizeUncompress=0x8000;
149275793eaSopenharmony_ci    int cprLevel=Z_DEFAULT_COMPRESSION ;
150275793eaSopenharmony_ci    long lFileSize;
151275793eaSopenharmony_ci    unsigned char* FilePtr;
152275793eaSopenharmony_ci    long lBufferSizeCpr;
153275793eaSopenharmony_ci    long lBufferSizeUncpr;
154275793eaSopenharmony_ci    long lCompressedSize=0;
155275793eaSopenharmony_ci    unsigned char* CprPtr;
156275793eaSopenharmony_ci    unsigned char* UncprPtr;
157275793eaSopenharmony_ci    long lSizeCpr,lSizeUncpr;
158275793eaSopenharmony_ci    DWORD dwGetTick,dwMsecQP;
159275793eaSopenharmony_ci    LARGE_INTEGER li_qp,li_rdtsc,dwResRdtsc;
160275793eaSopenharmony_ci
161275793eaSopenharmony_ci    if (argc<=1)
162275793eaSopenharmony_ci    {
163275793eaSopenharmony_ci        printf("run TestZlib <File> [BlockSizeCompress] [BlockSizeUncompress] [compres. level]\n");
164275793eaSopenharmony_ci        return 0;
165275793eaSopenharmony_ci    }
166275793eaSopenharmony_ci
167275793eaSopenharmony_ci    if (ReadFileMemory(argv[1],&lFileSize,&FilePtr)==0)
168275793eaSopenharmony_ci    {
169275793eaSopenharmony_ci        printf("error reading %s\n",argv[1]);
170275793eaSopenharmony_ci        return 1;
171275793eaSopenharmony_ci    }
172275793eaSopenharmony_ci    else printf("file %s read, %ld bytes\n",argv[1],lFileSize);
173275793eaSopenharmony_ci
174275793eaSopenharmony_ci    if (argc>=3)
175275793eaSopenharmony_ci        BlockSizeCompress=atol(argv[2]);
176275793eaSopenharmony_ci
177275793eaSopenharmony_ci    if (argc>=4)
178275793eaSopenharmony_ci        BlockSizeUncompress=atol(argv[3]);
179275793eaSopenharmony_ci
180275793eaSopenharmony_ci    if (argc>=5)
181275793eaSopenharmony_ci        cprLevel=(int)atol(argv[4]);
182275793eaSopenharmony_ci
183275793eaSopenharmony_ci    lBufferSizeCpr = lFileSize + (lFileSize/0x10) + 0x200;
184275793eaSopenharmony_ci    lBufferSizeUncpr = lBufferSizeCpr;
185275793eaSopenharmony_ci
186275793eaSopenharmony_ci    CprPtr=(unsigned char*)malloc(lBufferSizeCpr + BlockSizeCompress);
187275793eaSopenharmony_ci
188275793eaSopenharmony_ci    BeginCountPerfCounter(&li_qp,TRUE);
189275793eaSopenharmony_ci    dwGetTick=GetTickCount();
190275793eaSopenharmony_ci    BeginCountRdtsc(&li_rdtsc);
191275793eaSopenharmony_ci    {
192275793eaSopenharmony_ci        z_stream zcpr;
193275793eaSopenharmony_ci        int ret=Z_OK;
194275793eaSopenharmony_ci        long lOrigToDo = lFileSize;
195275793eaSopenharmony_ci        long lOrigDone = 0;
196275793eaSopenharmony_ci        int step=0;
197275793eaSopenharmony_ci        memset(&zcpr,0,sizeof(z_stream));
198275793eaSopenharmony_ci        deflateInit(&zcpr,cprLevel);
199275793eaSopenharmony_ci
200275793eaSopenharmony_ci        zcpr.next_in = FilePtr;
201275793eaSopenharmony_ci        zcpr.next_out = CprPtr;
202275793eaSopenharmony_ci
203275793eaSopenharmony_ci
204275793eaSopenharmony_ci        do
205275793eaSopenharmony_ci        {
206275793eaSopenharmony_ci            long all_read_before = zcpr.total_in;
207275793eaSopenharmony_ci            zcpr.avail_in = min(lOrigToDo,BlockSizeCompress);
208275793eaSopenharmony_ci            zcpr.avail_out = BlockSizeCompress;
209275793eaSopenharmony_ci            ret=deflate(&zcpr,(zcpr.avail_in==lOrigToDo) ? Z_FINISH : Z_SYNC_FLUSH);
210275793eaSopenharmony_ci            lOrigDone += (zcpr.total_in-all_read_before);
211275793eaSopenharmony_ci            lOrigToDo -= (zcpr.total_in-all_read_before);
212275793eaSopenharmony_ci            step++;
213275793eaSopenharmony_ci        } while (ret==Z_OK);
214275793eaSopenharmony_ci
215275793eaSopenharmony_ci        lSizeCpr=zcpr.total_out;
216275793eaSopenharmony_ci        deflateEnd(&zcpr);
217275793eaSopenharmony_ci        dwGetTick=GetTickCount()-dwGetTick;
218275793eaSopenharmony_ci        dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
219275793eaSopenharmony_ci        dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
220275793eaSopenharmony_ci        printf("total compress size = %u, in %u step\n",lSizeCpr,step);
221275793eaSopenharmony_ci        printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
222275793eaSopenharmony_ci        printf("defcpr time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
223275793eaSopenharmony_ci        printf("defcpr result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
224275793eaSopenharmony_ci    }
225275793eaSopenharmony_ci
226275793eaSopenharmony_ci    CprPtr=(unsigned char*)realloc(CprPtr,lSizeCpr);
227275793eaSopenharmony_ci    UncprPtr=(unsigned char*)malloc(lBufferSizeUncpr + BlockSizeUncompress);
228275793eaSopenharmony_ci
229275793eaSopenharmony_ci    BeginCountPerfCounter(&li_qp,TRUE);
230275793eaSopenharmony_ci    dwGetTick=GetTickCount();
231275793eaSopenharmony_ci    BeginCountRdtsc(&li_rdtsc);
232275793eaSopenharmony_ci    {
233275793eaSopenharmony_ci        z_stream zcpr;
234275793eaSopenharmony_ci        int ret=Z_OK;
235275793eaSopenharmony_ci        long lOrigToDo = lSizeCpr;
236275793eaSopenharmony_ci        long lOrigDone = 0;
237275793eaSopenharmony_ci        int step=0;
238275793eaSopenharmony_ci        memset(&zcpr,0,sizeof(z_stream));
239275793eaSopenharmony_ci        inflateInit(&zcpr);
240275793eaSopenharmony_ci
241275793eaSopenharmony_ci        zcpr.next_in = CprPtr;
242275793eaSopenharmony_ci        zcpr.next_out = UncprPtr;
243275793eaSopenharmony_ci
244275793eaSopenharmony_ci
245275793eaSopenharmony_ci        do
246275793eaSopenharmony_ci        {
247275793eaSopenharmony_ci            long all_read_before = zcpr.total_in;
248275793eaSopenharmony_ci            zcpr.avail_in = min(lOrigToDo,BlockSizeUncompress);
249275793eaSopenharmony_ci            zcpr.avail_out = BlockSizeUncompress;
250275793eaSopenharmony_ci            ret=inflate(&zcpr,Z_SYNC_FLUSH);
251275793eaSopenharmony_ci            lOrigDone += (zcpr.total_in-all_read_before);
252275793eaSopenharmony_ci            lOrigToDo -= (zcpr.total_in-all_read_before);
253275793eaSopenharmony_ci            step++;
254275793eaSopenharmony_ci        } while (ret==Z_OK);
255275793eaSopenharmony_ci
256275793eaSopenharmony_ci        lSizeUncpr=zcpr.total_out;
257275793eaSopenharmony_ci        inflateEnd(&zcpr);
258275793eaSopenharmony_ci        dwGetTick=GetTickCount()-dwGetTick;
259275793eaSopenharmony_ci        dwMsecQP=GetMsecSincePerfCounter(li_qp,TRUE);
260275793eaSopenharmony_ci        dwResRdtsc=GetResRdtsc(li_rdtsc,TRUE);
261275793eaSopenharmony_ci        printf("total uncompress size = %u, in %u step\n",lSizeUncpr,step);
262275793eaSopenharmony_ci        printf("time = %u msec = %f sec\n",dwGetTick,dwGetTick/(double)1000.);
263275793eaSopenharmony_ci        printf("uncpr  time QP = %u msec = %f sec\n",dwMsecQP,dwMsecQP/(double)1000.);
264275793eaSopenharmony_ci        printf("uncpr  result rdtsc = %I64x\n\n",dwResRdtsc.QuadPart);
265275793eaSopenharmony_ci    }
266275793eaSopenharmony_ci
267275793eaSopenharmony_ci    if (lSizeUncpr==lFileSize)
268275793eaSopenharmony_ci    {
269275793eaSopenharmony_ci        if (memcmp(FilePtr,UncprPtr,lFileSize)==0)
270275793eaSopenharmony_ci            printf("compare ok\n");
271275793eaSopenharmony_ci
272275793eaSopenharmony_ci    }
273275793eaSopenharmony_ci
274275793eaSopenharmony_ci    return 0;
275275793eaSopenharmony_ci}
276