www.pudn.com > bladeenc-0.90.0-src.zip > bladesys.c


/* 
 
			(c) Copyright 1998, 1999 - Tord Jansson 
			======================================= 
 
		This file is part of the BladeEnc MP3 Encoder, based on 
		ISO's reference code for MPEG Layer 3 compression. 
 
		This file doesn't contain any of the ISO reference code and 
		is copyright Tord Jansson (tord.jansson@swipnet.se). 
 
	BladeEnc is free software; you can redistribute this file 
	and/or modify it under the terms of the GNU Lesser General Public 
	License as published by the Free Software Foundation; either 
	version 2.1 of the License, or (at your option) any later version. 
 
*/ 
 
/****************************************************************************** 
							>>> BLADESYS <<< 
 
The intention of this file is to keep all system specific things away from the 
rest of the code. 
 
******************************************************************************/ 
 
 
 
#include	 
#include     
#include     
#include     
#include	 
#include    "system.h" 
 
#ifdef  MSWIN 
#	include	 
#	include     
#	include     
#endif 
 
 
#ifdef OS2 
#	define INCL_DOSFILEMGR 
#	define INCL_DOSERRORS 
#	define INCL_DOSPROCESS 
#	include  
#	include "os2key.h" 
#endif 
 
#ifdef UNIX_SYSTEM 
#	include	 
#	include	 
#	include	 
#	include	 
 
#	ifndef	PRIO_MAX 
#		define	PRIO_MAX	20 
#		define	PRIO_MIN	-20 
#	endif 
 
 
#endif 
 
#if	SYSTEM == MAC_OS 
#        include "EventHandling.h" 
#endif 
 
 
#include	"codec.h" 
#include    "samplein.h" 
#include	"arglink.h" 
#include	"bladesys.h" 
 
 
/****************************************************************************** 
 
				>>> SYSTEM FOR PRIORITY HANDLING <<< 
 
 
******************************************************************************/ 
 
 
#ifdef OS2 
 
typedef struct 
{ 
	ULONG ulClass; 
	LONG loDelta; 
} OS2PRIORITIES; 
 
OS2PRIORITIES OS2PrioTab[] = 
    { 
        { PRTYC_IDLETIME, 0 }, 
        { PRTYC_IDLETIME, 31 }, 
        { PRTYC_REGULAR, -31 }, 
        { PRTYC_REGULAR, 0 }, 
        { PRTYC_REGULAR, 31 }, 
        { PRTYC_TIMECRITICAL, 0 }, 
    }; 
 
