Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define OUTPUT_NAME "finalresult.txt"
#define MAX_SIZE 1024
void * xrealloc(void * prec, size_t len)
{
void *ret = realloc(prec, len);
if(!ret)
exit(0xDEAD);
return ret;
}
char * mstrndup(const char *str, size_t n)
{
char *ret = malloc((n+1) * sizeof(char));
if (!ret)
exit(0xDEAD);
strncpy(ret, str, n);
ret[n] = 0;
return ret;
}
void free_tab(char **t, size_t len)
{
if (t)
{
size_t i;
for (i = 0; i < len; i++)
free(t[i]);
free(t);
}
}
void free_tab2(char **t)
{
size_t i = 0;
while (t && t[i])
free(t[i++]);
free(t);
}
size_t count_word(const char *str)
{
size_t n = 0;
int a;
while (*str)
{
a = 0;
while (isalpha((unsigned char) *str) && *str) str++, a = 1;
if (a) n++;
while (!isalpha((unsigned char) *str) && *str) str++;
}
return n;
}
void get_word(char **tab, const char *str)
{
const char* p = str;
int a, i = 0;
while (*str)
{
a = 0;
while (isalpha((unsigned char) *p) && *p) p++, a = 1;
if (a)
tab[i++] = mstrndup(str, p-str);
while (!isalpha((unsigned char) *p) && *p) p++;
str = p;
}
}
int compareline(char **t1, size_t size1, char **t2, size_t size2)
{
int ret = 1;
size_t i, j;
int a;
for (i = 0; i < size1; i++)
{
a = 0;
for (j = 0; j < size2; j++)
if (!strcmp(t1[i], t2[j]))
{
a = 1;
break;
}
if (!a)
{
ret = 0;
break;
}
}
return ret;
}
int is_same(const char *s1, const char *s2, int comparesize)
{
char **t1, **t2;
size_t size1 = count_word(s1), size2 = count_word(s2);
int ret = 0;
if (!comparesize || (size1 > size2))
{
t1 = malloc(size1 * sizeof(char*));
t2 = malloc(size2 * sizeof(char*));
if (t1 && t2)
{
get_word(t1, s1);
get_word(t2, s2);
ret = comparesize? compareline(t2, size2, t1, size1) : compareline(t1, size1, t2, size2);
free_tab(t1, size1), free_tab(t2, size2);
}
else
exit(0xDEAD);
}
return ret;
}
char ** compare_files(const char *filename1, const char *filename2)
{
FILE *f = fopen(filename1, "r" ), *f2 = fopen(filename2, "r" );
char s[MAX_SIZE], s2[MAX_SIZE];
int a, retsize = 0;
char **ret = NULL;
if (f && f2)
{
while (fgets(s, MAX_SIZE, f))
{
a = 0;
rewind(f2);
while (fgets(s2, MAX_SIZE, f2))
if (is_same(s, s2, 0))
{
a = 1;
break;
}
if (!a)
{
ret = xrealloc(ret, (++retsize) * sizeof(char*));
ret[retsize-1] = mstrndup(s, strlen(s));
}
}
fclose(f), fclose(f2);
ret = xrealloc(ret, (++retsize) * sizeof(char*));
ret[retsize-1] = NULL;
}
else
{
if (f) fclose(f);
if (f2) fclose(f2);
}
return ret;
}
void write_tab(FILE *f, char **t, size_t len)
{
size_t i;
for (i = 0; t && i < len; i++)
if (t[i])
fprintf(f, t[i]);
}
void disp_tab(char **t)
{
size_t i;
for (i = 0; t && t[i]; i++)
printf(t[i]);
}
int main(void)
{
#define MAXFILE 3
#define MAXTMP 10
#define N 4
char **rets[MAXFILE] = {NULL}, tmp[MAXTMP];
char **interret = NULL;
size_t interret_size = 0;
int i,j,k;
int a, b;
int equN = 0, equN1 = 0, equothr = 0, equi = 0;
FILE *output;
*rets = compare_files("f.txt", "f1.txt" );
i = 0;
while(*rets && (*rets)[i])
{
a = count_word((*rets)[i]);
if(a == N)
equN++, equi = i;
else if (a == (N-1))
equN1++;
else if (a < (N-1))
equothr = 1;
i++;
}
if(equN == 1 && !equothr)
{
if(equN1)
{
interret = *rets;
interret_size = i;
free((*rets)[equi]), (*rets)[equi] = NULL;
}
else
{
interret = *rets;
interret_size = 1;
for(i = 1; rets[0][i]; i++)
free(rets[0][i]), rets[0][i] = NULL;
}
}
else
{
for (i = 1; i < MAXFILE; i++)
{
sprintf(tmp, "f%d.txt", i+1);
rets[i] = compare_files("f.txt", tmp);
}
i = 0;
while (rets[0] && rets[0][i])
{
a = b = 0;
for (j = 1; j < MAXFILE; j++)
{
k = 0;
while (rets[j] && rets[j][k])
{
if (!strcmp(rets[0][i], rets[j][k]))
{
a = 1;
break;
}
k++;
}
if (!a)
{
b = 1;
break;
}
}
if (!b)
{
interret = xrealloc(interret, (++interret_size) * sizeof(char*));
interret[interret_size-1] = mstrndup(rets[0][i], strlen(rets[0][i]));
}
i++;
}
for (i = 0; i < MAXFILE; i++)
free_tab2(rets[i]);
for (i = 0; i < interret_size; i++)
{
for (j = 0; interret[i] && j < interret_size; j++)
{
if (interret[j] && j != i)
if (is_same(interret[i], interret[j], 1))
{
free(interret[i]), interret[i] = NULL;
break;
}
}
}
}
if((output = fopen(OUTPUT_NAME, "w+" )) != NULL)
{
write_tab(output, interret, interret_size);
fclose(output);
}
free_tab(interret, interret_size);
return 0;
}
What would you think?
Bookmarks