home *** CD-ROM | disk | FTP | other *** search
/ DOS/V Power Report 1997 March / VPR9703A.ISO / OLS / Win31 / HMIZE120 / HMIZE120.LZH / SOURCE.LZH / EDITEDIT.CPP next >
C/C++ Source or Header  |  1994-01-16  |  10KB  |  414 lines

  1. #include <windows.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <dos.h>
  5. #include "global.h"
  6. #include "editedit.h"
  7.  
  8. static HANDLE    hmemClipboard;
  9. static LPSTR    pbText;
  10. static WORD        cbText;
  11. static HANDLE    hmemWrite;
  12. static LPSTR    pbWrite;
  13.  
  14. static BOOL GetText( BOOL fSelectOne = FALSE ) {
  15.     DWORD    dw = SendMessage( hwndTarget, EM_GETSEL, 0, 0L );
  16.     if( HIWORD(dw) == LOWORD(dw) ) {
  17.         if( fSelectOne ) {
  18.             SendShiftVKey( VK_RIGHT );
  19.             dw = SendMessage( hwndTarget, EM_GETSEL, 0, 0L );
  20.             if( HIWORD(dw) == LOWORD(dw) ) return FALSE;
  21.         } else {
  22.             return FALSE;
  23.         }
  24.     }
  25.     SendMessage( hwndTarget, WM_CUT, 0, 0L );
  26.     if( !OpenClipboard( NULL ) ) {
  27.         return FALSE;
  28.     }
  29.     hmemClipboard = GetClipboardData( CF_TEXT );
  30.     if( hmemClipboard == NULL ) return FALSE;
  31.     cbText = (WORD)GlobalSize( hmemClipboard );
  32.     pbText = (LPSTR)GlobalLock( hmemClipboard );
  33.     return TRUE;
  34. }
  35.  
  36. static void EndTextAccess( void ) {
  37.     GlobalUnlock( hmemClipboard );
  38.     CloseClipboard();
  39. }
  40.  
  41. static BOOL AllocWrite( WORD cb ) {
  42.     hmemWrite = GlobalAlloc( GMEM_MOVEABLE, cb );
  43.     if( hmemWrite == NULL ) return FALSE;
  44.     pbWrite = GlobalLock( hmemWrite );
  45.     if( pbWrite == NULL ) return FALSE;
  46.     return TRUE;
  47. }
  48.  
  49. static BOOL Paste( BOOL fWithSelect = TRUE ) {
  50.     if( !OpenClipboard( NULL ) ) return FALSE;
  51.     EmptyClipboard();
  52.     *pbWrite = '\0';
  53.     WORD    cb = FP_OFF(pbWrite);
  54.     GlobalUnlock( hmemWrite );
  55.     SetClipboardData( CF_TEXT, hmemWrite );
  56.     CloseClipboard();
  57.     SendMessage( hwndTarget, WM_PASTE, 0, 0L );
  58.     if( fWithSelect ) {
  59.         DWORD    dw = SendMessage( hwndTarget, EM_GETSEL, 0, 0L );
  60.         SendMessage( hwndTarget, EM_SETSEL, TRUE, MAKELONG( LOWORD(dw) - cb, LOWORD(dw) ) );
  61.     }
  62.     return TRUE;
  63. }
  64.  
  65. BOOL ToUpper( void ) {
  66.     if( !GetText() ) return FALSE;
  67.     if( !AllocWrite( cbText ) ) {
  68.         EndTextAccess();
  69.         return FALSE;
  70.     }
  71.     while( *pbText != '\0' ) {
  72.         if( (*pbText >= 0x81 && *pbText <= 0x9F)
  73.          || *pbText >= 0xE0 ) {
  74.             WORD    w = ((WORD)(*pbText) << 8) + pbText[1];
  75.             if( w >= 0x8281 && w <= 0x829A ) {
  76.                 w += 0x8260 - 0x8281;
  77.                 *pbWrite = HIBYTE(w);
  78.                 pbWrite[1] = LOBYTE(w);
  79.             } else {
  80.                 *(WORD FAR*)pbWrite = *(WORD FAR*)pbText;
  81.             }
  82.             pbText += 2;
  83.             pbWrite += 2;
  84.         } else {
  85.             if( *pbText >= 'a' && *pbText <= 'z' ) {
  86.                 *pbWrite = *pbText - 'a' + 'A';
  87.             } else {
  88.                 *pbWrite = *pbText;
  89.             }
  90.             pbText ++;
  91.             pbWrite ++;
  92.         }
  93.     }
  94.     EndTextAccess();
  95.     return Paste();
  96. }
  97.  
  98. BOOL ToLower( void ) {
  99.     if( !GetText() ) return FALSE;
  100.     if( !AllocWrite( cbText ) ) {
  101.         EndTextAccess();
  102.         return FALSE;
  103.     }
  104.     while( *pbText != '\0' ) {
  105.         if( (*pbText >= 0x81 && *pbText <= 0x9F)
  106.          || *pbText >= 0xE0 ) {
  107.             WORD    w = ((WORD)(*pbText) << 8) + pbText[1];
  108.             if( w >= 0x8260 && w <= 0x8279 ) {
  109.                 w += 0x8281 - 0x8260;
  110.                 *pbWrite = HIBYTE(w);
  111.                 pbWrite[1] = LOBYTE(w);
  112.             } else {
  113.                 *(WORD FAR*)pbWrite = *(WORD FAR*)pbText;
  114.             }
  115.             pbText += 2;
  116.             pbWrite += 2;
  117.         } else {
  118.             if( *pbText >= 'A' && *pbText <= 'Z' ) {
  119.                 *pbWrite = *pbText - 'A' + 'a';
  120.             } else {
  121.                 *pbWrite = *pbText;
  122.             }
  123.             pbText ++;
  124.             pbWrite ++;
  125.         }
  126.     }
  127.     EndTextAccess();
  128.     return Paste();
  129. }
  130.  
  131. static char szZenkakuEisuu[] =
  132.     " !”#$%&’()*+,-./0123456789:;<=>?@"
  133.     "ABCDEFGHIJKLMNOPQRSTUVWXYZ[¥]^_`"
  134.     "abcdefghijklmnopqrstuvwxyz"
  135.     "{|} ̄";
  136.  
  137. static char szZenkakuKata[] =
  138.     "。「」、・ヲァィゥェォャュョッーアイウエオカキクケコサシスセソ\タチツテト"
  139.     "ナニヌネノハヒフヘホマミムメモヤユヨラリルレロワン゛゜";
  140.  
  141. static char szZenkakuHira[] =
  142.     "。「」、・をぁぃぅぇぉゃゅょっーあいうえおかきくけこさしすせそたちつてと"
  143.     "なにぬねのはひふへほまみむめもやゆよらりるれろわん゛゜";
  144.  
  145. static char szKataDakuon[] =
  146.     "カガキギクグケゲコゴサザシジスズセゼソゾタダチヂツヅテデトドハバヒビフブヘベホボウヴ";
  147.  
  148. static char szKataHandaku[] = "ハパヒピフプヘペホポ";
  149.  
  150. static char szHiraDakuon[] =
  151.     "カがキぎクぐケげコごサざシじスずセぜソぞタだチぢツづテでトどハばヒびフぶヘべホぼ";
  152.  
  153. static char szHiraHandaku[] = "ハぱヒぴフぷヘぺホぽ";
  154.  
  155. static WORD near ToHankakuLocal( WORD w ) {
  156.     char*    pch = szZenkakuEisuu;
  157.     BYTE    b = ' ';
  158.     while( *pch != '\0' ) {
  159.         if( *pch == HIBYTE(w) && pch[1] == LOBYTE(w) ) {
  160.             return b;
  161.         }
  162.         pch += 2;
  163.         b ++;
  164.     }
  165.     b = 0xA1;
  166.     pch = szZenkakuKata;
  167.     while( *pch != '\0' ) {
  168.         if( *pch == HIBYTE(w) && pch[1] == LOBYTE(w) ) {
  169.             return b;
  170.         }
  171.         pch += 2;
  172.         b ++;
  173.     }
  174.     pch = szKataDakuon;
  175.     while( *pch != '\0' ) {
  176.         if( pch[1] == HIBYTE(w) && pch[2] == LOBYTE(w) ) {
  177.             return (((WORD)pch[0] << 8) + (WORD)0xDE);
  178.         }
  179.         pch += 3;
  180.     }
  181.     pch = szKataHandaku;
  182.     while( *pch != '\0' ) {
  183.         if( pch[1] == HIBYTE(w) && pch[2] == LOBYTE(w) ) {
  184.             return (((WORD)pch[0] << 8) + (WORD)0xDF);
  185.         }
  186.         pch += 3;
  187.     }
  188.     b = 0xA1;
  189.     pch = szZenkakuHira;
  190.     while( *pch != '\0' ) {
  191.         if( *pch == HIBYTE(w) && pch[1] == LOBYTE(w) ) {
  192.             return b;
  193.         }
  194.         pch += 2;
  195.         b ++;
  196.     }
  197.     pch = szHiraDakuon;
  198.     while( *pch != '\0' ) {
  199.         if( pch[1] == HIBYTE(w) && pch[2] == LOBYTE(w) ) {
  200.             return (((WORD)pch[0] << 8) + (WORD)0xDE);
  201.         }
  202.         pch += 3;
  203.     }
  204.     pch = szHiraHandaku;
  205.     while( *pch != '\0' ) {
  206.         if( pch[1] == HIBYTE(w) && pch[2] == LOBYTE(w) ) {
  207.             return (((WORD)pch[0] << 8) + (WORD)0xDF);
  208.         }
  209.         pch += 3;
  210.     }
  211.     return w;
  212. }
  213.  
  214. BOOL ToHankaku( void ) {
  215.     if( !GetText() ) return FALSE;
  216.     if( !AllocWrite( cbText ) ) {
  217.         EndTextAccess();
  218.         return FALSE;
  219.     }
  220.     while( *pbText != '\0' ) {
  221.         if( (*pbText >= 0x81 && *pbText <= 0x9F) || *pbText >= 0xE0 ) {
  222.             WORD    w = ((WORD)*pbText << 8) + (WORD)pbText[1];
  223.             w = ToHankakuLocal( w );
  224.             if( w <= 0xFF ) {
  225.                 *pbWrite = (char)w;
  226.                 pbWrite ++;
  227.             } else {
  228.                 *pbWrite = HIBYTE(w);
  229.                 pbWrite[1] = LOBYTE(w);
  230.                 pbWrite += 2;
  231.             }
  232.             pbText += 2;
  233.         } else {
  234.             *pbWrite = *pbText;
  235.             pbWrite ++;
  236.             pbText ++;
  237.         }
  238.     }
  239.     EndTextAccess();
  240.     return Paste();
  241. }
  242.  
  243. static WORD near ToDakuon( BYTE b, char* pch ) {
  244.     while( *pch != '\0' ) {
  245.         if( pch[0] == b ) {
  246.             return ((WORD)pch[1] << 8) + (WORD)pch[2];
  247.         }
  248.         pch += 3;
  249.     }
  250.     return 0;
  251. }
  252.  
  253. static WORD near ToZenkakuHiraLocal( BYTE b ) {
  254.     char*    pch = NULL;
  255.     if( b >= ' ' && b <= '~' ) {
  256.         pch = szZenkakuEisuu + (b - ' ') * 2;
  257.     } else if( b >= 0xA1 && b <= 0xDF ) {
  258.         pch = szZenkakuHira + (b - 0xA1) * 2;
  259.     }
  260.     if( pch != NULL ) {
  261.         return ((WORD)*pch << 8) + pch[1];
  262.     }
  263.     return b;
  264. }
  265.  
  266. static WORD near ToZenkakuKataLocal( BYTE b ) {
  267.     char*    pch = NULL;
  268.     if( b >= ' ' && b <= '~' ) {
  269.         pch = szZenkakuEisuu + (b - ' ') * 2;
  270.     } else if( b >= 0xA1 && b <= 0xDF ) {
  271.         pch = szZenkakuKata + (b - 0xA1) * 2;
  272.     }
  273.     if( pch != NULL ) {
  274.         return ((WORD)*pch << 8) + pch[1];
  275.     }
  276.     return b;
  277. }
  278.  
  279. BOOL ToZenkakuHira( void ) {
  280.     if( !GetText() ) return FALSE;
  281.     if( !AllocWrite( cbText * 2 ) ) {
  282.         EndTextAccess();
  283.         return FALSE;
  284.     }
  285.     while( *pbText != '\0' ) {
  286.         WORD    w;
  287.         if( (*pbText >= 0x81 && *pbText <= 0x9F) || *pbText >= 0xE0 ) {
  288.             w = ((WORD)*pbText << 8) + (WORD)pbText[1];
  289.             if( w >= 0x8340 && w <= 0x837E ) {
  290.                 w = w - 0x8340 + 0x829F;
  291.             } else if( w >= 0x8380 && w <= 0x8393 ) {
  292.                 w = w - 0x8380 + 0x82DE;
  293.             }
  294.             *pbWrite = HIBYTE(w);
  295.             pbWrite[1] = LOBYTE(w);
  296.             pbWrite += 2;
  297.             pbText += 2;
  298.         } else {
  299.             w = *pbText;
  300.             pbText ++;
  301.             if( *pbText == 0xDE ) {
  302.                 pbText ++;
  303.                 w = ToDakuon( (char)w, szHiraDakuon );
  304.             } else if( *pbText == 0xDF ) {
  305.                 pbText ++;
  306.                 w = ToDakuon( (char)w, szHiraHandaku );
  307.             }
  308.             if( w <= 0xFF ) w = ToZenkakuHiraLocal( (BYTE)w );
  309.             if( w > 0xFF ) {
  310.                 *pbWrite = HIBYTE(w);
  311.                 pbWrite[1] = LOBYTE(w);
  312.                 pbWrite += 2;
  313.             } else {
  314.                 *pbWrite = (BYTE)w;
  315.                 pbWrite ++;
  316.             }
  317.         }
  318.     }
  319.     EndTextAccess();
  320.     return Paste();
  321. }
  322.  
  323. BOOL ToZenkakuKata( void ) {
  324.     if( !GetText() ) return FALSE;
  325.     if( !AllocWrite( cbText * 2 ) ) {
  326.         EndTextAccess();
  327.         return FALSE;
  328.     }
  329.     while( *pbText != '\0' ) {
  330.         WORD    w;
  331.         if( (*pbText >= 0x81 && *pbText <= 0x9F) || *pbText >= 0xE0 ) {
  332.             w = ((WORD)*pbText << 8) + (WORD)pbText[1];
  333.             if( w >= 0x829F && w <= 0x82DD ) {
  334.                 w = w - 0x829F + 0x8340;
  335.             } else if( w >= 0x82DE && w <= 0x82F1 ) {
  336.                 w = w - 0x82DE + 0x8380;
  337.             }
  338.             *pbWrite = HIBYTE(w);
  339.             pbWrite[1] = LOBYTE(w);
  340.             pbWrite += 2;
  341.             pbText += 2;
  342.         } else {
  343.             w = *pbText;
  344.             pbText ++;
  345.             if( *pbText == 0xDE ) {
  346.                 pbText ++;
  347.                 w = ToDakuon( (char)w, szKataDakuon );
  348.             } else if( *pbText == 0xDF ) {
  349.                 pbText ++;
  350.                 w = ToDakuon( (char)w, szKataHandaku );
  351.             }
  352.             if( w <= 0xFF ) w = ToZenkakuKataLocal( (BYTE)w );
  353.             if( w > 0xFF ) {
  354.                 *pbWrite = HIBYTE(w);
  355.                 pbWrite[1] = LOBYTE(w);
  356.                 pbWrite += 2;
  357.             } else {
  358.                 *pbWrite = (BYTE)w;
  359.                 pbWrite ++;
  360.             }
  361.         }
  362.     }
  363.     EndTextAccess();
  364.     return Paste();
  365. }
  366.  
  367. BOOL CaseChange( void ) {
  368.     if( !GetText( TRUE ) ) return FALSE;
  369.     if( !AllocWrite( cbText * 2 ) ) {
  370.         EndTextAccess();
  371.         return FALSE;
  372.     }
  373.     while( *pbText != '\0' ) {
  374.         if( (*pbText >= 0x81 && *pbText <= 0x9F)
  375.          || *pbText >= 0xE0 ) {
  376.             WORD    w = ((WORD)(*pbText) << 8) + pbText[1];
  377.             if( w >= 0x8281 && w <= 0x829A ) {
  378.                 w += 0x8260 - 0x8281;
  379.                 *pbWrite = HIBYTE(w);
  380.                 pbWrite[1] = LOBYTE(w);
  381.             } else if( w >= 0x8260 && w <= 0x8279 ) {
  382.                 w += 0x8281 - 0x8260;
  383.                 *pbWrite = HIBYTE(w);
  384.                 pbWrite[1] = LOBYTE(w);
  385.             } else {
  386.                 *(WORD FAR*)pbWrite = *(WORD FAR*)pbText;
  387.             }
  388.             pbText += 2;
  389.             pbWrite += 2;
  390.         } else {
  391.             if( *pbText >= 'a' && *pbText <= 'z' ) {
  392.                 *pbWrite = *pbText - 'a' + 'A';
  393.             } else if( *pbText >= 'A' && *pbText <= 'Z' ) {
  394.                 *pbWrite = *pbText - 'A' + 'a';
  395.             } else {
  396.                 *pbWrite = *pbText;
  397.             }
  398.             pbText ++;
  399.             pbWrite ++;
  400.         }
  401.     }
  402.     EndTextAccess();
  403.     return Paste( FALSE );
  404. }
  405.  
  406. BOOL CapsLockForget( int xInput ) {
  407.     DWORD    dw = SendMessage( hwndTarget, EM_GETSEL, 0, 0L );
  408.     if( LOWORD(dw) != HIWORD(dw) ) return FALSE;
  409.     if( xInput >= LOWORD(dw) ) return FALSE;
  410.     DebugOut( "CapsLockForget processing\x0d\x0a" );
  411.     SendMessage( hwndTarget, EM_SETSEL, TRUE, MAKELONG( xInput, LOWORD(dw) ) );
  412.     return CaseChange();
  413. }
  414.