diff options
author | dcommander <dcommander@632fc199-4ca6-4c93-a231-07263d6284db> | 2010-10-10 06:04:05 +0000 |
---|---|---|
committer | dcommander <dcommander@632fc199-4ca6-4c93-a231-07263d6284db> | 2010-10-10 06:04:05 +0000 |
commit | 2233d3991e235d8f6cb4bf4bd6decd1fd050dd60 (patch) | |
tree | e3d672884b372fbcf0b0f5d6d8a00de04c25aac4 | |
parent | 200cc3ffb05524b3bd6b3781d21d38e9214d6905 (diff) |
Add -raw option to rdjpgcom for outputting non-printable characters as-is; Make rdjpgcom locale-aware.
git-svn-id: svn://svn.code.sf.net/p/libjpeg-turbo/code/trunk@246 632fc199-4ca6-4c93-a231-07263d6284db
-rw-r--r-- | rdjpgcom.1 | 11 | ||||
-rw-r--r-- | rdjpgcom.c | 33 |
2 files changed, 36 insertions, 8 deletions
@@ -1,9 +1,12 @@ -.TH RDJPGCOM 1 "11 October 1997" +.TH RDJPGCOM 1 "02 April 2009" .SH NAME rdjpgcom \- display text comments from a JPEG file .SH SYNOPSIS .B rdjpgcom [ +.B \-raw +] +[ .B \-verbose ] [ @@ -25,6 +28,12 @@ file. The maximum size of a COM block is 64K, but you can have as many of them as you like in one JPEG file. .SH OPTIONS .TP +.B \-raw +Normally +.B rdjpgcom +escapes non-printable characters in comments, for security reasons. +This option avoids that. +.PP .B \-verbose Causes .B rdjpgcom @@ -2,6 +2,7 @@ * rdjpgcom.c * * Copyright (C) 1994-1997, Thomas G. Lane. + * Modified 2009 by Bill Allombert, Guido Vollbeding. * This file is part of the Independent JPEG Group's software. * For conditions of distribution and use, see the accompanying README file. * @@ -14,6 +15,9 @@ #define JPEG_CJPEG_DJPEG /* to get the command-line config symbols */ #include "jinclude.h" /* get auto-config symbols, <stdio.h> */ +#ifdef HAVE_LOCALE_H +#include <locale.h> /* Bill Allombert: use locale for isprint */ +#endif #include <ctype.h> /* to declare isupper(), tolower() */ #ifdef USE_SETMODE #include <fcntl.h> /* to declare setmode()'s parameter macros */ @@ -218,12 +222,17 @@ skip_variable (void) */ static void -process_COM (void) +process_COM (int raw) { unsigned int length; int ch; int lastch = 0; + /* Bill Allombert: set locale properly for isprint */ +#ifdef HAVE_LOCALE_H + setlocale(LC_CTYPE, ""); +#endif + /* Get the marker parameter length count */ length = read_2_bytes(); /* Length includes itself, so must be at least 2 */ @@ -233,12 +242,14 @@ process_COM (void) while (length > 0) { ch = read_1_byte(); + if (raw) { + putc(ch, stdout); /* Emit the character in a readable form. * Nonprintables are converted to \nnn form, * while \ is converted to \\. * Newlines in CR, CR/LF, or LF form will be printed as one newline. */ - if (ch == '\r') { + } else if (ch == '\r') { printf("\n"); } else if (ch == '\n') { if (lastch != '\r') @@ -254,6 +265,11 @@ process_COM (void) length--; } printf("\n"); + + /* Bill Allombert: revert to C locale */ +#ifdef HAVE_LOCALE_H + setlocale(LC_CTYPE, "C"); +#endif } @@ -321,7 +337,7 @@ process_SOFn (int marker) */ static int -scan_JPEG_header (int verbose) +scan_JPEG_header (int verbose, int raw) { int marker; @@ -362,7 +378,7 @@ scan_JPEG_header (int verbose) return marker; case M_COM: - process_COM(); + process_COM(raw); break; case M_APP12: @@ -371,7 +387,7 @@ scan_JPEG_header (int verbose) */ if (verbose) { printf("APP12 contains:\n"); - process_COM(); + process_COM(raw); } else skip_variable(); break; @@ -398,6 +414,7 @@ usage (void) fprintf(stderr, "Usage: %s [switches] [inputfile]\n", progname); fprintf(stderr, "Switches (names may be abbreviated):\n"); + fprintf(stderr, " -raw Display non-printable characters in comments (unsafe)\n"); fprintf(stderr, " -verbose Also display dimensions of JPEG image\n"); exit(EXIT_FAILURE); @@ -438,7 +455,7 @@ main (int argc, char **argv) { int argn; char * arg; - int verbose = 0; + int verbose = 0, raw = 0; /* On Mac, fetch a command line. */ #ifdef USE_CCOMMAND @@ -457,6 +474,8 @@ main (int argc, char **argv) arg++; /* advance over '-' */ if (keymatch(arg, "verbose", 1)) { verbose++; + } else if (keymatch(arg, "raw", 1)) { + raw = 1; } else usage(); } @@ -488,7 +507,7 @@ main (int argc, char **argv) } /* Scan the JPEG headers. */ - (void) scan_JPEG_header(verbose); + (void) scan_JPEG_header(verbose, raw); /* All done. */ exit(EXIT_SUCCESS); |