home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 8 Other / 08-Other.zip / api111.zip / ROPS / SMPUTILS.C < prev    next >
C/C++ Source or Header  |  1993-01-18  |  9KB  |  225 lines

  1. /* Miscellaneous Utility routines needed for SPA Router sample programs.
  2.  
  3.    OS/2 Remote Operations
  4.    SPA Router SPCF API Sample Test program utility providing source
  5.    code file.
  6.  
  7.    COPYRIGHT:
  8.    ----------
  9.    (C) Copyright International Business Machines Corporation 1991
  10.  
  11.    REVISION LEVEL: 1.0
  12.    ---------------
  13.       Send a run command reply     request code 0x0302
  14. */
  15.  
  16. #define INCL_BASE
  17. #include <os2.h>
  18.  
  19. /* #include "acssvcc.h"  to get OS/2 Communications Manager/2 Common Services
  20.    verb info here. We just include what we need here for our sample program
  21. */
  22.  
  23.  /****************************************************************************/
  24.  /* 32 Bit Support                                                           */
  25.  /****************************************************************************/
  26. #ifdef __32BIT__                       /* 32-bit Compiler Options  */
  27. #pragma pack(1)
  28. #define STRUCT16 struct
  29. #define CALL16 _Far16 _Pascal
  30. #define PTR16 * _Seg16
  31. #define TYPECAST PVOID
  32. #else                                  /* 16-bit Compiler Options  */
  33. #define STRUCT16 struct
  34. #define CALL16 far pascal
  35. #define PTR16 far *
  36. #define TYPECAST long
  37. #endif
  38.  
  39. #ifdef __32BIT__                       /* Structures aligned on 64KB boundary */
  40. #pragma seg16(get_cp_convert_table)
  41. #endif
  42.  
  43. #ifdef __32BIT__
  44. extern void CALL16 ACSSVC(void PTR16);
  45. extern USHORT APIENTRY16 Dos16GetCp(USHORT, USHORT PTR16, USHORT PTR16);
  46. #else
  47. extern void CALL16 ACSSVC(long);
  48. #endif
  49.  
  50. #define SV_ASCII_TO_EBCDIC                         0x00
  51. #define SV_EBCDIC_TO_ASCII                         0x01
  52. #define SV_ROUND_TRIP                              0x01
  53.  
  54.  /*************************************************************/
  55.  /*                    Operation Codes                        */
  56.  /*************************************************************/
  57.  
  58. #define SV_GET_CP_CONVERT_TABLE                    0x0019
  59.  
  60.  /*************************************************************/
  61.  /*                 Service Structures                        */
  62.  /*************************************************************/
  63.  
  64.     STRUCT16 get_cp_convert_table
  65.         {
  66.         unsigned short opcode;       /* Verb operation code      */
  67.         unsigned char opext;         /* Verb extension code      */
  68.         unsigned char reserv2;       /* Reserved                 */
  69.         unsigned short primary_rc;   /* Primary RETURN_CODE      */
  70.         unsigned long secondary_rc;  /* Secondary RETURN_CODE    */
  71.         unsigned short source_cp;    /* SOURCE_CODE_PAGE         */
  72.         unsigned short target_cp;    /* TARGET_CODE_PAGE         */
  73.         unsigned char PTR16 conv_tbl_addr; /* CONVERT_TABLE_ADDR */
  74.         unsigned char char_not_fnd;  /* CHARACTER_NOT_FOUND      */
  75.                                      /*   SV_SUBSTITUTE          */
  76.                                      /*   SV_ROUND_TRIP          */
  77.         unsigned char substitute_char; /* SUBSTITUTE_CHARACTER   */
  78.         };
  79.  
  80. BYTE xlatetbl[512] ;    /* first 256 bytes ascii-to-ebcdic translation table */
  81.                         /* next  256 bytes ebcdic-to-ascii translation table */
  82. USHORT hostcodepage = 0; /* ebcdic host code page */
  83. USHORT curcodepage = 0; /* ascii code page of our NetView sim process */
  84.  
  85. /* Convert Ebcdic <-> Ascii by using CONVERT VERB of OS/2 EE Comm Mgr */
  86. /* Users call ConvertEtoA() or ConvertAtoE() macros which then get    */
  87. /* translated to this function call.                                  */
  88.  
  89. USHORT convertEbcAscii ( sourceaddr, destinaddr, len , tarlen, dowhat )
  90.  
  91. BYTE *sourceaddr ;
  92. BYTE *destinaddr ;
  93. USHORT len ;
  94. USHORT *tarlen ; /* target length, to be updated after trasnlation */
  95. BYTE dowhat ;
  96.  
  97. {
  98.    BYTE *converttbl ; /* point to ebcdic-ascii convertion table */
  99.    USHORT ctr ;
  100.  
  101.    if ( dowhat == SV_EBCDIC_TO_ASCII )
  102.       converttbl = xlatetbl+256 ;          /* ebcdic to                     */
  103.                                            /* ascii table space is the last */
  104.                                            /* 256 bytes in table            */
  105.    else
  106.       /* it is ascii to ebcdic convertion */
  107.       converttbl = xlatetbl ;              /* ascii to ebcdic               */
  108.                                            /* table space is the first      */
  109.                                            /* 256 bytes in table            */
  110.  
  111.    for ( ctr = 0; ctr < len ; ctr++ )
  112.          destinaddr[ctr] = converttbl [ sourceaddr[ctr] ] ;
  113.  
  114.    *tarlen = len ; /* update target byte length xlated, src=target for SBCS */
  115.    return (0) ; /* return OK */
  116.  
  117. }
  118.  
  119. /* Setup ascii-ebcdic translation tables by calling Comm Mgr/2             */
  120. /* Get_CP_Convert_table verb. Ascii code page is obtained by calling the   */
  121. /* system's current code page. "ebcdiccp" is the EBCDIC code page to use   */
  122. /* to build the translation tables ; 1 from ascii to ebcdic, the other for */
  123. /* ebcdic to ascii table.                                                  */
  124.  
  125. USHORT RoprXlateSetup ( ebcdiccp )
  126. USHORT ebcdiccp ;
  127.  
  128. {
  129.   USHORT len ;
  130.   STRUCT16 get_cp_convert_table convtblvcb ; /* convert table cp verb ctl blk */
  131.  
  132. /**************************************************************************/
  133. /* doscall to get current default ascii code page                         */
  134. /**************************************************************************/
  135. #ifdef __32BIT__
  136.      Dos16GetCp(2,
  137.                 &curcodepage,
  138.                 &len
  139.                );
  140. #else
  141.      DosGetCp(2,                       /* we want current code page only */
  142.               &curcodepage,
  143.               &len                     /* len returned */
  144.              );
  145. #endif
  146.  
  147.  
  148.    hostcodepage = ebcdiccp ; /* store ebcdic NetView code page for later use */
  149.  
  150.    /* we will build the ascii <-> ebcdic tables now by calling */
  151.    /* OS/2 Comm Mgr/2.                                         */
  152.  
  153.    convtblvcb.opcode = SV_GET_CP_CONVERT_TABLE ; /* get convert table opcode */
  154.    convtblvcb.opext = 0x00 ;                     /* reserved                 */
  155.    convtblvcb.reserv2 = 0x00 ;                   /* reserved                 */
  156.  
  157.    /* ascii to ebcdic table first */
  158.    convtblvcb.source_cp = curcodepage ;          /* source code page         */
  159.    convtblvcb.target_cp = ebcdiccp ;             /* target code page         */
  160.  
  161.    convtblvcb.conv_tbl_addr = xlatetbl ;     /* ascii to ebcdic table space */
  162.    convtblvcb.char_not_fnd = SV_ROUND_TRIP ; /* if char not found */
  163.    convtblvcb.substitute_char = 0x40 ; /* substitute char is 'space' in ebcdic */
  164.  
  165.    /* call Com Mgr/2 for get_cp_convert_table verb ) */
  166.    ACSSVC( (TYPECAST) &convtblvcb ) ; /* AX register returned code is not set */
  167.  
  168.    if ( convtblvcb.primary_rc )
  169.        return ( convtblvcb.primary_rc ) ; /* error occurred */
  170.  
  171.    /* else build ebcdic to ascii table */
  172.  
  173.    convtblvcb.opcode = SV_GET_CP_CONVERT_TABLE ; /* get convert table opcode */
  174.    convtblvcb.opext = 0x00 ;                     /* reserved                 */
  175.    convtblvcb.reserv2 = 0x00 ;                   /* reserved                 */
  176.  
  177.    /* ebcdic to ascii table in the next space */
  178.    convtblvcb.source_cp = ebcdiccp ;      /* source code page is ebcdic */
  179.    convtblvcb.target_cp = curcodepage ;   /* target code page is ascii  */
  180.  
  181.    convtblvcb.conv_tbl_addr = xlatetbl+256 ; /* ebcdic to  */
  182.                                            /* ascii table space is the next */
  183.                                            /* 256 bytes in table */
  184.  
  185.    convtblvcb.char_not_fnd = SV_ROUND_TRIP ; /* if char not found */
  186.    convtblvcb.substitute_char = 0x20 ; /* substitute char is 'space' in ascii */
  187.  
  188.    /* call Com Mgr/2 for get_cp_convert_table verb ) */
  189.    ACSSVC( (TYPECAST) &convtblvcb ) ; /* AX register returned code is not set */
  190.  
  191.    if ( convtblvcb.primary_rc )
  192.        return ( convtblvcb.primary_rc ) ; /* error occurred */
  193.    else
  194.       return 0 ;
  195.  
  196. }
  197.  
  198. /* Copy "len" bytes from source to destination. */
  199.  
  200. void bytecopy ( source, destin, len )
  201.  
  202. BYTE *source ;
  203. BYTE *destin ;
  204. USHORT len ;
  205.  
  206. {
  207.    while ( len > 0 ) {
  208.       *destin++ = *source++ ;
  209.       len-- ;
  210.    }
  211. }
  212.  
  213. /* swap bytes in an unsigned short */
  214. void swapbytes( us_num)
  215.  
  216. USHORT   *us_num ;
  217.  
  218. {
  219.       USHORT ustmp ;
  220.  
  221.       ustmp = *us_num >> 8 ;       /* get the high byte             */
  222.       *us_num = ( *us_num << 8 ) ; /* put the low byte in high byte */
  223.       *us_num = *us_num | ustmp ;  /* put the high byte in low      */
  224. }
  225.