1.ÄÁÆ®·ÑÀÇ ¸í·É

°¡.¸í·É

¸í·ÉÀ̶õ °¢Á¾ ÆíÁý µ¿ÀÛÀ» À¯¹ß½ÃÅ°´Â Áö½Ã¾îÀÌ´Ù. »ðÀÔ, »èÁ¦, À̵¿, ¼±ÅÃ, ½ºÅ©·Ñ, º¹»ç µîÀÇ ÆíÁý µ¿ÀÛµéÀÌ ¸ðµÎ ¸í·ÉµéÀ̸ç ÀÌ¿Ü¿¡ ¹®¼­³ª âÀ» °ü¸®ÇÏ´Â µ¿ÀÛµµ ¸í·ÉÀÌ µÉ ¼ö ÀÖ´Ù. ÀÌ·± µ¿ÀÛµéÀº Åë»ó »ç¿ëÀÚ°¡ Å°º¸µå³ª ¸¶¿ì½º·Î ÆíÁý±â¸¦ Á÷Á¢ Á¶ÀÛÇÏ¿© ½ÇÇàµÇ´Â °ÍÀÌ º¸ÅëÀÌÁö¸¸ ÇÁ·Î±×·¥ ³»ºÎ¿¡¼­ ÇÊ¿ä¿¡ ÀÇÇØ ¸í·ÉÀ» ¹ß»ý½ÃÅ°°í ó¸®ÇÒ ¼öµµ ÀÖ´Ù. ÆíÁý±â¿¡ ¸í·ÉÀ» ó¸®ÇÒ ¼ö ÀÖ´Â ±â´ÉÀ» ÀÛ¼ºÇØ ³õÀ¸¸é »ç¿ëÀÚÀÇ °³ÀÔ¾øÀÌ ÀÚµ¿È­µÈ 󸮸¦ ÇÒ ¼ö ÀÖÀ¸¸ç ±× ´ëÇ¥ÀûÀÎ ¿¹°¡ ¹Ù·Î ¸ÅÅ©·ÎÀÌ´Ù.

¸ÅÅ©·Î´Â ¸í·ÉÀÇ ÁýÇÕÀ¸·Î Á¤ÀÇµÇ¾î ¹Ýº¹ÀûÀÎ ÀÛ¾÷À» ÇÒ ¶§ Å°µ¿ÀÛÀ» ±â¾ïÇØ ³õ°í ÇѲ¨¹ø¿¡ ¿©·¯ °³ÀÇ ¸í·ÉÀ» ¿©·¯ ¹ø ½ÇÇàÇÏ´Â ÀåÄ¡ÀÌ´Ù. ÆíÁý µ¿ÀÛÀº ´Ü¼ø ¹Ýº¹ÀûÀÎ °æ¿ì°¡ ¸¹Àºµ¥ ÀÌ·± Áö·çÇÑ ÀÛ¾÷À» »ç¿ëÀÚ ´ë½Å ¼öÇàÇÏ´Â °ÍÀÌ ¹Ù·Î ¸ÅÅ©·ÎÀÌ´Ù. ¸ÅÅ©·Î´Â ¹Ýº¹ÀûÀΠ󸮿¡ »ç¿ëµÇ±âµµ ÇÏÁö¸¸ ¿©·¯ °³ÀÇ ´Ü¼øÇÑ ¸í·ÉÀ» Á¶ÇÕÇÏ¿© »õ·Î¿î º¹ÀâÇÑ ¸í·ÉÀ» Á¤ÀÇÇÏ´Â ¼ö´ÜÀ̱⵵ ÇÏ´Ù. ¿¹¸¦ µé¾î µÎ Ä­ ¾ÕÀ¸·Î °¡¼­ ±ÛÀÚ Áö¿ì±â, ¾ÕµÚ ±ÛÀÚ ¹Ù²Ù±â, ÇöÀç ¹®´ÜÀÇ »çº»À» ¾Æ·¡ÂÊ ¹®´Ü¿¡ ÀÛ¼ºÇϱ⠵îÀÇ °¡´ÉÇØÁø´Ù.

´Ù¼Ò °í±Þ ±â´ÉÀÌ´Ù º¸´Ï »ç¿ë¹ýÀ» ÀÍÇô¾ß ¾µ ¼ö ÀÖ°í Ãʺ¸ÀÚµéÀÌ ¾²±â¿¡´Â Á¶±Ý ¾î·Æ±â´Â ÇÏÁö¸¸ Á¦´ë·Î È°¿ëÇϸé ªÀº ½Ã°£¿¡ ´ë·®ÀÇ ÆíÁýÀ» Á¤È®ÇÏ°Ô ÇÒ ¼ö ÀÖ´Â °­·ÂÇÑ ±â´ÉÀÌ´Ù. ¸ÅÅ©·Î´Â ÃÖ¼ÒÇÑ µÎ °³ ÀÌ»óÀÇ ¸í·ÉÀÌ ¸ð¿©¾ß ½Ç¿ëÀûÀÎ °¡Ä¡°¡ ÀÖ´Ù. ¸ÅÅ©·Î¿¡ Æ÷ÇÔµÈ ¸í·ÉµéÀ» ±â¾ïÇÏ´Â ¹æ½ÄÀº ´ÙÀ½ µÎ °¡Áö°¡ ÀÖ´Ù.

 

¡á ¹®ÀÚ¿­ : ¸í·ÉÀ» ¹®ÀÚ¿­·Î Ç¥±âÇÑ´Ù. ¹Ù·Î Àаí ÆíÁýÇÒ ¼ö ÀÖ¾î Æí¸®ÇÏÁö¸¸ ½ÇÇàÇÒ ¶§¸¶´Ù ¹®ÀÚ¿­À» Çؼ®ÇØ¾ß ÇϹǷΠ¼Óµµ°¡ ´À¸®°í ¿ë·®ÀÌ Å©´Ù. ¶ÇÇÑ ¹®ÀÚ¿­ ÀÔ·Â °úÁ¤¿¡¼­ ¿ÀŸ°¡ ¹ß»ýÇÒ °¡´É¼ºÀÌ ³ôÀ¸¹Ç·Î ¼¶¼¼ÇÑ ¿¡·¯ 󸮵µ ÇÊ¿äÇÏ´Ù.

¡á ºÎȣȭ : °¢ ¸í·É¿¡ °íÀ¯ÇÑ Äڵ带 ÇÒ´çÇÏ°í ÀÌ·± ÄÚµåÀÇ ÁýÇÕÀ» ±â¾ïÇÏ´Â ¹æ½ÄÀÌ´Ù. ÀÌÁø Æ÷¸ËÀÌ¸ç ¸ÞŸ ÆÄÀÏ Çü½Ä°ú ºñ½ÁÇÏ´Ù°í »ý°¢ÇÏ¸é µÈ´Ù. Á÷Á¢ ÆíÁýÀº ºÒ°¡´ÉÇÏÁö¸¸ ÀÛ¼ºÇÒ ¶§ ¹Ù·Î Çؼ®µÇ¹Ç·Î ¿¡·¯ 󸮰¡ ¿ëÀÌÇÏ°í ½ÇÇà ¼Óµµ°¡ ºü¸£´Ù.

 

µÑ ´Ù ³ª¸§´ë·ÎÀÇ Àå´ÜÁ¡ÀÌ Àִµ¥ ´ç±ÙÀº ¹®ÀÚ¿­ ¹æ½ÄÀ» äÅÃÇϱâ·Î ÇÑ´Ù. ¼Óµµ°¡ ´À¸®°í ¿ë·®ÀÌ Å©±â´Â ÇÏÁö¸¸ ¿äÁòÀÇ Çϵå¿þ¾î ȯ°æ¿¡¼­´Â ¼º´Éº¸´Ù »ç¿ëÀÚÀÇ ÆíÀǼºÀÌ ´õ Áß¿äÇϹǷΠģ±ÙÇÑ Æ÷¸ËÀÎ ¹®ÀÚ¿­ ¹æ½ÄÀ» äÅÃÇß´Ù. ¸í·ÉÀº Çѱ۷ΠÁ¤ÀÇÇÒ ¼öµµ ÀÖÀ¸³ª ±¹Á¦È­ ½Ã´ë¿¡ ¸ÂÃç °£´ÜÇÑ ¿µ¹® ´Ü¾î·Î ¸í·ÉÀ» ±¸¼ºÇÑ´Ù. ¸ÅÅ©·Î ±¸¹®Àº °¢ ¸í·É¸¶´Ù Á¶±Ý¾¿ ´Ù¸¥µ¥ ´ëü·Î µ¿»ç+¸ñÀû¾î+ȸ¼öÀÇ ÇüŸ¦ °¡Áø´Ù. ´ÙÀ½Àº ApiEdit°¡ Á¤ÀÇÇÏ´Â ¸í·É ¸ñ·ÏÀÌ´Ù.

 

µ¿ÀÛ

¸ñÀû¾î

¼³¸í

move

left right up down home end pgup pgdn wleft wright wordhome wordend dochome docend paren last nextpara prevpara parahome paraend

À̵¿

movesel

left right up down home end pgup pgdn wleft wright wordhome worded dochome docend paren last nextpara prevpara parahome paraend

ÇöÀç À§Ä¡¿¡¼­ ~±îÁö ¼±ÅÃ

insert

"¹®ÀÚ¿­"

 

delete

 

 

bs

char word

 

select

word line para doc

 

copy

 

 

copyapp

 

 

cut

 

 

cutapp

 

 

paste

 

 

convert

upper lower reversecase upperfirst uppersent totab tospace removespace indent unindent comment uncomment

 

copychar

up down

 

scroll

up down pgup pgdn halfup halfdown left right pageleft pageright

 

setmark

unname 1~0

Åä±Û ¹æ½Ä

gomark

next prior 1~0

ºÏ¸¶Å© À̵¿

find

"¹®ÀÚ¿­"

ÇöÀç À§Ä¡¿¡¼­ ¾Æ·¡·Î. ½ÇÆнà ¸ÅÅ©·Î Á¾·á

replace

"¹®ÀÚ¿­1" "¹®ÀÚ¿­2"

 

focus

next prev

 

 

¿©·¯ °¡Áö Å×½ºÆ®¸¦ ÅëÇØ ÇʼöÀûÀÎ ¸í·É ¸ñ·ÏÀ» ¸¸µç °ÍÀε¥ ¾ÕÀ¸·Î ´õ ¸¹Àº ¸í·ÉµéÀÌ Ãß°¡µÉ °ÍÀÌ´Ù. ÀÌ ¸í·ÉµéÀÌ ¸ÅÅ©·Î¿¡ ±â·ÏµÇ¸ç ¸ÅÅ©·Î³»ÀÇ ¸í·ÉÀº ¼ø¼­´ë·Î ½ÇÇàµÈ´Ù. °¢ ¸í·ÉÀº °³Çà ÄÚµå ¶Ç´Â ¼¼¹ÌÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¸ç ÇÑ ¸ÅÅ©·Î¿¡ Æ÷Ç﵃ ¼ö ÀÖ´Â ¸í·ÉÀÇ °³¼ö¿¡´Â Á¦ÇÑÀÌ ¾ø´Ù.

°ü¸®ÀÇ ÆíÀÇ»ó ¸í·ÉÀ» ±¸¼ºÇÏ´Â µ¿»ç, ¸ñÀû¾îµéÀº ¿­°ÅÇüÀ¸·Î Á¤ÀÇÇÑ´Ù. ¸í·ÉÀ» ½ÇÇàÇÒ ¶§¸¶´Ù ¹®ÀÚ¿­ ÆĽÌÀ» ÇÒ ¼ö´Â ¾øÀ¸¹Ç·Î ÇÑ ¹ø ºÐ¼®ÇÑ ¸í·ÉÀº ¿­°ÅÇüÀ¸·Î °ü¸®ÇÏ´Â °ÍÀÌ È¿À²ÀûÀÌ´Ù. ¸í·É ±¸¹® ÀÚü´Â ApiEdit ÄÁÆ®·Ñ°ú Á÷Á¢ÀûÀÎ ¿¬°üÀÌ ¾øÀ¸¹Ç·Î ÀÏ¹Ý ÇÔ¼öµéÀÌ °ü¸®ÇÑ´Ù. Áï ApiEdit ÄÁÆ®·Ñ ÀÚü´Â ¸í·ÉÀÇ ÆíÁýÀ̳ª °ü¸®¿¡ °ü¿©ÇÏÁö ¾Ê°í ÇÔ¼öµéÀÌ ½ÃÅ°´Â µ¿ÀÛ¸¸ Çؼ®ÇÏ¿© ó¸®ÇÑ´Ù. AeUtil.h¿¡ ¿­°ÅÇüÀ» ´ÙÀ½°ú °°ÀÌ ¼±¾ðÇÑ´Ù.

 

enum {AEC_MOVE, AEC_MOVESEL, AEC_INSERT, AEC_DELETE, AEC_BS, AEC_SELECT,

     AEC_COPY, AEC_COPYAPP, AEC_CUT, AEC_CUTAPP, AEC_PASTE, AEC_CONVERT, AEC_COPYCHAR,

     AEC_SCROLL, AEC_SETMARK, AEC_GOMARK, AEC_FIND,AEC_REPLACE,AEC_FOCUS};

enum {AECM_LEFT, AECM_RIGHT, AECM_UP, AECM_DOWN, AECM_HOME, AECM_END, AECM_PGUP,

     AECM_PGDN, AECM_WLEFT, AECM_WRIGHT, AECM_WORDHOME, AECM_WORDEND, AECM_DOCHOME,

     AECM_DOCEND, AECM_PAREN,AECM_LAST, AECM_NEXTPARA, AECM_PREVPARA, AECM_PARAHOME,

     AECM_PARAEND};

enum {AECS_WORD, AECS_LINE, AECS_PARA, AECS_DOC};

enum {AECC_UPPER, AECC_LOWER, AECC_REVERSECASE, AECC_UPPERFIRST, AECC_UPPSERSENT,

     AECC_TOTAB, AECC_TOSAPCE, AECC_REMOVESPACE, AECC_INDENT, AECC_UNINDENT,

     AECC_COMMENT, AECC_UNCOMMENT};

enum {AECS_UP, AECS_DOWN, AECS_PGUP, AECS_PGDN, AECS_HALFUP, AECS_HALFDOWN,

     AECS_LEFT, AECS_RIGHT, AECS_PAGELEFT, AECS_PAGERIGHT};

 

AEC_·Î ½ÃÀ۵Ǵ °ÍÀº ¸í·ÉÀÌ°í ³ª¸ÓÁö´Â ¸í·ÉÀÇ ¸ñÀûÀÌ´Ù. ¿­°ÅÇüÀÇ À̸§À» Á÷°üÀûÀ¸·Î ÀÛ¼ºÇØ ³õ¾ÒÀ¸¹Ç·Î À̸§À» º¸¸é ¾î¶² ¸í·ÉÀÎÁö¸¦ ½±°Ô ¾Ë ¼ö ÀÖ´Ù. ¿¹¸¦ µé¾î AECM_DOCHOMEÀº À̵¿ ¸í·É Áß ¹®¼­ÀÇ Ã³À½À¸·Î °¡¶ó´Â ¶æÀÌ´Ù.

