#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF 200
#define RECORDS 50
#define SPACES 4
FILE * file1, * file2, *resultFile;
struct record {
char ingr[BUF/2];
char weight[BUF/2];
char dv[BUF/2];
};
void parseFile(struct record * records, FILE * file);
void writeResultToFile(struct record * f1, struct record * f2);
void replace(char * str, char c, char r);
void reverse(char * str);
void crop(char * str, char c);
void trim(char * str);
void fillWeight(char * str, char * weight);
void fillDv(char * str, char * dv);
int main(int argc, char * argv[]) {
if (argc != 3) {
fprintf(stderr
, "Usage: cmpr.exe F1 F2\n"); }
char * fileName1 = argv[1];
file1
= fopen(fileName1
, "r"); if (file1 == NULL) {
fprintf(stderr
, "Can't open input file %s!\n", file1
); }
char * fileName2 = argv[2];
file2
= fopen(fileName2
, "r"); if (file2 == NULL) {
fprintf(stderr
, "Can't open input file %s!\n", file2
); }
char * resultFileName = fileName1;
strcat(resultFileName
, fileName2
); strcat(resultFileName
, "_DIFF.txt"); resultFile
= fopen(resultFileName
, "w"); if (resultFile == NULL) {
fprintf(stderr
, "Can't open input file %s!\n", resultFile
); }
struct record fOneRecs [RECORDS];
struct record fTwoRecs [RECORDS];
parseFile(fOneRecs, file1);
parseFile(fTwoRecs, file2);
writeResultToFile(fOneRecs, fTwoRecs);
return 0;
}
void parseFile(struct record * records, FILE * file) {
char line [BUF];
char ingr [BUF];
char params [BUF];
char weight [BUF];
char dv [BUF];
int recCount = 0;
while (fgets(line
, sizeof(line
), file
) != NULL
) { replace(line, '\t', ' ');
reverse(line);
int i = 0, count = 0;
while (line[i]) {
params[i] = line[i];
if (count == SPACES) {
int j = 0;
++i;
params[i] = '\0';
while (line[i]) {
ingr[j++] = line[i++];
}
ingr[j] = '\0';
break;
}
if (line[i] == ' ') {
count++;
}
++i;
}
reverse(ingr);
crop(ingr, '(');
fillDv(params, dv);
reverse(dv);
reverse(params);
trim(ingr);
trim(params);
fillWeight(params, weight);
strcpy(records
[recCount
].
ingr, ingr
); strcpy(records
[recCount
].
weight, weight
); strcpy(records
[recCount
].
dv, dv
); recCount++;
}
}
void writeResultToFile(struct record * f1, struct record * f2) {
int i = 0, j = 0, k = 0;
while (1) {
j = 0;
if (!strcmp(f1
[i
].
ingr, "")) break; while (1) {
if (!strcmp(f2
[j
].
ingr, "")) break; if (!strcmp(f1
[i
].
ingr, f2
[j
].
ingr)) { fprintf(resultFile
, "%-20s %-10s(%-7sDV) \t%-5s %-10s(%-7sDV)\n", f1
[i
].
ingr, f1
[i
].
weight, f1
[i
].
dv, "<>", f2
[j
].
weight, f2
[j
].
dv); k++;
}
j++;
}
i++;
}
}
void replace(char *str, char c, char r) {
while (*str) {
if (*str == c) {
*str = r;
}
++str;
}
}
void reverse(char * str) {
char buffer[BUF];
int j = 0;
for (i; i >= 0; i--) {
buffer[j++] = *(str + i);
}
for (i
= 0; i
< strlen(str
); i
++) { *(str + i) = buffer[i];
}
*(str + i) = '\0';
}
void crop(char * str, char c) {
while (*str) {
if (*str == c) {
*str = '\0';
break;
}
str++;
}
}
void trim(char * str) {
char * end
= str
+ strlen(str
) - 1; if (*end == ' ') {
*end = '\0';
}
}
void fillWeight(char * str, char * weight) {
int spaceCount = 0;
while (*str == ' ' || *str == '\t') {
++str;
}
while (*str) {
if (*str == ' ' || *str == '\t') ++spaceCount;
if (spaceCount == 2) break;
*weight++ = *str++;
}
*weight = '\0';
}
void fillDv(char * str, char * dv) {
int spaceCount = 0;
while(*str != ' ' && *str != '\t') {
if (*str == '\n') {
++str;
continue;
}
*dv++ = *str++;
}
*dv = '\0';
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojZGVmaW5lIEJVRiAyMDAKI2RlZmluZSBSRUNPUkRTIDUwCiNkZWZpbmUgU1BBQ0VTIDQKCkZJTEUgKiBmaWxlMSwgKiBmaWxlMiwgKnJlc3VsdEZpbGU7CgpzdHJ1Y3QgcmVjb3JkIHsKCWNoYXIgaW5ncltCVUYvMl07CgljaGFyIHdlaWdodFtCVUYvMl07CgljaGFyIGR2W0JVRi8yXTsKfTsKCnZvaWQgcGFyc2VGaWxlKHN0cnVjdCByZWNvcmQgKiByZWNvcmRzLCBGSUxFICogZmlsZSk7CnZvaWQgd3JpdGVSZXN1bHRUb0ZpbGUoc3RydWN0IHJlY29yZCAqIGYxLCBzdHJ1Y3QgcmVjb3JkICogZjIpOwp2b2lkIHJlcGxhY2UoY2hhciAqIHN0ciwgY2hhciBjLCBjaGFyIHIpOwp2b2lkIHJldmVyc2UoY2hhciAqIHN0cik7CnZvaWQgY3JvcChjaGFyICogc3RyLCBjaGFyIGMpOwp2b2lkIHRyaW0oY2hhciAqIHN0cik7CnZvaWQgZmlsbFdlaWdodChjaGFyICogc3RyLCBjaGFyICogd2VpZ2h0KTsKdm9pZCBmaWxsRHYoY2hhciAqIHN0ciwgY2hhciAqIGR2KTsKCmludCBtYWluKGludCBhcmdjLCBjaGFyICogYXJndltdKSB7CiAgICBpZiAoYXJnYyAhPSAzKSB7CgkJZnByaW50ZihzdGRlcnIsICJVc2FnZTogY21wci5leGUgRjEgRjJcbiIpOwoJCWV4aXQoMSk7Cgl9CgljaGFyICogZmlsZU5hbWUxID0gYXJndlsxXTsKICAgIGZpbGUxID0gZm9wZW4oZmlsZU5hbWUxLCAiciIpOwogICAgaWYgKGZpbGUxID09IE5VTEwpIHsKICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNhbid0IG9wZW4gaW5wdXQgZmlsZSAlcyFcbiIsIGZpbGUxKTsKICAgICAgICBleGl0KDEpOwogICAgfQoJY2hhciAqIGZpbGVOYW1lMiA9IGFyZ3ZbMl07CiAgICBmaWxlMiA9IGZvcGVuKGZpbGVOYW1lMiwgInIiKTsKICAgIGlmIChmaWxlMiA9PSBOVUxMKSB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJDYW4ndCBvcGVuIGlucHV0IGZpbGUgJXMhXG4iLCBmaWxlMik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCWNoYXIgKiByZXN1bHRGaWxlTmFtZSA9IGZpbGVOYW1lMTsKCXN0cmNhdChyZXN1bHRGaWxlTmFtZSwgIl8iKTsKCXN0cmNhdChyZXN1bHRGaWxlTmFtZSwgZmlsZU5hbWUyKTsKCXN0cmNhdChyZXN1bHRGaWxlTmFtZSwgIl9ESUZGLnR4dCIpOwoJcmVzdWx0RmlsZSA9IGZvcGVuKHJlc3VsdEZpbGVOYW1lLCAidyIpOwoJaWYgKHJlc3VsdEZpbGUgPT0gTlVMTCkgewogICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2FuJ3Qgb3BlbiBpbnB1dCBmaWxlICVzIVxuIiwgcmVzdWx0RmlsZSk7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KCQoJc3RydWN0IHJlY29yZCBmT25lUmVjcwkJW1JFQ09SRFNdOwoJc3RydWN0IHJlY29yZCBmVHdvUmVjcwkJW1JFQ09SRFNdOwoJCiAgICBwYXJzZUZpbGUoZk9uZVJlY3MsIGZpbGUxKTsKCXBhcnNlRmlsZShmVHdvUmVjcywgZmlsZTIpOwoJd3JpdGVSZXN1bHRUb0ZpbGUoZk9uZVJlY3MsIGZUd29SZWNzKTsKICAgIAogICAgZmNsb3NlKGZpbGUxKTsKICAgIGZjbG9zZShmaWxlMik7CiAgICBmY2xvc2UocmVzdWx0RmlsZSk7CiAgICByZXR1cm4gMDsKfQoKdm9pZCBwYXJzZUZpbGUoc3RydWN0IHJlY29yZCAqIHJlY29yZHMsIEZJTEUgKiBmaWxlKSB7CiAgICBjaGFyIGxpbmUgICBbQlVGXTsKICAgIGNoYXIgaW5nciAgIFtCVUZdOwogICAgY2hhciBwYXJhbXMgW0JVRl07CiAgICBjaGFyIHdlaWdodCBbQlVGXTsKICAgIGNoYXIgZHYgICAgIFtCVUZdOwoJaW50IHJlY0NvdW50ID0gMDsKICAgIAogICAgd2hpbGUgKGZnZXRzKGxpbmUsIHNpemVvZihsaW5lKSwgZmlsZSkgIT0gTlVMTCkgewogICAgICAgIHJlcGxhY2UobGluZSwgJ1x0JywgJyAnKTsKICAgICAgICByZXZlcnNlKGxpbmUpOwogICAgICAgIGludCBpID0gMCwgY291bnQgPSAwOwogICAgICAgIHdoaWxlIChsaW5lW2ldKSB7CiAgICAgICAgICAgIHBhcmFtc1tpXSA9IGxpbmVbaV07CiAgICAgICAgICAgIGlmIChjb3VudCA9PSBTUEFDRVMpIHsKICAgICAgICAgICAgICAgIGludCBqID0gMDsKICAgICAgICAgICAgICAgICsraTsKICAgICAgICAgICAgICAgIHBhcmFtc1tpXSA9ICdcMCc7CiAgICAgICAgICAgICAgICB3aGlsZSAobGluZVtpXSkgewogICAgICAgICAgICAgICAgICAgIGluZ3JbaisrXSA9IGxpbmVbaSsrXTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGluZ3Jbal0gPSAnXDAnOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgaWYgKGxpbmVbaV0gPT0gJyAnKSB7CiAgICAgICAgICAgICAgICBjb3VudCsrOwogICAgICAgICAgICB9CiAgICAgICAgICAgICsraTsKICAgICAgICB9CiAgICAgICAgcmV2ZXJzZShpbmdyKTsKICAgICAgICBjcm9wKGluZ3IsICcoJyk7CiAgICAgICAgZmlsbER2KHBhcmFtcywgZHYpOwogICAgICAgIHJldmVyc2UoZHYpOwogICAgICAgIHJldmVyc2UocGFyYW1zKTsKICAgICAgICB0cmltKGluZ3IpOwogICAgICAgIHRyaW0ocGFyYW1zKTsKICAgICAgICBmaWxsV2VpZ2h0KHBhcmFtcywgd2VpZ2h0KTsKCQlzdHJjcHkocmVjb3Jkc1tyZWNDb3VudF0uaW5nciwgaW5ncik7CgkJc3RyY3B5KHJlY29yZHNbcmVjQ291bnRdLndlaWdodCwgd2VpZ2h0KTsKCQlzdHJjcHkocmVjb3Jkc1tyZWNDb3VudF0uZHYsIGR2KTsKCQlyZWNDb3VudCsrOwogICAgfQp9Cgp2b2lkIHdyaXRlUmVzdWx0VG9GaWxlKHN0cnVjdCByZWNvcmQgKiBmMSwgc3RydWN0IHJlY29yZCAqIGYyKSB7CglpbnQgaSA9IDAsIGogPSAwLCBrID0gMDsKCXdoaWxlICgxKSB7CgkJaiA9IDA7CgkJaWYgKCFzdHJjbXAoZjFbaV0uaW5nciwgIiIpKSBicmVhazsKCQl3aGlsZSAoMSkgewoJCQlpZiAoIXN0cmNtcChmMltqXS5pbmdyLCAiIikpIGJyZWFrOwoJCQlpZiAoIXN0cmNtcChmMVtpXS5pbmdyLCBmMltqXS5pbmdyKSkgewoJCQkJZnByaW50ZihyZXN1bHRGaWxlLCAiJS0yMHMgJS0xMHMoJS03c0RWKSBcdCUtNXMgJS0xMHMoJS03c0RWKVxuIiwgZjFbaV0uaW5nciwgZjFbaV0ud2VpZ2h0LCBmMVtpXS5kdiwgIjw+IiwgZjJbal0ud2VpZ2h0LCBmMltqXS5kdik7CgkJCQlrKys7CgkJCX0KCQkJaisrOwoJCX0KCQlpKys7Cgl9Cn0KCgp2b2lkIHJlcGxhY2UoY2hhciAqc3RyLCBjaGFyIGMsIGNoYXIgcikgewogICAgd2hpbGUgKCpzdHIpIHsKICAgICAgICBpZiAoKnN0ciA9PSBjKSB7CiAgICAgICAgICAgICpzdHIgPSByOwogICAgICAgIH0KICAgICAgICArK3N0cjsKICAgIH0KCn0KCnZvaWQgcmV2ZXJzZShjaGFyICogc3RyKSB7CiAgICBjaGFyIGJ1ZmZlcltCVUZdOwogICAgaW50IGkgPSBzdHJsZW4oc3RyKSAtIDE7CiAgICBpbnQgaiA9IDA7CiAgICBmb3IgKGk7IGkgPj0gMDsgaS0tKSB7CiAgICAgICAgYnVmZmVyW2orK10gPSAqKHN0ciArIGkpOwogICAgfQogICAgZm9yIChpID0gMDsgaSA8IHN0cmxlbihzdHIpOyBpKyspIHsKICAgICAgICAqKHN0ciArIGkpID0gYnVmZmVyW2ldOwogICAgfQogICAgKihzdHIgKyBpKSA9ICdcMCc7Cn0KCnZvaWQgY3JvcChjaGFyICogc3RyLCBjaGFyIGMpIHsKICAgIHdoaWxlICgqc3RyKSB7CiAgICAgICAgaWYgKCpzdHIgPT0gYykgewogICAgICAgICAgICAqc3RyID0gJ1wwJzsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHN0cisrOwogICAgfQp9Cgp2b2lkIHRyaW0oY2hhciAqIHN0cikgewogICAgY2hhciAqIGVuZCA9IHN0ciArIHN0cmxlbihzdHIpIC0gMTsKICAgIGlmICgqZW5kID09ICcgJykgewogICAgICAgICplbmQgPSAnXDAnOwogICAgfQp9Cgp2b2lkIGZpbGxXZWlnaHQoY2hhciAqIHN0ciwgY2hhciAqIHdlaWdodCkgewogICAgaW50IHNwYWNlQ291bnQgPSAwOwogICAgd2hpbGUgKCpzdHIgPT0gJyAnIHx8ICpzdHIgPT0gJ1x0JykgewogICAgICAgICsrc3RyOwogICAgfQogICAgd2hpbGUgKCpzdHIpIHsKICAgICAgICBpZiAoKnN0ciA9PSAnICcgfHwgKnN0ciA9PSAnXHQnKSArK3NwYWNlQ291bnQ7CiAgICAgICAgaWYgKHNwYWNlQ291bnQgPT0gMikgYnJlYWs7CiAgICAgICAgKndlaWdodCsrID0gKnN0cisrOwogICAgfQogICAgKndlaWdodCA9ICdcMCc7Cn0Kdm9pZCBmaWxsRHYoY2hhciAqIHN0ciwgY2hhciAqIGR2KSB7CiAgICBpbnQgc3BhY2VDb3VudCA9IDA7CiAgICB3aGlsZSgqc3RyICE9ICcgJyAmJiAqc3RyICE9ICdcdCcpIHsKICAgICAgICBpZiAoKnN0ciA9PSAnXG4nKSB7CiAgICAgICAgICAgICsrc3RyOwogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB9CiAgICAgICAgKmR2KysgPSAqc3RyKys7CiAgICB9CiAgICAqZHYgPSAnXDAnOwp9Cg==