Beispiel #1
0
void scan_libInfo ( char * libfile )
{
	FILE * fp;
	char line[1024], ch;
	int i, j, index;
	int libCounter;
	boolean flag;
	boolean * pe;
	fp = ckopen ( libfile, "r" );
	num_libs = 0;

	while ( fgets ( line, 1024, fp ) )
	{
		ch = line[5];
		line[5] = '\0';

		if ( strcmp ( line, "[LIB]" ) == 0 )
		{
			num_libs++;
		}

		if ( !num_libs )
		{
			line[5] = ch;
			flag = splitColumn ( line );

			if ( !flag )
			{
				continue;
			}

			if ( strcmp ( tabs[0], "max_rd_len" ) == 0 )
			{
				maxReadLen = atoi ( tabs[1] );
			}
		}
	}

	if ( num_libs == 0 )
	{
		fprintf ( stderr, "Config file error: no [LIB] in file\n" );
		exit ( -1 );
	}

	//count file numbers of each type
	lib_array = ( LIB_INFO * ) ckalloc ( num_libs * sizeof ( LIB_INFO ) );
	pe = ( boolean * ) ckalloc ( num_libs * sizeof ( boolean ) );

	for ( i = 0; i < num_libs; i++ )
	{
		lib_array[i].asm_flag = 3;
		lib_array[i].rank = 0;
		lib_array[i].pair_num_cut = 0;
		lib_array[i].rd_len_cutoff = 0;
		lib_array[i].map_len = 0;
		lib_array[i].num_s_a_file = 0;
		lib_array[i].num_s_q_file = 0;
		lib_array[i].num_p_file = 0;
		lib_array[i].num_a1_file = 0;
		lib_array[i].num_a2_file = 0;
		lib_array[i].num_q1_file = 0;
		lib_array[i].num_q2_file = 0;
		lib_array[i].num_b_file = 0;    //init
		pe[i] = false;
	}

	libCounter = -1;
	rewind ( fp );
	i = -1;

	while ( fgets ( line, 1024, fp ) )
	{
		ch = line[5];
		line[5] = '\0';

		if ( strcmp ( line, "[LIB]" ) == 0 )
		{
			i++;
			continue;
		}

		line[5] = ch;
		flag = splitColumn ( line );

		if ( !flag )
		{
			continue;
		}

		if ( strcmp ( tabs[0], "f1" ) == 0 )
		{
			lib_array[i].num_a1_file++;
			pe[i] = true;
		}
		else if ( strcmp ( tabs[0], "q1" ) == 0 )
		{
			lib_array[i].num_q1_file++;
			pe[i] = true;
		}
		else if ( strcmp ( tabs[0], "f2" ) == 0 )
		{
			lib_array[i].num_a2_file++;
			pe[i] = true;
		}
		else if ( strcmp ( tabs[0], "q2" ) == 0 )
		{
			lib_array[i].num_q2_file++;
			pe[i] = true;
		}
		else if ( strcmp ( tabs[0], "f" ) == 0 )
		{
			lib_array[i].num_s_a_file++;
		}
		else if ( strcmp ( tabs[0], "q" ) == 0 )
		{
			lib_array[i].num_s_q_file++;
		}
		else if ( strcmp ( tabs[0], "p" ) == 0 )
		{
			lib_array[i].num_p_file++;
			pe[i] = true;
		}
		else if ( strcmp ( tabs[0], "b" ) == 0 ) // the bam file
		{
			lib_array[i].num_b_file++;
			pe[i] = true;
		}
	}

	//allocate memory for filenames
	for ( i = 0; i < num_libs; i++ )
	{
		if ( lib_array[i].num_a2_file != lib_array[i].num_a1_file )
		{
			fprintf ( stderr, "Config file error: the number of mark \"f1\" is not the same as \"f2\"!\n" );
			exit ( -1 );
		}

		if ( lib_array[i].num_q2_file != lib_array[i].num_q1_file )
		{
			fprintf ( stderr, "Config file error: the number of mark \"q1\" is not the same as \"q2\"!\n" );
			exit ( -1 );
		}

		if ( lib_array[i].num_s_a_file )
		{
			lib_array[i].s_a_fname = ( char ** ) ckalloc ( lib_array[i].num_s_a_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_s_a_file; j++ )
			{
				lib_array[i].s_a_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_s_q_file )
		{
			lib_array[i].s_q_fname = ( char ** ) ckalloc ( lib_array[i].num_s_q_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_s_q_file; j++ )
			{
				lib_array[i].s_q_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_p_file )
		{
			lib_array[i].p_fname = ( char ** ) ckalloc ( lib_array[i].num_p_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_p_file; j++ )
			{
				lib_array[i].p_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_a1_file )
		{
			lib_array[i].a1_fname = ( char ** ) ckalloc ( lib_array[i].num_a1_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_a1_file; j++ )
			{
				lib_array[i].a1_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_a2_file )
		{
			lib_array[i].a2_fname = ( char ** ) ckalloc ( lib_array[i].num_a2_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_a2_file; j++ )
			{
				lib_array[i].a2_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_q1_file )
		{
			lib_array[i].q1_fname = ( char ** ) ckalloc ( lib_array[i].num_q1_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_q1_file; j++ )
			{
				lib_array[i].q1_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_q2_file )
		{
			lib_array[i].q2_fname = ( char ** ) ckalloc ( lib_array[i].num_q2_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_q2_file; j++ )
			{
				lib_array[i].q2_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) );
			}
		}

		if ( lib_array[i].num_b_file )  //allot memory for bam file name
		{
			lib_array[i].b_fname = ( char ** ) ckalloc ( lib_array[i].num_b_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_b_file; j++ )
				{ lib_array[i].b_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}
	}

	// get file names
	for ( i = 0; i < num_libs; i++ )
	{
		lib_array[i].curr_type = 1;
		lib_array[i].curr_index = 0;
		lib_array[i].fp1 = NULL;
		lib_array[i].fp2 = NULL;
		lib_array[i].num_s_a_file = 0;
		lib_array[i].num_s_q_file = 0;
		lib_array[i].num_p_file = 0;
		lib_array[i].num_a1_file = 0;
		lib_array[i].num_a2_file = 0;
		lib_array[i].num_q1_file = 0;
		lib_array[i].num_q2_file = 0;
		lib_array[i].num_b_file = 0;    //init
		lib_array[i].fp3 = NULL;
	}

	libCounter = -1;
	rewind ( fp );
	i = -1;

	while ( fgets ( line, 1024, fp ) )
	{
		ch = line[5];
		line[5] = '\0';

		if ( strcmp ( line, "[LIB]" ) == 0 )
		{
			i++;
			continue;
		}

		line[5] = ch;
		flag = splitColumn ( line );

		if ( !flag )
		{
			continue;
		}

		if ( strcmp ( tabs[0], "f1" ) == 0 )
		{
			index = lib_array[i].num_a1_file++;
			strcpy ( lib_array[i].a1_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "q1" ) == 0 )
		{
			index = lib_array[i].num_q1_file++;
			strcpy ( lib_array[i].q1_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "f2" ) == 0 )
		{
			index = lib_array[i].num_a2_file++;
			strcpy ( lib_array[i].a2_fname[index], tabs[1] );

			if ( strcmp ( lib_array[i].a2_fname[index], lib_array[i].a1_fname[index] ) == 0 )
			{
				fprintf ( stderr, "Config file error: f2 file is the same as f1 file\n" );
				fprintf ( stderr, "f1=%s\n", lib_array[i].a1_fname[index] );
				fprintf ( stderr, "f2=%s\n", lib_array[i].a2_fname[index] );
				exit ( -1 );
			}
		}
		else if ( strcmp ( tabs[0], "q2" ) == 0 )
		{
			index = lib_array[i].num_q2_file++;
			strcpy ( lib_array[i].q2_fname[index], tabs[1] );

			if ( strcmp ( lib_array[i].q2_fname[index], lib_array[i].q1_fname[index] ) == 0 )
			{
				fprintf ( stderr, "Config file error: q2 file is the same as q1 file\n" );
				fprintf ( stderr, "q1=%s\n", lib_array[i].q1_fname[index] );
				fprintf ( stderr, "q2=%s\n", lib_array[i].q2_fname[index] );
				exit ( -1 );
			}
		}
		else if ( strcmp ( tabs[0], "f" ) == 0 )
		{
			index = lib_array[i].num_s_a_file++;
			strcpy ( lib_array[i].s_a_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "q" ) == 0 )
		{
			index = lib_array[i].num_s_q_file++;
			strcpy ( lib_array[i].s_q_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "p" ) == 0 )
		{
			index = lib_array[i].num_p_file++;
			strcpy ( lib_array[i].p_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "b" ) == 0 )
		{
			//bam file
			index = lib_array[i].num_b_file++;
			strcpy ( lib_array[i].b_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "min_ins" ) == 0 )
		{
			lib_array[i].min_ins = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "max_ins" ) == 0 )
		{
			lib_array[i].max_ins = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "avg_ins" ) == 0 )
		{
			lib_array[i].avg_ins = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "rd_len_cutoff" ) == 0 )
		{
			lib_array[i].rd_len_cutoff = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "reverse_seq" ) == 0 )
		{
			lib_array[i].reverse = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "asm_flags" ) == 0 )
		{
			lib_array[i].asm_flag = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "rank" ) == 0 )
		{
			lib_array[i].rank = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "pair_num_cutoff" ) == 0 )
		{
			lib_array[i].pair_num_cut = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "rd_len_cutoff" ) == 0 )
		{
			lib_array[i].rd_len_cutoff = atoi ( tabs[1] );
		}
		else if ( strcmp ( tabs[0], "map_len" ) == 0 )
		{
			lib_array[i].map_len = atoi ( tabs[1] );
		}
	}

	for ( i = 0; i < num_libs; i++ )
	{
		if ( pe[i] && lib_array[i].avg_ins == 0 )
		{
			fprintf ( stderr, "Config file error: PE reads need avg_ins in [LIB] %d\n", i + 1 );
			exit ( -1 );
		}
	}

	fclose ( fp );
	qsort ( &lib_array[0], num_libs, sizeof ( LIB_INFO ), cmp_lib );
}
Beispiel #2
0
// Inserts column(s) such that a note can start at ts and end at te
// Sets current position to starting column
// Returns note duration in columns
// Ignores bar structure, therefore use only in last bar
int TabTrack::insertColumn(int ts, int te)
{
//	cout << "TabTrack::insertColumn("
//		<< ts << ", " << te << ")" << endl;
	int cstart;
	int cend;
	int dur;
	int res = 0;

	if ((ts<0) || (te<=ts)) {
		// LVIFIX: report error ?
//		cout << "TabTrack::insertColumn() -> input error" << endl;
		return -1;
	}

	int td = trackDuration();
//	cout << "td=" << td << endl;
	if (ts > td) {
//		cout << "TabTrack::insertColumn() ->"
//			<< " ts > td, append rest: " << ts - td
//			<< endl;
		x = c.size();
		insertColumn(1);
		c[x].flags = 0;
		c[x].setFullDuration(ts - td);
//		cout << "stop ringing:";
		for (int j = 0; j < MAX_STRINGS; j++) {
			if (isRingingAt(j, x)) {
//				cout << " " << j;
				c[x].e[j] = EFFECT_STOPRING;
			}
		}
//		cout << endl;
//		cout << "after append: ";
//		dumpCols(this);
		td = ts;
	}
	if (te > td) {
//		cout << "TabTrack::insertColumn() ->"
//			<< " te > td, append column: " << te - td
//			<< endl;
		x = c.size();
		insertColumn(1);
		c[x].flags = 0;
		c[x].setFullDuration(te - td);
//		cout << "stop ringing:";
		for (int j = 0; j < MAX_STRINGS; j++) {
			if (isRingingAt(j, x)) {
//				cout << " " << j;
				c[x].e[j] = EFFECT_STOPRING;
			}
		}
//		cout << endl;
//		cout << "after append: ";
//		dumpCols(this);
		td = te;
	}
	// find starting column
//	cout << "TabTrack::insertColumn() ->"
//		<< " find starting column";
	cstart = findCStart(ts, dur);
//	cout
//		<< " cstart=" << cstart
//		<< " dur=" << dur
//		<< endl;
	if (dur > 0) {
		splitColumn(cstart, dur);
		cstart++;
//		cout << "after split start: ";
//		dumpCols(this);
	}
	// find ending column
//	cout << "TabTrack::insertColumn() ->"
//		<< " find ending column";
	cend = findCEnd(te, dur);
//	cout
//		<< " cend=" << cend
//		<< " dur=" << dur
//		<< endl;
	if (dur < c[cend].fullDuration()) {
		splitColumn(cend, dur);
//		cout << "after split end: ";
//		dumpCols(this);
	}

	x = cstart;
	res = cend - cstart + 1;
//	cout << "TabTrack::insertColumn() ->"
//		<< " x=" << x
//		<< " res=" << res
//		<< endl;
	return res;
}
Beispiel #3
0
void scan_libInfo ( char * libfile )
{
	FILE * fp;
	char line[1024], ch;
	int i, j, index;
	int libCounter;
	boolean flag;
	fp = ckopen ( libfile, "r" );
	num_libs = 0;

	while ( fgets ( line, 1024, fp ) )
	{
		ch = line[5];
		line[5] = '\0';

		if ( strcmp ( line, "[LIB]" ) == 0 )
			{ num_libs++; }

		if ( !num_libs )
		{
			line[5] = ch;
			flag = splitColumn ( line );

			if ( !flag )
				{ continue; }

			if ( strcmp ( tabs[0], "max_rd_len" ) == 0 )
				{ maxReadLen = atoi ( tabs[1] ); }
		}
	}

	//count file numbers of each type
	lib_array = ( LIB_INFO * ) ckalloc ( num_libs * sizeof ( LIB_INFO ) );

	for ( i = 0; i < num_libs; i++ )
	{
		lib_array[i].asm_flag = 3;
		lib_array[i].rd_len_cutoff = 0;
		lib_array[i].rank = 0;
		lib_array[i].pair_num_cut = 0;
		lib_array[i].map_len = 0;
		lib_array[i].num_s_a_file = 0;
		lib_array[i].num_s_q_file = 0;
		lib_array[i].num_p_file = 0;
		lib_array[i].num_a1_file = 0;
		lib_array[i].num_a2_file = 0;
		lib_array[i].num_q1_file = 0;
		lib_array[i].num_q2_file = 0;
	}

	libCounter = -1;
	rewind ( fp );
	i = -1;

	while ( fgets ( line, 1024, fp ) )
	{
		ch = line[5];
		line[5] = '\0';

		if ( strcmp ( line, "[LIB]" ) == 0 )
		{
			i++;
			continue;
		}

		line[5] = ch;
		flag = splitColumn ( line );

		if ( !flag )
			{ continue; }

		if ( strcmp ( tabs[0], "f1" ) == 0 )
		{
			lib_array[i].num_a1_file++;
		}
		else if ( strcmp ( tabs[0], "q1" ) == 0 )
		{
			lib_array[i].num_q1_file++;
		}
		else if ( strcmp ( tabs[0], "f2" ) == 0 )
		{
			lib_array[i].num_a2_file++;
		}
		else if ( strcmp ( tabs[0], "q2" ) == 0 )
		{
			lib_array[i].num_q2_file++;
		}
		else if ( strcmp ( tabs[0], "f" ) == 0 )
		{
			lib_array[i].num_s_a_file++;
		}
		else if ( strcmp ( tabs[0], "q" ) == 0 )
		{
			lib_array[i].num_s_q_file++;
		}
		else if ( strcmp ( tabs[0], "p" ) == 0 )
		{
			lib_array[i].num_p_file++;
		}
	}

	//allocate memory for filenames
	for ( i = 0; i < num_libs; i++ )
	{
		if ( lib_array[i].num_s_a_file )
		{
			lib_array[i].s_a_fname = ( char ** ) ckalloc ( lib_array[i].num_s_a_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_s_a_file; j++ )
				{ lib_array[i].s_a_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}

		if ( lib_array[i].num_s_q_file )
		{
			lib_array[i].s_q_fname = ( char ** ) ckalloc ( lib_array[i].num_s_q_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_s_q_file; j++ )
				{ lib_array[i].s_q_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}

		if ( lib_array[i].num_p_file )
		{
			lib_array[i].p_fname = ( char ** ) ckalloc ( lib_array[i].num_p_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_p_file; j++ )
				{ lib_array[i].p_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}

		if ( lib_array[i].num_a1_file )
		{
			lib_array[i].a1_fname = ( char ** ) ckalloc ( lib_array[i].num_a1_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_a1_file; j++ )
				{ lib_array[i].a1_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}

		if ( lib_array[i].num_a2_file )
		{
			lib_array[i].a2_fname = ( char ** ) ckalloc ( lib_array[i].num_a2_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_a2_file; j++ )
				{ lib_array[i].a2_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}

		if ( lib_array[i].num_q1_file )
		{
			lib_array[i].q1_fname = ( char ** ) ckalloc ( lib_array[i].num_q1_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_q1_file; j++ )
				{ lib_array[i].q1_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}

		if ( lib_array[i].num_q2_file )
		{
			lib_array[i].q2_fname = ( char ** ) ckalloc ( lib_array[i].num_q2_file * sizeof ( char * ) );

			for ( j = 0; j < lib_array[i].num_q2_file; j++ )
				{ lib_array[i].q2_fname[j] = ( char * ) ckalloc ( 1024 * sizeof ( char ) ); }
		}
	}

	// get file names
	for ( i = 0; i < num_libs; i++ )
	{
		lib_array[i].curr_type = 1;
		lib_array[i].curr_index = 0;
		lib_array[i].fp1 = NULL;
		lib_array[i].fp2 = NULL;
		lib_array[i].num_s_a_file = 0;
		lib_array[i].num_s_q_file = 0;
		lib_array[i].num_p_file = 0;
		lib_array[i].num_a1_file = 0;
		lib_array[i].num_a2_file = 0;
		lib_array[i].num_q1_file = 0;
		lib_array[i].num_q2_file = 0;
	}

	libCounter = -1;
	rewind ( fp );
	i = -1;

	while ( fgets ( line, 1024, fp ) )
	{
		ch = line[5];
		line[5] = '\0';

		if ( strcmp ( line, "[LIB]" ) == 0 )
		{
			i++;
			continue;
		}

		line[5] = ch;
		flag = splitColumn ( line );

		if ( !flag )
			{ continue; }

		if ( strcmp ( tabs[0], "f1" ) == 0 )
		{
			index = lib_array[i].num_a1_file++;
			strcpy ( lib_array[i].a1_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "q1" ) == 0 )
		{
			index = lib_array[i].num_q1_file++;
			strcpy ( lib_array[i].q1_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "f2" ) == 0 )
		{
			index = lib_array[i].num_a2_file++;
			strcpy ( lib_array[i].a2_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "q2" ) == 0 )
		{
			index = lib_array[i].num_q2_file++;
			strcpy ( lib_array[i].q2_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "f" ) == 0 )
		{
			index = lib_array[i].num_s_a_file++;
			strcpy ( lib_array[i].s_a_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "q" ) == 0 )
		{
			index = lib_array[i].num_s_q_file++;
			strcpy ( lib_array[i].s_q_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "p" ) == 0 )
		{
			index = lib_array[i].num_p_file++;
			strcpy ( lib_array[i].p_fname[index], tabs[1] );
		}
		else if ( strcmp ( tabs[0], "min_ins" ) == 0 )
			{ lib_array[i].min_ins = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "max_ins" ) == 0 )
			{ lib_array[i].max_ins = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "avg_ins" ) == 0 )
			{ lib_array[i].avg_ins = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "rd_len_cutoff" ) == 0 )
			{ lib_array[i].rd_len_cutoff = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "reverse_seq" ) == 0 )
			{ lib_array[i].reverse = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "asm_flags" ) == 0 )
			{ lib_array[i].asm_flag = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "rank" ) == 0 )
			{ lib_array[i].rank = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "pair_num_cutoff" ) == 0 )
			{ lib_array[i].pair_num_cut = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "rd_len_cutoff" ) == 0 )
			{ lib_array[i].rd_len_cutoff = atoi ( tabs[1] ); }
		else if ( strcmp ( tabs[0], "map_len" ) == 0 )
			{ lib_array[i].map_len = atoi ( tabs[1] ); }
	}

	fclose ( fp );
	qsort ( &lib_array[0], num_libs, sizeof ( LIB_INFO ), cmp_lib );
}