ÃÑ ÆäÀÌÁö ¼ö : 3121

Àüü ÇÔ¼ö/¿ë¾î»çÀü
ÇöÀçÀ§Ä¡ : article>zlib_prog

¿øº» docbook¹®¼­
Zlib Ȱ¿ë

Zlib Ȱ¿ë

À± »ó¹è

dreamyun@yahoo.co.kr

고친 과정
고침 0.82003³â 10¿ù 2ÀÏ 23½Ã
ÃÖÃÊ ¹®¼­ÀÛ¼º

1. ¼Ò°³

PC¿Í ÀÎÅͳÝÀÇ º¸±ÞÀ¸·Î µ¥ÀÌÅÍÀÇ ¾çÀÌ ±ÞÁõÇϰí ÀÖ´Ù. ±×·¯´Ù º¸´Ï µ¥ÀÌÅÍ ÀúÀå°ø°£¿¡ ¸¹Àº ¾Ð¹ÚÀ» ¹Þ°Ô µÈ´Ù. °Å±â¿¡ ´õºÒ¾î ÀÎÅͳÝÀÌ ´ëÁßÈ­ µÇ¸é¼­ µ¥ÀÌÅ͸¦ Àü¼ÛÇϱâ À§ÇÑ ³×Æ®¿öÅ©ÀÚ¿ø¿¡ÀÇ ¾Ð¹Úµµ ¹Þ°Ô µÇ¾ú´Ù.

ÀÌ·± ¹®Á¦¸¦ ÇØ°áÇϱâ À§Çؼ­ °³¹ßµÈ°Ô µ¥ÀÌÅÍ ¾ÐÃà±â¼úÀ̸ç, Zlib´Â ¹ü¿ëÀûÀÎ µ¥ÀÌÅÍÀÇ ¾ÐÃàÀ» À§ÇÑ ¸ñÀûÀ¸·Î °³¹ßµÇ¾ú´Ù. ÀÌ ¹®¼­´Â Zlib¸¦ ¼³¸íÇϱâ À§ÇÑ ¸ñÀûÀ¸·Î ÀÛ¼ºµÇ¾úÀ¸¸ç, ·¹ÆÛ·±½º ¿ëµµ·Î½á À¯¿ëÇÏ°Ô »ç¿ë°¡´É ÇÒ°ÍÀÌ´Ù. ¶ÇÇÑ ¹®¼­ÀÇ ¸¶Áö¸·¿¡ °£´ÜÇÑ È°¿ë¿¹Á¦¸¦ µÒÀ¸·Î½á Á»´õ ½±°Ô ÀÌÇØÇϵµ·Ï ¹è·ÁÇϰí ÀÖ´Ù.

ÀÌ ¹®¼­ÀÇ ¸¹Àº ³»¿ëµéÀº Zlib·¹ÆÛ·±½º ¸Þ´º¾óÀ» Âü°í Çϰí ÀÖ´Ù.


2. Zlib¸¦ ÀÌ¿ëÇÑ ¾ÐÃà ÇÁ·Î±×·¡¹Ö

À̹øÀå¿¡¼­´Â Zlib¿¡ ´ëÇÑ °³·«ÀûÀÎ ¼Ò°³¿Í ÇÔ²² Zlib¿¡¼­ Á¦°øÇÏ´Â °¢Á¾ ÇÔ¼ö¿¡ ´ëÇØ¼­ ´Ù·ç°Ô µÈ´Ù. ±×·¯³ª ¸ðµç ÇÔ¼öµé¿¡ ´ëÇØ¼­´Â ´Ù·çÁö ¾Ê°í ÇÁ·Î±×·¡¹Ö Çϴµ¥ ÇÊ¿äÇÑ Çʼö ÇÔ¼öµé¸¸À» ´Ù·ê °ÍÀÌ´Ù. À̿ܿ¡µµ zlib¿¡¼­ Á¦°øµÇ´Â ÇÔ¼öµéÀÌ Àִµ¥, ÀϹÝÀûÀÎ ÀÀ¿ë ¾ÖÇø®ÄÉÀ̼ÇÀÇ Á¦ÀÛ¿¡´Â °ÅÀÇ »ç¿ëµÇÁö ¾Ê´Â ÇÔ¼öµéÀÌ´Ù. À̵é ÇÔ¼öµé¿¡ ´ëÇÑ ÀÚ¼¼ÇÑ ¼³¸íÀº Zlib·¹ÆÛ·±½º ¸Þ´º¾ó¸¦ Âü°íÇϱ⠹ٶõ´Ù.