³ª.¸í·É Áö¿ø

ApiEdit°¡ ¸ÅÅ©·Î¸¦ Áö¿øÇÏ·Á¸é »ç¿ëÀÚÀÇ Á÷Á¢ÀûÀÎ Á¶ÀÛ¿Ü¿¡µµ ¿ÜºÎ¿¡¼­ ÁÖ¾îÁø ¸í·É¿¡ ÀÇÇØ ¿òÁ÷ÀÏ ¼ö ÀÖ¾î¾ß ÇÑ´Ù. ¸í·É Áö¿øÀ» À§ÇØ ´ÙÀ½ ³× °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ Ãß°¡ÇÑ´Ù.

 

class CApiEditText : public CWindow

{

     ....

     virtual void ProcessKey(UINT vk,BOOL bControl,BOOL bShift);

     virtual void Select(int n);

     virtual void Move(int n, BOOL bSelect);

     virtual void Scroll(int nLine, int nCode=0);

 

ÆÄ»ý Ŭ·¡½º¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼öµµ ÀÖÀ¸¹Ç·Î °¡»ó ÇÔ¼ö·Î ¼±¾ðÇß´Ù. ÀÌ ÇÔ¼öµéÀº Å° ÀÔ·Â, ¼±ÅÃ, À̵¿, ½ºÅ©·Ñ µîÀÇ µ¿ÀÛÀ» ó¸®Çϴµ¥ ¿ø·¡ ÀÌ ÄÚµåµéÀº »ç¿ëÀÚÀÇ Å° Á¶ÀÛ¿¡ ÀÇÇؼ­¸¸ È£ÃâµÇ¾ú´Ù. ±×·¯³ª ÀÌÁ¦´Â ¸í·É¿¡ ÀÇÇؼ­µµ È£ÃâµÉ ¼ö ÀÖÀ¸¹Ç·Î Á» ´õ ¹ü¿ëÀûÀÎ µ¿ÀÛÀ» Áö¿øÇϱâ À§ÇØ ÇÔ¼ö·Î ºÐ¸®Çß´Ù.

¿¹¸¦ µé¾î Å°º¸µå ÀÔ·ÂÀ» ó¸®ÇÏ´Â OnKey ÇÔ¼ö´Â ½¬ÇÁÆ®, ÄÁÆ®·Ñ Å°ÀÇ »óŸ¦ ½Ç½Ã°£À¸·Î Á¶»çÇÏ¿© ¼±ÅÃ, ´Ü¾î ´ÜÀ§ À̵¿À» ÇÑ´Ù. ±×·¯³ª ¸í·ÉÀº ÀÌ Å°ÀÇ »óŸ¦ ÂüÁ¶ÇÏ´Â °ÍÀÌ ¾Æ´Ï¶ó ¸ñÀû¾î¸¦ ÂüÁ¶ÇϹǷΠ¸ñÀû¾î´ë·Î µ¿ÀÛÇÏ´Â ÇÔ¼ö°¡ ÇÊ¿äÇÑ °ÍÀÌ´Ù. ProcessKey ÇÔ¼ö´Â ±âÁ¸ OnKeyÀÇ µ¿ÀÛÀ» ¼öÇàÇÏµÇ Å°º¸µå°¡ ¾Æ´Ñ ÀμöÀÇ Áö½Ã¸¦ µû¸¥´Ù´Â Á¡ÀÌ ´Ù¸£´Ù. ProcessKey ÇÔ¼ö´Â ´ÙÀ½°ú °°ÀÌ ÀÛ¼ºÇÑ´Ù.

 

void CApiEditText::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)

{

     int r,c;

     int oldr;

     int OldOff;

     int toff;

 

     switch (vk) {

          ....

     }

}

 

switch (vk)ÀÌÇÏÀÇ ÄÚµå´Â OnKey¿¡ ÀÖ´Â switch ºí·°À» ±×´ë·Î °¡Á®¿Â °ÍÀÌ´Ù. ½ÇÁ¦ ó¸® Äڵ尡 ProcessKey·Î ¿Å°ÜÁ³À¸¹Ç·Î OnKey´Â ´ÙÀ½°ú °°ÀÌ ¼öÁ¤µÈ´Ù.

 

void CApiEditText::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     BOOL bShift, bControl;

 

     bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);

     ....

     if (vk>='0' && vk<='9' && bControl) {

          if (bShift) {

              ToggleBookmark(-1,vk-'0');

          } else {

              GotoBookmark(vk-'0');

          }

     }

 

    ProcessKey(vk,bControl,bShift);

 

     if (bShift && !bColumnMode) {

          ignoreVirt--;

     }

     if (bShift && bColumnMode && SelStart != SelEnd) {

          SelExtraX=ExtraX;

     }

}

 

bDragSel ¸ðµå¿Í ºÏ¸¶Å© ´ÜÃàÅ° ó¸®, ¿­¸ðµå ó¸® µîÀº ±×´ë·Î µÎ°í Å°¸¦ Á÷Á¢ ó¸®ÇÏ´Â ¸ðµç ÄÚµå´Â ProcessKey·Î À̵¿µÇ¾ú´Ù. Áö¿ª º¯¼ö´Â µÎ ÇÔ¼ö°¡ Àû´çÈ÷ ³ª´©¾î °¡Á®¾ß ÇÑ´Ù. ProcessKey´Â Àμö·Î Àü´ÞµÈ bShift, bControlÀÇ Áö½Ã´ë·Î À̵¿ ¹× ¼±Åà µ¿ÀÛÀ» ó¸®Çϸç bUseLineEnd, bLineEnd, ExtraX µîÀº Àü¿ª ¼³Á¤ »óÅÂÀÇ ¿µÇâÀ» ¹Þ´Â´Ù.

ÀÌ·¸°Ô µÇ¸é OnKey ÇÔ¼ö´Â ÀÚ½ÅÀÇ ÄÚµå ÀϺθ¦ Á¹º´ ÇÔ¼ö¿¡°Ô ³ª´©¾î Áֱ⸸ ÇßÀ» »Ó ±â´É»óÀÇ º¯È­°¡ ¾ø´Ù. ±×·¯³ª ½Ç¹« µ¿ÀÛÀ» ó¸®ÇÏ´Â ÇÔ¼ö¸¦ Çϳª ´õ ºÐ¸®ÇØ ³õÀ¸¸é ¸ÅÅ©·Îµµ ÀÌ µ¿ÀÛÀÌ ÇÊ¿äÇÒ ¶§ ÇÔ¼ö¸¦ È£ÃâÇÒ ¼ö ÀÖ¾î È°¿ë¼ºÀÌ ´õ ³ô¾ÆÁø´Ù.

¸¸¾à ÀÌ·¸°Ô ÇÔ¼ö¸¦ ºÐ¸®ÇÏÁö ¾Ê´Â´Ù¸é À̵¿Çϸ鼭 ¼±ÅÃÇÒ ¶§ ½¬ÇÁÆ® Å°°¡ ´­·¯Áø °Íó·³ OnKey ÇÔ¼ö¸¦ ¼Ó¿©¾ß Çϴµ¥ »ý°¢Ã³·³ ½±Áö°¡ ¾Ê´Ù. ÇÔ¼ö·Î ºÐ¸®µÇ¾î ÀÖÀ¸¸é bShift¸¦ FALSE·Î ÇÏ¿© ProcessKey ÇÔ¼ö¸¸ È£ÃâÇÏ¸é µÈ´Ù. ÇÁ·Î±×·¡¹Ö¿¡¼­´Â ÇÔ¼ö¸¦ Àß ºÐ¸®ÇÏ´Â ±â¼úÀÌ ¾ÆÁÖ Áß¿äÇÏ´Ù.

Move, Select ÇÔ¼ö¸¦ ¸¸µç ÀÌÀ¯µµ ProcessKey ÇÔ¼ö¸¦ ¸¸µç ÀÌÀ¯¿Í ºñ½ÁÇѵ¥ »ç¿ëÀÚÀÇ Á¶ÀÛ¾øÀ̵µ À̵¿À̳ª ¼±Åà ¸í·ÉÀ» ó¸®ÇØ¾ß ÇÏ°í ¶ÇÇÑ Å°º¸µå·Î Á÷Á¢ ó¸®ÇÒ ¼ö ¾ø´Â ¸í·Éµéµµ ½ÇÇàÇØ¾ß ÇÑ´Ù. Move´Â Àμö·Î Àü´ÞµÈ n¿¡ µû¶ó À̵¿ ¹× ¼±Åà ´ë»óÀÌ ´Þ¶óÁö´Âµ¥ ÀÌ °ªÀº ¸ÅÅ©·Î ¸í·É¾îÀÇ ¸ñÀû¾î¿Í ÀÏÄ¡½ÃÄÑ µÎ¾ú´Ù. bSelect°¡ TRUEÀ̸é À̵¿ÇÑ °÷±îÁö ¼±ÅÃÀ» È®ÀåÇÑ´Ù.

 

void CApiEditText::Move(int n, BOOL bSelect)

{

     int pr, pc;

     int toff;

 

     GetParaFromOff(off,pr,pc);

     switch (n) {

     case AECM_LAST:

          toff=pFrame->LastEditOff;

          break;

     case AECM_WORDHOME:

          toff=off;

          if (toff == 0)

              break;

          // ´Ü¾î ³¡ ±¸ºÐÀÚ¿¡ ÀÖ´Â °æ¿ì¸¦ À§ÇØ ÀÏ´Ü ÇÑÄ­ ¾ÕÀ¸·Î À̵¿.

          for (toff--;;toff--) {

              if (IsDelimiter(toff) || toff==0)

                   break;

          }

          if (toff !=0)

              toff++;

          break;

     case AECM_WORDEND:

          for (toff=off;;toff++) {

              if (IsDelimiter(toff))

                   break;

          }

          break;

     case AECM_NEXTPARA:

          pr++;

          toff=GetOffFromPara(pr,0);

          if (toff==-1) {

              return;

          }

          break;

     case AECM_PREVPARA:

          pr--;

          toff=GetOffFromPara(pr,0);

          if (toff==-1) {

              return;

          }

          break;

     case AECM_PARAHOME:

          toff=pLine[GetParaFirstLine(pr)].Start;

          break;

     case AECM_PARAEND:

          GetParaFromOff(off,pr,pc);

          toff=pLine[GetParaLastLine(pr)].End;

          break;

     default:

          return;

     }

 

     if (bSelect) {

          ExpandSelection(off,toff);

          off=toff;

     } else {

          off=toff;

          ClearSelection();

     }

     SetCaret();

}

 

void CApiEditText::Select(int n)

{

     int r,c;

     int pr,pc;

 

     switch (n) {

     case AECS_WORD:

          GetNowWord(off,SelStart,SelEnd);

          SetSelect(SelStart,SelEnd,FALSE);

          break;

     case AECS_LINE:

          GetRCFromOff(off,r,c);

          SelStart=pLine[r].Start;

          SelEnd=pFrame->IncludeEnter(pLine[r].End);

          SetSelect(SelStart,SelEnd,FALSE);

          break;

     case AECS_PARA:

          GetParaFromOff(off,pr,pc);

          SelStart=pLine[GetParaFirstLine(pr)].Start;

          SelEnd=pFrame->IncludeEnter(pLine[GetParaLastLine(pr)].End);

          SetSelect(SelStart,SelEnd,FALSE);

          break;

     case AECS_DOC:

          SendMessage(hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_SELALL,0),0);

          break;

     default:

          return;

     }

}

 

¹®´ÜÀ̳ª ÁÙÀ» ¼±ÅÃÇÒ ¶§´Â µÞºÎºÐÀÇ °³Çà Äڵ嵵 Æ÷ÇÔÇØ¾ß ÇϹǷΠIncludeEnter ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù. Scroll ÇÔ¼ö´Â nLine¸¸Å­ ½ºÅ©·ÑÇ쵂 nCode°¡ 0ÀÌ ¾Æ´Ò ¶§´Â nCode°¡ Áö½ÃÇϴ¸¸Å­ ½ºÅ©·Ñ ÁÙ ¼ö¸¦ Á÷Á¢ °è»êÇÑ´Ù. nCode°¡ 1, -1ÀÏ ¶§´Â ÆäÀÌÁö ´ÜÀ§·Î ¾Æ·¡, À§·Î ½ºÅ©·ÑÇÏ´Â °ÍÀÌ°í 2, -2ÀÏ ¶§´Â ¹Ý ÆäÀÌÁö ´ÜÀ§·Î ¾Æ·¡, À§·Î ½ºÅ©·Ñ ÇÏ´Â °ÍÀÌ´Ù.

ÆäÀÌÁö ´ÜÀ§·Î ½ºÅ©·Ñ ÇÏ·Á¸é frt¿Í LineHeight·ÎºÎÅÍ ½ºÅ©·ÑÇÒ ÁÙ ¼ö¸¦ °è»êÇØ¾ß Çϴµ¥ ÀÌ ¸â¹öµéÀº ¼û°ÜÁ® ÀÖÀ¸¹Ç·Î ¿ÜºÎ¿¡¼­´Â ÇÑ ÆäÀÌÁö°¡ ¸î ÁÙÀÎÁö °è»êÇÒ ¼ö ¾ø´Ù. ±×·¡¼­ nCode·Î ½ºÅ©·ÑÇÒ ³í¸®ÀûÀÎ ºÐ·®À» Àü´ÞÇÏ¸é ºä°¡ Á÷Á¢ ½ºÅ©·ÑÇÒ ¾çÀ» °è»êÇÑ´Ù. Scroll ÇÔ¼ö´Â nLineÀ¸·Î ÁöÁ¤ÇÑ Àý´ë ÁÙ ¼ö¸¸Å­ ¶Ç´Â nCode·Î ÁöÁ¤ÇÑ ³í¸®ÀûÀÎ ¾ç¸¸Å­ ½ºÅ©·ÑÇÑ´Ù.

 

void CApiEditText::Scroll(int nLine, int nCode/*=0*/)

