/** ** xor - exclusive or two files ** ** CREATED: 99.08.23 ABS copied from simple_diff ** MODIFIED: 99.09.01 ABS got working ** MODIFIED: 99.09.04 ABS added skip and self-doc ** **/ #include "xor.h" main(argc, argv) int argc; char** argv; { /* declare functions */ double atof(); char xor(); /* declare local variables */ FILE *stream1; FILE *stream2; char c1, c2; int s; int stillReading = TRUE; int j = 0; int n1, n2; /* initialize global variables (including parameters) */ defaultParms(); parseArgs(argc, argv); /* initialize local variables */ /* open */ if (Debug != FALSE) { fprintf(stdout, "%s: DEBUG: Filename1 = %s\n", argv[0], Filename1); fprintf(stdout, "%s: DEBUG: Filename2 = %s\n", argv[0], Filename2); } stream1 = fopen (Filename1, "r+b"); if (stream1 == 0) { fprintf(stdout, "%s: ERROR opening file %s\n", argv[0], Filename1); exit(-1); } stream2 = fopen (Filename2, "r+b"); if (stream2 == 0) { fprintf(stdout, "%s: ERROR opening file %s\n", argv[0], Filename2); exit(-1); } for (s = 0; s < Skip; s++) { #ifdef NT n2 = fread(&c2, 1, 1, stream2); #else c2 = (char)getc(stream2); #endif NT if (feof(stream2)) { fprintf(stdout, "%s: ERROR skip value is longer thsn key file %s\n", argv[0], Filename2); exit(-1); } } /* read & write */ while (stillReading) { j++; #ifdef NT n1 = fread(&c1, 1, 1, stream1); n2 = fread(&c2, 1, 1, stream2); #else c1 = (char)getc(stream1); c2 = (char)getc(stream2); #endif NT if (feof(stream1) || feof(stream2)) { exit(0); } #ifdef NT else if (n1 != 1) { fprintf(stdout, "%s: ERROR reading file %s on character %d\n", argv[0], Filename1, j); exit(-1); } else if (n2 != 1) { fprintf(stdout, "%s: ERROR reading file %s on character %d\n", argv[0], Filename2, j); exit(-1); } #endif NT putchar(xor(c1, c2)); if (Debug != FALSE && j < 55) { fprintf(stdout, "%s: DEBUG: c1 = %c = %d\n", argv[0], (char)c1, c1); fprintf(stdout, "%s: DEBUG: c2 = %c = %d\n", argv[0], (char)c2, c2); } } /* end while */ if (Debug != FALSE) { fprintf(stdout, "%s: DEBUG: j = %d\n", argv[0], j); } } /* end main */ /* * defaultParms - initialize global variables */ defaultParms() { Debug = FALSE; Skip = 0; } /* end defaultParms() */ /* * parseArgs - parse arguments into global variables */ parseArgs(argc, argv) int argc; char** argv; { int i; for (i = 0; i < argc; i++) { if (argv[i][0] == '-') { switch (argv[i][1]) { case 'f' : strcpy(Filename1, (char *)&argv[++i][0]); break; case 'k' : strcpy(Filename2, (char *)&argv[++i][0]); break; case 'D' : Debug = TRUE; break; case 'h' : help(argv); exit(0); break; case 's' : Skip = atoi(&argv[++i][0]); break; case 'u' : usage(argv); exit(0); break; default: fprintf(stdout, "%s: ERROR: illegal flag: %s\n", argv[0], argv[i]); usage(argv); exit(0); break; } /* end switch */ } /* end if */ } /* end for(i) */ } /* end parseArgs() */ char xor(c1, c2) char c1; char c2; { int i; char c3; char masks[8]; masks[0] = (char)0x01; /* bit 0 */ masks[1] = (char)0x02; /* bit 1 */ masks[2] = (char)0x04; /* bit 2 */ masks[3] = (char)0x08; /* bit 3 */ masks[4] = (char)0x10; /* bit 4 */ masks[5] = (char)0x20; /* bit 5 */ masks[6] = (char)0x40; /* bit 6 */ masks[7] = (char)0x80; /* bit 7 */ c3 = (char)0; for (i = 0; i < 8; i++) { if (((masks[i] & c1) && !(masks[i] & c2)) || (!(masks[i] & c1) && (masks[i] & c2))) { c3 += masks[i]; } } return c3; }