[トップ][編集][ノート][編集履歴][一覧][最近の更新][->English]

hspcmp:hspcmp.c

hspcmp.c


#include <windows.h>
#include  <io.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include "hspcmp.h"

#pragma comment( lib, "kernel32.lib" )
#pragma comment( lib, "user32.lib" )

#define FILE_HSPCMP             "hspcmp.dll"
#define FILE_PACKFILE           "packfile"

#define TMPSIZE 2048

//#define BUF_SIZE      256

#define ARG_FILE        0
#define ARG_PACKFILE    1
#define ARG_ELSE        2

#define MODE_NON        0x0000
#define MODE_ACMD       0x0001
#define MODE_HSPCL      0x0002
#define MODE_HELP       0x1000

/*
        DLL support routines
*/

typedef BOOL (CALLBACK *DLLFUNC)(int, int, int, int);

DLLFUNC hsc_ini;
DLLFUNC hsc_refname;
DLLFUNC hsc_objname;
DLLFUNC hsc_comp;
DLLFUNC hsc_getmes;
DLLFUNC hsc_clrmes;
DLLFUNC hsc_ver;
DLLFUNC hsc_bye;
DLLFUNC pack_ini;
DLLFUNC pack_make;
DLLFUNC pack_exe;
DLLFUNC pack_opt;
DLLFUNC pack_rt;
DLLFUNC hsc3_getsym;
DLLFUNC hsc3_make;
DLLFUNC hsc3_messize;

static  int dllflg = 0;                 // DLL uses flag
static  HINSTANCE hDLL;                 // Handle to DLL

char *SetDllFunc( char *name )
{
        //              DLL関数を割り当てる
        //
        char *ent;
        char fncname[128];
        fncname[0] = '_';
        strcpy( fncname + 1, name );
        strcat( fncname, "@16" );
        ent = (char *)GetProcAddress( hDLL, fncname );
        if ( ent == NULL ) dllflg = -1;              // error flag
        return ent;
}

int dll_ini( char *libname )
{
        //              Initalize DLL entry
        //                      (result:1=ok)
        //
        hDLL = LoadLibrary( libname );
        if ( hDLL == NULL ) return 0;

        dllflg = 1;
        hsc_ini = (DLLFUNC)SetDllFunc( "hsc_ini" );
        hsc_refname = (DLLFUNC)SetDllFunc( "hsc_refname" );
        hsc_objname = (DLLFUNC)SetDllFunc( "hsc_objname" );
        hsc_comp = (DLLFUNC)SetDllFunc( "hsc_comp" );
        hsc_getmes = (DLLFUNC)SetDllFunc( "hsc_getmes" );
        hsc_clrmes = (DLLFUNC)SetDllFunc( "hsc_clrmes" );
        hsc_ver = (DLLFUNC)SetDllFunc( "hsc_ver" );
        hsc_bye = (DLLFUNC)SetDllFunc( "hsc_bye" );
        pack_ini = (DLLFUNC)SetDllFunc( "pack_ini" );
        pack_make = (DLLFUNC)SetDllFunc( "pack_make" );
        pack_exe = (DLLFUNC)SetDllFunc( "pack_exe" );
        pack_opt = (DLLFUNC)SetDllFunc( "pack_opt" );
        pack_rt = (DLLFUNC)SetDllFunc( "pack_rt" );
        hsc3_getsym = (DLLFUNC)SetDllFunc( "hsc3_getsym" );
        hsc3_make = (DLLFUNC)SetDllFunc( "hsc3_make" );
        hsc3_messize = (DLLFUNC)SetDllFunc( "hsc3_messize" );

        return dllflg;
}

void dll_bye( void )
{
        //              Release DLL entry
        //
        if ( dllflg == 0 ) return;
        if ( dllflg == 1 ) {
                hsc_bye( 0, 0, 0, 0 );   // 後始末routine
        }
        FreeLibrary( hDLL );
        dllflg = 0;
}

void runexe( void )
{
/*
                HSP compile support routines
*/

        char hsp_file[128];                             // ソーススクリプトファイル名
        char objname[128];                              // オブジェクトファイル名
        char errbuf[32000];                             // エラーメッセージ格納の領域
        char execmd[128];                               // ソーススクリプトファイル名
        int              a;

        //              Compile as file
        //
        strcat( hsp_file, "test.as" );
        strcat( objname, "test.ax" );
        hsc_ini( 0, (int)hsp_file, 0, 0 );
        hsc_objname( 0, (int)objname, 0, 0 );
        a = hsc_comp( 1, 0, 0, 0 );
        if ( a ) {
                hsc_getmes( (int)errbuf, 0, 0, 0 );
        }

        //              execute HSP2 process
        //
        strcpy( execmd, "hsp3 " );
//      if (hsp_fullscr) strcat( execmd,"*" );  // フルスクリーンモード時
//      if (hsp_debug) strcat( execmd,"@" );    // デバッグウインドゥ表示時
        strcat( execmd, objname );
//      WinExec( execmd,SW_SHOW );              // HSP2.EXEを実行
}

static void setpackfile( char *fname, char szExeDir[] )
{
//      char tmpst[_MAX_PATH + 1];
//      char srcfn[_MAX_PATH + 1];
        pf_ini();
        pf_add( fname, szExeDir );
        pf_save();
        pf_bye();
        return;
}