{

     int yInc;

     int LinePerPage;

     RECT srt;

 

     if (nCode) {

          switch (nCode) {

          case 1:

              SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEDOWN,0),0);

              return;

          case -1:

              SendMessage(hWnd,WM_VSCROLL,MAKELONG(SB_PAGEUP,0),0);

              return;

          case 2:

              nLine=frt.bottom/LineHeight/2;

              break;

          case -2:

              nLine=-frt.bottom/LineHeight/2;

              break;

          }

     }

     LinePerPage=(frt.bottom/LineHeight)*LineHeight;

     yInc=LineHeight*nLine;

     yInc=max(-yPos, min(yInc, yMax-yPos-LinePerPage));

     yInc=yInc-(yInc % LineHeight);

     yPos=yPos+yInc;

     srt=frt;

     srt.left=0;

     ScrollWindow(hWnd, 0, -yInc, &srt, &srt);

     if (IsWindowEnabled(hVertScroll)) {

          SetScrollPos(hVertScroll, SB_CTL, yPos, TRUE);

     }

     SetCaret(FALSE,FALSE);

}

 

¸í·É¿¡ ÀÇÇØ À̵¿ÇÏ´Â Move ÇÔ¼ö°¡ ¸¸µé¾îÁ³°í ÀÌ ÇÔ¼öÀÇ ¸ñÀû¾î Áß¿¡ ÃÖÈÄ ÆíÁý À§Ä¡·Î À̵¿ÇÏ´Â AECM_LAST°¡ ÀÖÀ¸¹Ç·Î GotoLastEditOff ÇÔ¼ö´Â »ç½Ç»ó Move(AECM_LAST ,FALSE)¿Í µ¿ÀÏÇÏ´Ù. ±×·¡¼­ ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

 

void CApiEditText::GotoLastEditOff()

{

     Move(AECM_LAST,FALSE);

}

 

¹°·Ð ¿ø·¡ Äڵ嵵 Àß µ¿ÀÛÇϹǷΠ±×´ë·Î µÎ¾îµµ »ó°ü¾øÁö¸¸ ÀÏ°ü¼ºÀ» À§ÇØ ¼öÁ¤Çß´Ù. Move ¸í·É¿¡ ÃÖÈÄ ÆíÁý À§Ä¡·Î À̵¿ Äڵ尡 ÀÛ¼ºµÇ¾úÀ¸¹Ç·Î »ç½Ç GotoLastEditOff ÇÔ¼ö ÀÚü°¡ ºÒÇÊ¿äÇÏÁö¸¸ ÀÎÅÍÆäÀ̽º À¯Áö¸¦ À§ÇØ ÀÌ ÇÔ¼ö´Â ±×´ë·Î µÎ±â·Î ÇÑ´Ù. º° ½Ç¿ë¼ºÀº ¾øÁö¸¸ Move(AECM_LAST,TRUE) ¸í·ÉÀº ÇöÀç À§Ä¡¿¡¼­ ÃÖÈÄ ÆíÁý À§Ä¡±îÁö ¼±ÅÃÇ϶ó´Â »õ·Î¿î ¸í·ÉÀÌ µÈ´Ù.

´Ù.Çí»ç ºä ¼öÁ¤

¸í·ÉÀ» ó¸®Çϱâ À§ÇØ ±âº» ºäÀÇ Å°º¸µå ó¸®, À̵¿, ¼±Åà µ¿ÀÛÀ» ÇÔ¼ö·Î ºÐ¸®Çß´Ù. Çí»ç ºä´Â ÀÌ µ¿ÀÛµéÀÌ ±âº» ºä¿Í´Â ´Ù¼Ò ´Ù¸£¹Ç·Î ProcessKey, Move, Select ÇÔ¼öµéÀ» ÀçÁ¤ÀÇÇØ¾ß ÇÑ´Ù. ´Ü, Scroll ÇÔ¼ö´Â Àç»ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±×´ë·Î »ó¼Ó¹ÞÀ¸¸é µÈ´Ù.

 

class CApiEditHexa : public CApiEditText

{

     ....

     void ProcessKey(UINT vk,BOOL bControl,BOOL bShift);

     void Select(int n);

     void Move(int n, BOOL bSelect);

};

 

±âº» ºä¿¡¼­¿Í ¸¶Âù°¡Áö·Î OnKey ÇÔ¼öÀÇ switch¹®°ú Áö¿ª º¯¼ö¸¸ ProcessKey ÇÔ¼ö·Î °¡Á®¿Â´Ù. Çí»çºä¿¡¼­ÀÇ Å°ÀԷ ó¸®´Â ÅؽºÆ® ºä¿Í´Â »ó´çÈ÷ ´Ù¸£´Ù.

 

void CApiEditHexa::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)

{

     int r,c;

     int oldr;

     int OldOff;

 

     switch (vk) {

          ....

     }

}

 

void CApiEditHexa::OnKey(HWND hWnd, UINT vk, BOOL fDown, int cRepeat, UINT flags)

{

     BOOL bShift, bControl;

 

     bShift=((GetKeyState(VK_SHIFT) & 0x8000) != 0);

     ....

     bFindSelect=FALSE;

    ProcessKey(vk,bControl,bShift);

}

 

Move¿Í Select ÇÔ¼öµµ ÀçÁ¤ÀÇÇ쵂 ÀÌ ÇÔ¼öµéÀº ±âº» ºäÀÇ Äڵ带 ´ëºÎºÐ Àç»ç¿ëÇÒ ¼ö ÀÖÀ¸¹Ç·Î ±æÀÌ°¡ ÈξÀ ´õ ª´Ù. ´ëºÎºÐÀÇ Ã³¸®¸¦ ±âº» ºä·Î ³Ñ±â±â¸¸ ÇÏ¸é µÈ´Ù.

 

void CApiEditHexa::Move(int n, BOOL bSelect)

{

     switch (n) {

     case AECM_LAST:

     case AECM_WORDHOME:

     case AECM_WORDEND:

          CApiEditText::Move(n,bSelect);

          break;

     case AECM_NEXTPARA:

     case AECM_PREVPARA:

     case AECM_PARAHOME:

     case AECM_PARAEND:

          break;

     }

}

 

void CApiEditHexa::Select(int n)

{

     switch (n) {

     case AECS_WORD:

     case AECS_DOC:

          CApiEditText::Select(n);

          break;

     case AECS_LINE:

     case AECS_PARA:

          break;

     }

}

 

Çí»ç ºä´Â ÃÖÈÄ ÆíÁý À§Ä¡³ª ´Ü¾îÀÇ °³³äÀº ÀÖÁö¸¸ ¹®´ÜÀÇ °³³äÀÌ ¾øÀ¸¹Ç·Î ÀÌ ¸í·ÉµéÀº ½ÇÇàÇÏÁö ¸»¾Æ¾ß ÇÑ´Ù. Çí»ç ºä´Â pLineÀ» ÂüÁ¶ÇÏ´Â ¸ðµç ¸í·ÉÀ» ¹«½ÃÇØ¾ß ÇÑ´Ù. ¿©±â±îÁö ÀÛ¼ºÇÑ ÈÄ ½ÇÇàÇØ º¸¸é ¾ÆÁ÷±îÁö ´Þ¶óÁø °ÍÀº ¾Æ¹« °Íµµ ¾øÀ¸¸ç ÀÌÀü ¹öÀü°ú ¿ÏÀüÈ÷ µ¿ÀÏÇÏ°Ô µ¿ÀÛÇÑ´Ù. ±×·¯³ª ³»ºÎ ±¸Á¶´Â ¸¹ÀÌ ¼öÁ¤µÇ¾ú´Âµ¥ ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Â ÇÔ¼ö±ºÀ» º¸À¯ÇÏ°Ô µÇ¾ú´Ù.

¶ó.¸í·ÉÀÇ Á¤ÀÇ

¾Õ¿¡¼­ µµÇ¥·Î ÀÛ¼ºÇß´ø ¸í·ÉµéÀº Äڵ忡¼­ ±¸Á¶Ã¼·Î Ç¥ÇöµÇ¸ç ¸í·ÉÀÇ ÁýÇÕÀº ±¸Á¶Ã¼ ¹è¿­·Î ÀÛ¼ºµÈ´Ù. »ç¿ëÀÚ°¡ ¸í·ÉÀÇ ¸ñ·ÏÀ» ¿Ü¿ìÁö´Â ¸øÇϹǷΠ´ëÈ­»óÀÚ¿¡ ¸ñ·ÏÀ» Ç¥½ÃÇØ¾ß ÇϹǷΠ¹®ÀÚ¿­ ÇüÅ·ΠµÈ ¸í·É ¸ñ·ÏÀÌ ÇÊ¿äÇÏ´Ù. ´ÙÀ½ µÎ ±¸Á¶Ã¼¸¦ AeUtil.h¿¡ ¼±¾ðÇÑ´Ù.

 

struct SMacVerb

{

     TCHAR *Name;

     TCHAR *Desc;

     DWORD Flag;

};

 

struct SMacObject

{

     TCHAR *Name;

     TCHAR *Desc;

};

 

extern SMacVerb arComVerb[];

extern SMacObject arComObject[];

extern int arObjOfVerb[];

 

SMacVerb´Â ¸ÅÅ©·Î ¸í·É Çϳª¿¡ ´ëÇÑ Á¤º¸ÀÌ´Ù. NameÀº ¸í·ÉÀÇ À̸§, Desc´Â ¸í·É¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀ̸ç Flag´Â ¸í·ÉÀÇ ¼Ó¼ºÀÌ´Ù. Falg´Â µÎ °³ÀÇ ºñÆ®·Î ±¸¼ºµÈ´Ù. b0´Â ¸í·ÉÀ» ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÒ ¼ö Àִ°¡¸¦ ÁöÁ¤Çϸç ÀÌ Ç÷¡±×¿¡ µû¶ó Ä«¿îÆ®°ªÀ» °¡Áö´Â°¡ ¾Æ´Ñ°¡¸¦ °áÁ¤ÇÑ´Ù. À̵¿À̳ª »èÁ¦ µîÀº ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÒ ¼ö ÀÖÁö¸¸ º¹»ç³ª »ðÀÔÀº ¹Ýº¹ÀûÀ¸·Î ½ÇÇàÇÒ ¼ö ¾ø´Ù. b1Àº ¸ñÀû¾î°¡ ÀÖ´ÂÁö¸¦ ÁöÁ¤Çϴµ¥ ÀÌ °ªÀÌ 0ÀÌ¸é ¸ñÀû¾î°¡ ¾ø´Â ´Üµ¶ ¸í·ÉÀÌ´Ù.

SMacObject´Â ¸í·ÉÀÇ ¸ñÀû¾î¿¡ ´ëÇÑ Á¤º¸ÀÌ´Ù. NameÀº ¸ñÀû¾îÀÇ À̸§ÀÌ°í Desc´Â ¸ñÀû¾î¿¡ ´ëÇÑ °£´ÜÇÑ ¼³¸íÀÌ´Ù. ÀÌ µÎ ±¸Á¶Ã¼ÀÇ ¹è¿­·Î ¸í·É¾î¿Í ¸ñÀû¾î ¸ñ·ÏÀ» ÀÛ¼ºÇϸç ÀÌ ¸ñ·ÏÀº ¿ÜºÎ¿¡¼­µµ ÀÚÁÖ ÂüÁ¶µÇ¹Ç·Î ¹Ì¸® extern ¼±¾ðÇØ µÎ¾ú´Ù. AeUtil.cpp¿¡´Â ±¸Á¶Ã¼ ¹è¿­À» ´ÙÀ½°ú °°ÀÌ ÃʱâÈ­ÇÑ´Ù.

 

// µ¿»ç ¹è¿­

// FlagÀÇ b0=¹Ýº¹ °¡´É¼º, b1=¸ñÀû¾î À¯¹«(¹®ÀÚ¿­ ¸ñÀû¾î´Â Á¦¿Ü)

SMacVerb arComVerb[]={

     {"move","À̵¿",0x03},

     {"movesel","¼±ÅÃÀ̵¿",0x03},

     {"insert","»ðÀÔ",0x00},

     {"delete","»èÁ¦",0x01},

     {"bs","¾Õ¹®ÀÚ »èÁ¦",0x03},

     {"select","¼±ÅÃ",0x02},

     {"copy","º¹»ç",0x00},

     {"copyapp","º¹»çÇؼ­ Ãß°¡",0x00},

     {"cut","À߶󳻱â",0x00},

     {"cutapp","Àß¶ó¼­ Ãß°¡",0x00},

     {"paste","ºÙ¿©³Ö±â",0x01},

     {"convert","º¯È¯",0x03},

     {"copychar","À§¾Æ·¡ ¹®ÀÚ ¹Ýº¹",0x03},

     {"scroll","½ºÅ©·Ñ",0x03},

     {"setmark","Ã¥°¥ÇÇ ¼³Á¤",0x02},

     {"gomark","Ã¥°¥ÇÇ À̵¿",0x02},

     {"find","ã±â",0x00},

     {"replace","¹Ù²Ù±â",0x00},

     {"focus","ºä Àüȯ",0x03},

     {"","",0x00}

};

 

// ¸ñÀû¾î ¹è¿­

