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