Example #1
0
/*
* ML_Init
* Initialize map list. Check if cache file exists, if not create it
*/
void ML_Init( void )
{
	if( ml_initialized )
		return;

	Trie_Create( MLIST_TRIE_CASING, &mlist_filenames_trie );
	Trie_Create( MLIST_TRIE_CASING, &mlist_fullnames_trie );

	Cmd_AddCommand( "maplist", ML_MapListCmd );

	if( MLIST_CACHE_EXISTS )
		ML_InitFromCache();
	else
		ML_InitFromMaps();

	ml_initialized = true;
	ml_flush = true;
}
Example #2
0
void Dynvar_PreInit( void )
{
	assert( !dynvar_initialized );
	assert( !dynvar_preinitialized );

	assert( !dynvar_trie );
	Trie_Create( DYNVAR_TRIE_CASING, &dynvar_trie );

	dynvar_preinitialized = qtrue;
}
Example #3
0
/*
* Cvar_PreInit
*/
void Cvar_PreInit( void )
{
	assert( !cvar_initialized );
	assert( !cvar_preinitialized );

	assert( !cvar_trie );

	Trie_Create( CVAR_TRIE_CASING, &cvar_trie );

	cvar_preinitialized = qtrue;
}
Example #4
0
/*
* CL_MasterAddressCache_Init
*/
static void CL_MasterAddressCache_Init( void )
{
	char *master;
	const char *mlist;

	serverlist_masters_head = NULL;
	Trie_Create( TRIE_CASE_INSENSITIVE, &serverlist_masters_trie );

	// synchronous DNS queries cause interruption of sounds, background music, etc
	// so precache results of resolution queries for all master servers
	mlist = Cvar_String( "masterservers" );
	while( mlist )
	{
		master = COM_Parse( &mlist );
		if( !*master )
			break;
		CL_ResolveMasterAddress( master, NULL );
	}
}
Example #5
0
/*
* CL_MasterAddressCache_Init
*/
static void CL_MasterAddressCache_Init( void )
{
	int numMasters;
	const char *ptr;
	const char *master;
	const char *masterservers;

	Trie_Create( TRIE_CASE_INSENSITIVE, &serverlist_masters_trie );

	resolverThreads = NULL;

	masterservers = Cvar_String( "masterservers" );
	if( !*masterservers ) {
		return;
	}

	// count the number of master servers
	numMasters = 0;
	for( ptr = masterservers; ptr; ) {
		master = COM_Parse( &ptr );
		if( !*master ) {
			break;
		}
		numMasters++;
	}

	// don't allow too many as each will spawn its own resolver thread
	if( numMasters > MAX_MASTER_SERVERS )
		numMasters = MAX_MASTER_SERVERS;

	resolveLock = QMutex_Create();
	if( resolveLock != NULL )
	{
		unsigned numResolverThreads;

		numResolverThreads = 0;
		resolverThreads = malloc( sizeof( *resolverThreads ) * (numMasters+1) );
		memset( resolverThreads, 0, sizeof( *resolverThreads ) * (numMasters+1) );

		for( ptr = masterservers; ptr; )
		{
			char *master_copy;
			qthread_t *thread;

			master = COM_Parse( &ptr );
			if( !*master )
				break;

			master_copy = ( char * )malloc( strlen( master ) + 1 );
			memcpy( master_copy, master, strlen( master ) + 1 );

			thread = QThread_Create( CL_MasterResolverThreadEntry, ( void * )master_copy );
			if( thread != NULL ) {
				resolverThreads[numResolverThreads++] = thread;
				continue;
			}

			// we shouldn't get here if all goes well with the resolving thread
			free( master_copy );
		}
	}
}
Example #6
0
/*
* L10n_ParsePOFile
*
* Doesn't allocate memory, writes to input buffer, which
* should NOT be freed after calling this function.
*/
static trie_t *L10n_ParsePOFile( const char *filepath, char *buffer, int length )
{
	int linenum = 0;
	char *start = buffer, *end = buffer + length;
	char *cur, *eol;
	qboolean have_msgid, have_msgstr, error;
	char *msgid, *msgstr, *instr, *outstr;
	size_t str_length;
	trie_t *dict;
	trie_error_t tr_err;

	tr_err = Trie_Create( TRIE_CASE_SENSITIVE, &dict );
	if( tr_err != TRIE_OK ) {
		return NULL;
	}

	have_msgid = have_msgstr = qfalse;
	instr = outstr = buffer;
	msgid = msgstr = buffer;
	eol = end;

	for( cur = start; cur >= start && cur < end; cur = eol + 1 ) {
		if( !*cur ) {
			break;
		}

		linenum++;

		// skip whitespaces
		while( *cur == ' ' || *cur == '\t' ) {
			cur++;
		}

		// find the end of line
		eol = strchr( cur, '\n' );
		if( eol ) {
			char *prev = eol - 1;
			*eol = '\0';
			if( *prev == '\r' ) {
				*prev = '\0';
			}
		}

		if( *cur == '#' ) {
			continue;
		}

		if( !*cur ) {
			// empty line
			continue;
		}

parse_cmd:
		// search for msgid "id"
		if( !strncmp( cur, "msgid ", 6 ) ) {
			if( have_msgstr ) {
				Trie_Insert( dict, msgid, ( void * )msgstr );
				have_msgid = have_msgstr = qfalse;
			}
			have_msgid = qtrue;
			instr = cur + 6;
			outstr = cur + 5;
			msgid = outstr;
			*msgid = '\0';
		}
		else if( have_msgid && !strncmp( cur, "msgstr ", 7 ) ) {
			have_msgstr = qtrue;
			instr = cur + 7;
			outstr = cur + 6;
			msgstr = outstr;
			*msgstr = '\0';
		}
		else {
			// multiline?
			if( have_msgid || have_msgstr ) {
				if( *cur != '"' || !strrchr( cur+1, '"') ) {
					if( have_msgstr ) {
						Trie_Insert( dict, msgid, ( void * )msgstr );
					}
					// no
					have_msgid = have_msgstr = qfalse;
					goto parse_cmd;
				}
				// yes
				instr = cur;
			} else {
				continue;
			}
		}

		// parse single line of C-style string
		str_length = L10n_ParsePOString( instr, outstr, &error );
		if( !str_length ) {
			have_msgid = have_msgstr = qfalse;
			if( error ) {
				Com_Printf( S_COLOR_YELLOW "Error parsing line %i of %s: syntax error near '%s'\n", 
					linenum, filepath, instr );
			}
		}
		else {
			// shift the output buffer so that in case multiline string
			// is ecountered it'll be properly appended
			outstr += str_length;
		}
	}

	if( have_msgstr ) {
		Trie_Insert( dict, msgid, ( void * )msgstr );
	}

	return dict;
}