駄六川の草庵 トップページ > 役立たない?/プログラム等 > LPrint概要 > ソース2(SJis2Jis)
ごあいさつ
メニューごあいさつ、ご案内
たわごと
メニュー情報処理とビジネス
メニューその他
役立たない?
メニュープログラム等
メニュー英略語集
メニュー友人・知人リンク
プロフィール等
メニュープロフィール
メニューこのサイトについて

メニュー会員のページ

メニュー近辺のご案内

LPrint : Windows からの PR201系プリンタ直接制御

所収ソース


SJis2Jis.C

/*********************************************************************
 file name : SJis2Jis.C
   purpose : プリンタ直接出力のための Shift JIS → JIS 変換DLL

             Version 0.4 / October 31, 2003
 ---------------------------------------------------------------------
   history : V0.1/2002-11-19/ 他ソースより抽出、改造。
           : V0.2/2002-11-22/ ESC/P 用、PR201PL 用、分離。
           : V0.3/2003-02-01/ 文字ピッチ、全:半=2:1 化。
           : V0.4/2003-10-31/ ホームページ用コメント改変。
*********************************************************************/
#include <windows.h>
#include <mbstring.h>
//#include <mbctype.h>
#include "SJis2Jis.h"

static void change2jis( USCHAR *, USCHAR * );

/********************************************************************
 function : DllMain
  purpose : Dll Entry Point
 ********************************************************************/