SMacObject arComObject[]={

     {"left","¿ÞÂÊ"},                            // move:0

     {"right","¿À¸¥ÂÊ"},

     {"up","À§·Î"},

     {"down","¾Æ·¡·Î"},

     {"home","Á٠óÀ½À¸·Î"},

     {"end","ÁÙ ³¡À¸·Î"},

     {"pgup","ÆäÀÌÁö À§·Î"},

     {"pgdn","ÆäÀÌÁö ¾Æ·¡·Î"},

     {"wleft","ÀÌÀü ´Ü¾î·Î"},

     {"wright","ÀÌÈÄ ´Ü¾î"},

     {"wordhome","´Ü¾î óÀ½À¸·Î"},

     {"wordend","´Ü¾î ³¡À¸·Î"},

     {"dochome","¹®¼­ óÀ½"},

     {"docend","¹®¼­ ³¡"},

     {"paren","´ëÀÀµÇ´Â °ýÈ£"},

     {"last","¸¶Áö¸· ÆíÁý À§Ä¡"},

     {"nextpara","´ÙÀ½ ¹®´Ü"},

     {"prevpara","ÀÌÀü ¹®´Ü"},

     {"parahome","¹®´Ü óÀ½"},

     {"paraend","¹®´Ü ³¡"},

     {NULL,NULL},

     {"char","¹®ÀÚ"},                          // bs:21

     {"word","´Ü¾î"},

     {NULL,NULL},

     {"word","´Ü¾î"},                         // select:24

     {"line","ÁÙ"},

     {"para","¹®´Ü"},

     {"doc","¹®¼­"},

     {NULL,NULL},

     {"upper","´ë¹®ÀÚ·Î"},                       // convert:29

     {"lower","¼Ò¹®ÀÚ·Î"},

     {"reversecase","´ë¼Ò ¹Ý´ë·Î"},

     {"upperfirst","ù±ÛÀÚ¸¸ ´ë¹®ÀÚ·Î"},

     {"uppersent","¹®Àå óÀ½¸¸ ´ë¹®ÀÚ·Î"},

     {"totab","°ø¹éÀ» ÅÇÀ¸·Î"},

     {"tospace","ÅÇÀ» °ø¹éÀ¸·Î"},

     {"removespace","ºÒÇÊ¿äÇÑ °ø¹é Á¦°Å"},

     {"indent","µé¿©¾²±â"},

     {"unindent","³»¾î¾²±â"},

     {"comment","ÁÖ¼®À¸·Î"},

     {"uncomment","ÁÖ¼®Á¦°Å"},

     {NULL,NULL},

     {"up","À­ÁÙ ¹®ÀÚ"},                          // copychar:42

     {"down","¾Æ·¡ÁÙ ¹®ÀÚ"},

     {NULL,NULL},

     {"up","À§"},                                // scroll:45

     {"down","¾Æ·¡"},

     {"pgup","ÆäÀÌÁö À§"},

     {"pgdn","ÆäÀÌÁö ¾Æ·¡"},

     {"halfup","¹Ý ÆäÀÌÁö À§"},

     {"halfdown","¹Ý ÆäÀÌÁö ¾Æ·¡"},

     {"left","¿ÞÂÊ"},

     {"right","¿À¸¥ÂÊ"},

     {"pageleft","ÆäÀÌÁö ¿ÞÂÊ"},

     {"pageright","ÆäÀÌÁö ¿À¸¥ÂÊ"},

     {NULL,NULL},

     {"unname","À̸§¾ø´Â ºÏ¸¶Å©"},              // setmark:56

     {"0","0¹ø ºÏ¸¶Å©"},

     {"1","1¹ø ºÏ¸¶Å©"},

     {"2","2¹ø ºÏ¸¶Å©"},

     {"3","3¹ø ºÏ¸¶Å©"},

     {"4","4¹ø ºÏ¸¶Å©"},

     {"5","5¹ø ºÏ¸¶Å©"},

     {"6","6¹ø ºÏ¸¶Å©"},

     {"7","7¹ø ºÏ¸¶Å©"},

     {"8","8¹ø ºÏ¸¶Å©"},

     {"9","9¹ø ºÏ¸¶Å©"},

     {NULL,NULL},

     {"next","´ÙÀ½ ºÏ¸¶Å©"},                     // gomark:68

     {"prev","ÀÌÀü ºÏ¸¶Å©"},

     {"0","0¹ø ºÏ¸¶Å©"},

     {"1","1¹ø ºÏ¸¶Å©"},

     {"2","2¹ø ºÏ¸¶Å©"},

     {"3","3¹ø ºÏ¸¶Å©"},

     {"4","4¹ø ºÏ¸¶Å©"},

     {"5","5¹ø ºÏ¸¶Å©"},

     {"6","6¹ø ºÏ¸¶Å©"},

     {"7","7¹ø ºÏ¸¶Å©"},

     {"8","8¹ø ºÏ¸¶Å©"},

     {"9","9¹ø ºÏ¸¶Å©"},

     {"next","´ÙÀ½ º¸±â"},                        // focus:80

     {"prev","ÀÌÀü º¸±â"},

     {NULL,NULL}

};

 

// °¢ µ¿»çº° ¸ñÀû¾î ¹è¿­»óÀÇ ½ÃÀÛ Ã·ÀÚ

int arObjOfVerb[]={0,0,-1,-1,21,24,-1,-1,-1,-1,-1,29,42,45,56,68,-1,-1,80};

 

arComVerb´Â ¸í·ÉÀ» ±¸¼ºÇÏ´Â µ¿»çÀÇ ¸ñ·ÏÀÌ°í arComObject´Â ¸ñÀû¾îÀÇ ¸ñ·ÏÀÌ´Ù. µ¿»çº°·Î ¸ñÀû¾îÀÇ ¸ñ·Ï°ú °³¼ö°¡ ´Ù¸£¹Ç·Î ¸ðµç ¸ñÀû¾î¸¦ ÇϳªÀÇ ¹è¿­¿¡ ÀÛ¼ºÇÏ°í °¢ µ¿»çº° ¸ñÀû¾îÀÇ ½ÃÀÛ À妽º¸¦ arObjOfVerb ¹è¿­¿¡ µû·Î ÀÛ¼ºÇß´Ù. ¿¹¸¦ µé¾î À̵¿°ú ¼±ÅÃÀ̵¿ µ¿»çÀÇ ¸ñÀû¾î´Â 0ºÎÅÍ ½ÃÀÛÇÏ°í »ðÀÔ, »èÁ¦´Â ¸ñÀû¾î°¡ ¾øÀ¸¸ç ¾Õ¹®ÀÚ »èÁ¦ÀÇ ¸ñÀû¾î´Â 21ºÎÅÍÀÌ´Ù.

ƯÁ¤ µ¿»çÀÇ ¸ñÀû¾î ½ÃÀÛ À§Ä¡´Â arObjOfVerb¿¡¼­ ±¸ÇÒ ¼ö ÀÖ°í arComObject ¹è¿­¿¡¼­ ÀÌ À§Ä¡ ÀÌÈÄ À̸§ÀÌ NULLÀÌ ¾Æ´Ñ ¿ä¼Ò¸¦ ¸ðµÎ ÀÐÀ¸¸é ¸ñÀû¾î ¸ñ·ÏÀ» ±¸ÇÒ ¼ö ÀÖ´Ù. Á¶±Ý º¹ÀâÇØ º¸À̱â´Â Çѵ¥ ¸Þ¸ð¸®¸¦ ¾Æ³¢±â À§ÇØ ÀÌ·± ¹æ¹ýÀ» »ç¿ëÇÑ´Ù. AeUtil.h¿¡¼­ extern ¼±¾ðÀ» ÇØ µÎ¾úÀ¸¹Ç·Î È£½ºÆ®¿¡¼­ ÀÌ ¹è¿­À» °ð¹Ù·Î ÂüÁ¶ÇÒ ¼ö ÀÖ´Ù.

¸¶.¸í·É °ü¸® ÇÔ¼ö

¸ÅÅ©·Î´Â ¹®ÀÚ¿­ Æ÷¸ËÀ¸·Î ÀÛ¼ºµÇ´Âµ¥ ¹®ÀÚ¿­Àº ºÎȣȭµÈ Äڵ忡 ºñÇØ ´Ù·ç±â°¡ ±²ÀåÈ÷ ±î´Ù·Ó´Ù. ¸í·ÉÀ̳ª ¸ñÀûÀ¸·Î ÃßÃâÇϱâ À§Çؼ­´Â ¹®ÀÚ¿­ ºñ±³¸¦ ÇØ¾ß ÇÑ´Ù. °Ô´Ù°¡ »ç¿ëÀÚ°¡ Á¤È®ÇÏ°Ô ¸í·ÉÀ» ÀÛ¼ºÇÑ´Ù¸é °£´ÜÇØÁö°ÚÁö¸¸ °ø¹éÀ̳ª µû¿ÈÇ¥ µîÀÇ ±¸µÎÁ¡À» ÀÓÀÇ´ë·Î ÀÛ¼ºÇÒ ¼ö ÀÖ¾î ÀÌ·± ¿¡·¯ 󸮱îÁö ÇÏÀÚ¸é ¹«Ã´ º¹ÀâÇØÁø´Ù. ±×·¡¼­ ¸ÅÅ©·Î ±¸¹® Çؼ®À» À§ÇÑ µµ¿ì¹Ì ÇÔ¼öµéÀ» ÀÛ¼ºÇÏ°í ÀÌ ÇÔ¼öµé·Î ¸ÅÅ©·Î¸¦ Çؼ®ÇÑ´Ù. ´ÙÀ½ ÇÔ¼öÀÇ ¿øÇüÀ» AeUtil.h¿¡ ¼±¾ðÇÑ´Ù.

 

void SkipSpace(const TCHAR *&pc);

BOOL SkipString(const TCHAR *&pc);

void AeEscapeChar(const TCHAR *&s,TCHAR *&d);

int GetComVerb(const TCHAR *&szCom,SMacVerb *arVerb);

int GetComObject(int Verb,const TCHAR *&szCom,SMacObject *arObject,int *arObj);

void GetComString(const TCHAR *&szCom,TCHAR *&str,BOOL bEscape=TRUE);

int GetComNumber(const TCHAR *szCom,int Min);

 

ÀÌ ÇÔ¼öµéÀº ÀϹÝÀûÀÎ ¹®ÀÚ¿­À» ´Ù·ç±â ¶§¹®¿¡ ¸â¹ö ÇÔ¼ö°¡ ¾Æ´Ï¶ó ÀÏ¹Ý ÇÔ¼öÀÌ´Ù. FindString ÇÔ¼ö ´ÙÀ½¿¡ ¿øÇüÀ» ¼±¾ðÇÏ¸é µÈ´Ù. ÇÔ¼öÀÇ º»Ã¼´Â ¹°·Ð AeUtil.cpp¿¡ ÀÛ¼ºÇÑ´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â ¹®ÀÚ¿­ 󸮸¦ À§ÇÑ À¯Æ¿¸®Æ¼ ÇÔ¼öÀÌ´Ù.

 

// °ø¹éÀ» °Ç³Ê¶Ú´Ù.

void SkipSpace(const TCHAR *&pc)

{

     for (;*pc;pc++) {

          if (*pc!=' ' && *pc!='\t')

              break;

     }

}

 

// ¹®ÀÚ¿­À» ¸¸³ª¸é ¹®ÀÚ¿­ ³¡±îÁö °Ç³Ê¶Ü. pc´Â ´Ý´Â µû¿ÈÇ¥¿¡ À§Ä¡ÇÔ.

// ´Ý´Â µû¿ÈÇ¥°¡ ¾øÀ¸¸é FALSE¸¦ ¸®ÅÏÇÑ´Ù.

BOOL SkipString(const TCHAR *&pc)

{

     if (*pc=='\"') {

          for (pc++;;pc++) {

              if (*pc==NULL) {

                   return FALSE;

              }

              if (*pc=='\"' && *(pc-1)!='\\') {

                   break;

              }

          }

     }

     return TRUE;

}

 

SkipSpace ÇÔ¼ö´Â °ø¹éÀ» °Ç³Ê ¶Ú´Ù. "move right"¶ó°í Ç×»ó ¶È¹Ù·Î ½á ÁÖ¸é ÀÌ·± 󸮰¡ ÇÊ¿ä¾øÀ¸³ª "move    right" ¿ä·¸°Ô ¾²´Â »ç¶÷µµ ÀÖ°í µ¿»ç¿Í ¸ñÀû¾î »çÀÌ¿¡ ÅÇÀ» ¾²´Â »ç¶÷µµ Àֱ⠶§¹®¿¡ ÀÌ ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. SkipString ÇÔ¼ö´Â ¹®ÀÚ¿­À» °Ç³Ê ¶Ú´Ù. ¿©´Â µû¿ÈÇ¥ À§Ä¡¿¡¼­ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇÏ¸é ´Ý´Â µû¿ÈÇ¥ À§Ä¡¸¦ ã´Â´Ù. ±²ÀåÈ÷ °£´ÜÇÒ °Í °°Áö¸¸ ´Ý´Â µû¿ÈÇ¥°¡ ¾øÀ» ¼öµµ ÀÖ°í ¹®ÀÚ¿­ ³»ÀÇ È®Àå¿­À» °í·ÁÇØ¾ß Çϱ⠶§¹®¿¡ °è»êÀÌ ÇÊ¿äÇÏ´Ù.

È®Àå¿­À̶õ ¹®ÀÚ¿­³»¿¡ Æ÷ÇԵǴ ÀÏÁ¾ÀÇ Æ¯¼ö ¹®ÀÚÀε¥ C¾ð¾îÀÇ È®Àå¿­°ú °³³äÀûÀ¸·Î µ¿ÀÏÇÏ´Ù. µû¿ÈÇ¥¾È¿¡ µû¿ÈÇ¥³ª °³ÇàÄڵ带 ´ãÀ» ¼ö ¾ø±â ¶§¹®¿¡ È®Àå¿­ÀÌ ÇÊ¿äÇÏ´Ù. È®Àå¿­Àº \·Î ½ÃÀÛÇÏ¸ç ´ÙÀ½°ú °°Àº Á¾·ù°¡ ÀÖ´Ù. ´ëü·Î C¾ð¾îÀÇ È®Àå¿­°ú À¯»çÇÏ°Ô Á¤ÀÇÇß´Ù.

 

È®Àå¿­

¹®ÀÚ

\n

°³Çà ÄÚµåÀÌ´Ù. \r\nÀ¸·Î È®ÀåµÈ´Ù.

\t

ÅÇÀÌ´Ù. \t·Î È®ÀåµÈ´Ù.

\x

16Áø ¹®ÀÚ ÄÚµå. µÚ¿¡ ¹Ýµå½Ã µÎÀÚ¸®ÀÇ 16Áø¼ö°¡ ¿Í¾ß ÇÑ´Ù.

\i

10Áø ¹®ÀÚ ÄÚµå, µÚ¿¡ ¹Ýµå½Ã ¼¼ÀÚ¸®ÀÇ 255ÀÌÇÏÀÇ 10Áø¼ö°¡ ¿Í¾ß ÇÑ´Ù.

\"

µû¿ÈÇ¥ ¹®ÀÚ·Î È®ÀåµÈ´Ù. ´Ý´Â µû¿ÈÇ¥·Î ÀÎÁ¤µÇÁö ¾Ê´Â´Ù.

\\

¿ª½½·¹½¬ ¹®ÀÚ ÀÚüÀÌ´Ù.

 

\rÀ̳ª ±âŸ \a, \b°°ÀÌ Áö¿øµÇÁö ¾Ê´Â È®Àå¿­µéÀº ¹«½ÃµÈ´Ù. \x ´ÙÀ½¿¡ ¹Ýµå½Ã µÎ ÀÚ¸®ÀÇ 16Áø¼ö°¡ ¿Í¾ß ÇÏ´Â Á¦¾àÀÌ Á» ¸¶À½¿¡ ¾È µé ¼öµµ ÀÖ´Ù. \x0¶ó°í ÇÏ¸é ±×³É ³Î ¹®ÀÚ¸¦ Ç¥ÇöÇÒ ¼ö ÀÖ´Ù¸é ÁÁ°ÚÁö¸¸ ¹Ýµå½Ã \x00·Î ½á¾ß ÇÑ´Ù. ÀÌ·± Á¦¾àÀÌ ¾ø´Ù¸é \xbapple°°Àº °Ë»ö½ÄÀÇ °æ¿ì 16Áø¼ö 0xba ´ÙÀ½ÀÇ pple¸¦ ÀǹÌÇÏ´Â °ÍÀÎÁö ¾Æ´Ï¸é 0xb ´ÙÀ½ÀÇ appleÀ» ¸»ÇÏ´Â ²¯ÀÎÁö ±¸ºÐµÇÁö ¾Ê´Â ¹®Á¦°¡ ÀÖ´Ù. ±×·¡¼­ µÎÀÚ¸®±îÁö ¹«Á¶°Ç Àд´Ù. AeEscapeChar ÇÔ¼ö´Â µû¿ÈÇ¥³ª \r, \t µîÀÇ È®Àå¿­À» ½ÇÁ¦ ¹®ÀÚ·Î ´ëüÇÑ´Ù.

 

