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

hspcmp:packfile.c

packfile.c


/*--------------------------------------------------------
        packfile proc  1997/10  onitama
  --------------------------------------------------------*/

#include <windows.h>
#include <windowsx.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <direct.h>

static char szCDir[_MAX_PATH];
static char szDefDir[_MAX_PATH];
static char szFilt[128];
static int enc_mode;   // 暗号化モード(1=normal/2=encode)

typedef struct PFDIR
{
        //  PackFile directory list structure
        //
        int     flag;
        char    fname[128];
        char    pname[_MAX_PATH];

} PFDIR;

#define pfmax 2048
static PFDIR *mem_pf;
static PFDIR *pf;
int pid;

//
//   PackFile manager routines
//

void pf_ini( void )
{
        int a;
        mem_pf = (PFDIR *)malloc(sizeof(PFDIR)*pfmax);
        for( a = 0; a < pfmax; a++) {
                pf = &mem_pf[a];
                pf->flag = 0;
                pf->fname[0] = 0;
                pf->pname[0] = 0;
        }
        pid = 0;
        enc_mode = 1;
}

void pf_bye( void )
{
        free( mem_pf );
}

void pf_add( char *fname, char *pname )
{
        int a, i;
        char nam[128];
        if ( *fname == 0 ) return;
        if ( pname[strlen( pname ) - 1] != '\\' ) strcat( pname, "\\" );

        a = 0;
        if ( pid ) {
                for( i = 0; i < pid; i++ ) {
                        pf = &mem_pf[i];
                        if ( strcmp( pf->fname, fname ) == 0 ) a++;
                }
        }
        if ( a ) {
/*
#ifdef JPMSG
                MessageBox ( hDlg, "すでに登録されているファイル名です。",
                           "packfile warning", MB_OK | MB_ICONEXCLAMATION);
#else
                MessageBox ( hDlg, "Already in use.",
                           "packfile warning", MB_OK | MB_ICONEXCLAMATION);
#endif
*/
                return;
        }
        pf = &mem_pf[pid];
        pf->flag = enc_mode;
        strcpy( pf->fname, fname );
        strcpy( pf->pname, pname );
        pid++;

        if ( enc_mode == 1 ) {
                strcpy( nam, fname );
        }
        else {
                strcpy( nam, "+" );
                strcat( nam, fname );
        }
//      SendDlgItemMessage( hDlg,IDC_LIST3, LB_ADDSTRING,-1,(LPARAM)nam );
}

int pf_find( char *fname )
{
        int a, sel;
        char *p;
        if (pid == 0) return -1;
        sel = -1;
        p = fname;
        if ( *p == '+' ) p++;
        for( a = 0; a < pid; a++ ) {
                pf = &mem_pf[a];
                if ( strcmp( pf->fname, p ) == 0) sel = a;
        }
        return sel;
}

void pf_del( int id )
{
        int a, i;
        i = id;
        if ( pid <= 0 ) return;
        while( 1 ) {
                a = i + 1;
                mem_pf[i].flag = mem_pf[a].flag;
                strcpy( mem_pf[i].fname, mem_pf[a].fname );
                strcpy( mem_pf[i].pname, mem_pf[a].pname );
                i++;
                if (i >= pid) break;
        }
        pid--;
}


int pf_save( void )
{
        char szNow[_MAX_PATH];
        char szDir[_MAX_PATH];
        char stt[256];
        FILE *fp;
        int a, l;

        strcpy( szNow, szDefDir );
        if ( szNow[strlen( szNow ) - 1] != '\\') strcat( szNow, "\\" );

        fp = fopen( "packfile", "wb" );
        if ( fp == NULL ) return -1;
        wsprintf( stt, ";  packfile list for DPM\r\n" );
        fputs( stt, fp );
//      wsprintf( stt,";  Current dir is [%s]\r\n",szNow );
//      fputs( stt,fp );

        if ( pid ) {
                for( a = 0; a < pid; a++ ) {
                        pf = &mem_pf[a];
                        if ( pf->flag ) {
                                strcpy( szDir, pf->pname );
                                l = strlen( szNow );
                                if ( strncmp( szNow, szDir, l ) == 0) {
                                        strcpy( szDir, szDir + l );
                                }
                                if ( pf->flag == 1 ) {
                                        wsprintf( stt, "%s%s\r\n", szDir, pf->fname );
                                }
                                else {
                                        wsprintf( stt, "+%s%s\r\n", szDir, pf->fname );
                                }
                                fputs( stt, fp );
                        }
                }
        }
        fclose( fp );
        return 0;
}

int pf_load( HWND hDlg )
{
        char s0[256];
        char s1[256];
        char s2[256];
        char a1;
        FILE *fp;
        int a, b;
        int enc_bak;

        enc_bak = enc_mode;
        fp = fopen( "packfile", "rb" );
        if ( fp == NULL ) return -1;
        while( 1 ) {
                if ( fgets( s0, 256, fp ) == NULL ) break;
                a1 = *s0;
                if (( a1 != ';' ) && ( a1 != 0 )) {
                        if ( a1 == '+' ) {
                                enc_mode = 2;
                                strcpy( s1, s0 + 1 );
                        } else {
                                enc_mode = 1;
                                strcpy( s1, s0 );
                        }
                        b = -1;
                        for( a = 0; a < (int)strlen( s1 ); a++) {
                                a1 = s1[a];
                                if ( a1 < 32 ) s1[a] = 0;
                                if (a1 == 0x5c ) b = a;
                        }
                        if ( b == -1 )  {
                                strcpy( s2, szDefDir );
//                              pf_add( hDlg,s1,s2 );
                                pf_add( s1, s2 );
                        } else {
                                strcpy( s2, s1 + b + 1 );
                                s1[b] = 0;
//                              pf_add( hDlg,s2,s1 );
                                pf_add( s2, s1 );
                        }
                }
        }
        fclose( fp );
        enc_mode = enc_bak;
        return 0;
}