BOOL WINAPI DllMain( HINSTANCE hInstDll, DWORD reason, LPVOID reserved )
{
     switch( reason )
     {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

/*********************************************************************
 function : SJis2JisEscP
  purpose : ESC/P 用 Shift JIS 文字列 → JIS 変換
    param.: sjis ... Shift JIS 文字列
          : jis .... JIS 変換後文字列格納バッファ
          : count .. 変換元バイト数
  returns : 変換後バイト数
  remarks : 1バイト/2バイト文字混合対応
 *********************************************************************/
DllExport long WINAPI SJis2JisEscP( USCHAR *sjis, USCHAR *jis, short count )
{
    USCHAR *source;
    USCHAR *target;
    USCHAR  jis1, jis2;
    int  Kan = -1;    /* 1=Kan 0 = Not Kan */
    long lngRet = 0L;

    source = sjis;
    target = jis;

    while( count > 0 )
    {
        if( _ismbblead( *source ) )          /* 漢字第1バイトならば */
        {
            if(Kan != 1)
            {
                Kan = 1;
                *target++ = 0x1C;            /* FS & 漢字モード指定 */
                *target++ = 0x26;
                *target++ = 0x1C;            /* FS S 全角文字スペース量設定 */
                *target++ = 0x53;
                *target++ = 0x00;            /* 0 左スペース */
                *target++ = 0x03;            /* 3 右スペース */
                lngRet += 6;
            }
            jis1 = *source++;
            jis2 = *source++;
            count -= 2;

            change2jis( &jis1, &jis2 );         /* JISコード2バイト分、格納 */
            *target++ = jis1;
            *target++ = jis2;
            lngRet += 2;
        }
        else                                                   /* 非漢字なら */
        {
            if(Kan != 0)
            {
                Kan = 0;
                *target++ = 0x1c;
                *target++ = 0x2e;
                lngRet += 2;
            }
            *target++ = *source++;                   /* そのまま1バイト格納 */
            count -= 1;
            lngRet += 1;
        }
    }

    if(Kan == 1)
    {
        *target++ = 0x1c;
        *target = 0x2d;
        lngRet += 2;
    }

    return( lngRet );
}

/*********************************************************************
 function : SJis2JisPR201
  purpose : PR201PL 用 Shift JIS 文字列 → JIS 変換
    param.: sjis ... Shift JIS 文字列
          : jis .... JIS 変換後文字列格納バッファ
          : count .. 変換元バイト数
  returns : 変換後バイト数
  remarks : 1) 1バイト/2バイト文字混合対応
          : 2) 2003-02-01、DOS "PRINT.SYS" での「/P1」が無い場合を前提
          :   として改造。すなわち FS-B〜FS-A により、全角:半角の文字
          :   幅比を 2:1 とする。
 *********************************************************************/
DllExport long WINAPI SJis2JisPR201( USCHAR *sjis, USCHAR *jis, short count )
{
    USCHAR *source;
    USCHAR *target;
    USCHAR  jis1, jis2;
    int  Kan = -1;    /* 1=Kan 0 = Not Kan */
    long lngRet = 0L;

    source = sjis;
    target = jis;

    while( count > 0 )
    {
        if( _ismbblead( *source ) )                  /* 漢字第1バイトならば */
        {
            if(Kan != 1)
            {
                Kan = 1;
                *target++ = 0x1C;    /* FS B .... 漢字文字幅 1/5 inch */
                *target++ = 0x42;
                *target++ = 0x1B;    /* ESC K ... 全角漢字・横書き */
                *target++ = 0x4B;
                lngRet += 4;
            }

            jis1 = *source++;
            jis2 = *source++;
            count -= 2;

            change2jis( &jis1, &jis2 );         /* JISコード2バイト分、格納 */
            *target++ = jis1;
            *target++ = jis2;
            lngRet += 2;
        }
        else                                                   /* 非漢字なら */
        {
            if(Kan != 0)
            {
                Kan = 0;
                *target++ = 0x1B;        /* ESC H ... HD パイカモード */
                *target++ = 0x48;
                *target++ = 0x1c;        /* FS A .... 漢字文字幅 3/20 inch */
                *target++ = 0x41;
                lngRet += 4;
            }
            *target++ = *source++;                   /* そのまま1バイト格納 */
            count -= 1;
            lngRet += 1;
        }
    }

    if(Kan == 1)
    {
        *target++ = 0x1B;             /* HD パイカに戻しておく */
        *target++ = 0x48;
        *target++ = 0x1c;             /* FS A .... 漢字文字幅 3/20 inch */
        *target   = 0x41;
        lngRet += 4;
    }

    return( lngRet );
}

/*********************************************************************
 function : sjis2jis
  purpose : シフトJISコードをJISコードへ変換する。
    param.: ch1 = 漢字第1バイト(シフトJIS→JISコード)
            ch2 = 漢字第2バイト(シフトJIS→JISコード)
    notes : ポインタ2変数版(非 short 戻り値版)
 *********************************************************************/
static void change2jis( USCHAR *ch1, USCHAR *ch2 )
{
    int high = *ch1, low = *ch2;

    if( high <= 0x9f )   high -= 0x71;
    else                 high -= 0xb1;

    high = high * 2 + 1;

    if( low > 0x7f )     --low;
    if( low >= 0x9e )
    {
        low -= 0x7d;
        ++high;
    }
    else
    {
        low -= 0x1f;
    }

    *ch1 = (USCHAR)high;
    *ch2 = (USCHAR)low;
}

SJis2Jis.H

/********************************************************************
 file name : SJis2Jis.H
   purpose : SJis2Jis.DLL のためのヘッダファイル(プロトタイプ宣言)

             Version 0.2 / October 31, 2003
 --------------------------------------------------------------------
   history : V0.1/2002-11-19/ 新規作成。
           : V0.2/2003-10-31/ ホームページ用コメント改変。
 ********************************************************************/
#include <windows.h>

#ifndef TRUE
  #define FALSE 0
  #define TRUE  1
#endif

/***** Type Definition *****/
#if !defined( USCDEF )
    typedef unsigned char USCHAR;
#define  USCDEF
#endif

#define DllExport  __declspec( dllexport )

BOOL WINAPI DllMain( HINSTANCE, DWORD, LPVOID );

DllExport long WINAPI SJis2Jis( USCHAR *, USCHAR *, short );

SJis2Jis.Def

LIBRARY   SJis2Jis
DESCRIPTION "Shift JIS -> JIS Code for Printer"
EXPORTS
   SJis2JisEscP  = _SJis2JisEscP@12
   SJis2JisPR201 = _SJis2JisPR201@12

本ページの先頭へ
「LPrint 概要」へ戻る
「ソース1(LPrint.Bas)」へ戻る
「役立たない?/プログラム等」へ戻る


darokugawa@master.email.ne.jp darokugawa@master.email.ne.jp このページ最終更新日 : October 31, 2003