| 82 | 
  | 
 | 
| 83 | 
  | 
                                /* running real differences */ | 
| 84 | 
  | 
double  diff2sum = 0; | 
| 85 | 
< | 
int     nsum = 0; | 
| 85 | 
> | 
long    nsum = 0; | 
| 86 | 
  | 
 | 
| 87 | 
  | 
/* Report usage and exit */ | 
| 88 | 
  | 
static void | 
| 92 | 
  | 
        fputs(progname, stderr); | 
| 93 | 
  | 
        fputs(" [-h][-s|-w|-v][-rel min_test][-rms epsilon][-max epsilon] reference test\n", | 
| 94 | 
  | 
                        stderr); | 
| 95 | 
< | 
        exit(1); | 
| 95 | 
> | 
        exit(2); | 
| 96 | 
  | 
} | 
| 97 | 
  | 
 | 
| 98 | 
  | 
/* Get type ID from name (or 0 if not found) */ | 
| 134 | 
  | 
        return(1); | 
| 135 | 
  | 
} | 
| 136 | 
  | 
 | 
| 137 | 
+ | 
/* Compare two color values for equivalence */ | 
| 138 | 
+ | 
static int | 
| 139 | 
+ | 
color_check(COLOR c1, COLOR c2) | 
| 140 | 
+ | 
{ | 
| 141 | 
+ | 
        int     p; | 
| 142 | 
+ | 
 | 
| 143 | 
+ | 
        if (!real_check(colval(c1,RED)+colval(c1,GRN)+colval(c1,BLU)*(1./3.), | 
| 144 | 
+ | 
                        colval(c2,RED)+colval(c2,GRN)+colval(c2,BLU))*(1./3.)) | 
| 145 | 
+ | 
                return(0); | 
| 146 | 
+ | 
 | 
| 147 | 
+ | 
        p = (colval(c1,GRN) > colval(c1,RED)) ? GRN : RED; | 
| 148 | 
+ | 
        if (colval(c1,BLU) > colval(c1,p)) p = BLU; | 
| 149 | 
+ | 
         | 
| 150 | 
+ | 
        return(real_check(colval(c1,p), colval(c2,p))); | 
| 151 | 
+ | 
} | 
| 152 | 
+ | 
 | 
| 153 | 
  | 
/* Compare two strings for equivalence */ | 
| 154 | 
  | 
static int | 
| 155 | 
  | 
equiv_string(char *s1, char *s2) | 
| 291 | 
  | 
 | 
| 292 | 
  | 
/* Compare two sets of header variables */ | 
| 293 | 
  | 
static int | 
| 294 | 
< | 
headers_match(LUTAB *hp1, LUTAB *hp2) | 
| 294 | 
> | 
headers_match() | 
| 295 | 
  | 
{ | 
| 296 | 
< | 
        int     ne = lu_doall(hp1, match_val, hp2); | 
| 296 | 
> | 
        int     ne = lu_doall(&hdr1, match_val, &hdr2); | 
| 297 | 
  | 
        if (ne < 0) | 
| 298 | 
  | 
                return(0);      /* something didn't match! */ | 
| 299 | 
  | 
                                /* non-fatal if second header has extra */ | 
| 300 | 
< | 
        if (report >= REP_WARN && (ne = lu_doall(hp2, NULL, NULL) - ne)) | 
| 300 | 
> | 
        if (report >= REP_WARN && (ne = lu_doall(&hdr2, NULL, NULL) - ne)) | 
| 301 | 
  | 
                printf("%s: warning - '%s' has %d extra header setting(s)\n", | 
| 302 | 
  | 
                                        progname, f2name, ne); | 
| 303 | 
  | 
        return(1);              /* good match */ | 
| 441 | 
  | 
        return(0); | 
| 442 | 
  | 
} | 
| 443 | 
  | 
 | 
| 444 | 
+ | 
/* If line is continued (no newline), then back up to word boundary if one */ | 
| 445 | 
+ | 
static int | 
| 446 | 
+ | 
leftover(char *buf) | 
| 447 | 
+ | 
{ | 
| 448 | 
+ | 
        int     minlen = strlen(buf); | 
| 449 | 
+ | 
        char    *bend = buf + minlen; | 
| 450 | 
+ | 
        char    *cp = bend-1; | 
| 451 | 
+ | 
 | 
| 452 | 
+ | 
        if (*cp == '\r') *cp = '\n';            /* AARG Windoze! */ | 
| 453 | 
+ | 
        if (*cp == '\n')                        /* complete line? */ | 
| 454 | 
+ | 
                return(0); | 
| 455 | 
+ | 
 | 
| 456 | 
+ | 
        minlen >>= 2;                           /* back over partial word */ | 
| 457 | 
+ | 
        while (!isspace(*cp)) | 
| 458 | 
+ | 
                if (--cp <= buf+minlen) | 
| 459 | 
+ | 
                        return(0); | 
| 460 | 
+ | 
        *cp++ = '\0';                           /* break line here */ | 
| 461 | 
+ | 
        return(bend - cp); | 
| 462 | 
+ | 
} | 
| 463 | 
+ | 
 | 