Áö±ÝÀº ´ÜÁö ÀÚÁÖ »ç¿ëµÇ´Â À¯Æ¿¸®Æ¼ ÇÔ¼öµé¸¸ ¼³¸íÇϰí Àִµ¥, ½Ã°£ÀÌ µÈ´Ù¸é zlib¿¡¼­ Á¦°øÇÏ´Â ´Ù¸¥ ÇÔ¼öµé¿¡ ´ëÇØ¼­µµ ¼³¸íÇϵµ·Ï ÇϰڴÙ. (zlib¿¡¼­´Â Å©°Ô À¯Æ¿¸®Æ¼ ÇÔ¼ö, ±âº» ÇÔ¼ö, °í±Þ ÇÔ¼ö ¼¼°³·Î ºÐ·ùµÇ¾î¼­ ¼³¸íÇϰí ÀÖ´Ù.)


2.1. À¯Æ¿¸®Æ¼ ÇÔ¼ö¼³¸í

À¯Æ¿¸®Æ¼ ÇÔ¼öµéÀº ¸» ±×´ë·Î ÀÀ¿ë ¾ÖÇø®ÄÉÀÌ¼Ç ·¹º§¿¡¼­ °£´ÜÇÏ°Ô »ç¿ëÇÒ ¼ö ÀÖ´Â ³ôÀº ¼öÁØÀÇ ÇÔ¼öµé·Î½á ´ÙÀ½Àå¿¡ ¼³¸íÇÏ°ÔµÉ ±âº»ÇÔ¼öµéÀÇ ÀÀ¿ëÇÔ¼öµéÀÌ´Ù.

³ôÀº ¼öÁØÀÇ ÇÔ¼öµéÀÎ ¸¸Å­ »ç¿ëÇÏ±â ÆíÇÏ°í ´ëºÎºÐÀÇ ¾ÐÃàÀÛ¾÷À» Çϴµ¥ À־ ¿©±â¿¡¼­ Á¦°øÇÏ´Â °Íµé·Î ÃæºÐÇÒ °ÍÀÌ´Ù.

ÇÔ¼öµéÀ» »ìÆìº¸¸é ¾Ë°ÚÁö¸¸ ÆÄÀϰü·Ã ÀÛ¾÷À» À§ÇØ »ç¿ëµÇ´Â ÇÔ¼öµé°ú À̸§À̳ª ¾²ÀÓ»õ°¡ ¸Å¿ì ºñ½ÁÇÏ´Ù´Â°É ¾Ë ¼ö ÀÖÀ» °ÍÀÌ´Ù. ±âÁ¸ÀÇ Ç¥ÁØÀûÀÎ ÇÔ¼öµé°ú ºñ½ÁÇÑ ÀÎÅÍÆäÀ̽º¸¦ À¯ÁöÇϹǷνá ÇÔ¼ö¸¦ ÀÌÇØÇÏ°í »ç¿ëÇϱⰡ Á»´õ ¼ö¿ùÇÏ´Ù.


2.1.1. compress

int compress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen);
				
À̸§¿¡¼­ ¾Ë ¼ö ÀÖµíÀÌ µ¥ÀÌÅ͸¦ ¾ÐÃàÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. sourceµ¥ÀÌÅ͸¦ sourceLenÅ©±â ¸¸Å­ ¾ÐÃàÀ» ÇØ¼­ dest ¹öÆÛ·Î º¹»çÇÑ´Ù. destLenÀº dest¹öÆÛÀÇ ÃÑ Å©±âÀε¥, ÃÖ¼ÒÇÑ sourceLen 0.1%Á¤µµ Å©°Ô Àâ¾Æ ÁÖ¾î¾ß ÇÑ´Ù. ¾ÐÃàÀ» ½Ç½ÃÇÒ °æ¿ì ¹Ýµå½Ã µ¥ÀÌÅÍÀÇ Å©±â°¡ ÀÛ¾ÆÁú °Å¶ó°í »ý°¢ÇÒ ¼ö ÀÖ°ÚÁö¸¸ ¿ÀÈ÷·Á Ä¿Áö´Â °æ¿ìµµ »ý±æ ¼ö Àֱ⠶§¹®ÀÌ´Ù. ¸Å¿ì ÀÛÀº µ¥ÀÌÅ͸¦ ¾ÐÃàÇϰųª ÀÌ¹Ì ¾ÐÃàµÈ µ¥ÀÌÅ͸¦ ¾ÐÃàÇÏ´Â °æ¿ì ¾ÐÃàµÈ µ¥ÀÌÅÍ¿¡ zlibÇì´õ°¡ ºÙ¾î¼­ ¿ÀÈ÷·Á µ¥ÀÌÅÍÀÇ ¾çÀÌ ´õ Ä¿Áú ¼öµµ ÀÖ´Ù.

