home *** CD-ROM | disk | FTP | other *** search
/ The C Users' Group Library 1994 August / wc-cdrom-cusersgrouplibrary-1994-08.iso / listings / v_03_01 / 3n01024a < prev    next >
Text File  |  1991-12-03  |  5KB  |  186 lines

  1.  
  2. /*** Listing #1
  3. */
  4. #define TRUE  1
  5. #define FALSE 2
  6.  
  7. typedef unsigned char BOOL;
  8. typedef unsigned char DBC;
  9.  
  10. #include <dos.h>
  11. #define    MAXRANGES    10
  12. #define    GETDBCRANGES 0x6300
  13. #define    KANJIFLAG    0
  14. #define    NUMKRANGES   1
  15. #define    STARTRANGES  2
  16.  
  17. #define VIDEO         0x10
  18. #define GETSCREENMODE 0x0f
  19. #define GETSCRNMODE   0x50    /* Screen country code */
  20. #define SETSCREENMODE 0x00    /* Screen mode         */
  21. #define AXJGRAPHICS   0x53
  22. #define AXJTEXT       0x03
  23.  
  24. #define KEYBOARD      0x16
  25. #define CHECKKB       0x11
  26. #define GETKEY        0x10
  27.  
  28. #define JAPAN         0x51
  29.  
  30. /*  Kanji System Information Array
  31. *
  32. *     iKanjiInfo[0] -> BOOL indicating kanji system or not.
  33. *               [1] -> iNumRanges Number of Kanji code ranges.
  34. *               [2] -> Range #1's low value for lead byte of DBC.
  35. *               [3] -> Range #1's high value for lead byte of DBC.
  36. *                .
  37. *                .
  38. *               [iNumRanges*2]   -> Range #n's low value for lead byte of DBC.
  39. *               [iNumRanges*2+1] -> Range #n's high value for lead byte of DBC.
  40. */
  41. int far piKanjiInfo[(MAXRANGES*2)+2];
  42.  
  43. BOOL bInitKanji  (void);
  44. BOOL bIsDBC      (DBC *);
  45.  
  46. /*** bIsDBC - Determines if character is a DBC.
  47. *
  48. *   written by: John G. Nelson, Pacific Software Publishing Inc.
  49. *   copyright:  Pacific Software Publishing Inc.
  50. *   date:       4/91
  51. *   description:Determines if a DBC pointer is pointing to a DBC.
  52. *   inputs:     Pointer to a DBC or a SBC.
  53. *   outputs:    TRUE if the pointer points to a DBC.
  54. *               FALSE otherwise.
  55. */
  56. BOOL bIsDBC(
  57.     DBC *pdbcChar)    /* pointer to DBC   */
  58.     {
  59.     int i;
  60.     int iValue;
  61.     static   BOOL bNotInit = TRUE;
  62.     if (bNotInit)  {
  63.         bNotInit = FALSE;
  64.         if (FALSE == bInitKanji())  {
  65.             return(FALSE);
  66.         }
  67.     }
  68.     iValue = pdbcChar[0];
  69.     i = STARTRANGES;
  70.     /* Is kanji system installed                       */
  71.     if (0 == *piKanjiInfo)  {
  72.         return(FALSE);
  73.     }
  74.     while (TRUE)  {
  75.         if (piKanjiInfo[NUMKRANGES] == (i-2)/2)  {
  76.             return(FALSE);
  77.         }
  78.         if ((piKanjiInfo[i] <= iValue) && (piKanjiInfo[i+1] >= iValue))  {
  79.             return(TRUE);
  80.         }
  81.         i += 2;
  82.     }
  83. } /* bIsDBC /
  84.  
  85. /* bInitKanji
  86. *
  87. *   written by:  John G. Nelson, Pacific Software Publishing Inc.
  88. *   copyright:   Pacific Software Publishing Inc.
  89. *   date:        9/91
  90. *   description: Checks if AX Kanji system or not.
  91. *   functions:   Calls DOS subfunction 0x63 to retrieve
  92. *                kanji lead byte ranges.
  93. *   inputs:      none
  94. *   outputs:     FALSE - The Kanji system is not being used.
  95. *                TRUE that Kanji system is available and initialized.
  96. *   globals mod: iKanjiInfo character array.
  97. */
  98. BOOL bInitKanji(
  99.     void)
  100.     {
  101.     union    REGS  regReg;
  102.     struct   SREGS sregSreg;
  103.     unsigned char far *fpRanges;
  104.     int      iNumRanges = 0;
  105.     int      i;
  106.     char     cOrigMode;
  107.  
  108.     /* Get original screen mode                        */
  109.     regReg.h.ah = GETSCREENMODE;
  110.     int86 (VIDEO, ®Reg, ®Reg);
  111.     cOrigMode = regReg.h.al;
  112.  
  113.     /* Determine if AX system                          */
  114.     /* by attempting to set screen mode to AXJGRAPHICS */
  115.     regReg.h.ah = SETSCREENMODE;
  116.     regReg.h.al = AXJGRAPHICS;
  117.     int86 (VIDEO, ®Reg, ®Reg);
  118.  
  119.     /* Check if set mode was successful                */
  120.     regReg.h.ah = GETSCREENMODE;
  121.     regReg.h.al = 0;
  122.     int86 (VIDEO, ®Reg, ®Reg);
  123.     if (AXJGRAPHICS == regReg.h.al)  {
  124.  
  125.         /* AX system proved                            */
  126.         /* Set screen mode back to original before test*/
  127.         regReg.h.ah = SETSCREENMODE;
  128.         regReg.h.al = cOrigMode;
  129.         int86 (VIDEO, ®Reg, ®Reg);
  130.  
  131.         /* Get Mode of AX Screen                       */
  132.         regReg.h.ah = GETSCRNMODE;
  133.         regReg.h.al = 1;
  134.         int86 (VIDEO, ®Reg, ®Reg);
  135.         if (JAPAN != regReg.x.bx)  {
  136.             return(FALSE);
  137.         }
  138.  
  139.     } else  {
  140.  
  141.         /* Set screen mode to original before AX test  */
  142.         regReg.h.ah = SETSCREENMODE;
  143.         regReg.h.al = cOrigMode;
  144.         int86 (VIDEO, ®Reg, ®Reg);
  145.         piKanjiInfo[KANJIFLAG] = FALSE;
  146.         return(FALSE);
  147.  
  148.     }
  149.     piKanjiInfo[KANJIFLAG] = TRUE;
  150.  
  151.     /* Gets address of DBC ranges                      */
  152.     regReg.x.ax = GETDBCRANGES;
  153.     intdosx (®Reg, ®Reg, &sregSreg);
  154.     fpRanges = MK_FP (sregSreg.ds, regReg.x.si);
  155.  
  156.     /* Copy ranges to cKanjiInfo array                 */
  157.     i = STARTRANGES;
  158.     while (TRUE)  {
  159.         if (0 == (piKanjiInfo[i++] = *fpRanges++))  {
  160.             break;
  161.         }
  162.         if (0 == i%2)  {
  163.             iNumRanges++;
  164.         }
  165.         if (MAXRANGES == iNumRanges)  {
  166.             return(FALSE);
  167.         }
  168.     }
  169.  
  170.     piKanjiInfo[NUMKRANGES] = iNumRanges;
  171.  
  172.     if (0 == iNumRanges)  {
  173.         /* Default Ranges                              */
  174.         i = STARTRANGES;
  175.         piKanjiInfo[NUMKRANGES] = 2;
  176.         piKanjiInfo[i++] = 0x81;
  177.         piKanjiInfo[i++] = 0x9f;
  178.         piKanjiInfo[i++] = 0xe0;
  179.         piKanjiInfo[i++] = 0xfc;
  180.     }
  181.  
  182.     return (piKanjiInfo[KANJIFLAG]);
  183.  
  184. } /* bInitKanji  */
  185.  
  186.