| 464 | 
  | 
/* Compare two inputs as generic text files */ | 
| 465 | 
  | 
static int | 
| 466 | 
  | 
compare_text() | 
| 467 | 
  | 
{ | 
| 468 | 
  | 
        char    l1buf[4096], l2buf[4096]; | 
| 469 | 
+ | 
        int     l1over=0, l2over=0; | 
| 470 | 
  | 
 | 
| 471 | 
  | 
        if (report >= REP_VERBOSE) { | 
| 472 | 
  | 
                fputs(progname, stdout); | 
| 473 | 
  | 
                fputs(": comparing inputs as ASCII text\n", stdout); | 
| 474 | 
  | 
        } | 
| 475 | 
  | 
                                                /* compare a line at a time */ | 
| 476 | 
< | 
        while (fgets(l1buf, sizeof(l1buf), f1in)) { | 
| 477 | 
< | 
                lin1cnt++; | 
| 478 | 
< | 
                if (!*sskip2(l1buf,0)) | 
| 476 | 
> | 
        while (fgets(l1buf+l1over, sizeof(l1buf)-l1over, f1in)) { | 
| 477 | 
> | 
                lin1cnt += !(l1over = leftover(l1buf)); | 
| 478 | 
> | 
                if (!*sskip2(l1buf,0)) { | 
| 479 | 
> | 
                        memmove(l1buf, l1buf+sizeof(l1buf)-l1over, l1over); | 
| 480 | 
  | 
                        continue;               /* ignore empty lines */ | 
| 481 | 
< | 
                while (fgets(l2buf, sizeof(l2buf), f2in)) { | 
| 482 | 
< | 
                        lin2cnt++; | 
| 481 | 
> | 
                } | 
| 482 | 
> | 
                while (fgets(l2buf+l2over, sizeof(l2buf)-l2over, f2in)) { | 
| 483 | 
> | 
                        lin2cnt += !(l2over = leftover(l2buf)); | 
| 484 | 
  | 
                        if (*sskip2(l2buf,0)) | 
| 485 | 
  | 
                                break;          /* found other non-empty line */ | 
| 486 | 
+ | 
                        memmove(l2buf, l2buf+sizeof(l2buf)-l2over, l2over); | 
| 487 | 
  | 
                } | 
| 488 | 
  | 
                if (feof(f2in)) { | 
| 489 | 
  | 
                        if (report != REP_QUIET) { | 
| 508 | 
  | 
                        } | 
| 509 | 
  | 
                        return(0); | 
| 510 | 
  | 
                } | 
| 511 | 
+ | 
                if (l1over) memmove(l1buf, l1buf+sizeof(l1buf)-l1over, l1over); | 
| 512 | 
+ | 
                if (l2over) memmove(l2buf, l2buf+sizeof(l2buf)-l2over, l2over); | 
| 513 | 
  | 
        } | 
| 514 | 
  | 
                                                /* check for EOF on input 2 */ | 
| 515 | 
  | 
        while (fgets(l2buf, sizeof(l2buf), f2in)) { | 
| 569 | 
  | 
                        return(0); | 
| 570 | 
  | 
                } | 
| 571 | 
  | 
                for (x = 0; x < scanlen(&rs1); x++) { | 
| 572 | 
< | 
                        if (real_check(colval(scan1[x],RED), | 
| 531 | 
< | 
                                                colval(scan2[x],RED)) & | 
| 532 | 
< | 
                                        real_check(colval(scan1[x],GRN), | 
| 533 | 
< | 
                                                colval(scan2[x],GRN)) & | 
| 534 | 
< | 
                                        real_check(colval(scan1[x],BLU), | 
| 535 | 
< | 
                                                colval(scan2[x],BLU))) | 
| 572 | 
> | 
                        if (color_check(scan1[x], scan2[x])) | 
| 573 | 
  | 
                                continue; | 
| 574 | 
  | 
                        if (report != REP_QUIET) { | 
| 575 | 
  | 
                                printf( | 
| 605 | 
  | 
 | 
| 606 | 
  | 
        if (report >= REP_VERBOSE) { | 
| 607 | 
  | 
                fputs(progname, stdout); | 
| 608 | 
< | 
                fputs(": comparing inputs as 32-bit IEEE float\n", stdout); | 
| 608 | 
> | 
                fputs(": comparing inputs as 32-bit IEEE floats\n", stdout); | 
| 609 | 
  | 
        } | 
| 610 | 
  | 
        while (getbinary(&f1, sizeof(f1), 1, f1in)) { | 
| 611 | 
  | 
                if (!getbinary(&f2, sizeof(f2), 1, f2in)) | 
| 635 | 
  | 
 | 
| 636 | 
  | 
        if (report >= REP_VERBOSE) { | 
| 637 | 
  | 
                fputs(progname, stdout); | 
| 638 | 
< | 
                fputs(": comparing inputs as 64-bit IEEE double\n", stdout); | 
| 638 | 
> | 
                fputs(": comparing inputs as 64-bit IEEE doubles\n", stdout); | 
| 639 | 
  | 
        } | 
| 640 | 
  | 
        while (getbinary(&f1, sizeof(f1), 1, f1in)) { | 
| 641 | 
  | 
                if (!getbinary(&f2, sizeof(f2), 1, f2in)) | 
| 699 | 
  | 
                } | 
| 700 | 
  | 
                break; | 
| 701 | 
  | 
        } | 
| 702 | 
< | 
        if (a != argc-2) | 
| 702 | 
> | 
        if (a != argc-2)                        /* make sure of two inputs */ | 
| 703 | 
  | 
                usage(); | 
| 704 | 
< | 
        if (!f1name) f1name = argv[a]; | 
| 668 | 
< | 
        if (!f2name) f2name = argv[a+1]; | 
| 669 | 
< | 
 | 
| 670 | 
< | 
        if (!strcmp(f1name, f2name)) {          /* inputs are same? */ | 
| 704 | 
> | 
        if (!strcmp(argv[a], argv[a+1])) {      /* inputs are same? */ | 
| 705 | 
  | 
                if (report >= REP_WARN) | 
| 706 | 
  | 
                        printf("%s: warning - identical inputs given\n", | 
| 707 | 
  | 
                                        progname); | 
| 708 | 
  | 
                return(0); | 
| 709 | 
  | 
        } | 
| 710 | 
+ | 
        if (!f1name) f1name = argv[a]; | 
| 711 | 
+ | 
        if (!f2name) f2name = argv[a+1]; | 
| 712 | 
  | 
                                                /* open inputs */ | 
| 713 | 
  | 
        SET_FILE_BINARY(stdin);                 /* in case we're using it */ | 
| 714 | 
  | 
        if (!f1in && !(f1in = fopen(f1name, "rb"))) { | 
| 715 | 
  | 
                fprintf(stderr, "%s: cannot open for reading\n", f1name); | 
| 716 | 
< | 
                return(1); | 
| 716 | 
> | 
                return(2); | 
| 717 | 
  | 
        } | 
| 718 | 
  | 
        if (!strcmp(f2name, "-")) { | 
| 719 | 
  | 
                f2in = stdin; | 
| 720 | 
  | 
                f2name = stdin_name; | 
| 721 | 
  | 
        } else if (!(f2in = fopen(f2name, "rb"))) { | 
| 722 | 
  | 
                fprintf(stderr, "%s: cannot open for reading\n", f2name); | 
| 723 | 
< | 
                return(1); | 
| 723 | 
> | 
                return(2); | 
| 724 | 
  | 
        } | 
| 725 | 
  | 
                                                /* load headers */ | 
| 726 | 
  | 
        if ((typ1 = identify_type(f1name, f1in, &hdr1)) < 0) | 
| 727 | 
< | 
                return(1); | 
| 727 | 
> | 
                return(2); | 
| 728 | 
  | 
        if ((typ2 = identify_type(f2name, f2in, &hdr2)) < 0) | 
| 729 | 
< | 
                return(1); | 
| 729 | 
> | 
                return(2); | 
| 730 | 
  | 
        if (typ1 != typ2) { | 
| 731 | 
  | 
                if (report != REP_QUIET) | 
| 732 | 
  | 
                        printf("%s: '%s' is %s and '%s' is %s\n", | 
| 735 | 
  | 
                return(1); | 
| 736 | 
  | 
        } | 
| 737 | 
  | 
        ign_header |= !has_header(typ1);        /* check headers if indicated */ | 
| 738 | 
< | 
        if (!ign_header && !headers_match(&hdr1, &hdr2)) | 
| 738 | 
> | 
        if (!ign_header && !headers_match()) | 
| 739 | 
  | 
                return(1); | 
| 740 | 
  | 
        lu_done(&hdr1); lu_done(&hdr2); | 
| 741 | 
  | 
        if (!ign_header & (report >= REP_WARN)) { |