// ¹®ÀÚ Çϳª¸¦ À̽ºÄÉÀÌÇÁÇÑ´Ù. À§Ä¡ À̵¿±îÁö ÇØ ÁØ´Ù.

void AeEscapeChar(const TCHAR *&s,TCHAR *&d)

{

     TCHAR high,low,third;

     int code;

 

     if (*s=='\\') {

          s++;

          switch (*s) {

          case '\\':

              *d++='\\';

              break;

          // Á¦ÀÏ ³¡¿¡ \Çϳª¸¸ ÀÖ´Â °æ¿ì. \¹®ÀÚ·Î ÀÎÁ¤ÇÏ°í s¸¦ Áõ°¡½ÃÅ°Áö ¾Ê°í ¸®ÅÏ

          case NULL:

              *d++='\\';

              return;

          case 'n':

          case 'N':

              *d++='\r';

              *d++='\n';

              break;

          case 't':

          case 'T':

              *d++='\t';

              break;

          // ã±â¿¡¼­´Â ²À ÇÒ ÇÊ¿ä°¡ ¾ø´Ù. ¹Ù·Î "¸¦ ¾µ ¼öµµ ÀÖ´Ù.

          case '\"':

              *d++='\"';

              break;

          // 16Áø ÄÚµå ó¸®

          case 'x':

          case 'X':

              s++;

              if (*s==NULL) return;

              high=*s;

              s++;

              if (*s==NULL) return;

              if (IsCharLower(high)) high-=0x20;

              if (high >= '0' && high <= '9') {

                   high=high-'0';

              } else if (high >= 'A' && high <= 'F') {

                   high=high-'A'+10;

              } else {

                   break;

              }

              low=*s;

              if (IsCharLower(low)) low-=0x20;

              if (low >= '0' && low <= '9') {

                   low=low-'0';

              } else if (low >= 'A' && low <= 'F') {

                   low=low-'A'+10;

              } else {

                   break;

              }

              *d++=(high << 4 | low);

              break;

          // 10Áø ÄÚµå ó¸®

          case 'i':

          case 'I':

              s++;

              if (*s==NULL) return;

              high=*s;

              s++;

              if (*s==NULL) return;

              if (high >= '0' && high <= '9') {

                   high=high-'0';

              } else {

                   s++;

                   break;

              }

              low=*s;

              s++;

              if (*s==NULL) return;

               if (low >= '0' && low <= '9') {

                   low=low-'0';

              } else {

                   break;

              }

              third=*s;

              if (third >= '0' && third <= '9') {

                   third=third-'0';

              } else {

                   break;

              }

              code=high*100+low*10+third;

              if (code < 256) {

                   *d++=code;

              }

              break;

          // È®Àå¿­ÀÌ ¾Æ´Ñ ¹®ÀÚ´Â ¹«½ÃÇÔ. ¿¹¸¦ µé¾î È¥ÀÚ ¿À´Â \rµî.

          default:

              break;

          }

     } else {

          *d++=*s;

     }

     s++;

}

 

´ë¼Ò¹®ÀÚ´Â ±¸ºÐÇÏÁö ¾ÊÀ¸¸ç ¿¡·¯°¡ ÀÖÀ» °æ¿ì ¹«½ÃÇÑ´Ù. ¿¹¸¦ µé¾î \xgg³ª \a, \i567 ÀÌ·± °ÍÀº Åë°·Î ¾ø´Â °ÍÀ¸·Î Ãë±ÞÇÑ´Ù. ³¡¿¡ \È¥ÀÚ¸¸ ÀÖÀ¸¸é \¹®ÀÚ·Î ÀÎÁ¤ÇÑ´Ù. \x ´ÙÀ½¿¡ µÎ ÀÚ¸® ¼ýÀÚ°¡ ¾ø°Å³ª \i´ÙÀ½¿¡ ¼¼ ÀÚ¸® ¼ýÀÚ°¡ ¾øÀ¸¸é ¹«½ÃÇÑ´Ù. ´ÙÀ½ µÎ ÇÔ¼ö´Â µ¿»ç¿Í ¸ñÀûÀ¸·Î ã´Â´Ù. ãÀº ÈÄ Æ÷ÀÎÅÍ´Â Ç×»ó ±× ´ÙÀ½ À§Ä¡·Î À̵¿½ÃÅ°´Â Ư¼ºÀÌ ÀÖ´Ù.

 

// µ¿»ç¸¦ ã¾ÆÁØ´Ù. ¿¡·¯ÀÏ °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. µ¿»ç ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°Ü ÁØ´Ù.

int GetComVerb(const TCHAR *&szCom,SMacVerb *arVerb)

{

     TCHAR szVerb[32];

     TCHAR *p;

     int idx;

 

     // µ¿»ç ºÎºÐ¸¸ µû·Î ºÐ¸®ÇÑ´Ù.

     lstrcpyn(szVerb,szCom,32);

     for (p=szVerb;*p!=NULL;p++) {

          if (*p==' ') {

              *p=NULL;

              break;

          }

     }

 

     for (idx=0;;idx++) {

          if (lstrlen(arVerb[idx].Name) == 0) {

              idx=-1;

              break;

          }

          if (strcmpi(arVerb[idx].Name,szVerb)==0) {

              break;

          }

     }

 

     szCom += lstrlen(szVerb);

     SkipSpace(szCom);

     return idx;

}

 

// ¸ñÀû¾î¸¦ ã¾ÆÁØ´Ù. ¿¡·¯ÀÏ °æ¿ì -1À» ¸®ÅÏÇÑ´Ù. ¸ñÀû¾î°¡ ÀÖ´Â µ¿»ç¸¸ ÀÌ ÇÔ¼ö¸¦ È£ÃâÇϹǷΠ-1À» ¸®ÅÏÇصµ º° »ó°ü¾ø´Ù.

// ¸ñÀû¾î ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°Ü ÁØ´Ù.

int GetComObject(int Verb,const TCHAR *&szCom,SMacObject *arObject,int *arObj)

{

     TCHAR szObject[32];

     TCHAR *p;

     int stidx;

     int idx;

 

     // ¸ñÀû¾î ¹è¿­¿¡¼­ ½ÃÀÛ À妽º ãÀ½. ½ÃÀÛÀÌ -1ÀÌ¸é ¸ñÀû¾î°¡ ¾ø´Â µ¿»çÀÓ

     stidx=arObj[Verb];

     if (stidx==-1) {

          return -1;

     }

 

     // ¸ñÀû¾î ºÎºÐ¸¸ µû·Î ºÐ¸®ÇÑ´Ù. °ø¹éÀ̳ª ÅÇÀ» ¸¸³ª¸é ¸ñÀû¾îÀÇ ³¡

     lstrcpyn(szObject,szCom,32);

     for (p=szObject;*p!=NULL;p++) {

          if (*p==' ' || *p=='\t') {

              *p=NULL;

              break;

          }

     }

 

     for (idx=stidx;arObject[idx].Name!=NULL;idx++) {

          if (strcmpi(arObject[idx].Name,szObject)==0) {

              break;

          }

     }

     if (arObject[idx].Name==NULL) {

          idx=-1;

     } else {

          idx-=stidx;

     }

 

     // ¸ñÀû¾î ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°ÜÁØ´Ù.

     szCom += lstrlen(szObject);

     SkipSpace(szCom);

     return idx;

}

 

´ÙÀ½ ÇÔ¼ö´Â ¹®ÀÚ¿­À» ÃßÃâÇÑ´Ù. ¹®ÀÚ¿­ÀÇ ±æÀ̸¦ ¹Ì¸® ¾Ë ¼ö ¾ø±â ¶§¹®¿¡ ÀÌ ÇÔ¼ö¿¡¼­ ¹®ÀÚ¿­ ÀúÀåÀ» À§ÇÑ ¹öÆÛ¸¦ ÇÒ´çÇÏ°í È£Ãâ¿ø¿¡¼­ ÇØÁ¦ÇØ¾ß ÇÑ´Ù. ¹®ÀÚ¿­³»ÀÇ È®Àå¿­À» Áö¿øÇÑ´Ù.

 

// µû¿ÈÇ¥ ´ÙÀ½¿¡ ÀÖ´Â ¹®ÀÚ¿­À» ÃßÃâÇØ ÁØ´Ù. ¸Þ¸ð¸®¸¦ ¿©±â¼­ ÇÒ´çÇÏ°í È£Ãâ¿ø¿¡¼­ ÇØÁ¦ÇÑ´Ù.

// ¹®ÀÚ¿­ ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ ¿Å°ÜÁØ´Ù.

void GetComString(const TCHAR *&szCom,TCHAR *&str,BOOL bEscape/*=TRUE*/)

{

     int len;

     const TCHAR *pc;

     TCHAR *p;

 

     // ÃßÃâµÉ ÃÖ´ë ¹®ÀÚ¿­ÀÇ ±æÀ̸¸Å­ ÇÒ´ç

     len=lstrlen(szCom);

     str=(TCHAR *)malloc(len);

 

     // µû¿ÈÇ¥ ´ÙÀ½ ¹®ÀÚºÎÅÍ º¹»ç¸¦ ½ÃÀÛÇÑ´Ù. È®Àå¿­ ó¸®

     for (pc=szCom+1,p=str;;) {

          // ´Ý´Â µû¿ÈÇ¥°¡ ¾ø´Ù´Â ¶æÀÓ. ¿¡·¯·Î 󸮵ȴÙ.

          if (*pc==NULL) {

              free(str);

              str=NULL;

              break;

          }

          // ´Ý´Â µû¿ÈÇ¥. ¹®ÀÚ¿­ÀÇ ³¡

          if (*pc=='\"') {

              *p=0;

              break;

          }

 

          if (bEscape) {

              AeEscapeChar(pc,p);

          // È®Àå¿­À» È®ÀåÇÏÁö ¾ÊÀ» ¶§. ¸ðµç ¹®ÀÚ¸¦ ±×´ë·Î Á¶»çÇ쵂 ´Ü, À§ ·çÇÁ¿¡¼­ \"¸¦ ÀνÄÇÏÁö ¾Êµµ·Ï

          // ÀÌ È®Àå¿­¸¸ µû·Î º¹»çÇØÁØ´Ù.

          } else {

              if (*pc=='\\' && *(pc+1)=='\"') {

                   *p++=*pc++;

                   *p++=*pc++;

              } else {

                   *p++=*pc++;

              }

          }

     }

 

     // ¹®ÀÚ¿­ ´ÙÀ½À¸·Î Æ÷ÀÎÅ͸¦ º¸³½´Ù.

     szCom = pc+1;

     SkipSpace(szCom);

}

 

// szCom ¹®ÀÚ¿­¿¡¼­ ¼ýÀÚ¸¦ ÀоîÁØ´Ù. ÃÖ¼ÒÇÑÀÇ °ªÀ» ÁöÁ¤ÇÒ ¼ö ÀÖ´Ù.

int GetComNumber(const TCHAR *szCom,int Min)

{

     return max(Min,atoi(szCom));

}

 

È®Àå¿­Àº ¿¡·¯ ¹ß»ý °¡´É¼ºÀÌ ³ôÀ¸·Î ¿¡·¯¸¦ Àß Ã³¸®ÇØ¾ß ÇÑ´Ù. ÀÌ ÇÔ¼öµéÀº ¸ÅÅ©·Î ±¸¹®À» Çؼ®ÇÒ ¶§ »ç¿ëµÈ´Ù.

¹Ù.¹®ÀÚ¿­ °ü¸® ÇÔ¼ö

´ç±ÙÀº ¿©·¯ °´Ã¼¿¡ ¹®ÀÚ¿­·Î À̸§À» Áֱ⠶§¹®¿¡ ¹®ÀÚ¿­¿¡ ´ëÇÑ ¿¹¿Ü 󸮰¡ ÇÊ¿äÇÏ´Ù. ¿¹¸¦ µé¾î ¸ÅÅ©·Î À̸§ÀÌ Á¦´ë·Î ÀԷµǾú´ÂÁö °Ë»çÇÒ ¶§ ÀÌ ¹®ÀÚ¿­ÀÌ ºñ¾î ÀÖ´ÂÁö ¾Æ´ÑÁö ºÁ¾ß ÇÑ´Ù. ±æÀ̸¦ Á¡°ËÇÏ´Â °Í¸¸À¸·Î´Â ºÎÁ¤È®ÇÏ´Ù. °ø¹éÀ̳ª ÅÇÀº ¾Æ¹«¸® ¸¹ÀÌ µé¾î°¡ À־ À̸§À¸·Î ÀÎÁ¤µÇÁö ¾Ê±â ¶§¹®ÀÌ´Ù.

¶ÇÇÑ ¹®ÀÚ¿­À» Á¤±ÔÈ­ÇÒ ÇÊ¿äµµ ÀÖ´Ù. "move right"¿Í " move right", "move    right  "´Â °ø¹é ±¸¼º¸¸ Á¦¿ÜÇÏ°í´Â ¿ÏÀüÈ÷ °°´Ù. ÇÏÁö¸¸ ¹®ÀÚ¿­À» ºñ±³ÇÏ´Â strcmp ÇÔ¼ö´Â ´Ù¸¥ °ÍÀ¸·Î ÆǺ°ÇÑ´Ù. ±×·¡¼­ ¾ÕµÚÀÇ ºÒÇÊ¿äÇÑ °ø¹éÀº Á¦°ÅÇÏ°í Áß°£ÀÇ °ø¹éÀ̳ª ÅÇÀº Çϳª·Î Á¤±ÔÈ­ÇÒ ÇÊ¿ä°¡ ÀÖ´Ù. ¸¶Ä¡ À¥ ºê¶ó¿ìÀú°¡ HTML ¹®¼­ÀÇ ºÒÇÊ¿äÇÑ °ø¹éÀ» ¸ðµÎ Á¦°ÅÇÏ´Â °Í°ú °°´Ù. ´ÙÀ½ µÎ ÇÔ¼ö¸¦ Util.cpp¿¡ Ãß°¡ÇÏ°í Çì´õ ÆÄÀÏ¿¡ ¿øÇüµµ ¼±¾ðÇÑ´Ù.

 

BOOL IsStrEmpty(TCHAR *str)

{

     int len,i;

     BOOL bEmpty=TRUE;

 

     len=lstrlen(str);

     // ±æÀÌ°¡ 0ÀÌ¸é ºñ¾îÀÖ´Ù.

     if (len == 0) {

          return TRUE;

     }

 

     // °ø¹éÀ̳ª ÅÇ ¹®ÀÚ ¿Ü¿¡ ´Ù¸¥ ¹®ÀÚ°¡ ÀÖÀ¸¸é ºñ¾îÀÖÁö ¾Ê´Ù.

     for (i=0;i<len;i++) {

          if ((str[i]!=' ') && (str[i]!='\t')) {

              bEmpty=FALSE;

              break;

          }

     }

     return bEmpty;

}

 

