> Date: Sun, 09 Nov 2014 08:46:21 +0100 (CET) > Cc: groff@gnu.org > From: Werner LEMBERG <w...@gnu.org> > > > >> 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 <e...@gnu.org> * 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"