compress´Â ¼º°øÀûÀ¸·Î ¾ÐÃàµÇ¾úÀ» °æ¿ì Z_OK¸¦ ¸Þ¸ð¸®°¡ ÃæºÐÇÏÁö ¾ÊÀ»°æ¿ì Z_MEM_ERROR, ¹öÆÛÀÇ Å©±â°¡ ÃæºÐÇÏÁö ¾ÊÀ»°æ¿ì Z_BUF_ERROR¸¦ ¸®ÅÏÇÑ´Ù.


2.1.2. compress2

int compress2(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen, int level);
				
levelÀ̶õ ÀÎÀÚ°¡ Ãß°¡µÈ°Í ¿Ü¿¡´Â compress¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÏ´Ù. levelÀº ¾ÐÃàÀÇ Á¤µµ¸¦ °áÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÏ´Â °ÍÀ¸·Î 0¿¡¼­ 9»çÀÌÀÇ °ªÀ» °¡Áø´Ù. 0Àº °¡Àå ºü¸¥ ¾ÐÃà½Ã°£À» º¸¿©ÁÖ¸ç 9´Â ÃÖ°íÀÇ ¾ÐÃà·üÀ» º¸¿©ÁØ´Ù. ¸¸¾à levelÀ» 0À¸·Î ÇÏ¿´´Ù¸é ÀüÇô ¾ÐÃàÀ» ÇÏÁö ¾Ê´Â´Ù´Â Àǹ̷Πµ¥ÀÌÅÍ º¹»ç¸¦ ÇÏ´Â °Í°ú µ¿ÀÏÇÑ È¿°ú¸¦ º¸¿©ÁØ´Ù.

¸®ÅϰªÀº commpress¿Í ¿ÏÀüÈ÷ µ¿ÀÏÇÔÀ¸·Î Âü°íÇϱ⠹ٶõ´Ù.


2.1.3. uncompress

int uncompress(Bytef *dest, uLongf *destLen, const Bytef *source, uLong sourceLen); 
				
¾ÐÃàµÈ µ¥ÀÌÅÍÀÇ ¾ÐÃàÀ» Ç®±â À§Çؼ­ »ç¿ëÇÑ´Ù. ¾ÐÃàµÈ µ¥ÀÌÅÍ source¸¦ sourceLen±æÀ̸¸Å­ Àо ¾ÐÃàÀ» ÇØÁ¦ÇÑ´ÙÀ½ dest¹öÆÛ¿¡ ÀúÀåÇÑ´Ù. destLen´Â dest¹öÆÛÀÇ Å©±â·Î ¾ÐÃàÀÌ Ç®¸± µ¥ÀÌÅÍÀÇ Å©±â¸¦ ¿¹»óÇØ¼­ ÃæºÐÈ÷ Å©°Ô Àâ¾Æ¾ß ÇÑ´Ù. ¾ÐÃàÀ» ÇØÁ¦ÇÏ´Â ÀÛ¾÷ÀÌ ¼º°øÀûÀ¸·Î ÀÌ·ç¾îÁ³´Ù¸é ½ÇÁ¦ ¾ÐÃàÀÌ Ç®¸° µ¥ÀÌÅÍÀÇ Å©±â°¡ destLen¿¡ µé¾î°¡°Ô µÈ´Ù.

¼º°øÀûÀ¸·Î ¼öÇàµÇ¾úÀ» °æ¿ì Z_OK°¡ ¸®ÅϵǸç, ¸Þ¸ð¸®°¡ ÃæºÐÄ¡ ¾ÊÀ»°æ¿ì Z_MEM_ERROR, ¹öÆÛÀÇ Å©±â°¡ ÃæºÐÄ¡ ¾ÊÀ» °æ¿ì Z_BUF_ERROR, ¾ÐÃ൥ÀÌÅͰ¡ À߸øµÇ¾î ÀÖÀ» °æ¿ì Z_DATA_ERRORÀ» ¸®ÅÏÇÑ´Ù.


2.1.4. gzopen

typedef voidp gzFile;

gzFile gzopen(const char *path, const char *mode);
				