void StringNormalize(TCHAR *src, TCHAR *dest)

{

     TCHAR *s,*d;

     TCHAR *dest2;

 

     s=src;

     if (dest==NULL) {

          d=dest2=(TCHAR *)malloc(lstrlen(src)+1);

     } else {

          d=dest;

     }

     SkipSpace(const_cast<const TCHAR *&>(s));

 

     // Áß°£ÀÇ °ø¹é Á¤¸®

     for (;*s;) {

          if (*s==' ' || *s=='\t') {

              *d++=' ';

              SkipSpace(const_cast<const TCHAR *&>(s));

          } else {

              *d++=*s++;

          }

     }

     *d=0;

 

     // ³¡ °ø¹é Çϳª°¡ ÀÖÀ¸¸é Á¦°Å

     if (d > dest && d[-1]==' ') {

          d[-1]=0;

     }

 

     if (dest==NULL) {

          lstrcpy(src,dest2);

          free(dest2);

     }

}

 

IsStrEmpty ÇÔ¼ö´Â str ¹®ÀÚ¿­ÀÌ ºñ¾î ÀÖ´ÂÁö ¾Æ´ÑÁö¸¦ Á¡°ËÇÑ´Ù. ÄÚµå´Â ÀÐÀ¸¸é ¹Ù·Î Çؼ®µÉ Á¤µµ·Î ½±´Ù. ±æÀÌ°¡ 0À̸é ÀÌ ¹®ÀÚ¿­Àº ´õ º¼ °Íµµ ¾øÀÌ ºó °ÍÀÌ´Ù. ±×·¸Áö ¾ÊÀ» °æ¿ì ¹®ÀÚ¿­ Àüü¸¦ ¼øȸÇÏ¸ç °ø¹éÀ̳ª ÅÇÀÌ ¾Æ´Ñ ¹®ÀÚ°¡ ÀÖ´ÂÁö Á¡°ËÇϴµ¥ ÃÖ¼ÒÇÑ Çϳª ÀÌ»óÀÇ ¹®ÀÚ°¡ ÀÖ¾î¾ß ºñ¾î ÀÖÁö ¾Ê´Ù. ¸¸¾à ¹®ÀÚ¿­ Àüü°¡ ÅÇÀ̳ª °ø¹éÀ¸·Î¸¸ ±¸¼ºµÇ¾î ÀÖ´Ù¸é ÀÌ ¹®ÀÚ¿­Àº ½ÇÁ¦ ³»¿ëÀÌ ¾ø´Â ºó ¹®ÀÚ¿­ÀÌ´Ù.

StringNormalize ÇÔ¼ö´Â ¹®ÀÚ¿­À» Á¤±ÔÈ­ÇÑ´Ù. ¾ÕÂÊÀÇ °ø¹éÀ» Á¦°ÅÇÏ°í Áß°£ÀÇ °ø¹éÀº ½ºÆäÀ̽º Çϳª·Î Á¤¸®ÇÏ°í µÚÂÊÀÇ °ø¹éµµ Á¦°ÅÇÑ´Ù. dest´Â ¹Ýµå½Ã src¿Í °°°Å³ª ´õ ±æ¾î¾ß ÇÑ´Ù. ¾Æ´Ï¸é ¾Æ¿¹ NULL·Î ÁÖ¾î src¿¡ º¯È¯ °á°ú¸¦ µ¹·Á ¹ÞÀ» ¼öµµ ÀÖ´Ù. ±×·¡¼­ src´Â »ó¼ö¼ºÀ» °¡ÁöÁö ¾ÊÀ¸¸ç SkipSpace·Î srcÀÇ Æ÷ÀÎÅ͸¦ Àü´ÞÇÒ ¶§´Â »ó¼ö ij½ºÆÃÀ» ÇØ¾ß ÇÑ´Ù. ÀÌ Ä³½ºÆÃÀÎ ºñÁÖ¾ó C++ 6.0¿¡¼­´Â ÇÊ¿äÄ¡ ¾ÊÁö¸¸ ÈξÀ ´õ ¾ö°ÝÇÑ Å¸ÀÔüũ¸¦ ÇÏ´Â VC 8.0¿¡¼­´Â ÇÊ¿äÇÏ´Ù.

¹®ÀÚ¿­ Á¤±ÔÈ­¸¦ À§ÇØ AeUtil.cpp¿¡ Á¤ÀǵǾî ÀÖ´Â SkipSpace ÇÔ¼ö¸¦ È£ÃâÇϴµ¥ ´ç±ÙÀº ApiEdit¿¡ Á¾¼ÓÀûÀ̹ǷΠÀÌ·¸°Ô Çصµ »ó°ü¾ø´Ù. ¹°·Ð ±× ¹Ý´ë¿©¼­´Â ¾ÈµÈ´Ù. ¸¸¾à StringNormalize ÇÔ¼ö¸¦ ´Ù¸¥ ÇÁ·ÎÁ§Æ®¿¡ ¾²°í ½Í´Ù¸é SkipString ÇÔ¼öµµ °°ÀÌ °¡Áö°í °¡¾ß ÇÑ´Ù. ºó ¹®ÀÚ¿­ Á¡°Ë°ú Á¤±ÔÈ­ ÇÔ¼ö´Â ÀÌÈÄ ¸ÅÅ©·Î À̸§ µîÀÇ À¯È¿¼ºÀ» Á¡°ËÇÒ ¶§ »ç¿ëµÈ´Ù. ÀÌ ÇÔ¼öµéÀÌ ¿Ï¼ºµÈ ±è¿¡ 1.0ÀÇ »ç¼ÒÇÑ ¹ö±× ¸î °³µµ ¼öÁ¤ÇÏÀÚ. ÇÁ·ÎÁ§Æ®ÀÇ À̸§À» ÀԷ¹޴ ºÎºÐ¿¡ ÀÌ ÇÔ¼öµéÀ» Àû¿ëÇØ¾ß Çϴµ¥ Project.cppÀÇ ¿ø·¡ Äڵ带 º¸¸é ¹®Á¦°¡ ÀÖ´Ù.

 

BOOL CALLBACK DgNewProjectProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     ....

          case IDOK:

              ....

              GetDlgItemText(hDlg,IDC_PRJNEWNAME,Header.Name,32);

              if (lstrlen(Header.Name)==0) {

                   MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ À̸§Àº ¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù","¾Ë¸²",MB_OK);

                   return TRUE;

              }

 

ÇÁ·ÎÁ§Æ® À̸§ÀÇ ±æÀÌ°¡ 0ÀÌ¸é ¹«È¿¶ó°í ÆÇ´ÜÇÏ°í °æ°í ¸Þ½ÃÁö¸¦ Ãâ·ÂÇÑ´Ù. À̸§ÀÌ ¾øÀ¸¸é ±¸ºÐÀÌ µÇÁö ¾Ê±â ¶§¹®¿¡ ¹Ýµå½Ã À̸§À» ÀÔ·ÂÇϵµ·Ï °­Á¦ÇÏ´Â °ÍÀÌ´Ù. ±×·¸´Ù¸é °ø¹é Çϳª¸¸ ÀÔ·ÂÇϸé À¯È¿ÇÏ´Ù°í ÆÇ´ÜÇϴµ¥ À̰͵µ »ç½Ç ¹®Á¦°¡ ÀÖ´Â °ÍÀÌ´Ù. ´ÙÀ½°ú °°ÀÌ ¼öÁ¤ÇÑ´Ù.

          case IDOK:

              ....

              GetDlgItemText(hDlg,IDC_PRJNEWNAME,Header.Name,32);

           if (IsStrEmpty(Header.Name)) {

                   MessageBox(hDlg,"ÇÁ·ÎÁ§Æ®ÀÇ À̸§Àº ¹Ýµå½Ã ÀÔ·ÂÇØ¾ß ÇÕ´Ï´Ù","¾Ë¸²",MB_OK);

                   return TRUE;

              }

           StringNormalize(Header.Name,NULL);

 

°ø¹éÀ¸·Î¸¸ ±¸¼ºµÈ À̸§Àº ÇÁ·ÎÁ§Æ® À̸§À¸·Î ÀÎÁ¤ÇÏÁö ¾Ê¾Æ¾ß ÇÑ´Ù. ¿©±â¿¡ Á¤±ÔÈ­±îÁö ÇÏ¿© ÇÁ·ÎÁ§Æ® À̸§ÀÌ ÀÏÁ¤ÇÑ Çü½ÄÀ» °¡Áö°Ô Çß´Ù. Inertnet.cpp¿¡ ÀÖ´Â FTP ¼­¹öÀÇ µî·Ï Á¤º¸µµ ¸¶Âù°¡Áö·Î ¼öÁ¤ÇØ¾ß ÇÑ´Ù.

 

BOOL CALLBACK DGFtpConfigProc(HWND hDlg,UINT iMessage,WPARAM wParam,LPARAM lParam)

