From: deb <ot...@hu...> - 2013-01-23 09:30:24
|
> Are you sure the stream is binary? Be sure to set the stream to stdout > to binary: > > setmode(fileno(stdout), O_BINARY); Hi Erwin, thanks for your reply. Your suggestion is similar as Ken's reply: quote: > ... a bit of Googling found me an awful lot of complaints that stdin wasn't > binary mode, and therefore would do CR/LF translation. Which seems more like > a problem with MingW than anything else, to me... I'm not familiar with GhostScript source, but here is grep output, which you can further filter hopefully: ======================================== deb@HOME /c/src/gsdjvu-1.5/BUILD/ghostscript-9.06 $ grep -Hnr --include=*.c "(stdout" . ./base/bench.c:236: fprintf(stdout, "Time for %9d %s = %g ms\n", n, msg, ./base/bench.c:238: fflush(stdout); ./base/gdevdsp.c:1894: fprintf(stdout, "To show modes: disp\nTo run test: disp -t\n"); ./base/gdevdsp.c:1899: fprintf(stdout, "16#%x or %d: %s\n", test_modes[i].format, ./base/gsroptab.c:339: fflush(stdout); ./base/rinkj/rinkj-screen-eb.c:124: fprintf (stdout, "P5\n%d %d\n255\n", params->width, params->height); ./contrib/pscolor/test.c:125: fflush(stdout); ./cups/libs/cups/backend.c:102: fflush(stdout); ./cups/libs/cups/file.c:1729: fflush(stdout); ./cups/libs/cups/testarray.c:289: fflush(stdout); ./cups/libs/cups/testarray.c:316: fflush(stdout); ./cups/libs/cups/testconflicts.c:97: fflush(stdout); ./cups/libs/cups/testcups.c:135: fflush(stdout); ./cups/libs/cups/testcups.c:167: fflush(stdout); ./cups/libs/cups/testcups.c:193: fflush(stdout); ./cups/libs/cups/testcups.c:223: fflush(stdout); ./cups/libs/cups/testcups.c:240: fflush(stdout); ./cups/libs/cups/testcups.c:268: fflush(stdout); ./cups/libs/cups/testcups.c:284: fflush(stdout); ./cups/libs/cups/testcups.c:299: fflush(stdout); ./cups/libs/cups/testcups.c:318: fflush(stdout); ./cups/libs/cups/testfile.c:107: fflush(stdout); ./cups/libs/cups/testfile.c:124: fflush(stdout); ./cups/libs/cups/testhttp.c:469: fflush(stdout); ./cups/libs/cups/testhttp.c:559: fflush(stdout); ./cups/libs/cups/testppd.c:1040: fflush(stdout); ./cups/libs/cups/testpwg.c:119: fflush(stdout); ./cups/libs/cups/testpwg.c:283: fflush(stdout); ./cups/libs/cups/testpwg.c:302: fflush(stdout); ./cups/libs/filter/raster.c:128: * (stdout). ./expat/xmlwf/xmlfile.c:66: ftprintf(stdout, T("%s:%" XML_FMT_INT_MOD "u:%" XML_FMT_INT_MOD "u: %s\n"), ./expat/xmlwf/xmlwf.c:617: ftprintf(stdout, T("%s using %s\n"), prog, XML_ExpatVersion()); ./expat/xmlwf/xmlwf.c:620: ftprintf(stdout, T("%s"), features[0].name); ./expat/xmlwf/xmlwf.c:622: ftprintf(stdout, T("=%ld"), features[0].value); ./expat/xmlwf/xmlwf.c:624: ftprintf(stdout, T(", %s"), features[i].name); ./expat/xmlwf/xmlwf.c:626: ftprintf(stdout, T("=%ld"), features[i].value); ./expat/xmlwf/xmlwf.c:629: ftprintf(stdout, T("\n")); ./ijs/ijs_server_example.c:423: fclose (stdout); ./jbig2dec/jbig2dec.c:155: if (!params->verbose) fprintf(stdout, ./jbig2dec/jbig2dec.c:189: if (!params->verbose) fprintf(stdout, ./jbig2dec/jbig2dec.c:200: fprintf(stdout, "%s %s\n", PACKAGE, VERSION); ./jbig2dec/sha1.c:341: fprintf(stdout, "verifying SHA-1 implementation... "); ./jbig2dec/sha1.c:350: fprintf(stdout, "FAIL\n"); ./jbig2dec/sha1.c:364: fprintf(stdout, "FAIL\n"); ./jbig2dec/sha1.c:372: fprintf(stdout, "ok\n"); ./jpeg/cdjpeg.c:172: setmode(fileno(stdout), O_BINARY); ./jpeg/cdjpeg.c:175: if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { ./jpeg/wrjpgcom.c:524: setmode(fileno(stdout), O_BINARY); ./jpeg/wrjpgcom.c:527: if ((outfile = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { ./jpeg-6b/cdjpeg.c:172: setmode(fileno(stdout), O_BINARY); ./jpeg-6b/cdjpeg.c:175: if ((output_file = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { ./jpeg-6b/wrjpgcom.c:524: setmode(fileno(stdout), O_BINARY); ./jpeg-6b/wrjpgcom.c:527: if ((outfile = fdopen(fileno(stdout), WRITE_BINARY)) == NULL) { ./lcms/jpegicc/jpegicc.c:758: fprintf(stdout, " (Embedded profile found)\n"); ./lcms/jpegicc/jpegicc.c:759: fprintf(stdout, "Product name: %s\n", cmsTakeProductName(hIn)); ./lcms/jpegicc/jpegicc.c:760: fprintf(stdout, "Description : %s\n", cmsTakeProductDesc(hIn)); ./lcms/jpegicc/jpegicc.c:761: fflush(stdout); ./lcms/jpegicc/jpegicc.c:1061: fprintf(stdout, "%s(device link) -> %s [%s]", ./lcms/jpegicc/jpegicc.c:1067: fprintf(stdout, "%s(%s) -> %s(%s) [%s]", argv[xoptind], ./lcms/jpegicc/jpegicc.c:1079: if (Verbose) fprintf(stdout, "\n"); ./lcms/testbed/testcms.c:61: fprintf(stdout, "."); fflush(stdout); ./lcms/tifficc/tiffdiff.c:373: fprintf(stdout, "Embedded profile found : %s\n", cmsTakeProductDesc(*PtrProfile)); ./lcms/tifficc/tiffdiff.c:374: fflush(stdout); ./lcms/tifficc/tifficc.c:864: fprintf(stdout, " (Embedded profile found)\n"); ./lcms/tifficc/tifficc.c:865: fprintf(stdout, "Product name: %s\n", cmsTakeProductName(hProfile)); ./lcms/tifficc/tifficc.c:866: fprintf(stdout, "Description : %s\n", cmsTakeProductDesc(hProfile)); ./lcms/tifficc/tifficc.c:867: fflush(stdout); ./lcms/tifficc/tifficc.c:915: fprintf(stdout, " (Colorimetric TIFF)\n"); ./lcms/tifficc/tifficc.c:1402: fprintf(stdout, "%s(device link) -> %s [%s]", ./lcms/tifficc/tifficc.c:1408: fprintf(stdout, "%s(%s) -> %s(%s) [%s]", argv[xoptind], ./lcms/tifficc/tifficc.c:1413: fflush(stdout); ./lcms/tifficc/tifficc.c:1438: if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } ./lcms2/testbed/testcms2.c:62: fflush(stdout); ./lcms2/testbed/testcms2.c:196: fprintf(stdout, "."); fflush(stdout); ./lcms2/testbed/testcms2.c:247: fflush(stdout); ./lcms2/testbed/testcms2.c:276: fflush(stdout); ./lcms2/testbed/testcms2.c:6930: printf("%-45s: ", Txt); fflush(stdout); ./lcms2/testbed/testcms2.c:6940: fflush(stdout); ./lcms2/testbed/testcms2.c:7219: fflush(stdout); ./lcms2/utils/jpgicc/jpgicc.c:951: fprintf(stdout, " (Embedded profile found)\n"); ./lcms2/utils/jpgicc/jpgicc.c:953: fflush(stdout); ./lcms2/utils/jpgicc/jpgicc.c:1260: if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } ./lcms2/utils/tificc/tifdiff.c:308: fprintf(stdout, "Embedded profile found:\n"); ./lcms2/utils/tificc/tificc.c:663: fprintf(stdout, "\n[Embedded profile]\n"); ./lcms2/utils/tificc/tificc.c:665: fflush(stdout); ./lcms2/utils/tificc/tificc.c:710: fprintf(stdout, "\n[Colorimetric TIFF]\n"); ./lcms2/utils/tificc/tificc.c:1123: if (Verbose) { fprintf(stdout, "\n"); fflush(stdout); } ./libpng/contrib/gregbook/rpng-win.c:465: fflush(stdout); ./libpng/contrib/gregbook/rpng-x.c:409: fflush(stdout); ./libpng/contrib/gregbook/rpng2-win.c:1182: fflush(stdout); ./libpng/contrib/gregbook/rpng2-x.c:1581: fflush(stdout); ./libpng/contrib/gregbook/wpng.c:309: setmode(fileno(stdout), O_BINARY); ./libpng/contrib/gregbook/wpng.c:316: if ((wpng_info.outfile = fdopen(fileno(stdout), "wb")) == NULL) { ./libpng/pngtest.c:133: fprintf(stdout, "\n Pass %d: ", pass); ./libpng/pngtest.c:142: fprintf(stdout, "\n "); ./libpng/pngtest.c:146: fprintf(stdout, "r"); ./libpng/pngtest.c:157: fprintf(stdout, "w"); ./libpng-1.2.6/contrib/gregbook/rpng-win.c:379: fflush(stdout); ./libpng-1.2.6/contrib/gregbook/rpng-x.c:371: fflush(stdout); ./libpng-1.2.6/contrib/gregbook/rpng2-win.c:1095: fflush(stdout); ./libpng-1.2.6/contrib/gregbook/rpng2-x.c:1348: fflush(stdout); ./libpng-1.2.6/contrib/gregbook/wpng.c:272: setmode(fileno(stdout), O_BINARY); ./libpng-1.2.6/contrib/gregbook/wpng.c:279: if ((wpng_info.outfile = fdopen(fileno(stdout), "wb")) == NULL) { ./libpng-1.2.6/pngtest.c:133: fprintf(stdout,"\n Pass %d: ",pass); ./libpng-1.2.6/pngtest.c:140: fprintf(stdout, "\n "); ./libpng-1.2.6/pngtest.c:143: fprintf(stdout, "r"); ./libpng-1.2.6/pngtest.c:158: fprintf(stdout, "w"); ./openjpeg/libopenjpeg/t1_generate_luts.c:237: /* fprintf(stdout,"nmsedec luts:\n"); */ ./openjpeg/libopenjpeg/tcd.c:347: /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ ./openjpeg/libopenjpeg/tcd.c:606: /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ ./openjpeg/libopenjpeg/tcd.c:837: /* tcd_dump(stdout, tcd, &tcd->tcd_image); */ ./psi/dmmain.c:126: fflush(stdout); ./psi/dmmain.c:224: fflush(stdout); ./psi/dmmain.c:245: fflush(stdout); ./psi/dmmain.c:672: fflush(stdout); ./psi/dmmain.c:678: fflush(stdout); ./psi/dmmain.c:689: fflush(stdout); ./psi/dpmain.c:84: fflush(stdout); ./psi/dpmain.c:137: fprintf(stdout, "Couldn't get pid, rc = \n", rc); ./psi/dpmain.c:143: fprintf(stdout, "Couldn't get module name, rc = %d\n", rc); ./psi/dpmain.c:300: fflush(stdout); ./psi/dpmain.c:374: fprintf(stdout, "run_gspmdrv: starting\n"); ./psi/dpmain.c:381: fprintf(stdout, "run_gspmdrv: failed to create termination queue\n"); ./psi/dpmain.c:386: fprintf(stdout, "run_gspmdrv: Couldn't get module handle, rc = %d\n", ./psi/dpmain.c:392: fprintf(stdout, "run_gspmdrv: Couldn't get module name, rc = %d\n", ./psi/dpmain.c:439: fprintf(stdout, "run_gspmdrv: failed to run %s, rc = %d\n", ./psi/dpmain.c:441: fprintf(stdout, "run_gspmdrv: error_message: %s\n", error_message); ./psi/dpmain.c:446: fprintf(stdout, "run_gspmdrv: returning\n"); ./psi/dpmain.c:554: fprintf(stdout, "display_open(0x%x, 0x%x)\n", handle, device); ./psi/dpmain.c:591: fprintf(stdout, "\ndisplay_open: Couldn't get pid\n"); ./psi/dpmain.c:600: fprintf(stdout, "display_open: failed to create event semaphore %s\n", name); ./psi/dpmain.c:608: fprintf(stdout, "display_open: failed to create mutex semaphore %s\n", name); ./psi/dpmain.c:618: fprintf(stdout, "display_open: failed allocating shared BMP memory %s\n", name); ./psi/dpmain.c:626: fprintf(stdout, "display: failed committing BMP memory\n"); ./psi/dpmain.c:665: fprintf(stdout, "display_preclose(0x%x, 0x%x)\n", handle, device); ./psi/dpmain.c:700: fprintf(stdout, "display_close(0x%x, 0x%x)\n", handle, device); ./psi/dpmain.c:724: fprintf(stdout, "display_presize(0x%x 0x%x, %d, %d, %d, %d)\n", ./psi/dpmain.c:744: fprintf(stdout, "display_presize: format %d = 0x%x is unsupported\n", format, format); ./psi/dpmain.c:772: fprintf(stdout, "display_size(0x%x 0x%x, %d, %d, %d, %d, %d, 0x%x)\n", ./psi/dpmain.c:832: fprintf(stdout, "\nBMP dump\n"); ./psi/dpmain.c:833: fprintf(stdout, " bitmap=%lx\n", img->bitmap); ./psi/dpmain.c:834: fprintf(stdout, " committed=%lx\n", img->committed); ./psi/dpmain.c:835: fprintf(stdout, " cx=%d\n", bmi->cx); ./psi/dpmain.c:836: fprintf(stdout, " cy=%d\n", bmi->cy); ./psi/dpmain.c:837: fprintf(stdout, " cPlanes=%d\n", bmi->cPlanes); ./psi/dpmain.c:838: fprintf(stdout, " cBitCount=%d\n", bmi->cBitCount); ./psi/dpmain.c:839: fprintf(stdout, " ulCompression=%d\n", bmi->ulCompression); ./psi/dpmain.c:840: fprintf(stdout, " cbImage=%d\n", bmi->cbImage); ./psi/dpmain.c:841: fprintf(stdout, " cxResolution=%d\n", bmi->cxResolution); ./psi/dpmain.c:842: fprintf(stdout, " cyResolution=%d\n", bmi->cyResolution); ./psi/dpmain.c:843: fprintf(stdout, " cclrUsed=%d\n", bmi->cclrUsed); ./psi/dpmain.c:844: fprintf(stdout, " cclrImportant=%d\n", bmi->cclrImportant); ./psi/dpmain.c:858: fprintf(stdout, "display_sync(0x%x, 0x%x)\n", handle, device); ./psi/dpmain.c:881: fprintf(stdout, "display_page(0x%x, 0x%x, copies=%d, flush=%d)\n", ./psi/dpmain.c:903: fprintf(stdout, "display_memalloc(0x%x 0x%x %d)\n", ./psi/dpmain.c:926: fprintf(stdout, "No memory in display_memalloc rc = %d\n", rc); ./psi/dpmain.c:934: fprintf(stdout, " returning 0x%x\n", (int)mem); ./psi/dpmain.c:946: fprintf(stdout, "display_memfree(0x%x, 0x%x, 0x%x)\n", ./psi/dpmain.c:995: fprintf(stdout, "Can't load %s\n", szDllName); ./psi/dpmain.c:1029: fprintf(stdout, "%s\n", dformat); ./psi/dwmain.c:237: fprintf(stdout, "display_separation(0x%x, 0x%x, %d '%s' %d,%d,%d,%d)\n", ./psi/dwmain.c:448: fprintf(stdout, "Insufficient memory in WinMain()\n"); ./psi/dwmainc.c:63: fflush(stdout); ./psi/dwmainc.c:219: gsdll_utf8write(stdout, utf8str, bytelen, &thiswchar, &nmore); ./psi/dwmainc.c:301: fprintf(stdout, "display_open(0x%x, 0x%x)\n", handle, device); ./psi/dwmainc.c:315: fprintf(stdout, "display_preclose(0x%x, 0x%x)\n", handle, device); ./psi/dwmainc.c:329: fprintf(stdout, "display_close(0x%x, 0x%x)\n", handle, device); ./psi/dwmainc.c:348: fprintf(stdout, "display_presize(0x%x 0x%x, %d, %d, %d, %d, %ld)\n", ./psi/dwmainc.c:364: fprintf(stdout, "display_size(0x%x 0x%x, %d, %d, %d, %d, %ld, 0x%x)\n", ./psi/dwmainc.c:381: fprintf(stdout, "display_sync(0x%x, 0x%x)\n", handle, device); ./psi/dwmainc.c:395: fprintf(stdout, "display_page(0x%x, 0x%x, copies=%d, flush=%d)\n", ./psi/dwmainc.c:425: fprintf(stdout, "display_memalloc(0x%x 0x%x %d)\n", ./psi/dwmainc.c:430: fprintf(stdout, " returning 0x%x\n", (int)mem); ./psi/dwmainc.c:438: fprintf(stdout, "display_memfree(0x%x, 0x%x, 0x%x)\n", ./psi/dwmainc.c:453: fprintf(stdout, "display_separation(0x%x, 0x%x, %d '%s' %d,%d,%d,%d)\n", ./psi/dwmainc.c:503: _setmode(fileno(stdout), _O_BINARY); ./psi/dwmainc.c:548: _isatty(fileno(stdout)) ? gsdll_stdout_utf8 : gsdll_stdout, ./psi/dxmain.c:134: fflush(stdout); ./psi/dxmainc.c:62: fflush(stdout); ./psi/gs.c:107: fprintf(stdout, "{%s} =>\n", *pstr); ./psi/gs.c:108: fflush(stdout); ./psi/gs.c:112: fprintf(stdout, " => code = %d\n", code); ./psi/gs.c:113: fflush(stdout); ./psi/gserver.c:136: fprintf(stdout, "init: code %d\n", code); ./psi/gserver.c:141: fprintf(stdout, "print: code %d\n", code); ./psi/gserver.c:146: fprintf(stdout, "golfer: code %d\n", code); ./psi/gserver.c:153: fprintf(stdout, "0 div: code %d object %s\n", code, errstr); ./psi/gserver.c:158: fprintf(stdout, "undef: code %d object %s\n", code, errstr); ./psi/gserver.c:160: fprintf(stdout, "end: code %d\n", code); ./psi/gserver.c:161: fflush(stdout); ./psi/ziodevs.c:56:static iodev_proc_open_device(stdout_open); ./psi/ziodevsc.c:57:static iodev_proc_open_device(stdout_open); ./tiff/contrib/dbs/xtiff/xtiff.c:270: setbuf(stdout, NULL); setbuf(stderr, NULL); ./tiff/libtiff/tif_fax3.c:245: fflush(stdout); ./tiff/libtiff/tif_fax3.c:296: fflush(stdout); ./tiff/libtiff/tif_fax3.c:1399: fflush(stdout); ./tiff/libtiff/tif_fax3.c:1523: fflush(stdout); ./tiff/tools/fax2ps.c:245: emitFont(stdout); ./tiff/tools/gif2tiff.c:165: printf("overwrite %s? ", imagename); fflush(stdout); ./tiff/tools/tiffdump.c:366: PrintTag(stdout, tag); ./tiff/tools/tiffdump.c:368: PrintType(stdout, type); ./tiff/tools/tiffdump.c:498: PrintData(stdout,type,(uint32)count,datamem); ./zlib/contrib/puff/pufftest.c:157: SET_BINARY_MODE(stdout); ./zlib/examples/enough.c:346: fflush(stdout); ./zlib/examples/fitblk.c:166: if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) ./zlib/examples/fitblk.c:219: if (fwrite(blk, 1, have, stdout) != have || ferror(stdout)) ./zlib/examples/zpipe.c:158: if (ferror(stdout)) ./zlib/examples/zpipe.c:182: SET_BINARY_MODE(stdout); ./zlib/test/minigzip.c:585: SET_BINARY_MODE(stdout); ./zlib/test/minigzip.c:591: file = gzdopen(fileno(stdout), outmode); ./zlib/test/minigzip.c:597: SET_BINARY_MODE(stdout); ./zlib/test/minigzip.c:617: file = gzdopen(fileno(stdout), outmode); ./zlib-1.2.1/minigzip.c:302: SET_BINARY_MODE(stdout); ./zlib-1.2.1/minigzip.c:308: file = gzdopen(fileno(stdout), outmode); ======================================== |
From: Paul M. <p.f...@gm...> - 2013-01-23 10:07:52
|
On 23 January 2013 09:30, deb <ot...@hu...> wrote: >> Are you sure the stream is binary? Be sure to set the stream to stdout >> to binary: >> >> setmode(fileno(stdout), O_BINARY); > > Hi Erwin, > > thanks for your reply. > > Your suggestion is similar as Ken's reply: > > quote: >> ... a bit of Googling found me an awful lot of complaints that stdin wasn't >> binary mode, and therefore would do CR/LF translation. Which seems more like >> a problem with MingW than anything else, to me... >From Ken's reply, it sounds like the issue is that the Ghostscript source is not written with Unix/Windows portability in mind. On Unix, there is no distinction between text and binary modes (no CRLF->LF translation) so Unix programmers often don't think about the distinction. But on Windows, the standard input/output streams are in text mode by default, and that means that they do the CRLF translations. It's not possible (AFAIK) to alter this default - the called program (Ghostscript in this case) has to set the standard streams to binary mode - and this has to be done before any IO is performed. So what you probably need to do is to add the "setmode(fileno(stdout), O_BINARY);" statement to the Ghostscript source, somewhere near the start of the main() function, and then recompile. That may resolve the issue. If not, there's something more complex going on... Ideally, a change like this should be added to the Ghostscript sources with a suitable #ifdef to protect it. Projects vary in how willing they are to accept cross-platform compatibility patches like this, though, and I don't know Ghostscript's position on the matter. Paul. |
From: Greg C. <gch...@sb...> - 2013-01-23 11:46:00
|
On 2013-01-23 10:07Z, Paul Moore wrote: [...assumption that standard streams are binary is not portable...] > > So what you probably need to do is to add the "setmode(fileno(stdout), > O_BINARY);" statement to the Ghostscript source, somewhere near the > start of the main() function, and then recompile. That may resolve the > issue. If not, there's something more complex going on... That's similar to suggestion number five here: http://oldwiki.mingw.org/index.php/binary and some of the other suggestions there may be useful if the issue broadens (e.g., to encompass stdout or disk files). |
From: deb <ot...@hu...> - 2013-01-23 10:54:46
|
> From Ken's reply, it sounds like the issue is that the Ghostscript > source is not written with Unix/Windows portability in mind. > > On Unix, there is no distinction between text and binary modes (no > CRLF->LF translation) so Unix programmers often don't think about the > distinction. But on Windows, the standard input/output streams are in > text mode by default, and that means that they do the CRLF > translations. It's not possible (AFAIK) to alter this default - the > called program (Ghostscript in this case) has to set the standard > streams to binary mode - and this has to be done before any IO is > performed. > > So what you probably need to do is to add the "setmode(fileno(stdout), > O_BINARY);" statement to the Ghostscript source, somewhere near the > start of the main() function, and then recompile. That may resolve the > issue. If not, there's something more complex going on... OK, thanks for your suggestion. As mentioned I'm not familiar with GS source nor am I C programmer, so I'll try to coordinate this by writing your suggestion on GS list, and hopefully get further instructions. > > Ideally, a change like this should be added to the Ghostscript sources > with a suitable #ifdef to protect it. Projects vary in how willing > they are to accept cross-platform compatibility patches like this, > though, and I don't know Ghostscript's position on the matter. |
From: waterlan <wat...@xs...> - 2013-01-23 11:13:20
|
deb schreef op 2013-01-23 11:54: >> From Ken's reply, it sounds like the issue is that the Ghostscript >> source is not written with Unix/Windows portability in mind. >> >> On Unix, there is no distinction between text and binary modes (no >> CRLF->LF translation) so Unix programmers often don't think about the >> distinction. But on Windows, the standard input/output streams are in >> text mode by default, and that means that they do the CRLF >> translations. It's not possible (AFAIK) to alter this default - the >> called program (Ghostscript in this case) has to set the standard >> streams to binary mode - and this has to be done before any IO is >> performed. >> >> So what you probably need to do is to add the >> "setmode(fileno(stdout), >> O_BINARY);" statement to the Ghostscript source, somewhere near the >> start of the main() function, and then recompile. That may resolve >> the >> issue. If not, there's something more complex going on... > > OK, thanks for your suggestion. > As mentioned I'm not familiar with GS source nor am I C programmer, so > I'll try to coordinate this by writing your suggestion on GS list, and > hopefully get further instructions. > > >> >> Ideally, a change like this should be added to the Ghostscript >> sources >> with a suitable #ifdef to protect it. Projects vary in how willing >> they are to accept cross-platform compatibility patches like this, >> though, and I don't know Ghostscript's position on the matter. > There are some portability issues. * setmode() was depreciated in Microsoft Visual C 2005, so to be compatible with VC you should use _setmode(). * Cygwin will behave has Unix, but not when a Cygwin program is called by a non-Cygwin Windows program. Then you still have to set the stream to binary. This is what I do in dos2unix to be portable across all OSes: #if defined(_WIN32) && !defined(__CYGWIN__) /* stdin and stdout are by default text streams. We need * to set them to binary mode. Otherwise an LF will * automatically be converted to CR-LF on DOS/Windows. * Erwin */ /* 'setmode' was deprecated by MicroSoft * since Visual C++ 2005. Use '_setmode' instead. */ _setmode(fileno(stdout), O_BINARY); _setmode(fileno(stdin), O_BINARY); #elif defined(__MSDOS__) || defined(__CYGWIN__) || defined(__OS2__) setmode(fileno(stdout), O_BINARY); setmode(fileno(stdin), O_BINARY); #endif -- Erwin Waterlander http://waterlan.home.xs4all.nl/ |
From: Keith M. <kei...@us...> - 2013-01-23 11:57:48
|
On 23 January 2013 11:13, waterlan wrote: > There are some portability issues. > * setmode() was depreciated [sic] in Microsoft Visual C 2005, ... I think you mean "deprecated"; "depreciated" means something else entirely :) > ... so to be compatible with VC you should use _setmode(). Why? Deprecated doesn't mean withdrawn; setmode() should continue to work just fine. Certainly, you may argue the VC compatibility case, and if this "deprecation" was anything other that part of Microsoft's campaign toward vendor lock-in, I might agree. However, since POSIX requires setmode(), and not _setmode(), and since VC is likely to continue, albeit reluctantly, to support this POSIX standard in perpetuity, your case seems very insubstantial; certainly, MinGW will continue to provide -- and prefer -- the POSIX form. > ... > > This is what I do in dos2unix to be portable across all OSes: > > #if defined(_WIN32) && !defined(__CYGWIN__) > > /* stdin and stdout are by default text streams. We need > * to set them to binary mode. Otherwise an LF will > * automatically be converted to CR-LF on DOS/Windows. > * Erwin */ > > /* 'setmode' was deprecated by MicroSoft > * since Visual C++ 2005. Use '_setmode' instead. */ > > _setmode(fileno(stdout), O_BINARY); > _setmode(fileno(stdin), O_BINARY); Here, you are being grossly inconsistent. If you insist that you *must* use _setmode(), then you must also insist on _O_BINARY, (for the same reason); ditto _fileno(), since Microsoft also declared fileno() to be deprecated, along with setmode(); (I wonder why they neglected to apply this same asinine philosophy consistently, to stdin, stdout, and stderr, and even to FILE)? -- Regards, Keith. |
From: Earnie B. <ea...@us...> - 2013-01-23 12:31:08
|
On Wed, Jan 23, 2013 at 6:57 AM, Keith Marshall wrote: > On 23 January 2013 11:13, waterlan wrote: >> There are some portability issues. >> * setmode() was depreciated [sic] in Microsoft Visual C 2005, ... > > I think you mean "deprecated"; "depreciated" means something else > entirely :) > He added [sic] indicating that the quoted text said it that way. -- Earnie -- https://sites.google.com/site/earnieboyd |
From: waterlan <wat...@xs...> - 2013-01-23 14:21:15
|
Keith Marshall schreef op 2013-01-23 12:57: > On 23 January 2013 11:13, waterlan wrote: >> There are some portability issues. >> * setmode() was depreciated [sic] in Microsoft Visual C 2005, ... > > I think you mean "deprecated"; "depreciated" means something else > entirely :) Yes. Although deprecate can mean depreciate according to http://www.thefreedictionary.com/deprecated I meant obsoleted. English is not my native language. > >> ... so to be compatible with VC you should use _setmode(). > > Why? Deprecated doesn't mean withdrawn; setmode() should continue to > work just fine. Certainly, you may argue the VC compatibility case, > and if this "deprecation" was anything other that part of Microsoft's > campaign toward vendor lock-in, I might agree. However, since POSIX > requires setmode(), and not _setmode(), and since VC is likely to > continue, albeit reluctantly, to support this POSIX standard in > perpetuity, your case seems very insubstantial; certainly, MinGW will > continue to provide -- and prefer -- the POSIX form. > >> ... >> >> This is what I do in dos2unix to be portable across all OSes: >> >> #if defined(_WIN32) && !defined(__CYGWIN__) >> >> /* stdin and stdout are by default text streams. We need >> * to set them to binary mode. Otherwise an LF will >> * automatically be converted to CR-LF on DOS/Windows. >> * Erwin */ >> >> /* 'setmode' was deprecated by MicroSoft >> * since Visual C++ 2005. Use '_setmode' instead. */ >> >> _setmode(fileno(stdout), O_BINARY); >> _setmode(fileno(stdin), O_BINARY); > > Here, you are being grossly inconsistent. If you insist that you > *must* use _setmode(), then you must also insist on _O_BINARY, (for > the same reason); ditto _fileno(), since Microsoft also declared > fileno() to be deprecated, along with setmode(); (I wonder why they > neglected to apply this same asinine philosophy consistently, to > stdin, stdout, and stderr, and even to FILE)? > You are right. -- Erwin Waterlander http://waterlan.home.xs4all.nl/ |
From: LRN <lr...@gm...> - 2013-01-23 17:19:30
|
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 On 23.01.2013 18:21, waterlan wrote: > Keith Marshall schreef op 2013-01-23 12:57: >> On 23 January 2013 11:13, waterlan wrote: >>> There are some portability issues. * setmode() was depreciated >>> [sic] in Microsoft Visual C 2005, ... >> >> I think you mean "deprecated"; "depreciated" means something >> else entirely :) > > Yes. Although deprecate can mean depreciate according to > http://www.thefreedictionary.com/deprecated I meant obsoleted. > English is not my native language. > Actually, "deprecated" and "obsoleted" can be distinct things in programming. At least in one context i've seen them meaning the following: Deprecated - still available, but you should not use it in new software, and should fix its usage in existing software. Obsoleted - not available anymore. API goes into "deprecated" first, then later it is "obsoleted". -----BEGIN PGP SIGNATURE----- Version: GnuPG v1.4.11 (MingW32) Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/ iQEcBAEBAgAGBQJRABuCAAoJEOs4Jb6SI2CwXtsIAJccXlvLWpzEzU2yR7t187Bu C1wsM1CyLRDmkiapmWDjGIyVaAlfvQpuvCUD/7tsss6wEor7fhXE9fBfyE3kgTqK BFBSA2eAT46jY0ecwJhibChKD6EE+GsUf6uCEFds7B2jIOlXt7cU4HFczCrPw++0 7zTWn0oJ/TqxAQUeoSO4PI3HDhX2dKcui2zF3OCMPaYL53NupwWVnXgJ5yvZLs7P 5ByiLWGYFMowByBYHcUR2WRDNJjvqHETGBZTNnKFll81s5oi6AZE8lEJylMctd2q V3ORYpkXhlytcfzfMw3bw7xEK4rcmvmhQBdqJaPxT6RNpPrgiBsnAgyGYxybyO4= =mqks -----END PGP SIGNATURE----- |
From: Erwin W. <wat...@xs...> - 2013-01-23 19:06:26
|
Op 23-1-2013 18:19, LRN schreef: > -----BEGIN PGP SIGNED MESSAGE----- > Hash: SHA1 > > On 23.01.2013 18:21, waterlan wrote: >> Keith Marshall schreef op 2013-01-23 12:57: >>> On 23 January 2013 11:13, waterlan wrote: >>>> There are some portability issues. * setmode() was depreciated >>>> [sic] in Microsoft Visual C 2005, ... >>> I think you mean "deprecated"; "depreciated" means something >>> else entirely :) >> Yes. Although deprecate can mean depreciate according to >> http://www.thefreedictionary.com/deprecated I meant obsoleted. >> English is not my native language. >> > Actually, "deprecated" and "obsoleted" can be distinct things in > programming. > At least in one context i've seen them meaning the following: > Deprecated - still available, but you should not use it in new > software, and should fix its usage in existing software. > Obsoleted - not available anymore. > > API goes into "deprecated" first, then later it is "obsoleted". So one day it will be obsolete... Anyway, for me reason enough to follow MS advice to use _setmode() on Windows (http://msdn.microsoft.com/en-us/library/ms235459%28v=vs.80%29.aspx). _setmode() is also supported by MinGW and OpenWatcom, so I see no reason not to use _setmode(). regards, -- Erwin Waterlander http://waterlan.home.xs4all.nl/ |
From: deb <ot...@hu...> - 2013-01-23 18:31:41
|
>> So what you probably need to do is to add the "setmode(fileno(stdout), >> O_BINARY);" statement to the Ghostscript source, somewhere near the >> start of the main() function, and then recompile. That may resolve the >> issue. If not, there's something more complex going on... > >OK, thanks for your suggestion. >As mentioned I'm not familiar with GS source nor am I C programmer, so >I'll try to coordinate this by writing your suggestion on GS list, and >hopefully get further instructions. You suggestion was right lead. Problem is solved with kind help provided by GS developers. Here is the patch, if anyone is interested: http://ghostscript.com/pipermail/gs-devel/2013-January/009382.html Cheers |
From: Earnie B. <ea...@us...> - 2013-01-23 20:16:55
|
On Wed, Jan 23, 2013 at 1:31 PM, deb <ot...@hu...> wrote: >>> So what you probably need to do is to add the "setmode(fileno(stdout), >>> O_BINARY);" statement to the Ghostscript source, somewhere near the >>> start of the main() function, and then recompile. That may resolve the >>> issue. If not, there's something more complex going on... >> >>OK, thanks for your suggestion. >>As mentioned I'm not familiar with GS source nor am I C programmer, so >>I'll try to coordinate this by writing your suggestion on GS list, and >>hopefully get further instructions. > > You suggestion was right lead. Problem is solved with kind help provided by GS developers. > Here is the patch, if anyone is interested: http://ghostscript.com/pipermail/gs-devel/2013-January/009382.html BTW, another method is to add the object /mingw/lib/binmode.o to the final link. This sets the 3 stdio file descriptors appropriately without modifying the code. -- Earnie -- https://sites.google.com/site/earnieboyd |
From: Greg C. <gch...@sb...> - 2013-01-23 21:19:31
|
On 2013-01-23 20:16Z, Earnie Boyd wrote: [...setting stdin to binary...] > BTW, another method is to add the object /mingw/lib/binmode.o to the > final link. This sets the 3 stdio file descriptors appropriately > without modifying the code. Then is the (old) wiki wrong? http://oldwiki.mingw.org/index.php/binary | 1) You could add /mingw/lib/binmode.o to the objects when you | build the executable. This has the effect of making binary-mode | file translation the default (except that preopened files stdin, | stderr, stdout remain text). |
From: Earnie B. <ea...@us...> - 2013-01-24 00:46:50
|
On Wed, Jan 23, 2013 at 4:19 PM, Greg Chicares wrote: > On 2013-01-23 20:16Z, Earnie Boyd wrote: > [...setting stdin to binary...] >> BTW, another method is to add the object /mingw/lib/binmode.o to the >> final link. This sets the 3 stdio file descriptors appropriately >> without modifying the code. > > Then is the (old) wiki wrong? > No, I stand corrected. http://msdn.microsoft.com/en-us/library/ee2849wt(v=vs.80).aspx > http://oldwiki.mingw.org/index.php/binary > | 1) You could add /mingw/lib/binmode.o to the objects when you > | build the executable. This has the effect of making binary-mode > | file translation the default (except that preopened files stdin, > | stderr, stdout remain text). > > > ------------------------------------------------------------------------------ > Master Visual Studio, SharePoint, SQL, ASP.NET, C# 2012, HTML5, CSS, > MVC, Windows 8 Apps, JavaScript and much more. Keep your skills current > with LearnDevNow - 3,200 step-by-step video tutorials by Microsoft > MVPs and experts. ON SALE this month only -- learn more at: > http://p.sf.net/sfu/learnnow-d2d > _______________________________________________ > MinGW-users mailing list > Min...@li... > > This list observes the Etiquette found at > http://www.mingw.org/Mailing_Lists. > We ask that you be polite and do the same. Disregard for the list etiquette may cause your account to be moderated. > > _______________________________________________ > You may change your MinGW Account Options or unsubscribe at: > https://lists.sourceforge.net/lists/listinfo/mingw-users > Also: mailto:min...@li...?subject=unsubscribe -- Earnie -- https://sites.google.com/site/earnieboyd |