¾ÐÃàµÈ µ¥ÀÌÅ͸¦ Àаųª ¾²±â À§Çؼ­ gzipÆÄÀÏÀ» ¿¬´Ù. µÎ¹øÂ° ÀÎÀÚÀÎ mode´Â "rb", "wb"µîÀÌ »ç¿ëµÈ´Ù. ÆÄÀÏÀÌ ¾ÐÃàÆ÷¸äµÈ ÆÄÀÏÀÌ ¾Æ´Ï´õ¶óµµ »ó°üÀº ¾ø´Ù. ¼º°øÀûÀ¸·Î ÆÄÀÏÀ» ¿­¾úÀ»°æ¿ì gzFile¸¦ ¸®ÅÏÇϴµ¥, ¾ÐÃàÆÄÀÏ ½ºÆ®¸²À¸·Î gzread, gzwriteµîÀÇ ÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ ½ÇÁúÀûÀÎ ¾ÐÃàÀÛ¾÷À» ÇÒ¶§ (ÆÄÀÏÁöÁ¤ÀÚ)ó·³ »ç¿ëµÈ´Ù.

ÆÄÀÏÀ» ¿­±â¿¡ ½ÇÆÐÇßÀ» °æ¿ì NULLÀ» ¸®ÅÏÇÑ´Ù.


2.1.5. gzdopen

gzFile gzdopen(int fd, const char *mode);
				
¿­°íÀÚ ÇÏ´Â ÆÄÀÏÀÇ À̸§ÀÌ µé¾î°¡´Â ´ë½Å ÆÄÀÏ ÁöÁ¤ÀÚ°¡ µé¾î°£´Ù´Â °Í¸¸À» Á¦¿ÜÇϰí´Â gzopen°ú µ¿ÀÏÇÏ°Ô ÀÛµ¿ÇÑ´Ù. ÆÄÀÏÁöÁ¤ÀÚ´Â open, creat, pipe, filnoµîÀ¸·Î »ý¼ºµÈ´Ù.

½ÇÆÐÇßÀ» °æ¿ì NULLÀ» ¸®ÅÏÇÑ´Ù.


2.1.6. gzsetparams

int gzsetparams(gzFile file, int level, int strategy);
				
µ¿ÀûÀ¸·Î ¾ÐÃà·¹º§(level)°ú ¾ÐÃàÁ¤Ã¥(strategy)À» º¯°æÇϱâ À§Çؼ­ »ç¿ëµÈ´Ù. levelÀº ¾ÐÃà·üÀ» ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëµÈ´Ù.

¾ÐÃàÁ¤Ã¥Àº Z_DEFAULT_STRATEGY¿Í Z_FILTERED, Z_HUFFMAN_ONLY Áß Çϳª¸¦ ¼±ÅÃÇÒ ¼ö ÀÖ´Ù.

¼º°øÇßÀ» °æ¿ì Z_OK¸¦ ½ÇÆÐÇßÀ» °æ¿ì Z_STREAM_ERRORÀ» ¸®ÅÏÇÑ´Ù.


2.1.7. gzread

int gzread(gzFile file, voidp buf, unsigned len);
				
¾ÐÃàÆÄÀÏ ½ºÆ®¸² file·Î ºÎÅÍ lenÅ©±â¸¸Å­ Àо ¾ÐÃàÀ» Ǭ´ÙÀ½ buf¿¡ ÀúÀåÇÑ´Ù. ¸¸¾à ÆÄÀÏÀÌ gzip Æ÷¸ËÀÌ ¾Æ´Ò°æ¿ì ´Ü¼øÈ÷ µ¥ÀÌÅ͸¦ º¹»çÇÑ´Ù.

¼º°øÇßÀ» °æ¿ì ¾ÐÃàÇ®¸° µ¥ÀÌÅÍÀÇ Å©±â¸¦ µÇµ¹·ÁÁØ´Ù. ÆÄÀÏÀÇ ³¡ÀÏ °æ¿ì 0À» ±×¹ÛÀÇ ¿¡·¯¿¡ ´ëÇØ¼­´Â -1À» ¸®ÅÏÇÑ´Ù.


2.1.8. gzwrite

int gzwrite (gzFile file, const voidp buf, unsigned len);
				