{

     static int idx;

    TCHAR szTemp[256];

 

     switch(iMessage) {

     case WM_INITDIALOG:

          ....

     case WM_COMMAND:

          switch (LOWORD(wParam)) {

          case IDOK:

           GetDlgItemText(hDlg,IDC_FTPNAME,szTemp,32);

           if (IsStrEmpty(szTemp)) {

                   MessageBox(hDlg,"Á¢¼Ó¸íÀ» ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

           GetDlgItemText(hDlg,IDC_FTPADDR,szTemp,256);

           if (IsStrEmpty(szTemp)) {

                   MessageBox(hDlg,"¼­¹öÀÇ ÁÖ¼Ò¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

           GetDlgItemText(hDlg,IDC_FTPUSER,szTemp,32);

           if (IsStrEmpty(szTemp)) {

                   MessageBox(hDlg,"»ç¿ëÀÚ ID¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

           GetDlgItemText(hDlg,IDC_FTPPASS,szTemp,32);

           if (IsStrEmpty(szTemp)) {

                   MessageBox(hDlg,"ºñ¹Ð¹øÈ£¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

           GetDlgItemText(hDlg,IDC_FTPPORT,szTemp,32);

           if (IsStrEmpty(szTemp)) {

                   MessageBox(hDlg,"Á¢¼Ó Æ÷Æ® ¹øÈ£¸¦ ÀÔ·ÂÇØ ÁֽʽÿÀ","¾Ë¸²",MB_OK);

                   return TRUE;

              }

              if (idx==-1) {

                   for (idx=0;;idx++) {

                        if (lstrlen(Option.arFtp[idx].Name)==0)

                            break;

                   }

              }

              GetDlgItemText(hDlg,IDC_FTPNAME,Option.arFtp[idx].Name,32);

           StringNormalize(Option.arFtp[idx].Name,NULL);

              GetDlgItemText(hDlg,IDC_FTPADDR,Option.arFtp[idx].Addr,256);

              GetDlgItemText(hDlg,IDC_FTPUSER,Option.arFtp[idx].User,32);

              GetDlgItemText(hDlg,IDC_FTPPASS,Option.arFtp[idx].Pass,32);

              Option.arFtp[idx].Port=GetDlgItemInt(hDlg,IDC_FTPPORT,NULL,FALSE);

              EndDialog(hDlg,IDOK);

              return TRUE;

          case IDCANCEL:

              EndDialog(hDlg,IDCANCEL);

              return TRUE;

          }

          return FALSE;

     }

     return FALSE;

}

 

¿¡µðÆ® ÄÁÆ®·Ñ¿¡ ÀÔ·ÂµÈ Á¤º¸ÀÇ ±æÀ̸¸À¸·Î Á¤º¸ÀÇ À¯È¿¼ºÀ» Á¡°ËÇÏÁö ¾Ê°í IsStrEmpty ÇÔ¼ö·Î Á¦´ë·Î Á¡°ËÇß´Ù. Á¢¼Ó¸í¿¡ ´ëÇؼ­´Â Á¤±ÔÈ­±îÁö Çß´Ù. ÀÌ·± ¿¡·¯ 󸮴 ¾î¶»°Ô º¸¸é ±²ÀåÈ÷ »ç¼ÒÇÑ ¹®Á¦ÀÏ ¼öµµ ÀÖÁö¸¸ Á» ´õ ¿ÏÀüÇÑ ÇÁ·Î±×·¥ÀÌ µÇ±â À§Çؼ­´Â ¹«½ÃÇÒ ¼ö ¾ø´Â ºÎºÐÀÌ´Ù.

»ç.¸í·É ½ÇÇà

±×·³ ÀÌÁ¦ °ü·Ã ÇÔ¼öµéÀÌ ¿ÏºñµÇ¾úÀ¸¹Ç·Î ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÇÔ¼ö¸¦ ¸¸µé¾î º¸ÀÚ. ¹®ÀÚ¿­·Î µÈ ¸ÅÅ©·Î¸¸ Àü´ÞÇÏ¸é ¸ÅÅ©·Î¿¡ Æ÷ÇÔµÈ ¸í·ÉµéÀ» ÃßÃâÇÏ¿© ÆíÁý µ¿ÀÛÀ» ¼ø¼­´ë·Î ½ÇÇàÇØ¾ß ÇÑ´Ù. ±×·¸´Ù¸é ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÁÖü´Â °ú¿¬ ´©±¸Àϱî? ¸ÅÅ©·Î´Â È£½ºÆ®°¡ ½ÇÇàÇÒ ¼öµµ ÀÖ°í ÄÁÆ®·ÑÀÌ ½ÇÇàÇÒ ¼öµµ Àִµ¥ ´ç±ÙÀº ÄÁÆ®·ÑÀÌ ½ÇÇàÇÏ´Â °ÍÀÌ ¿©·¯ °¡Áö ¸é¿¡¼­ ´õ È¿À²ÀûÀÌ´Ù.

È£½ºÆ®°¡ ApiEditÀÇ ÆíÁý ¸í·ÉÀ» ÀÏÀÏÀÌ È£ÃâÇÏ¿© ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â °Íµµ ÇϳªÀÇ ¹æ¹ýÀ̱â´Â ÇÏÁö¸¸ ÀÌ·¸°Ô µÇ¸é ¸ÅÅ©·Î´Â ApiEdit ±â´É ¸ñ·Ï¿¡¼­ Á¦¿ÜµÇ¾î ¹ö¸®¹Ç·Î ÁÁÁö ¾Ê´Ù. ¶ÇÇÑ ¸ÅÅ©·Î³»ÀÇ ÆíÁý ¸í·ÉµéÀÌ ±×·ìÀ» ±¸¼ºÇØ¾ß Çϱ⠶§¹®¿¡ È£½ºÆ®°¡ ÀÌ ÀÛ¾÷À» Çϱ⿡´Â ÀûÀýÇÏÁö ¾Ê´Ù. ApiEdit¿¡ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â µÎ °³ÀÇ ¸â¹ö ÇÔ¼ö¸¦ ¼±¾ðÇÑ´Ù.

 

class CApiEdit : public CWindow

{

     ....

     int DoCommand(const TCHAR *szCom);

     void ExecMacro(const TCHAR *szMacro);

 

¸ÅÅ©·Î´Â ¸í·ÉµéÀÇ ÁýÇÕÀ¸·Î ±¸¼ºµÈ´Ù. DoCommand ÇÔ¼ö´Â ¸í·É Çϳª¸¸ ½ÇÇàÇÏ´Â ÇÔ¼öÀ̸ç ExecMacro´Â ¸ÅÅ©·Î Àüü¸¦ ½ÇÇàÇÏ´Â ¸í·ÉÀÌ´Ù. ExecMacro°¡ ¸ÅÅ©·ÎÀÇ ¸í·ÉÀ» ºÐ¸®ÇÏ¿© DoCommand ÇÔ¼ö¸¦ Â÷·Ê´ë·Î È£ÃâÇÏ´Â ±¸Á¶ÀÌ´Ù. DoCommand´Â ¸ðµç ¸ÅÅ©·Î ¸í·ÉÀ» ½ÇÇàÇØ¾ß ÇϹǷΠµ¢Ä¡°¡ ±²ÀåÈ÷ Å©´Ù. °¢ ¸í·É¿¡ ´ëÇØ ¶Ç ¸ñÀû¾î¿¡ ´ëÇØ ºÐ±âÇÏ´Â °Å´ëÇÑ switch ¹®À¸·Î ±¸¼ºµÈ´Ù.

 

// ¸í·É ½ÇÇà. NULL ¶Ç´Â °³ÇàÀ» ¸¸³¯ ¶§±îÁö¸¦ ÇϳªÀÇ ¸í·ÉÀ¸·Î º»´Ù.

// 0: Á¤»ó ½ÇÇà

// -1:µ¿»ç ¾øÀ½

// -2:Áö¿øµÇÁö ¾Ê´Â ¸ñÀû¾î

// -3:´Ý´Â µû¿ÈÇ¥ ¾øÀ½

int CApiEdit::DoCommand(const TCHAR *szCom)

{

     int comlen;

     const TCHAR *pc, *ps, *p;

     TCHAR *Com, *pCom;

     int Verb, Object;

     TCHAR *str,*str2;

     BOOL bShift;

     int Result=0;

     int Count, nCount;

     DWORD tFlag;

     CApiEditText *pView;

 

     // Ç×»ó È°¼ººä¿¡ ´ëÇØ µ¿ÀÛÇØ¾ß ÇÑ´Ù.

     pView=GetActiveView();

 

     // ¼±Çà °ø¹éÀº ¹«½ÃÇÑ´Ù.

     ps=szCom;

     SkipSpace(ps);

 

     // ÁÖ¼®ÀÌ¸é ¸í·É Àüü¸¦ ¹«½ÃÇÑ´Ù.

     if (*ps=='/' && *(ps+1)=='/') {

          return 0;

     }

 

     // ¸í·É¾îÀÇ ±æÀ̸¦ ±¸ÇÑ´Ù. ³Î, °³Çà, ¼¼¹ÌÄÝ·ÐÀÌ ¹®ÀåÀÇ ³¡ÀÌ´Ù.

     for (pc=ps;;pc++) {

          if (*pc==NULL || *pc=='\r' || *pc==';') {

              break;

          }

          if (SkipString(pc)==FALSE) {

              return -3;

          }

     }

     comlen=pc-ps;

 

     // szComÀÇ ¸ðµç ¹®ÀÚ´Â ¼Ò¹®ÀÚ·Î, ´Ü µû¿ÈÇ¥ ¾ÈÀº Á¦¿Ü. ´Ý´Â µû¿ÈÇ¥°¡ ÀÖ´ÂÁö´Â ÀÌ¹Ì Ã¼Å©ÇßÀ½

     Com=(TCHAR *)malloc(comlen+1);

     lstrcpyn(Com,ps,comlen+1);

     for (pCom=Com;*pCom;pCom++) {

          SkipString(const_cast<const TCHAR *&>(pCom));

          if (IsCharUpper(*pCom)) {

              *pCom+=0x20;

          }

     }

 

     // µ¿»ç¸¦ ¸ÕÀú ã´Â´Ù.

     p=Com;

     Verb=GetComVerb(p,arComVerb);

     if (Verb==-1) {

          Result=-1;

          goto End;

     }

 

     switch (Verb) {

     case AEC_MOVE:

     case AEC_MOVESEL:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          if (Verb==AEC_MOVE) {

              bShift=FALSE;

          } else {

              bShift=TRUE;

          }

          Count=GetComNumber(p,1);

 

          for (nCount=0;nCount<Count;nCount++) {

              switch (Object) {

              default:

              case -1:

                   Result=-2;

                   goto End;

              case AECM_LEFT:

                   pView->ProcessKey(VK_LEFT,FALSE,bShift);

                   break;

              case AECM_RIGHT:

                   pView->ProcessKey(VK_RIGHT,FALSE,bShift);

                   break;

              case AECM_UP:

                   pView->ProcessKey(VK_UP,FALSE,bShift);

                   break;

              case AECM_DOWN:

                   pView->ProcessKey(VK_DOWN,FALSE,bShift);

                   break;

              case AECM_HOME:

                   pView->ProcessKey(VK_HOME,FALSE,bShift);

                   break;

              case AECM_END:

                   pView->ProcessKey(VK_END,FALSE,bShift);

                   break;

              case AECM_PGUP:

                   pView->ProcessKey(VK_PRIOR,FALSE,bShift);

                   break;

              case AECM_PGDN:

                   pView->ProcessKey(VK_NEXT,FALSE,bShift);

                   break;

              case AECM_WLEFT:

                   pView->ProcessKey(VK_LEFT,TRUE,bShift);

                   break;

              case AECM_WRIGHT:

                   pView->ProcessKey(VK_RIGHT,TRUE,bShift);

                   break;

              case AECM_WORDHOME:

              case AECM_WORDEND:

              case AECM_LAST:

              case AECM_NEXTPARA:

              case AECM_PREVPARA:

              case AECM_PARAHOME:

              case AECM_PARAEND:

                   pView->Move(Object,bShift);

                   break;

                   pView->Move(2,bShift);

                   break;

              case AECM_DOCHOME:

                   pView->ProcessKey(VK_HOME,TRUE,bShift);

                   break;

              case AECM_DOCEND:

                   pView->ProcessKey(VK_END,TRUE,bShift);

                   break;

              case AECM_PAREN:

                   pView->FindParen(bShift);

                   break;

              }

          }

          break;

     case AEC_INSERT:

          GetComString(p,str);

          if (str) {

              Count=GetComNumber(p,1);

              for (nCount=0;nCount<Count;nCount++) {

                   pView->InsertText(str);

              }

              free(str);

          } else {

              Result=-3;

              goto End;

          }

          break;

     case AEC_DELETE:

          Count=GetComNumber(p,1);

          for (nCount=0;nCount<Count;nCount++) {

              pView->ProcessKey(VK_DELETE,FALSE,FALSE);

          }

          break;

     case AEC_BS:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          Count=GetComNumber(p,1);

          switch (Object) {

          default:

          case -1:

              Result=-2;

              goto End;

          case 0:

              for (nCount=0;nCount<Count;nCount++) {

                   pView->ProcessKey(VK_BACK,FALSE,FALSE);

              }

              break;

          case 1:

              for (nCount=0;nCount<Count;nCount++) {

                   pView->ProcessKey(VK_BACK,TRUE,FALSE);

              }

              break;

          }

          break;

     case AEC_SELECT:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          switch (Object) {

          default:

          case -1:

              Result=-2;

              goto End;

          case AECS_WORD:

          case AECS_LINE:

          case AECS_PARA:

          case AECS_DOC:

              pView->Select(Object);

              break;

          }

          break;

     case AEC_COPY:

          SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPY,0),0);

          break;

     case AEC_COPYAPP:

          SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_COPYAPPEND,0),0);

          break;

     case AEC_CUT:

          SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUT,0),0);

          break;

     case AEC_CUTAPP:

          SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_CUTAPPEND,0),0);

          break;

     case AEC_PASTE:

          Count=GetComNumber(p,1);

          for (nCount=0;nCount<Count;nCount++) {

               SendMessage(pView->hWnd,WM_COMMAND,MAKEWPARAM(IDM_AE_PASTE,0),0);

          }

          break;

     case AEC_CONVERT:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          switch (Object) {

          default:

          case -1:

              Result=-2;

              goto End;

          case AECC_UPPER:

              pView->ChangeCase(0);

              break;

          case AECC_LOWER:

              pView->ChangeCase(1);

              break;

          case AECC_REVERSECASE:

              pView->ChangeCase(2);

              break;

          case AECC_UPPERFIRST:

              pView->ChangeCase(3);

              break;

          case AECC_UPPSERSENT:

              pView->ChangeCase(4);

              break;

          case AECC_TOTAB:

              pView->ConvertSpaceTab(FALSE);

              break;

          case AECC_TOSAPCE:

              pView->ConvertSpaceTab(TRUE);

              break;

          case AECC_REMOVESPACE:

              pView->RemoveExtraSpace();

              break;

          case AECC_INDENT:

              pView->BlockIndent(FALSE);

              break;

          case AECC_UNINDENT:

              pView->BlockIndent(TRUE);

              break;

          case AECC_COMMENT:

              pView->InsertComment(FALSE);

              break;

          case AECC_UNCOMMENT:

              pView->InsertComment(TRUE);

              break;

          }

          break;

     case AEC_COPYCHAR:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          Count=GetComNumber(p,1);

          for (nCount=0;nCount<Count;nCount++) {

              switch (Object) {

              default:

              case -1:

                   Result=-2;

                   goto End;

              case 0:

                   pView->CopyChar(0);

                   break;

              case 1:

                   pView->CopyChar(1);

                   break;

              }

          }

          break;

     case AEC_SCROLL:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          Count=GetComNumber(p,1);

          for (nCount=0;nCount<Count;nCount++) {

              switch (Object) {

              default:

              case -1:

                   Result=-2;

                   goto End;

              case AECS_UP:

                   pView->Scroll(-1);

                   break;

              case AECS_DOWN:

                   pView->Scroll(1);

                   break;

              case AECS_PGUP:

                   pView->Scroll(0,-1);

                   break;

              case AECS_PGDN:

                   pView->Scroll(0,1);

                   break;

              case AECS_HALFUP:

                   pView->Scroll(0,-2);

                   break;

              case AECS_HALFDOWN:

                   pView->Scroll(0,2);

                   break;

              case AECS_LEFT:

                   if (pView->GetWrap()==0) {

                        SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_LINEUP,0),0);

                   }

                   break;

              case AECS_RIGHT:

                   if (pView->GetWrap()==0) {

                        SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_LINEDOWN,0),0);

                   }

                   break;

              case AECS_PAGELEFT:

                   if (pView->GetWrap()==0) {

                        SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_PAGEUP,0),0);

                   }

                   break;

              case AECS_PAGERIGHT:

                   if (pView->GetWrap()==0) {

                        SendMessage(pView->hWnd,WM_HSCROLL,MAKELONG(SB_PAGEDOWN,0),0);

                   }

                   break;

              }

          }

          break;

     case AEC_SETMARK:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          if (Object == 0) {

              pView->ToggleBookmark(-1,100);

          } else {

              pView->ToggleBookmark(-1,Object-1);

          }

          break;

     case AEC_GOMARK:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          switch (Object) {

          case 0:

              pView->GotoBookmark(10);

              break;

          case 1:

              pView->GotoBookmark(11);

              break;

          default:

              pView->GotoBookmark(Object-2);

          }

          break;

     case AEC_FIND:

          GetComString(p,str);

          if (str) {

              tFlag=AE_FIND_WRAP;

              if (strstr(p,"nowrap")) {

                   tFlag=tFlag & ~AE_FIND_WRAP;

              }

              if (strstr(p,"up")) {

                   tFlag=tFlag | AE_FIND_UP;

              }

              if (strstr(p,"word")) {

                   tFlag=tFlag | AE_FIND_WHOLEWORD;

              }

              if (strstr(p,"case")) {

                   tFlag=tFlag | AE_FIND_MATCHCASE;

              }

              pView->FindText(-1,str,tFlag);

              free(str);

          } else {

              Result=-3;

              goto End;

          }

          break;

     case AEC_REPLACE:

          GetComString(p,str);

          if (str==NULL) {

              Result=-3;

              goto End;

          }

          GetComString(p,str2);

          if (str2==NULL) {

              free(str);

              Result=-3;

              goto End;

          }

          tFlag=AE_FIND_WRAP;

          if (strstr(p,"nowrap")) {

              tFlag=tFlag & ~AE_FIND_WRAP;

          }

          if (strstr(p,"up")) {

              tFlag=tFlag | AE_FIND_UP;

          }

          if (strstr(p,"word")) {

              tFlag=tFlag | AE_FIND_WHOLEWORD;

          }

          if (strstr(p,"case")) {

              tFlag=tFlag | AE_FIND_MATCHCASE;

          }

          // 0(¾øÀ½), 2(±³Ã¼ ¿Ï·á)ÀÎ °æ¿ì´Â ´Ù½Ã È£ÃâÇÒ ÇÊ¿ä°¡ ¾øÀ½. 1(°Ë»ö¸¸)ÀÎ °æ¿ì´Â ´Ù½Ã Çѹø ´õ È£ÃâÇÑ´Ù.

          if (pView->ReplaceText(-1,str,tFlag,str2)==1) {

              pView->ReplaceText(-1,str,tFlag,str2);

          }

          free(str);

          free(str2);

          break;

     case AEC_FOCUS:

          Object=GetComObject(Verb,p,arComObject,arObjOfVerb);

          switch (Object) {

          default:

          case 0:

              ChangeActiveView(GetActiveView(),1);

              goto End;

          case 1:

              ChangeActiveView(GetActiveView(),1);

              break;

          }

          break;

     }

 

End:

     free(Com);

     return Result;

}

 