//
//              Dialog proc
//

/*
void set_dirlist( HWND hDlg )
{
        HWND h;
        getcwd( szCDir, _MAX_PATH ) ;
        h=GetDlgItem( hDlg,IDC_CDIR );SetWindowText( h,szCDir );
        SendDlgItemMessage( hDlg,IDC_LIST1,LB_RESETCONTENT, 0, 0L );
        SendDlgItemMessage( hDlg,IDC_LIST2,LB_RESETCONTENT, 0, 0L );
        SendDlgItemMessage( hDlg,IDC_LIST1,LB_DIR,DDL_READWRITE,(LPARAM)szFilt );
        SendDlgItemMessage( hDlg,IDC_LIST2,
                LB_DIR,DDL_DIRECTORY|DDL_DRIVES|DDL_EXCLUSIVE,(LPARAM)"*.*" );
}
*/

/*
BOOL CALLBACK PlistDlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
        HWND h;
        char szText[128];
        int ctrl_id, i, j;

        switch (message)
        {
        case WM_INITDIALOG:
                h=GetDlgItem( hDlg,IDC_EDIT1 );
                strcpy( szFilt,"*.*" );
                SetWindowText( h,szFilt );
                getcwd( szDefDir, 128 ) ;
                set_dirlist( hDlg );
                pf_ini();
                pf_load( hDlg );
                return TRUE ;

        case WM_CLOSE:
                chdir( szDefDir );
                pf_bye();
                EndDialog (hDlg, 0);
                return TRUE;

        case WM_COMMAND:
                ctrl_id=LOWORD (wParam);
                if (HIWORD (wParam) == LBN_DBLCLK ) {
                        i=SendDlgItemMessage( hDlg,ctrl_id, LB_GETCURSEL,0,0L );
                        SendDlgItemMessage( hDlg,ctrl_id, LB_GETTEXT,i,(LPARAM)szText );
                        if ( ctrl_id==IDC_LIST2 ) {
                                szText[strlen(szText)-1]=0;
                                if (szText[1]=='-') {
                                        szText[3]=':';chdir(szText+2);
                                }
                                else chdir(szText + 1);
                                set_dirlist( hDlg );
                        }
                        if ( ctrl_id==IDC_LIST1 ) {
//                              pf_add( hDlg,szText,szCDir );
                                pf_add( szText,szCDir );
                        }
                        break;
                }
                if ( ctrl_id==IDC_EDIT1 ) {
                        GetDlgItemText( hDlg,IDC_EDIT1,szFilt,128 );
                        set_dirlist( hDlg );
                        break;
                }
                if ( ctrl_id==IDC_CHECK1 ) {
                        enc_mode = 1;
                        if ( IsDlgButtonChecked( hDlg,IDC_CHECK1 )==BST_CHECKED ) enc_mode=2;
                        break;
                }
                switch (wParam)
                {
                case IDCM_ADD:
                        h=GetDlgItem( hDlg,IDC_LIST1 );
                        j=SendMessage( h,LB_GETCOUNT,0,0L );
                        if (j==0) break;
                        for(i=0;i<j;i++) {
                                if ( SendMessage( h,LB_GETSEL,i,0L ) ) {
                                        SendMessage( h, LB_GETTEXT,i,(LPARAM)szText );
//                                      pf_add( hDlg,szText,szCDir );
                                        pf_add( szText,szCDir );
                                }
                        }
                        break;

                case IDCM_ALLSEL:
                        h=GetDlgItem( hDlg,IDC_LIST1 );
                        j=SendMessage( h,LB_GETCOUNT,0,0L );
                        if (j==0) break;
                        for(i=0;i<j;i++) {
                                SendMessage( h, LB_GETTEXT,i,(LPARAM)szText );
//                              pf_add( hDlg,szText,szCDir );
                                pf_add( szText,szCDir );
                        }
                        break;

                case IDCM_DEL:
                        i=SendDlgItemMessage( hDlg,IDC_LIST3, LB_GETCURSEL,0,0L );
                        if (i>=0) {
                                SendDlgItemMessage( hDlg,IDC_LIST3, LB_GETTEXT,i,(LPARAM)szText );
                                SendDlgItemMessage( hDlg,IDC_LIST3, LB_DELETESTRING,i,0L );
                                i=pf_find( szText );
                                pf_del( i );
                        }
                        break;

                case IDCM_CLR:
                        SendDlgItemMessage( hDlg,IDC_LIST3,LB_RESETCONTENT, 0, 0L );
                        pf_bye();
                        pf_ini();
                        break;

                case IDOK:
                        chdir( szDefDir );
                        pf_save();
                        pf_bye();
                        EndDialog (hDlg, 0);
                        return TRUE;

                case IDCANCEL:
                        chdir( szDefDir );
                        pf_bye();
                        EndDialog (hDlg, 0);
                        return TRUE;
                }
                break ;
        }
        return FALSE ;
}
*/