buf·Î ºÎÅÍ lenÅ©±â¸¸Å­ µ¥ÀÌÅ͸¦ Àоîµé¿©¼­ ¾ÐÃàÀ» ÇÑ´ÙÀ½ file¿¡ ¾´´Ù. ¼º°øÀûÀ¸·Î ¼öÇàµÇ¾ú´Ù¸é ÀÔ·ÂµÈ ¿øº» µ¥ÀÌÅÍÀÇ Å©±â°¡ ¸®Åϵǰí, ½ÇÆÐ ÇßÀ» °æ¿ì 0ÀÌ ¸®ÅϵȴÙ.


2.1.9. int VAgzprintf

int VAgzprintf(gzFile file, const char *format, ...); 
				
Æ÷¸Ë ÀúÀåÀ» À§ÇÑ fprintf(3)¸¦ ¾Ë°í ÀÖÀ» °ÍÀÌ´Ù. ÀÌ ÇÔ¼ö´Â fprintfÀÇ ¾ÐÃà¹öÁ¯À̶ó°í ÇÒ¸¸ÇÏ´Ù. Æ÷¸ËÀ» ¹Þ¾Æ¼­ ¾ÐÃàÇÑ´ÙÀ½¿¡ ÀúÀåÇÑ´Ù. ¼º°øÇßÀ» °æ¿ì ¾ÐÃà¿¡ »ç¿ëµÈ µ¥ÀÌÅÍÀÇ Å©±â¸¦ ¸®ÅÏÇÏ°í ½ÇÆÐÇßÀ» °æ¿ì 0À» ¸®ÅÏÇÑ´Ù.


2.1.10. gzputs

int gzputs(gzFile file, const char *s);
				
³ÎÀÌ Á¦°ÅµÈ ¹®ÀÚ¿­À» ¹Þ¾Æµé¿©¼­ ¾ÐÃàÇÑ´Ù.

¼º°øÇßÀ» °æ¿ì ¹®ÀÚ¿­ÀÇ Å©±â¸¦ ±×·¸Áö ¾ÊÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù.


2.1.11. gzgets

char *gzgets(gzFile file, char *buf, int len);
				
¾ÐÃàÆÄÀÏ ½ºÆ®¸² file·Î ºÎÅÍ µ¥ÀÌÅ͸¦ Àоîµé¿©¼­ ¾ÐÃàÀ» Ǭ´ÙÀ½ ¹®ÀÚ¿­À» µÇµ¹·ÁÁØ´Ù. µ¥ÀÌÅ͸¦ ÀÐÀ» ¶§´Â len - 1¸¸Å­À» ÀÐ¾î µéÀÌ¸ç °³Ç๮ÀÚ¸¦ ¸¸³ª¸é ¸®ÅϽÃŲ´Ù. fgets(3)ÀÇ ¾ÐÃà¹öÁ¯ÀÌ´Ù.

½ÇÆÐ ÇßÀ»°æ¿ì Z_NULLÀ» ¸®ÅÏÇÑ´Ù.


2.1.12. gzputc

int gzputc(gzFile file, int c);
				
¹®ÀÚ c¸¦ unsigned char·Î º¯°æÇÑ´ÙÀ½ file·Î ÀúÀåÇÑ´Ù. ¼º°øÇϸé ÀÔ·ÂÇÑ °ªÀ» ¸®ÅÏÇÏ°í ½ÇÆÐÇßÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù.


2.1.13. gzgetc

int gzgetc(gzFile file);
				
¾ÐÃàÆÄÀÏ·Î ºÎÅÍ 1¹ÙÀÌÆ®¸¦ ÀоîµéÀδÙ. ¼º°øÇϸé ÀоîµéÀÎ °ªÀ» ¸®ÅÏÇÏ°í ÆÄÀÏÀÇ ³¡À» ¸¸³µ°Å³ª ½ÇÆÐÇßÀ» °æ¿ì -1À» ¸®ÅÏÇÑ´Ù.


2.1.14. gzfluseh

int gzflush(gzFile file, int flush);
				
Ãâ·Â´ë±â ÁßÀÎ ¸ðµç µ¥ÀÌÅ͸¦ ÆÄÀÏ¿¡ ¾´´Ù.

¼º°øÇßÀ» °æ¿ì Z_OK¸¦ ¸®ÅÏÇÑ´Ù.


2.1.15. gzseek

z_off_t gzseek(gzFile file, z_off_t offset, int whence);
				
