/*
 * cguses is the first working incarnation of something
 * I call `guses' (for Gentoo uses, see
 * <http://www.xs4all.nl/~rooversj/gentoo/guses>) which
 * is a bash script I wrote that searches crudely for USE
 * flags in use.desc and use.local.desc and returns the
 * matching lines with some fancy colouring.
 * I originally intended that to be the ultimate, but I
 * opted to learn a bit of C instead and have a much
 * faster working program. Not that speed matters much in
 * this case...
 *
 * It should compile on any basic Linux system, but since it
 * is intended to search in two Gentoo-specific files (and
 * because right now the paths are hard-wired and no error-
 * checking is in place) compiling it (with whatever gcc
 * options you prefer) will probably simply work.
 *
 * Thanks to KillerFox and #gentoo-hppa for their programming clues. :)
 * 
 * This program was written by JeR in 2005, released on May 9, 2005
 * and is distributed under the GNU General Public License
 * version 2 or later.
 *
 * Mail your suggestions, improvements and complaints to
 *   jer <at> xs4all.nl
 */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

/*Color definitions: */
#define BG "\033[01;32m" /* Bright Green */
#define FC "\033[00m"		/* Normal			 */
#define BW "\033[01;29m" /* Bright White */
#define NC "\033[00;36m" /* Normal Cyan	*/
#define BB "\033[01;34m" /* Bright Blue	*/

char use_line[512];

void print_usage(char *program_name)
{
		if (program_name && strrchr (program_name, '/'))
				program_name = strrchr (program_name, '/') + 1;
		if (isatty(STDOUT_FILENO))
		{
				printf("Usage: %s%s <USE flag to search>%s\n", BG, program_name, FC);
		}
		else
		{
				printf("Usage: %s <USE flag to search>\n", program_name);
		}
		printf("%s searches use.desc and use.local.desc for your USE flag.\n", program_name);
		exit(EXIT_SUCCESS);
}

int use_desc_format ( char *use_line )
{
		int i;
		size_t use_len;
		use_len = strlen(use_line);
		printf("%s",BG);
		for (i=0;i<use_len;++i)
		{
				if (use_line[i] == ' ')
				{
						printf("%s", FC);
				}
				printf("%c",use_line[i]);
		}
		return 0;
}

int use_local_desc_format (char *use_line)
{
		int i;
		size_t use_len;
		int past_colon = 0;
		use_len = strlen(use_line);
		printf("%s",NC);
		for (i=0;i<use_len;++i)
		{
				if (&use_line[i] >= strstr(use_line, ":"))
				{
						switch (use_line[i])
						{
								case ':': printf("%s%c%s",FC,use_line[i], BG);
											past_colon = 1; break;
								case '-': printf("%s%c",FC,use_line[i]); break;
								default : printf("%c",use_line[i]); break;
						}
				}
				else printf("%c",use_line[i]);


		}
		return 0;
}

int main(int argc, char **argv)
{
		FILE *ptr = NULL;
		char *match_char;
		const char *use_desc_path = "/usr/portage/profiles/use.desc";
		const char *use_local_desc_path = "/usr/portage/profiles/use.local.desc";
		int use_desc_matches = 0;
		int use_local_desc_matches = 0;

		/* First look in use.desc: */
		if (argc < 2) print_usage(argv[0]) ;
		ptr = fopen(use_desc_path , "r");
		while (feof(ptr) == 0)
		{
				fgets(use_line, 1024, ptr);
				if (use_line[0] == '#') continue;
				match_char = strstr(use_line, argv[1]);
				if (match_char != 0)
				{
						if ( use_desc_matches == 0 )
						{
								printf(" %s*%s Found '%s%s%s' in %suse.desc%s:\n", BG, FC, BW, argv[1], FC, BB, FC);
								use_desc_matches = 1;
						}
						use_desc_format ( use_line ); /* Format a single line */
				}
		}

		fclose(ptr);
		/* Then look in use.local.desc: */
		ptr = fopen(use_local_desc_path, "r");
		while (feof(ptr) == 0)
		{
				fgets(use_line, 1024, ptr);
				if (use_line[0] == '#') continue;
				if (strstr(use_line, argv[1]) != 0)
				{
						if ( use_local_desc_matches == 0 )
						{
							printf(" %s*%s Found %s%s%s in %suse.local.desc%s:\n", BG, FC, BW, argv[1], FC, BB, FC);
							use_local_desc_matches = 1;
						}
						use_local_desc_format( use_line );
				}
		}
		exit(EXIT_SUCCESS);
}


syntax highlighted by Code2HTML, v. 0.9.1