static int SetCmpFile( char *fname, char szExeDir[] )
{
        int a;
        char tmpst[_MAX_PATH + 1];
        char srcfn[_MAX_PATH + 1];
        char message[4096];

        strcpy( srcfn, fname );
        strcpy( tmpst, "start.ax" );

        hsc_ini( 0, (int)srcfn, 0, 0 );
        hsc_refname( 0, (int)fname, 0, 0 );
        hsc_objname( 0, (int)tmpst, 0, 0 );
        a = hsc_comp( 0, 0 | 4, 0, 0 );
        printf( "%s\n", srcfn);
        printf( "コンパイル中...\n" );
        hsc_getmes( (int)message, 0, 0, 0 );
        printf( message );
        if ( a ) return a;

/*
        if( (_access( FILE_PACKFILE, 0 )) == -1 ) {
                pf_ini();
                pf_add( tmpst, szExeDir );
                pf_save();
                pf_bye();
        }
*/
        pack_ini( 0, (int)fname, 0, 0 );
        pack_make( 0, 0, 0, 0 );
        return 0L;
}

/*
static int SetPackFile( char *fname )
{
        return 0L;
}
*/

static int compexe( char szExeDir[] )
{
        char hh[_MAX_PATH + 1];
        char message[4096];
        wsprintf( hh, "%s\\hsprt", szExeDir );
        pack_rt( 0, (int)hh, 0, 0 );
        pack_opt( 640, 480, 0, 0 );
        pack_exe(0, 0, 0, 0 );
        hsc_getmes( (int)message, 0, 0, 0);
        printf( message );
        return 0L;
}

static int mkexefile2( char *fname, char szExeDir[] )
{
        //      auto make exe file (ver2.6)
        //
        int a;
        char tmpst[_MAX_PATH + 1];
        char srcfn[_MAX_PATH + 1];
        char ftmp[_MAX_PATH + 1];
        strcpy( srcfn, fname );
        strcpy( tmpst, "start.ax" );

        hsc_ini( 0, (int)srcfn, 0, 0 );
        hsc_refname( 0, (int)fname, 0, 0 );
        hsc_objname( 0, (int)tmpst, 0, 0 );
        a = hsc_comp( 0, 0 | 4, 0, 0 );
        printf( "%s\n", srcfn);
        if ( a ) return a;

        sprintf( ftmp, "%s\\%s.dpm", szExeDir, srcfn );
        a=hsc3_make( 0, (int)ftmp, 0, 0 );
        if ( a ) return a;
        return 0;
}

int ChkCmdLine(char arg) {
        switch( arg )
        {
        //help
        case 'H':
        case 'h':
        case '?':
                return MODE_HELP;
        case 'C':
        case 'c':
                return MODE_HSPCL;
        default:
                return MODE_HELP;
        }
        return MODE_HELP;
}

int main( int argc, char *argv[] )
{
        char szExeDir[_MAX_PATH + 1];
        char szDirName[_MAX_PATH + 1];
        char szFileName[_MAX_PATH + 1];
        char szStartDir[_MAX_PATH + 1];
        char szCmdline[_MAX_PATH + 1];
        char szDllDir[_MAX_PATH + 1];
        int  a;
        char a1;
        int  i;
        char *arg, *cmp_as_file = NULL;
        int mode;
        GetModuleFileName( NULL,szExeDir, _MAX_PATH );

        a = strlen( szExeDir ) - 1;

        while( 1 ) {
                a1 = szExeDir[a];
                if ( a1 == '\\' ) break;
                a--;
        }
        szExeDir[a] = 0;

        //  DLLを初期化
        strcpy( szDllDir, szExeDir );
        strcat( szDllDir, "\\" );
        strcat( szDllDir, FILE_HSPCMP );

        if(dll_ini( szDllDir ) != 1) {
                printf( "%sが見つかりませんでした。\n", szDllDir );
                dll_bye();
                return -1;
        }

        DispVer();       // バージョンの表示

        if(argc <= 1) {
                DispHelp( argv[0] );
                dll_bye();
                return 0;
        }
        if(argc > 1) {
                mode = MODE_NON;
                for( i = 1; i < argc; i++ ) {
                        arg = argv[i];
                        if( arg[0] == '-' || arg[0] == '/' ) {
                                switch(strlen(arg))
                                {
                                case 1:
                                        mode |= MODE_HELP;
                                        break;
                                case 2:
                                        mode |= ChkCmdLine( arg[1] );
                                        break;
                                default:
                                        mode |= MODE_HELP;
                                        break;
                                }
                        } else if( !( mode && MODE_HELP ) ) {
                                cmp_as_file = arg;
                        }
                }
        }
        if(mode & MODE_HELP) {
                DispHelp( argv[0] );
        } else if( cmp_as_file != NULL ) {
                if( SetCmpFile( cmp_as_file, szExeDir ) ) {
//                      char message[4096];
//                      hsc_getmes((int)message, 0, 0, 0);
//                      printf( "error file by %s\n", arg );
//                      printf("%s\n", message);
                } else {
                        compexe( szExeDir );
                }
        } else {
                printf( "%s\n", arg );
        }
        dll_bye();

        return 0L;
}