file¿¡¼­ gzread³ª gzwrite¸¦ ÀÌ¿ëÇÒ ½ÃÀÛ À§Ä¡¸¦ ÁöÁ¤Çϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. lseek(2)¿Í ºñ½ÁÇÏ´Ù°í º¼¼ö ÀÖ´Ù. offsetÀº ¾ÐÃàÀÌ Ç®¸° µ¥ÀÌÅÍÀÇ º¯À§¸¦ °¡¸£Å²´Ù. whence´Â lseek(2)¿¡¼­¿Í µ¿ÀÏÇÑ °ªÀ» »ç¿ëÇÒ ¼ö ÀÖÁö¸¸ SEEK_END°¡ Áö¿øµÇÁö ¾Ê´Â´Ù. whence¿¡ ´ëÇØ¼­ ÀÚ¼¼È÷ ¾Ë±æ ¿øÇÑ´Ù¸é lseek¸¦ ÀÌ¿ëÇÑ ÆÄÀϳ» À§Ä¡À̵¿¸¦ Âü°íÇϱ⠹ٶõ´Ù.

ÀÌ ÇÔ¼ö´Â ¾ÐÃàµÈ ÆÄÀϳ»¿¡¼­ À§Ä¡À̵¿À» ÇÏ´Â°Ô ¾Æ´Ñ ¾ÐÃàÀÌ Ç®¸° µ¥ÀÌÅͳ»¿¡¼­ÀÇ À§Ä¡À̵¿À» ÇÏ°Ô µÇ¹Ç·Î, ÆÄÀÏÀÌ Àбâ À§Çؼ­ ¿­·Á ÀÖ´Â °æ¿ì ±Øµµ·Î ´À¸®°Ô ÀÛµ¿ÇÒ °ÍÀÌ´Ù. ¸¸¾à ÆÄÀÏÀÌ ¾²±â À§Çؼ­ ¿­·Á ÀÖ´Ù¸é ´ÜÁö Àü¹æÇâ À̵¿(forward seek)¸¸ Çã¿ë µÈ´Ù.

¼º°øÇßÀ» °æ¿ì ¾ÐÃàÀÌ Ç®¸° µ¥ÀÌÅÍÀÇ ½ÃÀÛÁöÁ¡¿¡¼­ÀÇ º¯À§°ªÀ» µÇµ¹·ÁÁÖ°í ½ÇÆÐ ÇßÀ»°æ¿ì -1À» ¸®ÅÏÇÑ´Ù.


2.1.16. gzrewind

int gzrewind(gzFile file);
				
ÆÄÀÏÀ» óÀ½À¸·Î µÇµ¹¸°´Ù. Àбâ¸ðµå·Î ¿­¾úÀ» ¶§¸¸ »ç¿ë°¡´ÉÇÏ´Ù. gzrewind(file)´Â gzseek(file, 0L, SEEK_SET)¿Í µ¿ÀÏÇÏ´Ù.


2.1.17. gzeof

int gzeof(gzFile file);
				
ÆÄÀÏ¿¡¼­ ³¡À» ¸¸³¯°æ¿ì 1À» ¸®ÅÏÇÑ´Ù. ±×·¸Áö ¾ÊÀ»°æ¿ì 0À» ¸®ÅÏÇÑ´Ù.


2.1.18. gzclose

int gzclose(gzFile file);
				
¾ÐÃà°ú °ü·ÃµÈ ¸ðµç ÀÛ¾÷ÀÌ ³¡³ª°í Fluseh±îÁö ¼º°øÀûÀ¸·Î ¼öÇàÇß´Ù¸é, gzclose¸¦ È£ÃâÇØ¼­ ¾ÐÃàµÈ ÆÄÀÏÀ» ´Ý°í ¸ðµç ÀÚ¿øÀ» ÇØÁ¦ ÇØ¾ß ÇÑ´Ù.


2.1.19. gzerror

const char * gzerror(gzFile file, int *errnum);
				
¸¶Áö¸· ¿¡·¯¿¡ ´ëÇÑ ¿¡·¯ ¸Þ½ÃÁö¸¦ µÇµ¹·ÁÁØ´Ù. errnumÀº zlib¿¡¼­ »ç¿ëÇÏ´Â ¿¡·¯¹øÈ£´Ù. ¸¸¾à ¿¡·¯°¡ zlib°¡ ¾Æ´Ñ ´Ù¸¥ (¿¹¸¦ µé¾î¼­ ÆÄÀÏ ½Ã½ºÅÛ)°÷¿¡¼­ ¹ß»ýÇÑ °ÍÀ̶ó¸é errnumÀº Z_ERRNO·Î ä¿öÁø´Ù. À̶§´Â errno¸¦ °Ë»ç Çϵµ·Ï ÇÑ´Ù.


