1 /* 2 * cdjpeg.c 3 * 4 * This file was part of the Independent JPEG Group's software: 5 * Copyright (C) 1991-1997, Thomas G. Lane. 6 * It was modified by The libjpeg-turbo Project to include only code relevant 7 * to libjpeg-turbo. 8 * For conditions of distribution and use, see the accompanying README file. 9 * 10 * This file contains common support routines used by the IJG application 11 * programs (cjpeg, djpeg, jpegtran). 12 */ 13 14 #include "cdjpeg.h" /* Common decls for cjpeg/djpeg applications */ 15 #include <ctype.h> /* to declare isupper(), tolower() */ 16 #ifdef USE_SETMODE 17 #include <fcntl.h> /* to declare setmode()'s parameter macros */ 18 /* If you have setmode() but not <io.h>, just delete this line: */ 19 #include <io.h> /* to declare setmode() */ 20 #endif 21 22 23 /* 24 * Optional progress monitor: display a percent-done figure on stderr. 25 */ 26 27 #ifdef PROGRESS_REPORT 28 29 METHODDEF(void) 30 progress_monitor (j_common_ptr cinfo) 31 { 32 cd_progress_ptr prog = (cd_progress_ptr) cinfo->progress; 33 int total_passes = prog->pub.total_passes + prog->total_extra_passes; 34 int percent_done = (int) (prog->pub.pass_counter*100L/prog->pub.pass_limit); 35 36 if (percent_done != prog->percent_done) { 37 prog->percent_done = percent_done; 38 if (total_passes > 1) { 39 fprintf(stderr, "\rPass %d/%d: %3d%% ", 40 prog->pub.completed_passes + prog->completed_extra_passes + 1, 41 total_passes, percent_done); 42 } else { 43 fprintf(stderr, "\r %3d%% ", percent_done); 44 } 45 fflush(stderr); 46 } 47 } 48 49 50 GLOBAL(void) 51 start_progress_monitor (j_common_ptr cinfo, cd_progress_ptr progress) 52 { 53 /* Enable progress display, unless trace output is on */ 54 if (cinfo->err->trace_level == 0) { 55 progress->pub.progress_monitor = progress_monitor; 56 progress->completed_extra_passes = 0; 57 progress->total_extra_passes = 0; 58 progress->percent_done = -1; 59 cinfo->progress = &progress->pub; 60 } 61 } 62 63 64 GLOBAL(void) 65 end_progress_monitor (j_common_ptr cinfo) 66 { 67 /* Clear away progress display */ 68 if (cinfo->err->trace_level == 0) { 69 fprintf(stderr, "\r \r"); 70 fflush(stderr); 71 } 72 } 73 74 #endif 75 76 77 /* 78 * Case-insensitive matching of possibly-abbreviated keyword switches. 79 * keyword is the constant keyword (must be lower case already), 80 * minchars is length of minimum legal abbreviation. 81 */ 82 83 GLOBAL(boolean) 84 keymatch (char * arg, const char * keyword, int minchars) 85 { 86 register int ca, ck; 87 register int nmatched = 0; 88 89 while ((ca = *arg++) != '\0') { 90 if ((ck = *keyword++) == '\0') 91 return FALSE; /* arg longer than keyword, no good */ 92 if (isupper(ca)) /* force arg to lcase (assume ck is already) */ 93 ca = tolower(ca); 94 if (ca != ck) 95 return FALSE; /* no good */ 96 nmatched++; /* count matched characters */ 97 } 98 /* reached end of argument; fail if it's too short for unique abbrev */ 99 if (nmatched < minchars) 100 return FALSE; 101 return TRUE; /* A-OK */ 102 } 103 104 105 /* 106 * Routines to establish binary I/O mode for stdin and stdout. 107 * Non-Unix systems often require some hacking to get out of text mode. 108 */ 109 110 GLOBAL(FILE *) 111 read_stdin (void) 112 { 113 FILE * input_file = stdin; 114 115 #ifdef USE_SETMODE /* need to hack file mode? */ 116 setmode(fileno(stdin), O_BINARY); 117 #endif 118 #ifdef USE_FDOPEN /* need to re-open in binary mode? */ 119 if ((input_file = fdopen(fileno(stdin), READ_BINARY)) == NULL) { 120 fprintf(stderr, "Cannot reopen stdin\n"); 121 exit(EXIT_FAILURE); 122 } 123 #endif 124 return input_file; 125 } 126 127 128 GLOBAL(FILE *) 129 write_stdout (void) 130 { 131 FILE * output_file = stdout; 132 133 #ifdef USE_SETMODE /* need to hack file mode? */ 134 setmode(fileno(stdout), O_BINARY); 135 #endif 136 #ifdef USE_FDOPEN /* need to re-open in binary mode? */ 137 if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { 138 fprintf(stderr, "Cannot reopen stdout\n"); 139 exit(EXIT_FAILURE); 140 } 141 #endif 142 return output_file; 143 } 144