°¢°¢ÀÇ case°¡ °íÀ¯ÀÇ ¸í·É°ú ¸ñÀû¾î¸¦ ó¸®ÇÏ´Â ±¸Á¶À̹ǷΠ±æÀÌ°¡ ±æ¾îµµ ¼Ò½º¸¦ Àбâ´Â ½±´Ù. Àμö·Î Àü´ÞµÈ ¸í·ÉÀ» ÀÏÂ÷·Î Çؼ®ÇÏ°í ÇÊ¿äÇÒ °æ¿ì ¸ñÀû¾î±îÁö Çؼ®ÇÏ¿© È°¼º ºä¿¡°Ô Àü´ÞÇϱ⸸ ÇÏ¸é µÈ´Ù. ApiEdit¿¡ °ü·Ã ¸í·ÉÀ» ½ÇÇàÇÒ ¼ö ÀÖ´Â ÇÔ¼ö ÁýÇÕµéÀÌ Àß ±¸ºñµÇ¾î ÀÖÀ¸¹Ç·Î DoCommand ÇÔ¼ö´Â ÇÔ¼ö¸¦ È£ÃâÇϰųª ¸Þ½ÃÁö¸¦ º¸³»´Â °ÍÀ¸·Î ¸í·ÉÀ» °£´ÜÈ÷ ½ÇÇàÇÒ ¼ö ÀÖ´Ù.

find ¸í·ÉÀÇ °æ¿ì ÇöÀç´Â ´Ü¼øÇÑ À̵¿ ¸í·ÉÀ̶ó°í º¼ ¼ö ÀÖ´Ù. °Ë»ö °á°ú¿¡ µû¸¥ ¿¡·¯ 󸮸¦ Çϸé È°¿ë¼ºÀÌ ´õ ³ô¾ÆÁöÁö¸¸ ±×·¸°Ô ÇÏ·Á¸é ¸í·ÉÀÌ °á°ú¸¦ ¸®ÅÏÇØ¾ß ÇÏ¸ç ¸®ÅÏ°ªÀ» ¹ÞÀ» ¼ö ÀÖ´Â º¯¼öÀÇ °³³äÀÌ ÇÊ¿äÇÏ´Ù. º¯¼ö°ªÀ» ºñ±³ÇÏ·Á¸é ºñ±³ ¿¬»êÀÚ°¡ ÇÊ¿äÇÏ°í Á¶°Ç¹®ÀÌ ÀÖ¾î¾ß ÇÏ¸ç º¯¼ö¸¦ °¡°øÇÒ ¼ö ÀÖ´Â ÇÔ¼öÀÇ °³³ä, ¹Ýº¹¹® µîÀÇ ÇÊ¿äÇØ Áø´Ù. °á±¹ °£´ÜÇÑ ¸ÅÅ©·Î ¼öÁØ¿¡¼­´Â ºÒ°¡´ÉÇÏ¸ç ´ÙÀ½ ¹öÀü¿¡¼­³ª ½ÃµµÇØ º¼ °ÍÀÌ´Ù.

DoCommand ÇÔ¼ö´Â Àμö·Î Àü´ÞµÈ ¹®ÀÚ¿­¿¡¼­ µ¿»ç¿Í ¸ñÀû¾î¸¦ ºÐ¸®ÇØ °ü·Ã ¸í·ÉÀ» ½ÇÇàÇÏ°í ¸®ÅÏÇϹǷΠ´Ü ÇϳªÀÇ ¸í·É¸¸ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. ¸í·ÉÀÇ ÁýÇÕÀÎ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÇÔ¼ö´Â ExecMacroÀε¥ ¸ÅÅ©·Î ½ÇÇàÀÇ ÁÖü¶ó°í ÇÒ ¼ö ÀÖ´Ù. ¸ÅÅ©·Î¿¡ Æ÷ÇԵǴ ¸í·ÉÀÌ º¹ÀâÇؼ­ ´ë´ÜÈ÷ °Å´ëÇÒ °Í °°Áö¸¸ °ü·Ã ¼­ºê ·çƾÀÌ Àß ÀÛ¼ºµÇ¾î ÀÖÀ¸¹Ç·Î »ý°¢º¸´Ù ±æÁö ¾Ê´Ù.

 

void CApiEdit::ExecMacro(const TCHAR *szMacro)

{

     const TCHAR *pc;

     int Result,ParentResult;

 

     StartUndoGroup(21);

     for (pc=szMacro;;) {

          if (*pc==NULL) {

              break;

          }

          // ¸í·É ½ÇÇà.

          Result=DoCommand(pc);

          // ±¸¹®»óÀÇ ¿¡·¯ÀÌ¸é ¸ÅÅ©·Î Á¾·á

          if (Result < -1) {

              break;

          }

          // µ¿»ç°¡ ¾øÀ¸¸é ÀÏ´Ü ºÎ¸ð¿¡°Ô ¸ÕÀú ¹°¾îº»´Ù.

          if (Result==-1) {

              ParentResult=SendMessage(GetParent(hWnd),UserBase+2,0,(LPARAM)pc);

              // ºÎ¸ð°¡ ó¸®ÇØ ÁÖÁö ¾ÊÀ¸¸é ¸ÅÅ©·Î Á¾·á.

              // 0ÀÎ °æ¿ì : Á¤»ó ½ÇÇà, ¶Ç´Â ¹«½ÃµÈ »óȲ => °è¼Ó ½ÇÇàÇÑ´Ù.

              if (ParentResult < 0) {

                   break;

              }

          }

 

          // ´ÙÀ½ ¸í·É ãÀ½

          for (;;pc++) {

              // °³Çà Äڵ带 ã¾ÒÀ¸¸é ´ÙÀ½ ÁÙ·Î

              if (*pc=='\r') {

                   pc+=2;

                   break;

              }

              if (*pc==';') {

                   pc++;

                   break;

              }

              // NULLÀ» ã¾ÒÀ¸¸é ±×³É ³ª°¨. ¹Ù±ù ·çÇÁ ¼±µÎ¿¡¼­ Å»ÃâÇÔ

              if (*pc==NULL) {

                   break;

              }

              // ¹®ÀÚ¿­ °Ç³Ê ¶Ü. ÀÌ ½ÃÁ¡¿¡¼­´Â ÀÌ¹Ì ½ÇÇàµÈ ¸í·ÉÀ» °Ç³Ê¶Ù´Â ÁßÀ̹ǷΠ´Ý´Â µû¿ÈÇ¥°¡ ¹Ýµå½Ã ÀÖÀ½

              // ¸¸¾à ¾ø¾ú´Ù¸é ¾ÕÂÊ DoCommand¿¡¼­ ÀÌ¹Ì ¿¡·¯¸¦ ¸®ÅÏÇß°í ¸ÅÅ©·Î Á¾·áµÇ¾úÀ½

              SkipString(pc);

          }

     }

     EndUndoGroup();

}

 

¸í·É ÁýÇÕ¿¡¼­ ¸í·ÉÀ» ÃßÃâÇÏ¿© ¼ø¼­´ë·Î ½ÇÇàÇϱ⸸ ÇÏ¸é µÈ´Ù. ¸ÅÅ©·Î³»ÀÇ ¸í·ÉµéÀº °³Çà Äڵ峪 ¼¼¹ÌÄÝ·ÐÀ¸·Î ±¸ºÐµÇ¹Ç·Î ±¸ºÐÀÚ¸¦ °Ç³Ê¶Ù¸é¼­ ¸í·ÉµéÀ» ÃßÃâÇÏ¿© DoCommand¸¦ È£ÃâÇÑ´Ù. DoCommand ÇÔ¼ö´Â ¸í·É ½ÇÇà °á°ú¸¦ ¸®ÅÏÇϴµ¥ ¸®ÅÏ°ªÀÇ Àǹ̴ ÁÖ¼®¿¡ Àß ±â·ÏµÇ¾î ÀÖ´Ù. ¸¸¾à µ¿»ç¾øÀ½ ÀÌ¿ÜÀÇ ±¸¹® ¿¡·¯°¡ ¹ß»ýÇß´Ù¸é À̶§´Â ¸ÅÅ©·Î ½ÇÇà Àüü¸¦ Á¾·áÇÑ´Ù.

¸®ÅÏ°ªÀÌ -1À̸é ÄÁÆ®·ÑÀÌ Á÷Á¢ ÀÌÇØÇÏÁö ¸øÇÏ´Â µ¿»ç¶ó´Â ¶æÀε¥ À̶§´Â ºÎ¸ð À©µµ¿ì¿¡°Ô UserBase+2¸¦ º¸³» 󸮸¦ ÀÇ·ÚÇÑ´Ù. ÇÔ¼ö¸¦ ºÎ¸£Áö ¸øÇÏ°í ¸Þ½ÃÁö¸¦ º¸³»´Â ÀÌÀ¯´Â ÄÁÆ®·ÑÀÇ µ¶¸³¼º È®º¸¸¦ À§Çؼ­Àε¥ È£½ºÆ®°¡ ÀÌ ¸Þ½ÃÁö¸¦ ¹«½ÃÇÏ°Ç Á¦´ë·Î ó¸®ÇØ ÁÖ°Ç »ó°ü¾øÀÌ ÄÁÆ®·ÑÀ» ½ÇÇàµÇ¾î¾ß ÇÑ´Ù. ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ±¸Á¶¶ó¸é È£½ºÆ®´Â ¹Ýµå½Ã ÄÁÆ®·ÑÀÇ ¸ÅÅ©·Î È£ÃâÀ» ó¸®ÇÏ´Â ÇÔ¼ö¸¦ Á¦°øÇØ¾ß ÇÏ´Â °­Á¦ Àǹ«¸¦ ºÎ¿©¹Þ°Ô µÈ´Ù. ÀÌ Á¡¿¡ ´ëÇؼ­´Â ¾Õ¿¡¼­µµ ¼³¸íÇÑ ÀûÀÌ ÀÖ´Ù.

UserBase+2°¡ 0À» ¸®ÅÏÇÑ °æ¿ì´Â ½ÇÇà¿¡ ¼º°øÇ߰ųª ¶Ç´Â ÀÌ ¸Þ½ÃÁö¸¦ ó¸®ÇÏÁö ¾Ê°í ¹«½ÃÇÏ´Â °æ¿ì µÎ °¡Áö°¡ ÀÖ´Ù. ApiEdit´Â È£½ºÆ®°¡ ¹«½ÃÇß´õ¶óµµ ¼º°øÀ¸·Î °£ÁÖÇϴµ¥ Áï, È£½ºÆ®°¡ ó¸®ÇÏÁö ¾Ê´Â ¸í·ÉÀº ±×³É ¹«½ÃÇÏ´Â °ÍÀÌ´Ù. ApiEditÀÇ ¸ÅÅ©·Î´Â ÅؽºÆ® ÆíÁý¿¡ °ü·ÃµÈ ¸í·ÉÀ¸·Î ±¸¼ºµÇÁö¸¸ È£½ºÆ®ÀÇ ¸ÅÅ©·Î´Â À̺¸´Ù ÈξÀ ´õ È®ÀåµÈ Àǹ̸¦ °¡Áú ¼öµµ ÀÖ´Ù. ¿¹¸¦ µé¾î ¹®¼­ ¿ÜºÎ¿¡¼­ ó¸®ÇØ¾ß ÇÏ´Â Àϵµ ¸í·ÉÀ¸·Î Á¤ÀÇÇÒ ¼ö ÀÖ´Ù. È£½ºÆ®ÀÇ ¸í·ÉÀº Àá½Ã ÈÄ¿¡ ÀÛ¼ºÇÒ °ÍÀÌ´Ù.

¸ÅÅ©·Î¸¦ ½ÇÇàÇÒ ¼ö ÀÖ´Â ÇÔ¼öµéÀÌ ¿Ï¼ºµÇ¾ú´Âµ¥ ¾ÆÁ÷ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇÏ´Â UI´Â ¸¸µé¾îÁöÁö ¾Ê¾Ò´Ù. ±×·¡¼­ Å×½ºÆ®¸¦ À§ÇØ ¸ÅÅ©·Î¸¦ ½ÇÇàÇÏ´Â ÀÓ½ÃÀûÀÎ ´ÜÃàÅ°¸¦ ¸¸µé°í ¿©±â¿¡ °£´ÜÇÑ ¸ÅÅ©·Î¸¦ ÀÛ¼ºÇØ º¸ÀÚ. ProcessKey¿¡¼­ VK_F4, VK_F5 µîÀÇ Å°¿¡¼­ °£´ÜÇÑ ¸ÅÅ©·Î·Î ExecMacroÇÔ¼ö¸¦ È£ÃâÇØ º¸ÀÚ.

 

void CApiEditText::ProcessKey(UINT vk,BOOL bControl,BOOL bShift)

{

     ...

     switch (vk) {

     case VK_F4:

          pFrame->ExecMacro("movesel left;cut;move right;paste;move left");

          break;

     case VK_F5:

          pFrame->ExecMacro("move wordhome;insert \"<\";move wordend;insert \">\";move wright");

          break;

 

¸ÅÅ©·ÎÀÇ ³»¿ëÀº ¾î·ÆÁö ¾Ê°Ô Çؼ®µÈ´Ù. F4´Â ¿ÞÂÊÀ¸·Î ÇÑÄ­ ¼±ÅÃÀ̵¿ÇÑ ÈÄ Àß¶ó³»°í ¿À¸¥ÂÊÀ¸·Î À̵¿ÇÏ¿© ºÙÀÌ°í ´Ù½Ã ¿ÞÂÊÀ¸·Î À̵¿ÇÔÀ¸·Î½á ¾ÕµÚ ±ÛÀÚ¸¦ ±³Ã¼ÇÑ´Ù. ½ÇÁ¦ Å°º¸µå·Î ÀÌ µ¿ÀÛÀ» ¿¬¼ÓÀûÀ¸·Î ÇØ º¸¸é ¹®ÀÚ ±³È¯À̶ó´Â °ÍÀ» ½±°Ô ¾Ë ¼ö ÀÖ´Ù. F5´Â ÇöÀç ´Ü¾î¸¦ < >°ýÈ£·Î °¨½Î°í ´ÙÀ½ ´Ü¾î·Î À̵¿ÇÑ´Ù.

º¸´Ù½ÃÇÇ ¸ÅÅ©·Î¸¦ »ç¿ëÇÏ¸é µÎ °³ ÀÌ»óÀÇ ¸í·ÉÀ» ÇѲ¨¹ø¿¡ ½ÇÇàÇÒ ¼ö ÀÖ´Ù. À§ ¸ÅÅ©·Î ±¸¹®Àº ºñ±³Àû °£´ÜÇÑ ÆíÀε¥ Á» ´õ º¹ÀâÇÏ°Ô ÀÛ¼ºÇÏ¸é ¾ó¸¶µçÁö ½Ç¿ëÀûÀ¸·Î ÀÀ¿ëÇÒ ¼ö ÀÖ´Â °÷ÀÌ ¸¹´Ù. Å×½ºÆ®°¡ ³¡³µÀ¸¸é ÀÌ ÄÚµå´Â »èÁ¦ÇÏÀÚ. Àá½Ã ÈÄ ¸ÅÅ©·Î ÀÛ¼º ´ëÈ­»óÀÚ¸¦ ¸¸µé¸é ¾ó¸¶µçÁö º¹ÀâÇÑ ¸ÅÅ©·Î¸¦ Á÷Á¢ ¸¸µé ¼ö ÀÖ´Ù.