2.1.20. zlibVersion

const char *zlibVersion(void);
				
¾ÖÇø®ÄÉÀ̼ÇÀÌ »ç¿ëÇÏ´Â zlib¹öÁ¯À» È®ÀÎÇϱâ À§Çؼ­ »ç¿ëÇÑ´Ù. ¸¸¾à ¾ÖÇø®ÄÉÀ̼ÇÀÇ zlib¹öÁ¯°ú zlib.h¿¡ ¼±¾ðµÈ ZLIB_VERSION¹öÁ¯ÀÇ Ã¹±ÛÀÚ°¡ Ʋ¸®´Ù¸é ÀÌ ¾ÖÇø®ÄÉÀ̼ÇÀº zlibȣȯ ¹®Á¦·Î »ç¿ëÇÒ ¼ö ¾ø°ÔµÈ´Ù.

´ÙÀ½°ú °°Àº ¹æ¹ýÀ¸·Î ¹öÁ¯È£È¯¿©ºÎ¸¦ üũÇÒ ¼ö ÀÖÀ» °ÍÀÌ´Ù.

...
if (strncmp(zlibVersion(), ZLIB_VERSION, 1) != 0)
{
	printf("Version error\n");
	exit(1);
}
...
				


2.2. ¿¹Á¦

2°³ÀÇ ¿¹Á¦ÆÄÀÏÀ» ÁغñÇß´Ù. Çϳª´Â ƯÁ¤ÆÄÀÏÀ» ¾ÐÃàÇÏ´Â ÇÁ·Î±×·¥ÀÌ°í ¶Ç´Ù¸¥ Çϳª´Â ¾ÐÃàµÈ ÆÄÀÏÀÇ ¿ø¹® ³»¿ëÀ» Ãâ·ÂÇÏ´Â ÇÁ·Î±×·¥ÀÌ´Ù. ¸Å¿ì °£´ÜÇÑ ¼Ò½º À̹ǷΠ¼³¸íÀº ÁÖ¼®À¸·Î ´ë½ÅÇϵµ·Ï ÇϰڴÙ.


2.2.1. ÆÄÀÏ ¾ÐÃà ¿¹Á¦

¿¹Á¦ : jzip.c

/*
 * ÆÄÀϸí : jzip.c 
 * »ç¿ë¹ý : # jzip [filename]
 * ¾ÐÃàÇϰíÀÚ ÇÏ´Â filename¸¦ ÀÔ·ÂÇϸé filename.gzÀ̶ó´Â ¾ÐÃàÆÄÀÏÀÌ 
 * »ý¼ºµÈ´Ù.  
 */

// zlib Çì´õÆÄÀÏ  
#include <zlib.h>

// Ç¥ÁØ CÇì´õÆÄÀÏ
#include <stdio.h>
#include <fcntl.h>

int main(int argc, char **argv)
{
    char    *filename   = NULL;
    char    *gzfilename = NULL;

    gzFile  *zfp;
    int     fd;
    int     n;
    char    buf[256];
    int     lerrno;

    if(argc !=2)
    {
        printf("Usage : jzip [file name]\n"); 
        exit(0);
    }
    filename = argv[1];
    // ¾ÐÃàÆÄÀÏÀÇ À̸§Àº filename.gz À¸·Î ÇÑ´Ù. 
    gzfilename = (char *)malloc(strlen(filename)*sizeof(char));
    sprintf(gzfilename, "%s.gz", filename);

    // ¾ÐÃà¿øº» ÆÄÀÏÀÌ Á¸ÀçÇÏ´ÂÁö È®ÀÎÇÑ´Ù. 
    if (access(filename, F_OK) != 0) 
    {
        printf("Á¸ÀçÇÏÁö ¾Ê´Â ÆÄÀÏÀÔ´Ï´Ù\n");
        exit(0);
    }

    if ((fd = open(filename, O_RDONLY)) < 0)
    {
        printf("file open error\n");
        exit(0);    
    }

    // ¾ÐÃàÆÄÀÏÀ» ¿¬´Ù. 
    if ((zfp = gzopen(gzfilename, "wb")) == NULL)
    {
        exit(0);
    }

    // ¿øº»ÆÄÀÏÀ» ¿¡¼­ µ¥ÀÌŸ¸¦ ÀоîµéÀ̰í 
    // gzwriteÇÔ¼ö¸¦ ÀÌ¿ëÇØ¼­ µ¥ÀÌÅ͸¦ ¾ÐÃàÇÏ°í ÆÄÀÏ¿¡ ¾´´Ù.   
    while((n = read(fd, buf, 255)) > 0)
    {
        if (gzwrite(zfp, buf, n) < 0)
        {
            printf("%s\n",gzerror(zfp, &lerrno));
            exit(0);
        }
    }
    gzclose(zfp);
    printf("¾ÐÃà ¼º°ø : %s => %s\n", filename, gzfilename);
}
				