#endif 
 
 
int	setPriority( char * pPrioString ) 
{ 
 
#ifdef  MSWIN 
	HANDLE	hThread; 
 
	hThread = GetCurrentThread(); 
 
	if( pPrioString == NULL ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_LOWEST );				/* Set default priority if NULL! */ 
	else if( strcmp( pPrioString, "HIGHEST" ) == 0 ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_HIGHEST ); 
	else if( strcmp( pPrioString, "HIGHER" ) == 0 ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_ABOVE_NORMAL ); 
	else if( strcmp( pPrioString, "NORMAL" ) == 0 ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_NORMAL ); 
 
	else if( strcmp( pPrioString, "LOWER" ) == 0 ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_BELOW_NORMAL ); 
	else if( strcmp( pPrioString, "LOWEST" ) == 0 ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_LOWEST ); 
	else if( strcmp( pPrioString, "IDLE" ) == 0 ) 
		SetThreadPriority( hThread, THREAD_PRIORITY_IDLE ); 
	else 
		return	FALSE; 
 
#endif 
 
 
#ifdef OS2 
	APIRET	rc; 
	int			prio; 
 
	if( pPrioString == NULL ) 
		prio = 1;												/* Set default priority if NULL! */ 
	else if( strcmp( pPrioString, "HIGHEST" ) == 0 ) 
		prio = 5; 
	else if( strcmp( pPrioString, "HIGHER" ) == 0 ) 
		prio = 4; 
	else if( strcmp( pPrioString, "NORMAL" ) == 0 ) 
		prio = 3; 
	else if( strcmp( pPrioString, "LOWER" ) == 0 ) 
		prio = 2; 
	else if( strcmp( pPrioString, "LOWEST" ) == 0 ) 
		prio = 1; 
	else if( strcmp( pPrioString, "IDLE" ) == 0 ) 
		prio = 0; 
	else 
		return	FALSE; 
 
	if ((rc = DosSetPriority (PRTYS_PROCESS, 
	                          OS2PrioTab[prio].ulClass, 
	                          OS2PrioTab[prio].loDelta, 
	                          0L)) != NO_ERROR) 
	{ 
		printf (" DosSetPriority error : rc = %u\n", rc); 
		exit(1); 
	} 
#endif 
 
 
#ifdef	UNIX_SYSTEM 
	pid_t	my_pid; 
	int		prio; 
 
	if( pPrioString == NULL ) 
		prio = (PRIO_MAX + PRIO_MIN)/2;							/* Set default priority if NULL! */ 
	else if( strcmp( pPrioString, "HIGHEST" ) == 0 ) 
		prio = PRIO_MIN; 
	else if( strcmp( pPrioString, "HIGHER" ) == 0 ) 
		prio = (PRIO_MAX + PRIO_MIN + PRIO_MIN)/3; 
	else if( strcmp( pPrioString, "NORMAL" ) == 0 ) 
		prio = (PRIO_MAX + PRIO_MIN)/2; 
	else if( strcmp( pPrioString, "LOWER" ) == 0 ) 
		prio = (PRIO_MAX + PRIO_MAX + PRIO_MIN)/3; 
	else if( strcmp( pPrioString, "LOWEST" ) == 0 ) 
		prio = (PRIO_MAX + PRIO_MAX + PRIO_MAX + PRIO_MIN)/4; 
	else if( strcmp( pPrioString, "IDLE" ) == 0 ) 
		prio = PRIO_MAX; 
	else 
	{ 
		prio = atoi( pPrioString ); 
		if( prio < PRIO_MIN ) 
			prio = PRIO_MIN; 
		if( prio > PRIO_MAX ) 
			prio = PRIO_MAX; 
	} 
	my_pid = getpid(); 
	setpriority( PRIO_PROCESS, my_pid, prio ); 
#endif 
 
	/* Include Prioritysettings for other systems here... */ 
 
	return	TRUE; 
} 
 
 
/* Some systems are by default using text-input/output instead of binary.:-( */ 
 
void	prepStdin( void ) 
{ 
#ifdef	MSWIN 
	_setmode(_fileno(stdin), _O_BINARY ); 
#endif 
} 
 
void	prepStdout( void ) 
{ 
#ifdef	MSWIN 
	_setmode(_fileno(stdout), _O_BINARY ); 
#endif 
} 
 
 
/****************************************************************************** 
 
											>>> ROUTINES FOR KEYHANDLING <<< 
 
******************************************************************************/ 
 
 
int		be_kbhit( void ) 
{ 
#ifdef	MSWIN 
	return	kbhit(); 
#endif 
#ifdef	OS2 
	return	DosKeyAvailable(); 
#endif 
	return	0; 
} 
 
int		be_getch( void ) 
{ 
#if	defined(MSWIN) || defined(OS2) 
	return	getch(); 
#endif 
	return	0; 
} 
 
/****************************************************************************** 
 
		>>> EXPAND WILDCARDS FOR SYSTEMS THAT DON'T DO IT AUTOMATICALLY <<< 
 
******************************************************************************/ 
 
#ifdef	WILDCARDS 
 
 
 
int findFirstMatch( char * pFileName, char * wpName ); 
int findNextMatch(  char * pFileName, char * wpName ); 
 
 
/*____ expandWildcards() ____________________________________________________*/ 
 
