groff
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Groff] Strange error messages from Groff 1.22.3


From: Eli Zaretskii
Subject: Re: [Groff] Strange error messages from Groff 1.22.3
Date: Mon, 10 Nov 2014 17:08:21 +0200

> Date: Sun, 09 Nov 2014 08:46:21 +0100 (CET)
> Cc: address@hidden
> From: Werner LEMBERG <address@hidden>
> 
> 
> >> I was imagining something primitive, e.g. a working equivalent to
> >> 
> >>   #if defined(__MSDOS__) || (defined(_WIN32) && !defined(__CYGWIN__))
> >>   # define DOS2UNIX_FILENAME(f) dos2unix_filename(f)
> >>   #else
> >>   # define DOS2UNIX_FILENAME(f) (f)
> >>   #endif
> > 
> > But then the non-Windows code will have to call strsave and strcpy
> > unnecessarily, because we cannot modify 'const char *' strings.  If
> > that's okay with you, doing the above is easy; I was trying not to
> > incur that overhead on Posix platforms.
> 
> Well, `do_file' is the function called in the top-level loop, called
> once per file, thus the overhead is very small – and the slight
> degradation of efficiency in `table.cpp' is OK with me.
> 
> I suggest to use a `string' object for the filename string so that we
> have automatic deallocation; dos2unix_file can then use a `string &'
> parameter to get a slight C++ touch :-)

OK, here's take 2, hope you like it better:

2014-11-10  Eli Zaretskii  <address@hidden>

        * src/preproc/soelim/soelim.cpp (do_file):
        * src/preproc/refer/refer.cpp (do_file):
        * src/preproc/preconv/preconv.cpp (do_file):
        * src/preproc/pic/main.cpp (do_file):
        * src/preproc/eqn/main.cpp (do_file): Call normalize_for_lf to
        convert backslashes in the file name being processed to forward
        slashes.

        * src/include/lib.h (normalize_for_lf): Add prototype.

        * src/preproc/eqn/eqn.h:
        * src/preproc/pic/pic.h:
        * src/preproc/refer/refer.h:
        * src/preproc/tbl/table.h: Include stringclass.h before lib.h.

        * src/libs/libgroff/lf.cpp (normalize_for_lf): New function.

        * src/roff/groff/groff.cpp (append_arg_to_string)
        [_WIN32 && !__CYGWIN__]: Use only ".." for quoting in native
        Windows builds.

--- src/include/lib.h~0 2014-11-04 10:38:35.161524000 +0200
+++ src/include/lib.h   2014-11-10 16:39:53.801000000 +0200
@@ -99,6 +99,7 @@
 size_t path_name_max();
 
 int interpret_lf_args(const char *p);
+void normalize_for_lf (string &fn);
 
 extern char invalid_char_table[];
 


--- src/libs/libgroff/lf.cpp~0  2014-11-04 10:38:35.170524000 +0200
+++ src/libs/libgroff/lf.cpp    2014-11-10 16:40:10.644750000 +0200
@@ -19,9 +19,9 @@ along with this program. If not, see <ht
 
 #include <ctype.h>
 
+#include "stringclass.h"
 #include "lib.h"
 #include "cset.h"
-#include "stringclass.h"
 
 extern void change_filename(const char *);
 extern void change_lineno(int);
@@ -60,3 +60,15 @@ int interpret_lf_args(const char *p)
   change_lineno(ln);
   return 1;
 }
+
+void normalize_for_lf (string &fn)
+{
+#if defined(__MSDOS__) || (defined(_WIN32) && !defined(__CYGWIN__))
+  int fnlen = fn.length();
+  for (int i = 0; i < fnlen; i++)
+    {
+      if (fn[i] == '\\')
+       fn[i] = '/';
+    }
+#endif
+}


--- src/preproc/eqn/main.cpp~0  2014-11-04 10:38:35.232523000 +0200
+++ src/preproc/eqn/main.cpp    2014-11-10 16:46:14.160375000 +0200
@@ -18,7 +18,6 @@ You should have received a copy of the G
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
 #include "eqn.h"
-#include "stringclass.h"
 #include "device.h"
 #include "searchpath.h"
 #include "macropath.h"
