Á¦ ¸ñ:[°­ÁÂ] ÀζóÀÎ ¾î¼Àºí¸®¸¦ ºÐ¼®ÇÏÀÚ. (4) °ü·ÃÀÚ·á:¾øÀ½ [572] º¸³½ÀÌ:Çѵ¿ÈÆ (ddoch ) 1997-02-19 22:30 Á¶È¸:601 2.14 strtok ¹Ì¸® ¼ûÀ» Å©°Ô Çѹø ½¬ÀÚ. ±×·¸´Ù°í ÇØ¼­ ÁÖ´ªµé ÇÊ¿ä´Â ¾ø´Ù. ºÐ·® ¸¸ ¸¹À» »ÓÀÌÁö ÀÌÀü¿¡¼­ º¸¾Æ¿Ô´ø ·çƾµéÀÇ Áö°Ü¿î ¹Ýº¹ÀÏ »ÓÀÌ´Ù. Â÷ºÐÈ÷ Å丷Å丷 ³»¾îº¸ÀÚ. ¸®´ª¼­¿¡°Ô´Â ºÒ°¡´ÉÀÌ ¾øÁö ¾ÊÀº°¡? ÀÌ¿Í °°Àº CÀÇ ¼Ò½º°¡ "/usr/src/linux/lib/string.c"¿¡ ÀÖÀ¸´Ï º¹Àâ ÇÑ °ÍÀº ºñ±³¸¦ ÇØ°¡¸é¼­ º¸´Â °Íµµ Àç¹ÌÀÖÀ» °ÍÀÌ´Ù. ¹°·Ð ÀÌ µÑ ´Ù ¸®´©½º Åä¹ßÁî¿¡ ÀÇÇØ ¾²¿©Á³´Ù. ¸ÕÀú C¿¡¼­ÀÇ strtokÀÇ Çൿ¾ç½ÄºÎÅÍ ÆÄ¾ÇÇÏÀÚ. char *strtok(char *s, const char *ct); ÇѸ¶µð·Î strtokÀº ´Ù¸¥ ÇÔ¼öµé¿¡ ºñÇØº¼ ¶§ ºñÁ¤»óÀûÀÎ °ÍÀÓÀº Ʋ¸² ¾ø´Ù. À¯¿ëÇϱâ´Â ÇÏÁö¸¸.. ^^; Àá½Ã ¾Æ·¡ÀÇ ¼Ò½º¸¦ Å×½ºÆ®Çغ¸ÀÚ. Çൿ¾ç½ÄÀÌ ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. --------------------------------------------------------------------- #include #include void main() { char str[] = "ab:cd::ef"; char *del = ":"; char *token; token = strtok(str, del); while (token != NULL) { printf("%s\n", token); token = strtok(NULL, del); } printf("again = %s\n", str); } --------------------------------------------------------------------- °á°ú´Â ´ÙÀ½°ú °°´Ù. ab cd ef Áï, óÀ½¿¡ strtok(str, del)°ú °°ÀÌ È£ÃâÇϸé str¿¡¼­ del¿¡ ÇØ´ç ÇÏ´Â ¹®ÀÚ°¡ ³ª¿Ã°æ¿ì '\0'À¸·Î ä¿ì°í óÀ½À¸·Î del¿¡ ÇØ´çµÇÁö ¾Ê´Â ¹®ÀÚ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¸®ÅÏÇÑ´Ù. µû¶ó¼­ str : "ab\0cd::ef\0" index: 012 3456789 ¿Í °°ÀÌ µÇ¾î ÀÖÀ» °ÍÀÌ´Ù. index 0ÀÇ Æ÷ÀÎÅ͸¦ µ¹·ÁÁÖ°í ¾Æ¸¶µµ index 3ÀÇ Æ÷ÀÎÅÍ´Â ___strtok Àü¿ªº¯¼ö¿¡ ÀúÀåÇÒ °ÍÀÌ´Ù. ±× ´Ù À½¿¡ token = strtok(NULL, del); ¿Í °°ÀÌ È£ÃâÇÏ¿© str´ë½Å¿¡ NULLÀÌ ÁÖ¾îÁø´Ù¸é ÀÌÀü¿¡ ÀúÀåµÈ ___strtok º¯¼ö¸¦ »ç¿ëÇÒ °ÍÀÌ´Ù. À̹ø¿¡´Â index 5¸¦ '\0'·Î ä¿ì °í index 3ÀÇ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÒ °ÍÀ̰í index 6¿¡ ´ëÇÑ Æ÷ÀÎÅÍ´Â ´Ù½Ã ___strtok¿¡ ÀúÀåµÉ °ÍÀÌ´Ù. strtok(NULL, del)À» Çѹø ´õ È£Ãâ ÇÑ´Ù ¸é index 6¿¡¼­ del¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ´Â °Ç³Ê¶Ù°í index 7¿¡ ´ëÇÑ Æ÷ ÀÎÅ͸¦ µ¹·ÁÁÙ °ÍÀ̰í, ´õÀÌ»ó del ¹®ÀÚ°¡ º¸ÀÌÁö ¾Ê°í '\0'À» ¸¸³ª ¹Ç·Î ___strtok¿¡´Â NULLÀ» ÀúÀåÇÒ °ÍÀÌ´Ù. Çѹø ´õ À§¿Í °°ÀÌ È£ÃâÇÑ´Ù¸é ÀÌÁ¦´Â ´õ ÀÌ»ó ºÐ¸®ÇÒ ÅäÅ«ÀÌ ¾øÀ¸¹Ç·Î ___strtokÀÇ NULLÀ» ¸®ÅϰªÀ¸·Î µ¹·Á ÁÙ °ÍÀÌ´Ù. ¸¸ÀÏ strtok(str2, del)°ú °°ÀÌ ´Ù¸¥ ¹®ÀÚ¿­¿¡ ´ëÇÑ ÀÛ¾÷À» ÇÑ´Ù¸é ___strtok º¯¼öÀÇ °ªÀÌ ´õÀÌ»ó ÀÌÀüÀÇ ¹®ÀÚ¿­ Æ÷ÀÎÅÍ¿¡ ´ëÇÑ Á¤º¸ ¸¦ °¡ÁöÁö ¾Ê°í »õ·Ó°Ô óÀ½ºÎÅÍ ½ÃÀÛÇÒ °ÍÀÌ´Ù. "/usr/src/linux/lib/string.c"ÀÇ strtokÀÇ C ¼Ò½º¸¦ Àá±ñ º¸ÀÚ. Á¦ÀÏ ¾ÕÂÊ¿¡ ___strtok ÀÌ Àü¿ªº¯¼ö·Î ¼±¾ðµÇ¾î ÀÖ´Ù. --------------------------------------------------------------------- /* strtok -- /usr/src/linux/lib/string.c ¿¡¼­.. */ char * ___strtok = NULL; char *strtok(char *s, const char *ct) { char *sbegin, *send; /* sÀÇ °ªÀÌ NULL(0)À̸é ÀÌÀü¿¡ ÀúÀåµÈ ___strtok ÀÇ °ªÀÌ sbegin¿¡ ÀúÀåµÇ°í ¾Æ´Ï¸é sÀÇ °ªÀÌ sbeginÀ¸·Î ÀúÀåµÇ¾î »õ·Î¿î str(s)¿¡ ´ëÇØ¼­ ÀÛ¾÷À» ÇÑ´Ù. */ sbegin = s ? s : ___strtok; /* sbeginÀÌ NULL(0)À̶ó´Â °ÍÀº ___strtokÀÌ NULL(0)À̶ó´Â °ÍÀ» ÀǹÌÇÏ¸ç ´õÀÌ»ó ºÐ¸®ÇÒ ÅäÅ«ÀÌ ¾ø´Ù´Â °ÍÀ» ÀÇ¹Ì ÇÑ´Ù. NULLÀ» ¸®ÅÏÇÑ´Ù. */ if (!sbegin) { return NULL; } /* sbeginÀº ÀÌÁ¦ ct¿Í ÇÔ²² strspnÀ¸·Î È£ÃâµÈ´Ù. strspn ÀÇ ¿ªÇÒÀº sbegin¿¡¼­ ct¿¡ ¾ø´Â ¹®ÀÚ°¡ óÀ½À¸·Î Ÿ³ª ³ª´Â °÷ÀÇ À§Ä¡¸¦ µ¹·ÁÁØ´Ù. ÀÌÁ¦ sbeginÀº óÀ½À¸·Î ct ¿¡ ¼ÓÇÏÁö ¾Ê´Â sbegin³»¿¡ À§Ä¡¸¦ °¡¸£Å²´Ù. À§ÀÇ ¿¹¸¦ µé¸é "ab:cd::ef\0" : ct = ":" 0123456789 ¿¡¼­ sbeginÀº index 0À» °¡¸£Å³ °ÍÀÌ´Ù. */ sbegin += strspn(sbegin, ct); /* strspn ÇÔ¼ö »ç¿ë */ /* ¸¸ÀÏ sbeginÀÌ °¡¸£Å°´Â ¹®ÀÚ°¡ ³ÎÀ̶ó¸é ´õ ÀÌ»ó ºÐ¸®ÇÒ ÅäÅ«ÀÌ ¾øÀ¸¹Ç·Î ___strtokÀ» NULL·Î ¼¼ÆÃÇϰí NULLÀ» ¸® ÅÏÇÑ´Ù. */ if (*sbegin == '\0') { ___strtok = NULL; return (NULL); } /* strpbrk´Â strspn°ú´Â °Å²Ù·Î µ¿ÀÛÇÑ´Ù. Áï, sbegin¿¡¼­ ºÎÅÍ ½ÃÀÛÇÏ¿© ct¿¡ ÇØ´çÇÏ´Â ¹®ÀÚ°¡ ³ª¿À´Â ù À§Ä¡¸¦ Æ÷ ÀÎÅÍ·Î µ¹·ÁÁشٰí Çß´Ù. ¾Õ¼­ÀÇ ¿¹¸¦ µé¸é, "ab:cd::ef\0" : ct = ":" 0123456789 strpbrk¸¦ È£ÃâÇϸé ÇöÀç sbeginÀº index 0À» °¡¸£Å°°í ÀÖÀ¸ ¹Ç·Î ±× ¸®ÅÏ Æ÷ÀÎÅÍ´Â ct(":")°¡ óÀ½À¸·Î ³ª¿À´Â index 2 ¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ send·Î ³Ñ°ÜÁÙ °ÍÀÌ´Ù. */ send = strpbrk( sbegin, ct); /* strpkrk ÇÔ¼ö »ç¿ë */ send°¡ ³ÎÆ÷ÀÎÅͰ¡ ¾Æ´Ï°í send°¡ ³Î¹®ÀÚ¸¦ °¡¸£Å°Áö ¾Ê´Â´Ù ¸é send°¡ °¡¸£Å°°í ÀÖ´Â index 2´Â '\0'¹®ÀÚ·Î µÇ°í sendÀÇ °ªÀº ÀÌÈÄÀÇ È£ÃâÀ» À§Çؼ­ 1ÀÌ Áõ°¡ÇÏ¿© ___strtok¿¡ ÀúÀåÀ» ÇÑ´Ù. sbeginÀº ÇöÀç ¾îµð¸¦ °¡¸£Å°°í Àִ°¡? ¸¶Áö¸·À¸·Î sbeginÀÌ »ç¿ëµÈ °÷Àº ¹Ù·Î À§ÀÇ index 0À» °¡¸£Å°°í ÀÖÀ» ¶§ÀÌ´Ù. µû¶ó¼­ index 0¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ÃÖÁ¾ÀûÀ¸·Î ¸®ÅÏ ÇÑ´Ù. ___strtokÀº ÇöÀç index 3¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ º¸À¯Çϰí ÀÖ´Ù. */ if (send && *send != '\0') *send++ = '\0'; ___strtok = send; return (sbegin); } --------------------------------------------------------------------- ÀÌÁ¦ Á¤È®È÷ ÀÌÇØ°¡ µÇ´Â°¡? ³ª¸ÓÁöÀÇ ¹®ÀÚ¿­¿¡ ´ëÇØ¼­µµ ÇÔ¼ö¸¦ µ¹·Á º¸¶ó. À§ÀÇ ÇÁ·Î±×·¥ÀÇ È帧°ú °°Àº °£´ÜÈ÷ ±×¸²À» ±×·Áº¸°Ú´Ù. ¾î¼Àºí¸® ·çƾ¿¡¼­ Âü°í°¡ µÉ °ÍÀÌ´Ù. [±×¸²1] ---------------------------------------------------------------------- 0ÀÌ ¾Æ´Ô s -------------> sbegin = s -------------> sbegin = ___strtok 0 ÀÓ 0 ÀÓ *sbegin ------------> ___strtok = 0, return 0 strpbrk(sbegin, ct) -----> send 0ÀÌ ¾Æ´Ô send && *send -------> *send++ = 0, ___strtok = send, return sbegin ----------------------------------------------------------------------- ÀÌ·¸°Ô ÀåȲÇÏ°Ô ¼³¸íÇÏ´Â °ÍÀº ¾î¼Àºí¸® ·çƾ¿¡¼­ÀÇ ºÎÇϸ¦ Á¶±ÝÀÌ¶óµµ ÁÙÀÌ °íÀÚ ÇÏ´Â ¸¶À½¿¡¼­ÀÌ´Ù. ÀÌÁ¦ ¾î¼Àºí¸® ·çƾÀ» ´ë·«ÀûÀ¸·Î »ìÆìº¸ÀÚ. ----------------------------------------------------------------------- extern inline char * strtok(char * s,const char * ct) { register char * __res; __asm__ __volatile__( "testl %1,%1\n\t" "jne 1f\n\t" "testl %0,%0\n\t" "je 8f\n\t" "movl %0,%1\n" "1:\txorl %0,%0\n\t" "movl $-1,%%ecx\n\t" "xorl %%eax,%%eax\n\t" "cld\n\t" "movl %4,%%edi\n\t" "repne\n\t" "scasb\n\t" "notl %%ecx\n\t" "decl %%ecx\n\t" "je 7f\n\t" /* empty delimiter-string */ "movl %%ecx,%%edx\n" "2:\tlodsb\n\t" "testb %%al,%%al\n\t" "je 7f\n\t" "movl %4,%%edi\n\t" "movl %%edx,%%ecx\n\t" "repne\n\t" "scasb\n\t" "je 2b\n\t" "decl %1\n\t" "cmpb $0,(%1)\n\t" "je 7f\n\t" "movl %1,%0\n" "3:\tlodsb\n\t" "testb %%al,%%al\n\t" "je 5f\n\t" "movl %4,%%edi\n\t" "movl %%edx,%%ecx\n\t" "repne\n\t" "scasb\n\t" "jne 3b\n\t" "decl %1\n\t" "cmpb $0,(%1)\n\t" "je 5f\n\t" "movb $0,(%1)\n\t" "incl %1\n\t" "jmp 6f\n" "5:\txorl %1,%1\n" "6:\tcmpb $0,(%0)\n\t" "jne 7f\n\t" "xorl %0,%0\n" "7:\ttestl %0,%0\n\t" "jne 8f\n\t" "movl %0,%1\n" "8:" :"=b" (__res),"=S" (___strtok) :"0" (___strtok),"1" (s),"g" (ct) :"ax","cx","dx","di","memory"); return __res; } ------------------------------------------------------------------ * output ebx¸¦ ÅëÇÏ¿© __res·Î °ªÀ» Çϳª Àü´ÞÇϰí, (%0) esi¸¦ ÅëÇÏ¿© ___strtok Àü¿ªº¯¼ö¿¡ °ªÀ» Àü´ÞÇÑ´Ù. (%1) * input ebx¸¦ ÅëÇÏ¿© ___strtokÀÇ °ªÀ» Àü´ÞÇϰí, -- %0 esi¸¦ ÅëÇÏ¿© sÀÇ °ªÀ» Àü´ÞÇϸç, -- %1 ctÀÇ °ªÀÇ Àü´ÞÀº ÄÄÆÄÀÏ·¯¿¡°Ô ¸Ã±ä´Ù. (%4) ¿©±â¿¡¼­ ___strtokÀº ebx·Î °ªÀÌ Àü´ÞµÇÁö¸¸ ³ªÁß¿¡´Â esiÀÇ °è»ê°á°ú °¡ ___strtokÀ¸·Î ÀúÀåµÈ´Ù. ebx¿¡¼­´Â __res°¡ ³ª¿Â´Ù. ÀԷ°ú Ãâ·ÂÀÌ ¼­·Î ¾ù°¥¸®¹Ç·Î Àß »ìÆìºÁ¾ß ÇÑ´Ù. ÇÁ·Î±×·¥¿¡¼­´Â %0, %1, %4·Î °¢°¢ ebx¿Í esi,ct°¡ ÂüÁ¶µÇ°í ÀÖ´Ù. ctÀÇ °ªÀÌ Àü´ÞµÈ °÷Àº output, input ÀÇ ¼ø¼­¿¡ µû¶ó %2°¡ ¾Æ´Ï°í %4ÀÌ´Ù. * registers ¸®ÅÏÇÏ´Â ·¹Áö½ºÅÍ ebx, esi¸¦ Á¦¿ÜÇÑ "ax", "cx", "dx", "di", "memory" ¸¦ º¸È£Çϰí ÀÖ´Ù. * commands ¸ÕÀú C¿¡¼­ char * __res¸¦ Çϳª ¼±¾ðÇϰí ÀÖ´Ù. ___strtokÀº Àü¿ªº¯¼ö ·Î ÀÌ¹Ì Á¸ÀçÇØ¾ß ÇÑ´Ù. ¶óº§´ÜÀ§·Î ©¶ó¼­ ÁýÁßÀûÀ¸·Î »ìÆìº¸ÀÚ. /* if (s != NULL) goto 1; else if (___strtok == NULL) goto 8(return NULL); else __res = ___strtok; # s °¡ NULLÀÌ ¾Æ´Ï¸é »õ·Î¿î ¹®ÀÚ¿­¿¡ ´ëÇÑ ÀÛ¾÷ÀÌ ½ÃÀ۵ǹǷΠ1: ·Î °£´Ù(testl %1, %1; jne 1f). # ¸¸ÀÏ s°¡ NULLÀÏ °æ¿ì´Â ÀÌ¹Ì Àü´Ü°è¿¡¼­ ÀÛ¾÷ÀÌ ÁøÇàµÈ »óÅ·Πº¸¹Ç·Î ebx·Î Àü´ÞµÈ ___strtokÀÇ °ªÀÌ NULLÀÌ¸é ´õÀÌ»ó ºÐÇØÇÒ ÅäÅ«ÀÌ ¾ø´Ù´Â À̾߱Ⱑ µÈ´Ù. µû¶ó¼­ Á¾·áÇÑ´Ù(testl %0, %0; je 8f). Á¾·á½Ã¿¡´Â °á°ú°ªÀ¸·Î ÇöÀç ebx (¿ø·¡ÀÇ ___strtokÀÇ °ª: NULL)ÀÌ __res ·Î ¸®Åϵǰí, s°¡ NULL ÀÎ »óÅÂÀ̰í, À̰ÍÀÌ esi¿¡ Àü´ÞµÇ¾úÀ¸¹Ç·Î ___strtok¿¡´Â NULLÀÌ ÀúÀåµÈ´Ù. (output Çʵå) # s °¡ NULLÀ̰í ___strtokÀÌ NULLÀÌ ¾Æ´Ï¶ó¸é ÇöÀç ÀÛ¾÷ÀÌ ÁøÇàÁßÀÌ¹Ç ·Î esi(source index)·Î ¿Å±ä´Ù. esi´Â ¿ø·¡ ÀÛ¾÷ó·Î ¾²Àδ٠(movl %0, %1). */ "testl %1,%1\n\t" /* testl %%esi(s), %%esi */ "jne 1f\n\t" "testl %0,%0\n\t" /* testl %%ebx(___strtok), %%ebx */ "je 8f\n\t" "movl %0,%1\n" /* movl %%ebx(___strtok), %%esi */ /* __res = 0; ±×¸®°í ctÀÇ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ±¸ÇÏ´Â ºÎºÐÀÌ´Ù. */ # ebx¸¦ 0À¸·Î ¸¸µç´Ù. (xorl %0, %0) # ctÀÇ ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ±¸Çϱâ À§ÇÑ °Ë»ç¹Ýº¹È½¼ö¸¦ 0xffffffff·Î ÇÏ¿© ecx¿¡ ÀúÀåÇÑ´Ù. (movl $-1, %%ecx) # eax¸¦ 0À¸·Î ¸¸µç´Ù. (xorl %%eax, %%eax) # ctÀÇ ±æÀ̸¦ ±¸Çϱâ À§ÇØ ct¸¦ dest index·Î ¿Å±ä´Ù. (movl %4,%%edi) # repne, scasb·Î al(ÇöÀç 0)ÀÇ °ªÀÌ edi°¡ °¡¸£Å°´Â °÷¿¡ ÀÖ´Â °ªÀÌ °°Àº Áö¸¦ ecx¸¸Å­ ¹Ýº¹ÇÑ´Ù. ediÀÇ °ªÀÌ º¯°æµÈ´Ù. # notl, decl·Î ecx¿¡ ctÀÇ ±æÀ̸¦ ±¸ÇÑ´Ù. # ¸¸ÀÏ ecx°¡ 0À̸é ct°¡ ""ÀÌ µÇ¹Ç·Î 7·Î °£´Ù. (je 7f) */ # ¼¼ºÎºñ±³È½¼öÀÎ ecx¸¦ ¾ÈÀüÇÑ edx¿¡ º¸°üÇÑ´Ù. (movl %%ecx,%%edx) "1:\txorl %0,%0\n\t" /* xorl %%ebx, %%ebx */ "movl $-1,%%ecx\n\t" /* °Ë»ç¹Ýº¹ Ƚ¼ö 0xffffffff -> ecx */ "xorl %%eax,%%eax\n\t" "cld\n\t" "movl %4,%%edi\n\t" /* movl (ct), %%edi */ "repne\n\t" "scasb\n\t" "notl %%ecx\n\t" "decl %%ecx\n\t" "je 7f\n\t" /* if (strlen(ct) == 0) goto 7; */ "movl %%ecx,%%edx\n" /* __res += strspn(__res, ct); strspn·çƾÀÌ´Ù. alÀÌ edi¼Ó¿¡ Æ÷ÇԵǴ°¡¸¦ »ìÆì¼­ Æ÷ÇÔµÈ´Ù¸é ·çÇÁ¸¦ ¹Ýº¹ÇÏ¿© óÀ½À¸·Î edi(ct)¼Ó¿¡ Æ÷ÇÔµÇÁö ¾Ê´Â °÷À» ±¸ÇÑ´Ù. s¹®ÀÚ¿­À» al·Î ²ø¾î¿Ã¸®´Â µµÁß¿¡ 0ÀÌ ¹ß°ßµÈ´Ù¸é ¹®ÀÚ¿­ÀÇ ³¡À̹ǷΠ7·Î °£´Ù. ÀÌ À̾߱â´Â s³»¿¡¼­ ÅäÅ« ºÐ¸®ÀÚ¸¦ ¸¸³ª°í ÀÖ´Â °¡¿îµ¥ '\0'À» ¸¸³­ ´Ù´Â À̾߱â´Ù. ÇöÀç __res = 0ÀÌ´Ù. µû¶ó¼­ 7¿¡¼­ NULLÀ» ÀúÀåÇÑ´Ù. °è»êµÈ esiÀÇ °ªÀ» ebx·Î ÀúÀåÇÏ´Â ºÎºÐÀ» ´«¿©°Ü ºÁµÎÀÚ. À̰ÍÀº output ¿¡¼­ __res·Î ¸®Å쵃 °ªÀÌ´Ù. */ "2:\tlodsb\n\t" /* al¿¡ esi(s)¿¡¼­ ÇϳªÀÇ ¹®ÀÚ¸¦ °¡Á®¿Â´Ù. */ "testb %%al,%%al\n\t" /* al ÀÌ 0À̸é 7 ·Î */ "je 7f\n\t" "movl %4,%%edi\n\t" /* edi°¡ º¯°æµÇ¾î¼­ ´Ù½Ã °¡Á®¿È ct ==> edi */ "movl %%edx,%%ecx\n\t" /* ¼¼ºÎºñ±³¿¡¼­ ¹Ýº¹È½¼ö¸¦ °¡Á®¿È */ "repne\n\t" /* al(0)ÀÇ °ª°ú edi°¡ °¡¸£Å°´Â °÷ÀÇ °ªÀÌ */ "scasb\n\t" /* °°À» ¶§±îÁö ºñ±³¹Ýº¹ */ "je 2b\n\t" /* °°´Ù¸é 2·Î */ "decl %1\n\t" /* ´Ù¸£´Ù¸é esi(s)¸¦ Çϳª °¨¼Ò */ "cmpb $0,(%1)\n\t" /* *esi(*s)¿¡¼­ ³ÎÀÌ ³ª¿Â´Ù¸é 7·Î */ "je 7f\n\t" "movl %1,%0\n" /* esi -> ebx */ /* send = strpbrk( __res, ct); if (send == NULL) goto 5; /* testb %%al, %%al; je 5f */ if (*send == '\0') goto 5; else *send++ = '\0'; ¿©±â´Â strpbrk ¿ªÇÒÀ» ÇÑ´Ù. À§¿¡¼­´Â del(¶Ç´Â ct)¿¡ ÇØ´çÇÏÁö ¾Ê´Â ¹® ÀÚ("ab:cd::ef"Áß 'a'°ú °°Àº °Í)¸¦ ã¾ÒÁö¸¸ ÀÌÁ¦´Â ÅäÅ«ºÐ¸®ÀÚ·Î ¾²ÀÌ ´Â del(ct -- ¿¹¿¡¼­´Â ":")¸¦ s³»¿¡¼­ ã´Â´Ù. µû¶ó¼­ s³»¿¡¼­ 0À» ¸¸ ³ª´õ¶óµµ __res´Â NULLÀÌ µÇÁö ¾Ê°í ___strtok¸¸ NULLÀÌ µÈ´Ù. "3:\tlodsb\n\t" /* esi¿¡¼­ ÇϳªºÒ·¯¼­ al ·Î */ "testb %%al,%%al\n\t" /* esiÀÇ ÇöÀç¹®ÀÚ°¡ 0À̸é 5 ·Î */ "je 5f\n\t" "movl %4,%%edi\n\t" /* edi°¡ º¯°æµÇ¾î¼­ ´Ù½Ã °¡Á®¿È ct ==> edi */ "movl %%edx,%%ecx\n\t" /* ¹Ýº¹È½¼ö¸¦ °¡Á®¿È */ "repne\n\t" /* al ÀÇ ¹®ÀÚ¿Í ediÀÇ ¹®ÀÚ¸¦ Ƚ¼ö¸¸Å­ ºñ±³ */ "scasb\n\t" "jne 3b\n\t" /* sÀÇ ÇöÀç¹®ÀÚ°¡ ct¿¡ ³ª¿ÀÁö ¾Ê´Â´Ù¸é 3À¸·Î*/ "decl %1\n\t" /* ³ª¿Ô´Ù¸é esi¸¦ Çϳª°¨¼Ò */ "cmpb $0,(%1)\n\t" /* *esi°¡ 0Àΰ¡¸¦ °Ë»ç */ "je 5f\n\t" /* ³ÎÀ̸é 5·Î */ "movb $0,(%1)\n\t" /* 0À» *esi(*s)¿¡ Ãß°¡ */ "incl %1\n\t" /* esi¸¦ ÇϳªÁõ°¡½Ã۰í 6À¸·Î */ "jmp 6f\n" /* ___strtok = NULL */ "5:\txorl %1,%1\n" /* esi¸¦ 0À¸·Î ¸¸µë */ /* if ( *send != '\0') goto 7; if ( *send == '\0') ___strtok = NULL; */ "6:\tcmpb $0,(%0)\n\t" /* *ebx°¡ 0ÀÎÁö °Ë»çÇØ¼­ ¾Æ´Ï¸é 7·Î */ "jne 7f\n\t" "xorl %0,%0\n" /* *ebx°¡ 0À̸é ebx¸¦ 0À¸·Î ¸¸µë */ /* if (__res != 0) goto 8; else ___strtok = __res; "7:\ttestl %0,%0\n\t" /* ebx°¡ 0ÀÎÁö °Ë»çÇØ¼­ ¾Æ´Ï¶ó¸é 8·Î */ "jne 8f\n\t" "movl %0,%1\n" /* ebx ¸¦ esi·Î */ /* return __res; */ "8:" :"=b" (__res),"=S" (___strtok) :"0" (___strtok),"1" (s),"g" (ct) :"ax","cx","dx","di","memory"); return __res; } --------------------------------------------------------------------- »ó´çÈ÷ º¹ÀâÇÔÀ» ´À³¥ °ÍÀÌ´Ù. ÇÏÁö¸¸ Áß°£ Áß°£ ¶óº§ ´ÜÀ§·Î ÇØ´çÇÏ´Â CÀÇ ÇüŸ¦ ±â¼úÇØ µÎ¾úÀ¸¹Ç·Î ºñ±³Àû ÀÌÇØ°¡ µÉ °ÍÀÌ´Ù. ¶óº§ 1¹ø ÀÌÀü¿¡´Â ebx, esi°¡ input°ú output ÀÌ È¥ÀçÇÏ´Â »óȲÀ̹ǷΠÀß ¿¬°ü½ÃÄÑ¾ß ÇÑ´Ù. 1¹øÀÌÈĺÎÅÍ´Â ebx´Â __res¿Í esi´Â ___strtok°ú ¿¬°üÀ» ½ÃÄѼ­ À¯½ÉÈ÷ »ìÆìº¸ÀÚ. °°Àº ¼Ò½ºÀÌÁö¸¸ C·Î ÇÏ´Â °Íº¸´Ù ¾î ¼Àºí¸®¾î·Î ±â¼úÇÏ¸é ¶óº§·ÎÀÇ Á¡ÇÁ ¶§¹®¿¡ ¾ó¸¶³ª È¥À⽺·¯¿îÁö ³³µæ ÀÌ °¥°ÍÀÌ´Ù. ÀÌÇØ°¡ Àß µÇ´Â°¡? ³ª¸§´ë·Î ÀÌÇØ¸¦ ÇÏ¼Ì´Ù¸é ¿©·¯ºÐµµ ÀÌÁ¦ AT&TÀÎ ¶óÀÎ ¾î¼Àºí¸®¿¡ ¾î´ÀÁ¤µµ Àͼ÷ÇØÁ³´Ù°í º¼ ¼ö ÀÖÀ¸¸ç °£´ÜÇÑ ·çƾ Àº ÀÚ½ÅÀÇ ¼Ò½º¿¡ Æ÷ÇÔÀ» ½Ãų ¼ö ÀÖ´Â ´É·ÂÀ» °¡Á³´Ù°í ºÁµµ °ú¾ð ÀÌ ¾Æ´Ò°ÍÀÌ´Ù. ¾Æ¿ï·¯ Ä¿³Î ¼Ò½º °°Àº °÷¿¡¼­ ³ª¿À´Â ÀζóÀÎ ¾î¼À ºí¸®µµ Àß ³³µæÀÌ µÉ °ÍÀÌ´Ù. º¸È£¸ðµå¸¸ Á¦¿ÜÇÑ´Ù¸é.. À̹ø ½Ã°£¿¡´Â strtok Çϳª¸¸À¸·Î 400¶óÀÎÀ» Â÷ÁöÇÑ °Í °°´Ù. ¸¶ÀÇ strtokÀ» ÀÌÇØÇϽŠºÐ¿¡°Ô ÈûÂù ¹Ú¼ö¸¦ º¸³»°í ½Í´Ù. ^^; °í¼öÀÇ ÀÔÀå¿¡¼­ º¸¸é ¾ðÁ¦³ª ½¬¿î ¹®Á¦°ÚÁö¸¸ ¿ì¸®°°Àº Ãʺ¸¿¡°Ô´Â Èûµé µû¸§ÀÌ´Ù. ¿©·¯ºÐµéÀÌ Ä¿³Î¼Ò½º³ª ¾î¼Àºí¸® °ü·Ã ¼Ò½º¸¦ °øºÎÇÒ ±â ȸ°¡ ÀÖ´ÙÇÏ´õ¶óµµ ÇÑ ¸ðµâÀÌ ÀÌ ¸¸Å­ ¸¹ÀÌ ³ª¿À´Â °ÍÀº º¸±â°¡ Èû µé °ÍÀ¸·Î ¹Ï´Â´Ù. ¾Æ¸¶ ÇÊÀÚµµ À̸»À» Á¦¹ø¹÷ ÇÒ ÀÏÀÌ ÀÖÀ» Áöµµ ¸ð¸£°ÚÁö¸¸.. ´ÙÀ½½Ã°£±îÁö Ç« ½¬¾ú´Ù°¡ ³ª¸ÓÁö ÀÛÀº ¸î°³ÀÇ ·çƾµé¹Û¿¡ ¾È³²¾Ò À¸´Ï ÈûÀ» ³»°í µµÀüÇØº¸ÀÚ. ¹º°¡ Çϳª Á¤µµ´Â ³¡À» ºÁ¾ß ÇÒ°Ô ¾Æ ´Ñ°¡? ´ÙÀ½½Ã°£ÀÌ ¸¶Áö¹ÚÀÌ µÉ °Í °°´Ù. ¶ÇÄ¡ Çѵ¿ÈÆ