Files
FireBee_Setup/sources/z-tools/trunk/zview/plugins.c

125 lines
3.1 KiB
C

#include "general.h"
#include "ztext.h"
/* Prototype */
int16 plugins_init( void);
void plugins_quit( void);
/* LDG function */
void CDECL( *codec_init)( void) = NULL;
/* Global variable */
int16 plugins_nbr = 0;
LDG *codecs[100];
/*==================================================================================*
* void plugins_quit: *
* unload all the codec from memory. *
*----------------------------------------------------------------------------------*
* input: *
* -- *
*----------------------------------------------------------------------------------*
* returns: *
* -- *
*==================================================================================*/
void plugins_quit( void)
{
int16 i;
for( i = 0; i < plugins_nbr; i++)
ldg_close( codecs[i], ldg_global);
}
/*==================================================================================*
* void plugins_init: *
* load all the codec to memory. *
*----------------------------------------------------------------------------------*
* input: *
* -- *
*----------------------------------------------------------------------------------*
* returns: *
* -- *
*==================================================================================*/
int16 plugins_init( void)
{
char *env_ldg, plugin_dir[MAX_PATH];
DIR *dir;
LDG_INFOS *cook;
struct dirent *de;
int16 len;
char extention[4];
strcpy( plugin_dir, zview_path);
strcat( plugin_dir, "\\codecs");
/* We try to find the zcodecs folder in zview directory... */
if ( chdir( plugin_dir) != 0)
{
shel_envrn( &env_ldg, "LDGPATH=");
/* ...if this directory doesn't exist, we try to find
the zcodecs folder in the default LDG path, with
the LDG cookie or with the environment variable. */
if( ldg_cookie( LDG_COOKIE, ( int32*)&cook))
strcpy( plugin_dir, cook->path);
else if( env_ldg)
strcpy( plugin_dir, env_ldg);
else
strcpy( plugin_dir, "C:\\gemsys\\ldg\\");
len = ( int16)strlen( plugin_dir);
if( plugin_dir[len-1] != '\\')
strcat( plugin_dir, "\\");
strcat( plugin_dir, "codecs");
if ( chdir( plugin_dir) != 0)
return( 0);
}
if (( dir = opendir( ".")) != NULL)
{
while(( de = readdir( dir)) != NULL)
{
if (( strcmp( de->d_name, ".") == 0) || ( strcmp( de->d_name, "..") == 0))
continue;
strcpy ( extention, de->d_name + strlen( de->d_name) - 3);
str2lower( extention);
if( strcmp ( extention, "ldg") == 0)
{
if ( ( codecs[plugins_nbr] = ldg_open( de->d_name, ldg_global)))
{
if ( ( codec_init = ldg_find( "plugin_init", codecs[plugins_nbr])))
{
codec_init();
plugins_nbr++;
}
else
{
errshow( de->d_name, ldg_error());
ldg_close( codecs[plugins_nbr], ldg_global);
}
}
else
{
errshow( de->d_name, ldg_error());
}
}
}
closedir( dir);
}
chdir( zview_path);
return plugins_nbr;
}