19f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 29f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * cdjpeg.c 39f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 49f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Copyright (C) 1991-1997, Thomas G. Lane. 59f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file is part of the Independent JPEG Group's software. 69f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * For conditions of distribution and use, see the accompanying README file. 79f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * 89f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * This file contains common support routines used by the IJG application 99f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * programs (cjpeg, djpeg, jpegtran). 109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <ctype.h> /* to declare isupper(), tolower() */ 149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef NEED_SIGNAL_CATCHER 159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <signal.h> /* to declare signal() */ 169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_SETMODE 189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <fcntl.h> /* to declare setmode()'s parameter macros */ 199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* If you have setmode() but not <io.h>, just delete this line: */ 209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#include <io.h> /* to declare setmode() */ 219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Signal catcher to ensure that temporary files are removed before aborting. 269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * NB: for Amiga Manx C this is actually a global routine named _abort(); 279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * we put "#define signal_catcher _abort" in jconfig.h. Talk about bogus... 289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef NEED_SIGNAL_CATCHER 319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstatic j_common_ptr sig_cinfo; 339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectvoid /* must be global for Manx C */ 359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectsignal_catcher (int signum) 369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sig_cinfo != NULL) { 389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (sig_cinfo->err != NULL) /* turn off trace output */ 399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sig_cinfo->err->trace_level = 0; 409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project jpeg_destroy(sig_cinfo); /* clean up memory allocation & temp files */ 419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectenable_signal_catcher (j_common_ptr cinfo) 489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project sig_cinfo = cinfo; 509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef SIGINT /* not all systems have SIGINT */ 519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project signal(SIGINT, signal_catcher); 529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef SIGTERM /* not all systems have SIGTERM */ 549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project signal(SIGTERM, signal_catcher); 559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Optional progress monitor: display a percent-done figure on stderr. 639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef PROGRESS_REPORT 669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectMETHODDEF(void) 689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectprogress_monitor (j_common_ptr cinfo) 699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cd_progress_ptr prog = (cd_progress_ptr) cinfo->progress; 719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int total_passes = prog->pub.total_passes + prog->total_extra_passes; 729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit); 739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (percent_done != prog->percent_done) { 759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project prog->percent_done = percent_done; 769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (total_passes > 1) { 779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "\rPass %d/%d: %3d%% ", 789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project prog->pub.completed_passes + prog->completed_extra_passes + 1, 799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project total_passes, percent_done); 809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } else { 819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "\r %3d%% ", percent_done); 829f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 839f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fflush(stderr); 849f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 859f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 869f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 879f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 889f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 899f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectstart_progress_monitor (j_common_ptr cinfo, cd_progress_ptr progress) 909f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 919f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Enable progress display, unless trace output is on */ 929f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->err->trace_level == 0) { 939f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->pub.progress_monitor = progress_monitor; 949f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->completed_extra_passes = 0; 959f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->total_extra_passes = 0; 969f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project progress->percent_done = -1; 979f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project cinfo->progress = &progress->pub; 989f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 999f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1009f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1019f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1029f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(void) 1039f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectend_progress_monitor (j_common_ptr cinfo) 1049f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1059f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* Clear away progress display */ 1069f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (cinfo->err->trace_level == 0) { 1079f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "\r \r"); 1089f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fflush(stderr); 1099f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1109f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1119f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1129f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1139f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1149f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1159f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1169f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Case-insensitive matching of possibly-abbreviated keyword switches. 1179f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * keyword is the constant keyword (must be lower case already), 1189f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * minchars is length of minimum legal abbreviation. 1199f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1209f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1219f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(boolean) 1229f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectkeymatch (char * arg, const char * keyword, int minchars) 1239f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1249f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int ca, ck; 1259f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project register int nmatched = 0; 1269f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1279f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project while ((ca = *arg++) != '\0') { 1289f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((ck = *keyword++) == '\0') 1299f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; /* arg longer than keyword, no good */ 1309f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (isupper(ca)) /* force arg to lcase (assume ck is already) */ 1319f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project ca = tolower(ca); 1329f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (ca != ck) 1339f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; /* no good */ 1349f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project nmatched++; /* count matched characters */ 1359f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1369f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project /* reached end of argument; fail if it's too short for unique abbrev */ 1379f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if (nmatched < minchars) 1389f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return FALSE; 1399f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return TRUE; /* A-OK */ 1409f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1419f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1429f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1439f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project/* 1449f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Routines to establish binary I/O mode for stdin and stdout. 1459f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project * Non-Unix systems often require some hacking to get out of text mode. 1469f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project */ 1479f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1489f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(FILE *) 1499f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectread_stdin (void) 1509f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1519f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * input_file = stdin; 1529f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1539f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_SETMODE /* need to hack file mode? */ 1549f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project setmode(fileno(stdin), O_BINARY); 1559f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1569f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_FDOPEN /* need to re-open in binary mode? */ 1579f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) { 1589f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Cannot reopen stdin\n"); 1599f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 1609f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1619f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1629f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return input_file; 1639f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 1649f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1659f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1669f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source ProjectGLOBAL(FILE *) 1679f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Projectwrite_stdout (void) 1689f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project{ 1699f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project FILE * output_file = stdout; 1709f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project 1719f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_SETMODE /* need to hack file mode? */ 1729f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project setmode(fileno(stdout), O_BINARY); 1739f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1749f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#ifdef USE_FDOPEN /* need to re-open in binary mode? */ 1759f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { 1769f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project fprintf(stderr, "Cannot reopen stdout\n"); 1779f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project exit(EXIT_FAILURE); 1789f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project } 1799f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project#endif 1809f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project return output_file; 1819f5d49a1588e438ae7ceabd0c94172117e3303aaThe Android Open Source Project} 182