int	expandWildcards( argLink ** ppArgLink ) 
{ 
	argLink * pFirstNewLink = NULL; 
	argLink ** wppPrev = &pFirstNewLink; 
	 
	argLink * pArgLink = * ppArgLink; 
	argLink * pTmp; 
	 
	int		nNew = 0; 
	int		x; 
	char	temp[MAX_NAMELEN]; 
 
	while( pArgLink != NULL ) 
	{ 
#ifdef	MSWIN 
		if( strchr( pArgLink->pString, '*' ) != NULL || strchr( pArgLink->pString, '?' ) != NULL 
		    || strchr( pArgLink->pString, '~' ) != NULL ) 
#else 
		if( strchr( pArgLink->pString, '*' ) != NULL || strchr( pArgLink->pString, '?' ) != NULL ) 
#endif 
		{ 
			x = findFirstMatch( pArgLink->pString, temp ); 
			while( x == TRUE ) 
			{ 
				pTmp = insertStringInArgLink( wppPrev, temp ); 
				wppPrev = &pTmp->psNext; 
				nNew++; 
 
				x = findNextMatch( pArgLink->pString, temp ); 
			} 
			pTmp = pArgLink; 
			pArgLink = pArgLink->psNext; 
			free( pTmp ); 
		} 
		else 
		{ 
			* wppPrev = pArgLink; 
			wppPrev = &pArgLink->psNext; 
			pArgLink = pArgLink->psNext; 
		}		 
	} 
 
	* wppPrev = NULL; 
	* ppArgLink = pFirstNewLink; 
	return	nNew; 
} 
 
 
 
#ifdef  MSWIN 
 
static struct   _finddata_t sFind; 
static long             hFind; 
 
 
/*____ findFirstMatch() - MSWIN version ______________________________________*/ 
 
int findFirstMatch( char * pFileName, char * wpName ) 
{ 
	int		x; 
 
	hFind = _findfirst( pFileName, &sFind ); 
	if( hFind == -1 ) 
		return  FALSE; 
 
	if( (sFind.attrib & _A_SUBDIR) != 0 ) 
		return findNextMatch( pFileName, wpName ); 
 
 
	strcpy( wpName, pFileName ); 
	for( x = strlen(wpName)-1 ; wpName[x] != '\\' && wpName[x] !='/' 
	        && wpName[x] != ':' && x > 0 ; x-- ); 
 
	if( x != 0 ) 
		x++; 
	strcpy( wpName + x, sFind.name ); 
	return TRUE; 
} 
 
 
/*____ findNextMatch() - MSWIN version _______________________________________*/ 
 
int findNextMatch( char * pFileName, char * wpName ) 
{ 
	int		x; 
 
	while( 1 ) 
	{ 
		if( _findnext( hFind, &sFind ) != 0 ) 
			return  FALSE; 
 
		if( (sFind.attrib & _A_SUBDIR) == 0 ) 
		{ 
			strcpy( wpName, pFileName ); 
			for( x = strlen(wpName)-1 ; wpName[x] != '\\' && wpName[x] !='/' 
			        && wpName[x] != ':' && x > 0 ; x-- ); 
 
			if( x != 0 ) 
				x++; 
			strcpy( wpName + x, sFind.name ); 
			return TRUE; 
		} 
	} 
} 
 
#endif  /* MSWIN */ 
 
#ifdef OS2 
 
static HDIR          hdirFindHandle = HDIR_SYSTEM; 
static FILEFINDBUF3  FindBuffer     = {0}; 
static ULONG         ulResultBufLen = sizeof(FILEFINDBUF3); 
static ULONG         ulFindCount    = 1; 
 
 
/*____ findFirstMatch() - OS/2 version _______________________________________*/ 
 
int     findFirstMatch( char * pFileName, char * wpName ) 
{ 
	int		x; 
	APIRET	rc = NO_ERROR; 
 
	ulFindCount = 1; 
	rc = DosFindFirst( pFileName, 
	                   &hdirFindHandle, 
	                   FILE_NORMAL, 
	                   &FindBuffer, 
	                   ulResultBufLen, 
	                   &ulFindCount, 
	                   FIL_STANDARD); 
 
	if (rc != NO_ERROR) 
		return FALSE; 
 
	if( (FindBuffer.attrFile & FILE_DIRECTORY) != 0 ) 
		return findNextMatch( pFileName, wpName ); 
 
 
	strcpy( wpName, pFileName ); 
	for( x = strlen(wpName)-1 ; wpName[x] != '\\' && wpName[x] !='/' 
	        && wpName[x] != ':' && x > 0 ; x-- ); 
 
	if( x != 0 ) 
		x++; 
	strcpy( wpName + x, FindBuffer.achName ); 
	return TRUE; 
} 
 
 
/*____ findNextMatch() - OS/2 version ________________________________________*/ 
 
int     findNextMatch( char * pFileName, char * wpName ) 
{ 
	int		x; 
	APIRET	rc = NO_ERROR; 
 
	while( 1 ) 
	{ 
		ulFindCount = 1; 
 
		if ((rc = DosFindNext(hdirFindHandle, 
		                      &FindBuffer, 
		                      ulResultBufLen, 
		                      &ulFindCount)) != NO_ERROR) 
		{ 
			if ((rc = DosFindClose(hdirFindHandle)) != NO_ERROR) 
				printf("DosFindClose error: return code = %u\n",rc); 
			return FALSE; 
		} 
 
		if( (FindBuffer.attrFile & FILE_DIRECTORY) == 0 ) 
		{ 
			strcpy( wpName, pFileName ); 
			for( x = strlen(wpName)-1 ; wpName[x] != '\\' && wpName[x] !='/' 
			        && wpName[x] != ':' && x > 0 ; x-- ); 
 
			if( x != 0 ) 
				x++; 
			strcpy( wpName + x, FindBuffer.achName ); 
			return TRUE; 
		} 
	} 
} 
 
#endif /* OS/2 */ 
 
 
#endif /* WILDCARDS */ 
 
 
/****************************************************************************** 
 
				>>> Routine for finding config file <<< 
 
******************************************************************************/ 
 
/*____ findConfigFile() _____________________________________________________*/ 
 
int findConfigFile( char * pExepath, char * wpPath ) 
{ 
	char	* pTmp; 
	FILE	* fp; 
 
#ifdef	MSWIN 
	strcpy( wpPath, pExepath ); 
	pTmp = wpPath + strlen( wpPath) -1; 
	while( * pTmp != '\\' && pTmp != wpPath ) 
		pTmp--; 
 
	if( * pTmp == '\\' ) 
		pTmp++; 
 
	strcpy( pTmp, "bladeenc.cfg" ); 
 
	fp = fopen( wpPath, "r" ); 
	if( fp != NULL ) 
	{ 
		fclose( fp ); 
		return	TRUE; 
	} 
#endif 
 
 
#ifdef	UNIX_SYSTEM 
	pTmp = getenv( "HOME" ); 
	if( pTmp != NULL ) 
	{ 
		strcpy( wpPath, pTmp ); 
		if( wpPath[strlen(wpPath)-1] != '/' ) 
			strcat( wpPath, "/" ); 
 
		strcat( wpPath, ".bladeencrc" ); 
		fp = fopen( wpPath, "r" ); 
		if( fp != NULL ) 
		{ 
			fclose( fp ); 
			return	TRUE; 
		} 
	} 
#endif 
 
#if	SYSTEM == MAC_OS 
 strcpy( wpPath, pExepath ); 
 pTmp = wpPath + strlen( wpPath) -1; 
 while( * pTmp != ':' ) 
         pTmp--; 
 
 strcpy( pTmp+1, MAC_BLADEENC_PREFSFILE ); 
 
 fp = fopen( wpPath, "r" ); 
 if( fp != NULL ) 
 { 
         fclose( fp ); 
         return  TRUE; 
 } 
#endif 
 
	return	FALSE; 
}