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 |
このページ最終更新日 : October 31, 2003 |
|