More ... | hspcmp:hspcmp.chspcmp.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; } |