From 0e7690deacc3232f1a0bd3902255ffa34292e5cf Mon Sep 17 00:00:00 2001 From: Claudio Bley Date: Fri, 1 Nov 2013 11:10:13 +0200 Subject: [PATCH] Fix handling of comments in NetPBM image files. src/image.c (pbm_next_char): New function. (pbm_scan_number): Use it. lisp/image.el (image-type-header-regexps): Fix the 'pbm' part to allow comments in pbm files. --- lisp/ChangeLog | 3 +++ lisp/image.el | 5 ++++- src/ChangeLog | 4 +++- src/image.c | 51 +++++++++++++++++++++++++++++--------------------- 4 files changed, 40 insertions(+), 23 deletions(-) diff --git a/lisp/ChangeLog b/lisp/ChangeLog index a73c38bd52..fd8e77c9c5 100644 --- a/lisp/ChangeLog +++ b/lisp/ChangeLog @@ -1,5 +1,8 @@ 2013-11-01 Claudio Bley + * image.el (image-type-header-regexps): Fix the 'pbm' part to + allow comments in pbm files. + * term/w32-win.el (dynamic-library-alist): Support newer versions of libjpeg starting with v7: look only for the DLL from the version against which Emacs was built. diff --git a/lisp/image.el b/lisp/image.el index 6ce5b82ec4..69d890719d 100644 --- a/lisp/image.el +++ b/lisp/image.el @@ -34,7 +34,10 @@ (defconst image-type-header-regexps `(("\\`/[\t\n\r ]*\\*.*XPM.\\*/" . xpm) - ("\\`P[1-6][[:space:]]+\\(?:#.*[[:space:]]+\\)*[0-9]+[[:space:]]+[0-9]+" . pbm) + ("\\`P[1-6]\\\(?:\ +\\(?:\\(?:#[^\r\n]*[\r\n]\\)?[[:space:]]\\)+\ +\\(?:\\(?:#[^\r\n]*[\r\n]\\)?[0-9]\\)+\ +\\)\\{2\\}" . pbm) ("\\`GIF8[79]a" . gif) ("\\`\x89PNG\r\n\x1a\n" . png) ("\\`[\t\n\r ]*#define \\([a-z0-9_]+\\)_width [0-9]+\n\ diff --git a/src/ChangeLog b/src/ChangeLog index 0d58733f4b..bfa2810557 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,6 +1,8 @@ 2013-11-01 Claudio Bley - * image.c (Qlibjpeg_version): New variable. + * image.c (pbm_next_char): New function. + (pbm_scan_number): Use it. + (Qlibjpeg_version): New variable. (syms_of_image): DEFSYM and initialize it. 2013-10-31 Jan Djärv diff --git a/src/image.c b/src/image.c index fca1bb077f..958295c5d0 100644 --- a/src/image.c +++ b/src/image.c @@ -5106,6 +5106,27 @@ pbm_image_p (Lisp_Object object) } +/* Get next char skipping comments in Netpbm header. Returns -1 at + end of input. */ + +static int +pbm_next_char (unsigned char **s, unsigned char *end) +{ + int c = -1; + + while (*s < end && (c = *(*s)++, c == '#')) + { + /* Skip to the next line break. */ + while (*s < end && (c = *(*s)++, c != '\n' && c != '\r')) + ; + + c = -1; + } + + return c; +} + + /* Scan a decimal number from *S and return it. Advance *S while reading the number. END is the end of the string. Value is -1 at end of input. */ @@ -5115,28 +5136,16 @@ pbm_scan_number (unsigned char **s, unsigned char *end) { int c = 0, val = -1; - while (*s < end) - { - /* Skip white-space. */ - while (*s < end && (c = *(*s)++, c_isspace (c))) - ; + /* Skip white-space. */ + while ((c = pbm_next_char (s, end)) != -1 && c_isspace (c)) + ; - if (c == '#') - { - /* Skip comment to end of line. */ - while (*s < end && (c = *(*s)++, c != '\n')) - ; - } - else if (c_isdigit (c)) - { - /* Read decimal number. */ - val = c - '0'; - while (*s < end && (c = *(*s)++, c_isdigit (c))) - val = 10 * val + c - '0'; - break; - } - else - break; + if (c_isdigit (c)) + { + /* Read decimal number. */ + val = c - '0'; + while ((c = pbm_next_char (s, end)) != -1 && c_isdigit (c)) + val = 10 * val + c - '0'; } return val; -- 2.20.1