📄 chksum.c
字号:
#ifndef lintstatic char sccsid[] = "@(#)chksum.c 1.1 92/07/30 Copyr 1990 Sun Micro";#endif/* * Copyright (c) 1990 by Sun Microsystems, Inc. */#include <stdio.h>#include <string.h>#include <sys/wait.h>#include <pixrect/pixrect_hs.h>#include <sdrtns.h> /* sdrtns.h should always be included */#include <esd.h>#define TAR "tar"#define TAR_ARG "xf"#define CG12_DATA "cg12.data"#define CG12_DATA_GSXR "cg12.data.gsxr"#define ICON_SIZE 8#define TOLERANCE 4#define MAX_TRIALS 10externint chksum_gen;externint chksum_dump;externchar *device_name;externchar *getfname();/**********************************************************************/char *chksum_verify(test)/**********************************************************************/char *test;{ static char errtxt[256]; Pixrect *device_pr; Pixrect *pr; Pixrect *mpr; int reduced_width; int reduced_height; int icon_width = ICON_SIZE; int icon_height = ICON_SIZE; int red_err = 0; int green_err = 0; int blue_err = 0; func_name = "chksum_verify"; TRACE_IN#ifdef ALWAYS_PASSED /* for testing purposes */ TRACE_OUT sleep(3); return (char *)0;#else if !ALWAYS_PASSED device_pr = pr_open(device_name); if (device_pr == NULL) { (void)sprintf(errtxt, errmsg_list[4], device_name); TRACE_OUT return(errtxt); } /* set 24-bit plane group and attributes */ (void)pr_set_planes(device_pr, PIXPG_24BIT_COLOR, -1); /* no matter what the screen size really is, we will work * only in a region of 1152x900. */ pr = pr_region(device_pr, 0, 0, 1152, 900); if (pr == NULL) { (void)pr_close(device_pr); (void)sprintf(errtxt, errmsg_list[4], device_name); TRACE_OUT return(errtxt); } reduced_width = pr->pr_width / icon_width; reduced_height = pr->pr_height / icon_height; mpr = mem_create(reduced_width, reduced_height, 8); if (mpr == NULL) { (void)pr_close(pr); (void)pr_close(device_pr); TRACE_OUT return("unable to create memory pixrect.\n"); } if (reduce_output_image(pr, mpr, icon_width, icon_height, RED_CHK)){ (void)pr_close(pr); (void)pr_close(device_pr); (void)pr_close(mpr); TRACE_OUT return("Can't reduce result image, RED component.\n"); } if (verify_with_file(getfname(test, RED_CHK), mpr, chksum_gen)) { red_err = 1; } if (reduce_output_image(pr, mpr, icon_width, icon_height, GREEN_CHK)) { (void)pr_close(pr); (void)pr_close(device_pr); (void)pr_close(mpr); TRACE_OUT return("Can't reduce result image, GREEN component.\n"); } if (verify_with_file(getfname(test, GREEN_CHK), mpr, chksum_gen)) { green_err = 1; } if (reduce_output_image(pr, mpr, icon_width, icon_height, BLUE_CHK)) { (void)pr_close(pr); (void)pr_close(device_pr); (void)pr_close(mpr); TRACE_OUT return("Can't reduce result image, BLUE component.\n"); } if (verify_with_file(getfname(test, BLUE_CHK), mpr, chksum_gen)) { blue_err = 1; } (void)pr_close(pr); (void)pr_close(mpr); (void)pr_close(device_pr); if (red_err | green_err | blue_err) { if (chksum_dump) { FILE *fd; char fname[256]; device_pr = pr_open(device_name); (void)pr_set_planes(device_pr, PIXPG_24BIT_COLOR, -1); strcpy(fname, "/tmp/"); strcat(fname, test); strcat(fname, ".dump"); fd = fopen(fname, "w"); if (fd == NULL) { (void)fb_send_message(SKIP_ERROR, CONSOLE, "Can't open %s to dump pixrect.\n", fname); } else { (void)pr_dump(device_pr, fd, NULL, RT_BYTE_ENCODED, 0); (void)fclose(fd); } (void)pr_close(device_pr); } (void)strcpy(errtxt, "Error(s) found in "); if (red_err) (void)strcat(errtxt, "RED "); if (green_err) (void)strcat(errtxt, "GREEN "); if (blue_err) (void)strcat(errtxt, "BLUE "); (void)strcat(errtxt, "component(s).\n"); TRACE_OUT return errtxt; } else { TRACE_OUT return (char *)0; }#endif ALWAYS_PASSED} /**********************************************************************/static intverify_with_file(testname, mpr, gen)/**********************************************************************/char *testname;Pixrect *mpr;int gen;{ FILE *file; Pixrect *fpr; unsigned char *md; unsigned char *fd; register unsigned char *mp; register unsigned char *fp; int npixels; int i; int err; int trials; func_name = "verify_with_file"; TRACE_IN (void)check_key(); if (gen) { /* generate test result file rather than checking */ file = fopen(testname, "w"); if (file == NULL) { (void)perror(testname); TRACE_OUT return 1; } err = pr_dump(mpr, file, NULL, RT_BYTE_ENCODED, 0); (void)fclose(file); if (err) { (void)perror(testname); TRACE_OUT return 1; } else { TRACE_OUT return 0; } } else { /* verify content of result file against mpr */ trials = MAX_TRIALS; do { file = fopen(testname, "r"); if (file) break; sleep(1); } while (file == NULL && trials--); if (file == NULL) { (void)perror(testname); TRACE_OUT return 1; } fpr = pr_load(file, NULL); (void)fclose(file); (void)unlink(testname); if (fpr == NULL) { (void)perror(testname); TRACE_OUT return 1; } md = (unsigned char *)mpr_d(mpr)->md_image; fd = (unsigned char *)mpr_d(fpr)->md_image; npixels = mpr->pr_width * mpr->pr_height; for (mp = md, fp = fd, i = 0 ; i < npixels ; fp++, mp++, i++) { register fmax = *fp + TOLERANCE; register fmin = *fp - TOLERANCE; if (fmax > 255) fmax = 255; if (fmin < 0) fmin = 0; if (*mp > fmax || *mp < fmin) { if (debug) { FILE *fd; char fname[256]; strcpy(fname, testname); strcat(fname, ".dump"); fd = fopen(fname, "w"); if (fd == NULL) { (void)fb_send_message(SKIP_ERROR, CONSOLE, "Can't open %s to dump pixrect.\n", fname); } else { (void)pr_dump(mpr, fd, NULL, RT_BYTE_ENCODED, 0); (void)fclose(fd); } } (void)pr_close(fpr); TRACE_OUT return 1; } } (void)pr_close(fpr); TRACE_OUT return 0; }}/**********************************************************************/static intreduce_output_image(spr, dpr, icon_width, icon_height, type)/**********************************************************************/Pixrect *spr;Pixrect *dpr;int icon_width;int icon_height;int type;{ Pixrect *ipr; unsigned char *dd; register unsigned int *id; register int x; register int y; register int i; register int shift; int npixels; double total; int value; int mask; int xrun; int yrun; func_name = "reduce_output_image"; TRACE_IN ipr = mem_create(icon_width, icon_height, 32); if (ipr == NULL) { TRACE_OUT return 1; } dd = (unsigned char *)mpr_d(dpr)->md_image; npixels = icon_width * icon_height; xrun = spr->pr_width-icon_width; yrun = spr->pr_height-icon_height; if (type == RED_CHK) { mask = 0xff; shift = 0; } else if (type == GREEN_CHK) { mask = 0xff00; shift = 8; } else if (type == BLUE_CHK) { mask = 0xff0000; shift = 16; } else { mask = 0; } for (y = 0 ; y <= yrun ; y += icon_height) { (void)check_key(); for (x = 0 ; x <= xrun ; x += icon_width) { (void)pr_rop (ipr, 0, 0, icon_width, icon_height, PIX_SRC | PIX_DONTCLIP, spr, x, y); id = (unsigned int *)mpr_d(ipr)->md_image; for (i = 0, total = 0.0 ; i < npixels ; i++) { total += (double)((*id++ & mask) >> shift); } value = (unsigned char)(total / (double)npixels); *dd++ = value; if (debug) { /* write back to the frame buffer */ id = (unsigned int *)mpr_d(ipr)->md_image; for (i = 0 ; i < npixels ; i++) { *id &= ~mask; *id++ |= (value << shift); } (void)pr_rop (spr, x, y, icon_width, icon_height, PIX_SRC | PIX_DONTCLIP, ipr, 0, 0); } } } TRACE_OUT return 0;}/**********************************************************************/xtract(file)/**********************************************************************/char *file;{ char file_red[128], file_green[128], file_blue[128]; func_name = "xtract"; TRACE_IN strcpy(file_red, getfname(file, RED_CHK)); strcpy(file_green, getfname(file, GREEN_CHK)); strcpy(file_blue, getfname(file, BLUE_CHK)); (void)tarxf(file_red, file_green, file_blue); TRACE_OUT}/**********************************************************************/tarxf(testname_red, testname_green, testname_blue)/**********************************************************************/char *testname_red;char *testname_green;char *testname_blue;{ extern int sys_nerr; extern int errno; extern char *sys_errlist[]; int child_pid; int count; func_name = "tarxf"; TRACE_IN child_pid = vfork(); if (child_pid == 0) { Pixrect *pr; pr = pr_open(device_name); execlp(TAR, TAR, TAR_ARG, (pr->pr_size.x == 1280) ? CG12_DATA_GSXR : CG12_DATA, testname_red, testname_green, testname_blue, (char *)0); (void)fb_send_message(SKIP_ERROR, CONSOLE, "tar: %s\n", sys_errlist[errno]); _exit(-1); } else if (child_pid < 0) { (void)fb_send_message(SKIP_ERROR, CONSOLE, "vfork: %s\n", sys_errlist[errno]); } /* wait for the tar program to complete */ count = 1000000; while ((wait4(child_pid, NULL, WNOHANG | WUNTRACED, NULL) == NULL) && count--); if (count == 0) { (void)fb_send_message(SKIP_ERROR, WARNING, "'tar' never finished.\n"); } TRACE_OUT}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -