X-Git-Url: http://git.savannah.gnu.org/gitweb/?p=enscript.git;a=blobdiff_plain;f=src%2Futil.c;h=cb8c0828c8bc0eee6449062ce89614e0a6c779d9;hp=d214549b2d11cda22e286ed67c7b1b54f8093c5c;hb=0378bb0fa0a1e4649fdc6e4c7f8990ac566cd866;hpb=cee050d75d296ea9420e3885fddaae2d43f2521c;ds=sidebyside diff --git a/src/util.c b/src/util.c index d214549..cb8c082 100644 --- a/src/util.c +++ b/src/util.c @@ -6,25 +6,24 @@ */ /* - * This file is part of GNU enscript. + * This file is part of GNU Enscript. * - * This program is free software; you can redistribute it and/or modify + * Enscript is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2, or (at your option) - * any later version. + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. * - * This program is distributed in the hope that it will be useful, + * Enscript is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License - * along with this program; see the file COPYING. If not, write to - * the Free Software Foundation, 59 Temple Place - Suite 330, - * Boston, MA 02111-1307, USA. + * along with Enscript. If not, see . */ #include "gsint.h" +#include /* * Types and definitions. @@ -32,7 +31,7 @@ #define CFG_FATAL(body) \ do { \ - fprintf (stderr, "%s:%s:%d: ", program, fname, line); \ + fprintf (stderr, "%s:%s:%d: ", program, buffer_ptr(&fname), line); \ fprintf body; \ fprintf (stderr, "\n"); \ fflush (stderr); \ @@ -94,6 +93,19 @@ static struct if (token2 == NULL) \ CFG_FATAL ((stderr, _("missing argument: %s"), token)); +void search_and_replace(char *str, char *search, char *replace) { + char *pos; + int search_len = strlen(search); + int replace_len = strlen(replace); + + while ((pos = strstr(str, search)) != NULL) { + char tmp[strlen(str) + 1]; + strcpy(tmp, pos + search_len); + strcpy(pos, replace); + strcpy(pos + replace_len, tmp); + str = pos + replace_len; + } +} int read_config (char *path, char *file) { @@ -110,10 +122,13 @@ read_config (char *path, char *file) fp = fopen (buffer_ptr (&fname), "r"); - buffer_uninit (&fname); + /* We wait to uninit the buffer so that CFG_FATAL can use it. */ if (fp == NULL) - return 0; + { + buffer_uninit (&fname); + return 0; + } while (fgets (buf, sizeof (buf), fp)) { @@ -137,6 +152,7 @@ read_config (char *path, char *file) { token2 = GET_TOKEN (NULL); CHECK_TOKEN (); + search_and_replace(token2,"$HOME",getenv("HOME")); xfree (afm_path); afm_path = xstrdup (token2); } @@ -170,6 +186,16 @@ read_config (char *path, char *file) { token2 = GET_TOKEN (NULL); CHECK_TOKEN (); +#ifdef LC_PAPER + if (!strcasecmp("LC_PAPER", token2)) + { + unsigned int paperheight = (unsigned int)nl_langinfo(_NL_PAPER_HEIGHT); + if (paperheight && paperheight == 279) + token2 = "letter"; + else + token2 = "a4"; + } +#endif xfree (media_name); media_name = xstrdup (token2); } @@ -438,6 +464,9 @@ read_config (char *path, char *file) else CFG_FATAL ((stderr, _("illegal option: %s"), token)); } + + fclose (fp); + buffer_uninit (&fname); return 1; } @@ -573,6 +602,7 @@ paste_file (char *name, char *suffix) (void **) &cp2)) { /* Not it is not, we must include this resource. */ +#include fprintf (ofp, "%%%%IncludeResource: font %s\n", cp); /* @@ -625,7 +655,7 @@ paste_file (char *name, char *suffix) if (j >= sizeof (name) - 1) FATAL ((stderr, _("%s:%d: %%Format: too long name, maxlen=%d"), - buffer_ptr (ctx.fullname), line, sizeof (name) - 1)); + buffer_ptr (ctx.fullname), line, (int)(sizeof (name) - 1))); /* Find the start of the format string. */ for (; buf[i] && isspace (buf[i]); i++) @@ -948,6 +978,11 @@ read_font_info (void) enc_flags); break; + case ENC_ISO_8859_15: + (void) afm_font_encoding (font, AFM_ENCODING_ISO_8859_15, + enc_flags); + break; + case ENC_ASCII: (void) afm_font_encoding (font, AFM_ENCODING_ASCII, enc_flags); break; @@ -1239,6 +1274,8 @@ escape_string (char *string) /* Create result. */ cp = xmalloc (len + 1); + if (cp == NULL) + return NULL; for (i = 0, j = 0; string[i]; i++) switch (string[i]) { @@ -1354,7 +1391,8 @@ format_user_string (char *context_name, char *str) break; case 'c': /* `%c' trailing component of pwd. */ - getcwd (buf, sizeof (buf)); + if (!getcwd (buf, sizeof (buf))) + perror("getcwd"); cp = strrchr (buf, '/'); if (cp) cp++; @@ -1370,7 +1408,8 @@ format_user_string (char *context_name, char *str) break; case 'd': /* `%d' current working directory */ - getcwd (buf, sizeof (buf)); + if (!getcwd (buf, sizeof (buf))) + perror("getcwd"); APPEND_STR (buf); break; @@ -1838,7 +1877,7 @@ parse_float (char *string, int units, int horizontal) case 'l': if (horizontal) - val *= CHAR_WIDTH ('m'); + val *= FNT_CHAR_WIDTH ('m'); else val *= LINESKIP; break; @@ -1879,6 +1918,7 @@ is_open (InputStream *is, FILE *fp, char *fname, char *input_filter) char *cmd = NULL; int cmdlen; int i, pos; + char *cp; is->is_pipe = 1; @@ -1902,12 +1942,16 @@ is_open (InputStream *is, FILE *fp, char *fname, char *input_filter) { case 's': /* Expand cmd-buffer. */ - cmdlen += strlen (fname); - cmd = xrealloc (cmd, cmdlen); + if ((cp = shell_escape (fname)) != NULL) + { + cmdlen += strlen (cp); + cmd = xrealloc (cmd, cmdlen); - /* Paste filename. */ - strcpy (cmd + pos, fname); - pos += strlen (fname); + /* Paste filename. */ + strcpy (cmd + pos, cp); + pos += strlen (cp); + free (cp); + } i++; break; @@ -2116,3 +2160,36 @@ buffer_len (Buffer *buffer) { return buffer->len; } + +/* + * Escapes the name of a file so that the shell groks it in 'single' + * quotation marks. The resulting pointer has to be free()ed when not + * longer used. +*/ +char * +shell_escape(const char *fn) +{ + size_t len = 0; + const char *inp; + char *retval, *outp; + + for(inp = fn; *inp; ++inp) + switch(*inp) + { + case '\'': len += 4; break; + default: len += 1; break; + } + + outp = retval = malloc(len + 1); + if(!outp) + return NULL; /* perhaps one should do better error handling here */ + for(inp = fn; *inp; ++inp) + switch(*inp) + { + case '\'': *outp++ = '\''; *outp++ = '\\'; *outp++ = '\'', *outp++ = '\''; break; + default: *outp++ = *inp; break; + } + *outp = 0; + + return retval; +}