@@ -66,9 +65,12 @@ void do_file(FILE *fp, const char *filen
 {
   string linebuf;
   string str;
+  string fn(filename);
+  fn += '\0';
+  normalize_for_lf(fn);
+  current_filename = fn.contents();
   if (output_format == troff)
-    printf(".lf 1 %s\n", filename);
-  current_filename = filename;
+    printf(".lf 1 %s\n", current_filename);
   current_lineno = 0;
   while (read_line(fp, &linebuf)) {
     if (linebuf.length() >= 4




--- src/preproc/pic/main.cpp~0  2014-11-04 10:38:35.226523000 +0200
+++ src/preproc/pic/main.cpp    2014-11-10 16:29:15.113500000 +0200
@@ -309,8 +309,11 @@ void do_file(const char *filename)
       fatal("can't open `%1': %2", filename, strerror(errno));
     }
   }
-  out->set_location(filename, 1);
-  current_filename = filename;
+  string fn(filename);
+  fn += '\0';
+  normalize_for_lf(fn);
+  current_filename = fn.contents();
+  out->set_location(current_filename, 1);
   current_lineno = 1;
   enum { START, MIDDLE, HAD_DOT, HAD_P, HAD_PS, HAD_l, HAD_lf } state = START;
   for (;;) {


--- src/preproc/preconv/preconv.cpp~0   2014-11-04 10:38:35.214524000 +0200
+++ src/preproc/preconv/preconv.cpp     2014-11-10 16:40:41.644750000 +0200
@@ -17,6 +17,7 @@ for more details.
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
+#include "stringclass.h"
 #include "lib.h"
 
 #include <assert.h>
@@ -26,7 +27,6 @@ along with this program. If not, see <ht
 #include "error.h"
 #include "localcharset.h"
 #include "nonposix.h"
-#include "stringclass.h"
 
 #include <locale.h>
 
@@ -1065,8 +1065,12 @@ do_file(const char *filename)
   }
   if (debug_flag)
     fprintf(stderr, "  encoding used: `%s'\n", encoding);
-  if (!raw_flag)
-    printf(".lf 1 %s\n", filename);
+  if (!raw_flag) {
+    string fn(filename);
+    fn += '\0';
+    normalize_for_lf(fn);
+    printf(".lf 1 %s\n", fn.contents());
+  }
   int success = 1;
   // Call converter (converters write to stdout).
   if (!strcasecmp(encoding, "ISO-8859-1"))


--- src/preproc/refer/refer.cpp~0       2014-11-04 10:38:35.245523000 +0200
+++ src/preproc/refer/refer.cpp 2014-11-10 16:45:51.019750000 +0200
@@ -432,8 +432,11 @@ static void do_file(const char *filename
       return;
     }
   }
-  current_filename = filename;
-  fprintf(outfp, ".lf 1 %s\n", filename);
+  string fn(filename);
+  fn += '\0';
+  normalize_for_lf(fn);
+  current_filename = fn.contents();
+  fprintf(outfp, ".lf 1 %s\n", current_filename);
   string line;
   current_lineno = 0;
   for (;;) {


--- src/preproc/soelim/soelim.cpp~0     2014-11-04 10:38:35.250523000 +0200
+++ src/preproc/soelim/soelim.cpp       2014-11-10 16:46:51.394750000 +0200
@@ -17,6 +17,7 @@ for more details.
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
+#include "stringclass.h"
 #include "lib.h"
 
 #include <ctype.h>
@@ -25,7 +26,6 @@ along with this program. If not, see <ht
 #include <errno.h>
 #include "errarg.h"
 #include "error.h"
-#include "stringclass.h"
 #include "nonposix.h"
 #include "searchpath.h"
 
@@ -161,6 +161,7 @@ int do_file(const char *filename)
     error("can't open `%1': %2", whole_filename.contents(), strerror(err));
     return 0;
   }
+  normalize_for_lf(whole_filename);
   current_filename = whole_filename.contents();
   current_lineno = 1;
   set_location();


--- src/preproc/tbl/main.cpp~0  2014-11-04 10:38:35.220524000 +0200
+++ src/preproc/tbl/main.cpp    2014-11-10 16:31:23.629125000 +0200
@@ -1615,7 +1615,10 @@ int main(int argc, char **argv)
          fatal("can't open `%1': %2", argv[i], strerror(errno));
        else {
          current_lineno = 1;
-         current_filename = argv[i];
+         string fn(argv[i]);
+         fn += '\0';
+         normalize_for_lf(fn);
+         current_filename = fn.contents();
          printf(".lf 1 %s\n", current_filename);
          process_input_file(fp);
        }


--- src/preproc/tbl/table.cpp~0 2014-11-04 10:38:35.221524000 +0200
+++ src/preproc/tbl/table.cpp   2014-11-10 16:33:40.785375000 +0200
@@ -2966,7 +2966,10 @@ void set_troff_location(const char *fn, 
       && strcmp(fn, last_filename) == 0)
     printfs(".lf %1\n", as_string(ln));
   else {
-    printfs(".lf %1 %2\n", as_string(ln), fn);
+    string filename(fn);
+    filename += '\0';
+    normalize_for_lf(filename);
+    printfs(".lf %1 %2\n", as_string(ln), filename.contents());
     last_filename = fn;
     location_force_filename = 0;
   }


--- src/roff/groff/groff.cpp~0  2014-11-04 10:38:35.195524000 +0200
+++ src/roff/groff/groff.cpp    2014-11-08 11:45:38.738500000 +0200
@@ -701,7 +701,13 @@ void append_arg_to_string(const char *ar
 {
   str += ' ';
   int needs_quoting = 0;
+  // Native Windows programs don't support '..' style of quoting, so
+  // always behave as if ARG included the single quote character.
+#if defined(_WIN32) && !defined(__CYGWIN__)
+  int contains_single_quote = 1;
+#else
   int contains_single_quote = 0;
+#endif
   const char*p;
   for (p = arg; *p != '\0'; p++)
     switch (*p) {
@@ -731,10 +737,17 @@ void append_arg_to_string(const char *ar
     str += '"';
     for (p = arg; *p != '\0'; p++)
       switch (*p) {
+#if !(defined(_WIN32) && !defined(__CYGWIN__))
       case '"':
       case '\\':
       case '$':
        str += '\\';
+#else
+      case '"':
+      case '\\':
+       if (*p == '"' || (*p == '\\' && p[1] == '"'))
+         str += '\\';
+#endif
        // fall through
       default:
        str += *p;
--- src/preproc/eqn/eqn.h~0     2014-11-04 10:38:35.232523000 +0200
+++ src/preproc/eqn/eqn.h       2014-11-10 16:46:06.707250000 +0200
@@ -17,6 +17,7 @@
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
+#include "stringclass.h"
 #include "lib.h"
 
 #include <assert.h>


--- src/preproc/pic/pic.h~0     2014-11-04 10:38:35.226523000 +0200
+++ src/preproc/pic/pic.h       2014-11-10 16:43:16.426000000 +0200
@@ -17,6 +17,7 @@
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
+#include "stringclass.h"
 #include "lib.h"
 
 #include <math.h>
@@ -49,7 +50,6 @@
 
 #include "assert.h"
 #include "cset.h"
-#include "stringclass.h"
 #include "errarg.h"
 #include "error.h"
 #include "position.h"


--- src/preproc/refer/refer.h~0 2014-11-04 10:38:35.245523000 +0200
+++ src/preproc/refer/refer.h   2014-11-10 16:45:55.613500000 +0200
@@ -17,6 +17,7 @@
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
+#include "stringclass.h"
 #include "lib.h"
 
 #include <stdlib.h>
@@ -25,7 +26,6 @@
 
 #include "errarg.h"
 #include "error.h"
-#include "stringclass.h"
 #include "cset.h"
 #include "cmap.h"
 


--- src/preproc/tbl/table.h~0   2014-11-04 10:38:35.221524000 +0200
+++ src/preproc/tbl/table.h     2014-11-10 16:41:24.972875000 +0200
@@ -17,6 +17,7 @@
 You should have received a copy of the GNU General Public License
 along with this program. If not, see <http://www.gnu.org/licenses/>. */
 
+#include "stringclass.h"
 #include "lib.h"
 
 #include <stdlib.h>
@@ -26,7 +27,6 @@
 
 #include "cset.h"
 #include "cmap.h"
-#include "stringclass.h"
 #include "errarg.h"
 #include "error.h"
 




reply via email to

[Prev in Thread] Current Thread [Next in Thread]