ÄÄÆÄÀÏ ÇÒ ¶§´Â ¹Ýµå½Ã zlib¸¦ ¸µÅ© ½ÃÄÑÁà¾ß ÇÑ´Ù.
# gcc -o jzip jzip.c -lz
				


2.2.2. ¾ÐÃà ÇØÁ¦ ¿¹Á¦

À̹ø ÇÁ·Î±×·¥Àº ¾ÐÃàµÈ text¹®¼­ÀÇ ¿ø·¡ ³»¿ëÀ» º¸¿©ÁÖ´Â °£´ÜÇÑ ÇÁ·Î±×·¥ÀÌ´Ù.

¿¹Á¦ : jcat.c

#include <zlib.h>
#include <stdio.h>

int main(int argc, char **argv)
{
    char *filename = NULL;

    gzFile *zfp;
    char buf[1024];

    if (argc != 2)
    {
        printf("Usage : jcat [file name]\n");
        exit(0);
    }
    filename = argv[1];

    if ((zfp = gzopen(filename, "rb")) == NULL)
    {
        exit(0);
    }

    while(gzgets(zfp, buf, 1023) != NULL)
    {
        printf("%s", buf);
    }

    gzclose(zfp);
}
				


2.3. ³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ÀÇ È°¿ë

zlib´Â ÀÏ¹Ý ÆÄÀÏÀ» ¾ÐÃàÇϱâ À§ÇÑ ¿ëµµ·Î ¸Å¿ì ÈǸ¢ÇÑ µµ±¸À̱ä ÇÏÁö¸¸ ÀÎÅͳÝÀ» ÅëÇØ ´ë·®ÀÇ Á¤º¸¸¦ º¸³»´Â ¿äÁò¿¡´Â ƯÈ÷ ³×Æ®¿öÅ©¿¡¼­ÀÇ µ¥ÀÌÅÍ ¾ÐÃàÀ» À§Çؼ­µµ Áß¿äÇÏ°Ô »ç¿ëµÈ´Ù.

´ëºÎºÐÀÇ À¥¼­¹ö¿Í À¥Å¬¶óÀÌ¾ðÆ®´Â zlib¸¦ ÀÌ¿ëÇØ¼­ ÀÚüÀûÀ¸·Î ÇÊ¿äÇÑ µ¥ÀÌÅ͸¦ ¾ÐÃàÇϰí ÇØÁ¦Çϸ鼭 °¡´ÉÇÑÇÑ ³×Æ®¿öÅ©ÀÇ ÀÚ¿øÀ» È¿À²ÀûÀ¸·Î »ç¿ëÇÒ ¼ö ÀÖµµ·Ï ÀÛ¼ºµÇ¾îÁö°í ÀÖ´Ù. °ø¿ëÀ¸·Î »ç¿ëµÇ´Â ³×Æ®¿öÅ© º¸´Ù´Â ¾Æ¹«·¡µµ °³ÀÎÀÌ »ç¿ëÇÏ´Â PCÀÇ (CPU)ÀÚ¿øÀ» Ȱ¿ëÇÏ´Â°Ô ¿©·¯¸ð·Î È¿À²ÀûÀ̱⠶§¹®ÀÌ´Ù.

³×Æ®¿öÅ© ¾ÖÇø®ÄÉÀ̼ǿ¡¼­ µ¥ÀÌÅ͸¦ ¾ÐÃà½ÃÄѼ­ Àü¼ÛÇϱâ À§Çؼ­´Â uncompress, compressµîÀÇ ¾ÐÃà¸í·ÉÀ» ÁÖ·Î »ç¿ëÇÑ´Ù. ÀÌµé ³»¿ë¿¡ ´ëÇØ¼­´Â ÀÚ¼¼È÷ ´Ù·çÁö ¾ÊÀ» °ÍÀÌ´Ù. Á÷Á¢ ±¸ÇöÇØº¸´Â °Íµµ ¸Å¿ì Àç¹ÌÀÖÀ» °ÍÀÌ´Ù.