aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordcommander <dcommander@632fc199-4ca6-4c93-a231-07263d6284db>2010-10-10 06:04:05 +0000
committerdcommander <dcommander@632fc199-4ca6-4c93-a231-07263d6284db>2010-10-10 06:04:05 +0000
commit2233d3991e235d8f6cb4bf4bd6decd1fd050dd60 (patch)
treee3d672884b372fbcf0b0f5d6d8a00de04c25aac4
parent200cc3ffb05524b3bd6b3781d21d38e9214d6905 (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.111
-rw-r--r--rdjpgcom.c33
2 files changed, 36 insertions, 8 deletions
diff --git a/rdjpgcom.1 b/rdjpgcom.1
index 2bba04e..97611df 100644
--- a/rdjpgcom.1
+++ b/rdjpgcom.1
@@ -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
diff --git a/rdjpgcom.c b/rdjpgcom.c
index ffe6fc6..3719154 100644
--- a/rdjpgcom.c
+++ b/rdjpgcom.c
@@ -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);