Exemple #1
0
int			main(int ac, char **av)
{
	t_meta	*meta;

	if (ac == 2)
	{
		meta = init_meta();
		file_to_tab(open_file(av[1]), meta);
		verif_tetri(meta);
		fillit(meta);
		free_meta(meta);
	}
	else
		ft_putendl("usage: ./fillit source_file");
	return (0);
}
Exemple #2
0
/***********************************************************
MAIN
***********************************************************/
int main(int argc, char** argv)
{
    //check the number of argument, less than 2 is impossible
    if (argc < 2)
    {
        printf("Not enough arguments.");
        return 1;
    }


    /*****************************************************
    Initialisation OPTIONS
    ******************************************************/
    int option_i = 0;
    int option_b = 0;
    int option_E = 0;
    int option_v = 0;
    int option_h = 0;
    int option_w = 0;
    int option_N = 0;
    int option_t = 0;

    //these options must call its functions after string behavior options
    int option_s = 0;
    int option_q = 0;
    int option_y = 0;


	//How many options do we have?
	int k;
	int cpt = 0; //total number of options
	for(k=1;k<argc;k++)
	{
			if(strcmp(argv[k], "-i") == 0 || strcmp(argv[k], "--ignore-case") == 0)
			{
				option_i = 1;
				cpt++;
			}
			if(strcmp(argv[k], "-b") == 0 || strcmp(argv[k], "--ignore-space-change") == 0)
			{
				option_b = 1;
				cpt++;
			}
			if(strcmp(argv[k], "-E") == 0 || strcmp(argv[k], "--ignore-tab-expansion") == 0)
			{
				option_E = 1;
				cpt++;
			}
			if(strcmp(argv[k], "-v") == 0  || strcmp(argv[k], "--version") == 0)
			{
				option_v = 1; //useless because of return 0;
				printf("%s: Version 2012.01.13.1727\n\n",argv[0]);
				printf("Written by Antoine Lang-Cavelier\n");
				return 0; //end of the programm now
			}
			if(strcmp(argv[k], "--help") == 0)
			{
				option_h = 1; //useless because of return 0;
                printf("Syntax:\n");
                printf("%s [OPTIONS] fichier1 fichier2\n\n",argv[0]);
				opt_help(); //we have a function to display the help
				return 0; //end of the programm now
			}
			if(strcmp(argv[k], "-w") == 0 || strcmp(argv[k], "--ignore-all-space") == 0)
			{
				option_w = 1;
				cpt++;
			}
			if(strcmp(argv[k], "-N") == 0 || strcmp(argv[k], "--new-file") == 0)
			{
				option_N = 1;
				cpt++;
				if (argv[2] == NULL)
				{
				    printf("%s: No differences between 2 empty files.\n",argv[0]);
				    return 0;
				}
			}
            if(strcmp(argv[k], "-t") == 0 || strcmp(argv[k], "--expand-tabs") == 0)
			{
				option_t = 1;
				cpt++;
			}
            if(strcmp(argv[k], "-s") == 0 || strcmp(argv[k], "--report-identical-files") == 0)
			{
				option_s = 1;
				cpt++;
			}
			if(strcmp(argv[k], "-q") == 0  || strcmp(argv[k], "--brief") == 0)
			{
				option_q = 1;
				cpt++;
			}
            if(strcmp(argv[k], "-y") == 0  || strcmp(argv[k], "--side-by-side") == 0)
			{
				option_y = 1;
				cpt++;
			}
	}
	//we increase our arguments by the number of different options selected
	//because after that, we will use argv[1] and argv[2]
	argv[1] = argv[cpt+1]; //first file
	argv[2] = argv[cpt+2]; //second file
    /*****************************************************
    ENDOF: Initialisation OPTIONS
    ******************************************************/

    if (option_N == 0 && argv[2] == NULL)
    {
        printf("%s: Missing operand after '%s'.\n",argv[0],argv[1]);
        printf("%s: Try `%s --help' for more information.\n",argv[0],argv[0]);
        return 0;
    }

    //we rename our two arguments to avoid type issues (char* vs char**)
    char* src1 = argv[1];
    char* src2 = argv[2];


    /*****************************************************
    ALGO DIFF;
    ******************************************************/
    //call of our function nombre_ligne();
    int nb1 = nombre_ligne(src1); //ask total lines of src1 and put it in nb1
    int nb2 = nombre_ligne(src2); //ask total lines of src2 and put it in nb2

    //beginning of the comparison loop in order to print the diff

    //call of our function file_to_tab();
    char** chaine_tab1 = file_to_tab(src1, nb1); //put our file1 in a tab of string
    char** chaine_tab2 = file_to_tab(src2, nb2); //put our file2 in a tab of string


	/*****************
    Option -i
    not case sensitive
    *****************/
	if (option_i == 1)
	{
	    int i;
	    for (i=0; i<nb1; i++)
	    {
	        chaine_tab1[i] = str_to_lower(chaine_tab1[i]);
	    }
	    int j;
	    for (j=0; j<nb2; j++)
	    {
	        chaine_tab2[j] = str_to_lower(chaine_tab2[j]);
	    }
	}
    /*****************
    ENDOF: Option -i
    *****************/


	/*****************
    Option -b
    no multi space
    *****************/
	if (option_b == 1)
	{
	    int i;
	    for (i=0; i<nb1; i++)
	    {
	        chaine_tab1[i] = str_onespace(chaine_tab1[i]);
	    }
	    int j;
	    for (j=0; j<nb2; j++)
	    {
	        chaine_tab2[j] = str_onespace(chaine_tab2[j]);
	    }
	}
    /*****************
    ENDOF: Option -b
    *****************/


	/*****************
    Option -E
    no multi tab
    *****************/
	if (option_E == 1)
	{
	    int i;
	    for (i=0; i<nb1; i++)
	    {
	        chaine_tab1[i] = str_onetab(chaine_tab1[i]);
	    }
	    int j;
	    for (j=0; j<nb2; j++)
	    {
	        chaine_tab2[j] = str_onetab(chaine_tab2[j]);
	    }
	}
    /*****************
    ENDOF: Option -E
    *****************/


	/*****************
    Option -w
    skip blank characters
    *****************/
	if (option_w == 1)
	{
	    int i;
	    for (i=0; i<nb1; i++)
	    {
	        chaine_tab1[i] = str_ignore_blank(chaine_tab1[i]);
	    }
	    int j;
	    for (j=0; j<nb2; j++)
	    {
	        chaine_tab2[j] = str_ignore_blank(chaine_tab2[j]);
	    }
	}
    /*****************
    ENDOF: Option -w
    *****************/


	/*****************
    Option -t
    change tab in space
    *****************/
	if (option_t == 1)
	{
	    int i;
	    for (i=0; i<nb1; i++)
	    {
	        chaine_tab1[i] = str_tabtospace(chaine_tab1[i]);
	    }
	    int j;
	    for (j=0; j<nb2; j++)
	    {
	        chaine_tab2[j] = str_tabtospace(chaine_tab2[j]);
	    }
	}
    /*****************
    ENDOF: Option -t
    *****************/


	/*****************
    Option -s
    report-identical-files
    *****************/
	if (option_s == 1)
	{
	    if (opt_s(chaine_tab1, nb1, chaine_tab2, nb2) == 0)
	    {
	        printf("Files %s and %s are identical.",src1,src2);

            free(chaine_tab1);
            free(chaine_tab2);
	        return 0;
	    }
	}
    /*****************
    ENDOF: Option -s
    *****************/


	/*****************
    Option -q
    brief diff
    MUST BE AFTER STRING BEHAVIOR OPTIONS
    *****************/
	if (option_q == 1)
	{
	    if (opt_q(chaine_tab1, nb1, chaine_tab2, nb2) != 0)
	    {
	        printf("Files %s and %s differ.", src1, src2);
	    }

        free(chaine_tab1);
        free(chaine_tab2);
	    return 0;
	}
    /*****************
    ENDOF: Option -q
    *****************/


	/*****************
    Option -y
    side by side diff
    MUST BE AFTER STRING BEHAVIOR OPTIONS
    *****************/
	if (option_y == 1)
	{
	    printf("Side by side diff of %s with %s:\n\n",src1,src2);
	    opt_y(chaine_tab1, nb1, chaine_tab2, nb2);

        free(chaine_tab1);
        free(chaine_tab2);
	    return 0;
	}
    /*****************
    ENDOF: Option -y
    *****************/


	printf("Diff of %s with %s:\n\n",src1,src2);

	// i is the index of the line we're processing in chaine_tab1.
	int i;
	// j is the index of the line we're processing in chaine_tab2.
	int j = 0;

	//Process each line of chaine_tab1 and do our job
	for (i=0; i<nb1; i++)
	{
		//Indicates if a matching line was found in chaine_tab2 (true = 1)
		int found = 0;
		//Indicates the number of lines we've skipped in chaine_tab2 before finding the matching line.
		int skipped = 0;

		//we process each line of chaine_tab2 (starting from the j-th one)
		//until we either find a matching line or the end of file
		while (j<nb2 && found == 0)
		{
			// Compare both lines
			if(strcmp(chaine_tab1[i], chaine_tab2[j]) == 0)
			{
				found = 1;
			}
			else
			{
			    skipped++;
			}
			j++;
		}

		//Now process the result:
		if (found == 1)
		{
			//Print lines we skipped (from j-skipped to j)
			int a;
			for (a=j-skipped;a<j;a++)
			{
				printf("> %s\n", chaine_tab2[a-1]);
			}
            //Print the matched line
			printf("= %s\n", chaine_tab1[i]);



		}
		else
		{
			//Only print the line from chaine_tab1, and rollback the
			//index j because we'll have to read those lines again.
			printf("< %s\n", chaine_tab1[i]);
			j = j-skipped;

		}
	}


	//Time to print all lines of chaine_tab2 if file2 have more
	//line than file1: these are all new.
	while (j < nb2)
    {
        printf("> %s\n", chaine_tab2[j]);
        j++;
    }

    //deallocation of our mallocs
    free(chaine_tab1);
    free(chaine_tab2);
    /*****************************************************
    ENDOF: ALGO DIFF;
    ******************************************************/

    return 0;
}