diff --git a/README.md b/README.md index 9d0c8b7..0b0c65d 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,8 @@ # ghostscript +Ghostscript is a package of software that provides: +- An interpreter for the PostScript (TM) language, with the ability to convert PostScript language files to many raster formats, view them on displays, and print them on printers that don't have PostScript language capability built in; +- An interpreter for Portable Document Format (PDF) files, with the same abilities; +- The ability to convert PostScript language files to PDF (with some limitations) and vice versa; and +- A set of C procedures (the Ghostscript library) that implement the graphics and filtering (data compression / decompression / conversion) capabilities that appear as primitive operations in the PostScript language and in PDF. + diff --git a/ghostscript-9.07-european-locales-comma-separator.patch b/ghostscript-9.07-european-locales-comma-separator.patch new file mode 100644 index 0000000..5e123e1 --- /dev/null +++ b/ghostscript-9.07-european-locales-comma-separator.patch @@ -0,0 +1,28431 @@ +diff -up ghostscript-9.07/base/fapiufst.c.gs_sprintf ghostscript-9.07/base/fapiufst.c +--- ghostscript-9.07/base/fapiufst.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/fapiufst.c 2013-05-09 17:02:39.056447042 +0100 +@@ -699,7 +699,7 @@ pack_long(LPUB8 * p, UL32 v) + static inline void + pack_float(LPUB8 * p, float v) + { +- sprintf((char *)(*p), "%f", v); ++ gs_sprintf((char *)(*p), "%f", v); + *p += strlen((const char *)*p) + 1; + } + +diff -up ghostscript-9.07/base/gdev3b1.c.gs_sprintf ghostscript-9.07/base/gdev3b1.c +--- ghostscript-9.07/base/gdev3b1.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdev3b1.c 2013-05-09 17:02:39.057447046 +0100 +@@ -538,7 +538,7 @@ att3b1_do_output_page(gx_device *dev, in + } + + ut.ut_num = WTXTSLK1; +- sprintf(ut.ut_text, ++ gs_sprintf(ut.ut_text, + "%s %d, top right (%d,%d), size (%d,%d), press '?' for help.", + flush ? "Showpage" : "Copypage", att3b1dev->page_num, xorigin, yorigin, + att3b1dev->width, att3b1dev->height); +diff -up ghostscript-9.07/base/gdev8510.c.gs_sprintf ghostscript-9.07/base/gdev8510.c +--- ghostscript-9.07/base/gdev8510.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdev8510.c 2013-05-09 17:02:39.058447051 +0100 +@@ -129,7 +129,7 @@ m8510_output_run(gx_device_printer *pdev + /* Transfer the line of data. */ + count = out_end - out; + if (count) { +- sprintf(tmp, "\033g%03d", count/8); ++ gs_sprintf(tmp, "\033g%03d", count/8); + fwrite(tmp, 1, 5, prn_stream); + fwrite(out, 1, count, prn_stream); + fwrite("\r", 1, 1, prn_stream); +diff -up ghostscript-9.07/base/gdevccr.c.gs_sprintf ghostscript-9.07/base/gdevccr.c +--- ghostscript-9.07/base/gdevccr.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevccr.c 2013-05-09 17:02:39.059447055 +0100 +@@ -207,9 +207,9 @@ static int alloc_rb( gs_memory_t *mem, c + int r; + for(r=0; rfname, i); ++ gs_sprintf(spotname, "%ss%d", pdevn->fname, i); + spot_file[i] = gp_fopen(spotname, "wb"); + if (spot_file[i] == NULL) { + code = gs_error_VMerror; +@@ -2117,7 +2117,7 @@ spotcmyk_print_page(gx_device_printer * + return code; + } + for(i = 0; i < nspot; i++) { +- sprintf(spotname, "%ss%d", pdevn->fname, i); ++ gs_sprintf(spotname, "%ss%d", pdevn->fname, i); + code = devn_write_pcx_file(pdev, spotname, 1, bpc, linelength[i]); + if (code < 0) + return code; +@@ -2451,7 +2451,7 @@ devn_write_pcx_file(gx_device_printer * + in = gp_fopen(filename, "rb"); + if (!in) + return_error(gs_error_invalidfileaccess); +- sprintf(outname, "%s.pcx", filename); ++ gs_sprintf(outname, "%s.pcx", filename); + out = gp_fopen(outname, "wb"); + if (!out) { + fclose(in); +diff -up ghostscript-9.07/base/gdevdjet.c.gs_sprintf ghostscript-9.07/base/gdevdjet.c +--- ghostscript-9.07/base/gdevdjet.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevdjet.c 2013-05-09 17:02:39.061447064 +0100 +@@ -323,9 +323,9 @@ hpjet_make_init(gx_device_printer *pdev, + else if (dev->MediaPosition_set && dev->MediaPosition >= 0) + paper_source = dev->MediaPosition; + if (paper_source >= 0) +- sprintf(buf, "%s\033&l%dH", str, paper_source); ++ gs_sprintf(buf, "%s\033&l%dH", str, paper_source); + else +- sprintf(buf, "%s", str); ++ gs_sprintf(buf, "%s", str); + } + + /* The DeskJet can compress (mode 2) */ +@@ -361,7 +361,7 @@ fs600_print_page_copies(gx_device_printe + char base_init[60]; + char init[80]; + +- sprintf(base_init, "\033*r0F\033&u%dD", dots_per_inch); ++ gs_sprintf(base_init, "\033*r0F\033&u%dD", dots_per_inch); + hpjet_make_init(pdev, init, base_init); + return dljet_mono_print_page_copies(pdev, prn_stream, num_copies, + dots_per_inch, PCL_FS600_FEATURES, +@@ -425,7 +425,7 @@ ljet3d_print_page_copies(gx_device_print + bool tumble=dev->Tumble; + + hpjet_make_init(pdev, init, "\033&l-180u36Z\033*r0F"); +- sprintf(even_init, "\033&l180u36Z\033*r0F"); ++ gs_sprintf(even_init, "\033&l180u36Z\033*r0F"); + return dljet_mono_print_page_copies(pdev, prn_stream, num_copies, + 300, PCL_LJ3D_FEATURES, init, even_init, tumble); + } +@@ -440,7 +440,7 @@ ljet4_print_page_copies(gx_device_printe + char base_init[60]; + char init[80]; + +- sprintf(base_init, "\033&l-180u36Z\033*r0F\033&u%dD", dots_per_inch); ++ gs_sprintf(base_init, "\033&l-180u36Z\033*r0F\033&u%dD", dots_per_inch); + hpjet_make_init(pdev, init, base_init); + + return dljet_mono_print_page_copies(pdev, prn_stream, num_copies, +@@ -472,9 +472,9 @@ ljet4d_print_page_copies(gx_device_print + in duplex mode we set this parameters for each odd page + (paper tray is set by "hpjet_make_init") + */ +- sprintf(base_init, "\033&l-180u36Z\033*r0F\033&u%dD", dots_per_inch); ++ gs_sprintf(base_init, "\033&l-180u36Z\033*r0F\033&u%dD", dots_per_inch); + hpjet_make_init(pdev, init, base_init); +- sprintf(even_init, "\033&l180u36Z\033*r0F\033&u%dD", dots_per_inch); ++ gs_sprintf(even_init, "\033&l180u36Z\033*r0F\033&u%dD", dots_per_inch); + return dljet_mono_print_page_copies(pdev, prn_stream, num_copies, + dots_per_inch, PCL_LJ4D_FEATURES, + init,even_init,tumble); +@@ -489,7 +489,7 @@ ljet4pjl_print_page_copies(gx_device_pri + { int dots_per_inch = (int)pdev->y_pixels_per_inch; + char real_init[60]; + +- sprintf(real_init, "\033&l-180u36Z\033*r0F\033&u%dD", dots_per_inch); ++ gs_sprintf(real_init, "\033&l-180u36Z\033*r0F\033&u%dD", dots_per_inch); + return dljet_mono_print_page_copies(pdev, prn_stream, num_copies, + dots_per_inch, PCL_LJ4PJL_FEATURES, + real_init, real_init, false); +diff -up ghostscript-9.07/base/gdevijs.c.gs_sprintf ghostscript-9.07/base/gdevijs.c +--- ghostscript-9.07/base/gdevijs.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevijs.c 2013-05-09 17:02:39.063447072 +0100 +@@ -674,7 +674,7 @@ gsijs_set_margin_params(gx_device_ijs *i + } + + if (code == 0) { +- sprintf (buf, "%gx%g", ijsdev->MediaSize[0] * (1.0 / 72), ++ gs_sprintf (buf, "%gx%g", ijsdev->MediaSize[0] * (1.0 / 72), + ijsdev->MediaSize[1] * (1.0 / 72)); + code = ijs_client_set_param(ijsdev->ctx, 0, "PaperSize", + buf, strlen(buf)); +@@ -715,7 +715,7 @@ gsijs_set_margin_params(gx_device_ijs *i + m[1] = ijsdev->MediaSize[1] * (1.0 / 72) - + printable_top - printable_height; + gx_device_set_margins((gx_device *)ijsdev, m, true); +- sprintf (buf, "%gx%g", printable_left, printable_top); ++ gs_sprintf (buf, "%gx%g", printable_left, printable_top); + code = ijs_client_set_param(ijsdev->ctx, 0, "TopLeft", + buf, strlen(buf)); + } +@@ -864,7 +864,7 @@ gsijs_open(gx_device *dev) + /* Note: dup() may not be portable to all interesting IJS + platforms. In that case, this branch should be #ifdef'ed out. + */ +- sprintf(buf, "%d", fd); ++ gs_sprintf(buf, "%d", fd); + ijs_client_set_param(ijsdev->ctx, 0, "OutputFD", buf, strlen(buf)); + close(fd); + } else { +@@ -1021,9 +1021,9 @@ gsijs_output_page(gx_device *dev, int nu + } + + /* Required page parameters */ +- sprintf(buf, "%d", n_chan); ++ gs_sprintf(buf, "%d", n_chan); + gsijs_client_set_param(ijsdev, "NumChan", buf); +- sprintf(buf, "%d", ijsdev->BitsPerSample); ++ gs_sprintf(buf, "%d", ijsdev->BitsPerSample); + gsijs_client_set_param(ijsdev, "BitsPerSample", buf); + + /* This needs to become more sophisticated for DeviceN. */ +@@ -1031,12 +1031,12 @@ gsijs_output_page(gx_device *dev, int nu + ((n_chan == 3) ? (krgb_mode ? ((k_bits == 1) ? "KRGB" : "KxRGB") : "DeviceRGB") : "DeviceGray")); + gsijs_client_set_param(ijsdev, "ColorSpace", buf); + +- sprintf(buf, "%d", ijs_width); ++ gs_sprintf(buf, "%d", ijs_width); + gsijs_client_set_param(ijsdev, "Width", buf); +- sprintf(buf, "%d", ijs_height); ++ gs_sprintf(buf, "%d", ijs_height); + gsijs_client_set_param(ijsdev, "Height", buf); + +- sprintf(buf, "%gx%g", xres, yres); ++ gs_sprintf(buf, "%gx%g", xres, yres); + gsijs_client_set_param(ijsdev, "Dpi", buf); + + #ifdef KRGB_DEBUG +diff -up ghostscript-9.07/base/gdevl31s.c.gs_sprintf ghostscript-9.07/base/gdevl31s.c +--- ghostscript-9.07/base/gdevl31s.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevl31s.c 2013-05-09 17:02:39.063447072 +0100 +@@ -184,9 +184,9 @@ lj3100sw_print_page_copies(gx_device_pri + if (gdev_prn_file_is_new(pdev)) { + lj3100sw_output_section_header(prn_stream, 1, 0, 0); + lj3100sw_output_repeated_data_bytes(prn_stream, buffer, &ptr, 0x1b, 12); +- ptr += sprintf(ptr, "\r\nBD"); ++ ptr += gs_sprintf(ptr, "\r\nBD"); + lj3100sw_output_repeated_data_bytes(prn_stream, buffer, &ptr, 0, 5520); +- ptr += sprintf(ptr, "%s\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n", ++ ptr += gs_sprintf(ptr, "%s\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n%s %d\r\n", + "NJ", + "PQ", -1, + "RE", high_resolution ? 6 : 2, +@@ -198,7 +198,7 @@ lj3100sw_print_page_copies(gx_device_pri + } + + lj3100sw_output_section_header(prn_stream, 3, ppdev->NumCopies, 0); +- ptr += sprintf(ptr, "%s %d\r\n%s\r\n", ++ ptr += gs_sprintf(ptr, "%s %d\r\n%s\r\n", + "CM", 1, + "PD"); + *ptr++ = 0; +diff -up ghostscript-9.07/base/gdevp14.c.gs_sprintf ghostscript-9.07/base/gdevp14.c +--- ghostscript-9.07/base/gdevp14.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevp14.c 2013-05-09 17:02:39.065447081 +0100 +@@ -6427,7 +6427,7 @@ get_param_compressed_color_list_elem(pdf + pkeyname_list_elem->next = *pkeyname_list; + pkeyname_list_elem->key_name = keyname_buf; + *pkeyname_list = pkeyname_list_elem; +- sprintf(keyname_buf, "%s_%d", keyname, i); ++ gs_sprintf(keyname_buf, "%s_%d", keyname, i); + get_param_compressed_color_list_elem(pdev, plist, + pcomp_list->u.sub_level_ptrs[i], keyname_buf, + pkeyname_list); +@@ -6498,7 +6498,7 @@ put_param_compressed_color_list_elem(gx_ + char buff[50]; + compressed_color_list_t * sub_list_ptr; + +- sprintf(buff, "%s_%d", keyname, i); ++ gs_sprintf(buff, "%s_%d", keyname, i); + put_param_compressed_color_list_elem(pdev, plist, + &sub_list_ptr, buff, num_comps - 1); + pcomp_list->u.sub_level_ptrs[i] = sub_list_ptr; +@@ -6560,7 +6560,7 @@ get_param_spot_color_names(pdf14_clist_d + pkeyname_list_elem->next = *pkeyname_list; + pkeyname_list_elem->key_name = keyname_buf; + *pkeyname_list = pkeyname_list_elem; +- sprintf(keyname_buf, "PDF14SpotName_%d", i); ++ gs_sprintf(keyname_buf, "PDF14SpotName_%d", i); + str.size = separations->names[i].size; + str.data = separations->names[i].data; + str.persistent = false; +@@ -6596,7 +6596,7 @@ put_param_pdf14_spot_names(gx_device * p + char buff[20]; + byte * sep_name; + +- sprintf(buff, "PDF14SpotName_%d", i); ++ gs_sprintf(buff, "PDF14SpotName_%d", i); + code = param_read_string(plist, buff, &str); + switch (code) { + default: +diff -up ghostscript-9.07/base/gdevpdfb.c.gs_sprintf ghostscript-9.07/base/gdevpdfb.c +--- ghostscript-9.07/base/gdevpdfb.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfb.c 2013-05-09 17:02:39.066447085 +0100 +@@ -588,7 +588,7 @@ gdev_pdf_strip_tile_rectangle(gx_device + if (image_id) { + char buf[MAX_REF_CHARS + 6 + 1]; /* +6 for /R# Do\n */ + +- sprintf(buf, "/R%ld Do\n", image_id); ++ gs_sprintf(buf, "/R%ld Do\n", image_id); + pprintd1(s, "%d>>stream\n", strlen(buf)); + if (pdev->PDFA != 0) + pprints1(s, "%s\nendstream\n", buf); +diff -up ghostscript-9.07/base/gdevpdf.c.gs_sprintf ghostscript-9.07/base/gdevpdf.c +--- ghostscript-9.07/base/gdevpdf.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdf.c 2013-05-09 17:02:39.067447089 +0100 +@@ -301,7 +301,7 @@ pdf_initialize_ids(gx_device_pdf * pdev) + timeoffset = any_abs(timeoffset) / 60; + tms = *localtime(&t); + +- sprintf(buf, "(D:%04d%02d%02d%02d%02d%02d%c%02d\'%02d\')", ++ gs_sprintf(buf, "(D:%04d%02d%02d%02d%02d%02d%c%02d\'%02d\')", + tms.tm_year + 1900, tms.tm_mon + 1, tms.tm_mday, + tms.tm_hour, tms.tm_min, tms.tm_sec, + timesign, timeoffset / 60, timeoffset % 60); +@@ -1277,7 +1277,7 @@ static int write_xref_section(gx_device_ + * chances of needing to write white space to pad the file out. + */ + if (!pdev->Linearise) { +- sprintf(str, "%010"PRId64" 00000 n \n", pos); ++ gs_sprintf(str, "%010"PRId64" 00000 n \n", pos); + stream_puts(pdev->strm, str); + } + if (Offsets) +@@ -1310,7 +1310,7 @@ rewrite_object(gx_device_pdf *const pdev + code = fread(&c, 1, 1, linear_params->sfile); + read++; + } while (c != '\n' && code > 0); +- sprintf(Scratch, "%d 0 obj\n", pdev->ResourceUsage[object].NewObjectNumber); ++ gs_sprintf(Scratch, "%d 0 obj\n", pdev->ResourceUsage[object].NewObjectNumber); + fwrite(Scratch, strlen(Scratch), 1, linear_params->Lin_File.file); + + code = fread(&c, 1, 1, linear_params->sfile); +@@ -1359,7 +1359,7 @@ rewrite_object(gx_device_pdf *const pdev + target++; + sscanf(target, "%d 0 R", &ID); + fwrite(source, target - source, 1, linear_params->Lin_File.file); +- sprintf(Buf, "%d 0 R", pdev->ResourceUsage[ID].NewObjectNumber); ++ gs_sprintf(Buf, "%d 0 R", pdev->ResourceUsage[ID].NewObjectNumber); + fwrite(Buf, strlen(Buf), 1, linear_params->Lin_File.file); + source = next; + } else { +@@ -1544,7 +1544,7 @@ static int pdf_linearise(gx_device_pdf * + } + #endif + /* Linearisation. Part 1, file header */ +- sprintf(Header, "%%PDF-%d.%d\n", level / 10, level % 10); ++ gs_sprintf(Header, "%%PDF-%d.%d\n", level / 10, level % 10); + fwrite(Header, strlen(Header), 1, linear_params->Lin_File.file); + if (pdev->binary_ok) + fwrite(Binary, strlen(Binary), 1, linear_params->Lin_File.file); +@@ -1556,16 +1556,16 @@ static int pdf_linearise(gx_device_pdf * + + /* Linearisation. Part 2, the Linearisation dictioanry */ + linear_params->LDictOffset = gp_ftell_64(linear_params->Lin_File.file); +- sprintf(LDict, "%d 0 obj\n<< \n", ++ gs_sprintf(LDict, "%d 0 obj\n<< \n", + LDictObj); + fwrite(LDict, strlen(LDict), 1, linear_params->Lin_File.file); + + /* First page cross-reference table here (Part 3) */ + linear_params->FirstxrefOffset = gp_ftell_64(linear_params->Lin_File.file); +- sprintf(Header, "xref\n%d %d\n", LDictObj, Part1To6 - LDictObj + 1); /* +1 for the primary hint stream */ ++ gs_sprintf(Header, "xref\n%d %d\n", LDictObj, Part1To6 - LDictObj + 1); /* +1 for the primary hint stream */ + fwrite(Header, strlen(Header), 1, linear_params->Lin_File.file); + +- sprintf(Header, "0000000000 00000 n \n"); ++ gs_sprintf(Header, "0000000000 00000 n \n"); + + for (i = LDictObj;i <= linear_params->LastResource + 2; i++) { + fwrite(Header, 20, 1, linear_params->Lin_File.file); +@@ -1575,7 +1575,7 @@ static int pdf_linearise(gx_device_pdf * + * +1 for the linearisation dict and +1 for the primary hint stream. + */ + linear_params->FirsttrailerOffset = gp_ftell_64(linear_params->Lin_File.file); +- sprintf(LDict, "\ntrailer\n<>\nstartxref\r\n0\n%%%%EOF\n \n", ++ gs_sprintf(LDict, "\ntrailer\n<>\nstartxref\r\n0\n%%%%EOF\n \n", + linear_params->LastResource + 3, pdev->ResourceUsage[linear_params->Info_id].NewObjectNumber, pdev->ResourceUsage[linear_params->Catalog_id].NewObjectNumber, fileID, fileID, 0); + fwrite(LDict, strlen(LDict), 1, linear_params->Lin_File.file); + +@@ -1685,7 +1685,7 @@ static int pdf_linearise(gx_device_pdf * + } + } + /* insert the primary hint stream */ +- sprintf(LDict, "%d 0 obj\n<>\nstream\n", HintStreamObj); ++ gs_sprintf(LDict, "%d 0 obj\n<>\nstream\n", HintStreamObj); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + + HintStreamStart = gp_ftell_64(linear_params->sfile); +@@ -1999,7 +1999,7 @@ static int pdf_linearise(gx_device_pdf * + flush_hint_stream(linear_params); + HintLength = gp_ftell_64(linear_params->sfile) - HintStreamStart; + +- sprintf(LDict, "\nendstream\nendobj\n"); ++ gs_sprintf(LDict, "\nendstream\nendobj\n"); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + /* Calculate the length of the primary hint stream */ + HintStreamLen = gp_ftell_64(linear_params->sfile) - pdev->ResourceUsage[HintStreamObj].LinearisedOffset; +@@ -2032,23 +2032,23 @@ static int pdf_linearise(gx_device_pdf * + + /* Now the file is long enough, write the xref */ + mainxref = gp_ftell_64(linear_params->sfile); +- sprintf(Header, "xref\n0 %d\n", LDictObj); ++ gs_sprintf(Header, "xref\n0 %d\n", LDictObj); + fwrite(Header, strlen(Header), 1, linear_params->sfile); + + linear_params->T = gp_ftell_64(linear_params->sfile) - 1; +- sprintf(Header, "0000000000 65535 f \n"); ++ gs_sprintf(Header, "0000000000 65535 f \n"); + fwrite(Header, strlen(Header), 1, linear_params->sfile); + + for (i = 1;i < LDictObj; i++) { + for (j = 0; j < pdev->ResourceUsageSize;j++) { + if (pdev->ResourceUsage[j].NewObjectNumber == i) { +- sprintf(Header, "%010ld 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset + HintStreamLen); ++ gs_sprintf(Header, "%010ld 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset + HintStreamLen); + fwrite(Header, 20, 1, linear_params->sfile); + } + } + } + +- sprintf(LDict, "trailer\n<>\nstartxref\n%ld\n%%%%EOF\n", ++ gs_sprintf(LDict, "trailer\n<>\nstartxref\n%ld\n%%%%EOF\n", + LDictObj, linear_params->FirstxrefOffset); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + +@@ -2062,32 +2062,32 @@ static int pdf_linearise(gx_device_pdf * + * versions. + */ + gp_fseek_64(linear_params->sfile, linear_params->LDictOffset, SEEK_SET); +- sprintf(LDict, "%d 0 obj\n<FileLength); ++ gs_sprintf(LDict, "%d 0 obj\n<FileLength); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + +- sprintf(LDict, "%ld", pdev->ResourceUsage[HintStreamObj].LinearisedOffset); ++ gs_sprintf(LDict, "%ld", pdev->ResourceUsage[HintStreamObj].LinearisedOffset); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); +- sprintf(LDict, " %ld]", HintStreamLen); ++ gs_sprintf(LDict, " %ld]", HintStreamLen); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + /* Implementation Note 180 in hte PDF Reference 1.7 says that Acrobat + * gets the 'E' value wrong. So its probably not important.... + */ +- sprintf(LDict, "/O %d/E %ld",pdev->ResourceUsage[pdev->pages[0].Page->id].NewObjectNumber, linear_params->E); ++ gs_sprintf(LDict, "/O %d/E %ld",pdev->ResourceUsage[pdev->pages[0].Page->id].NewObjectNumber, linear_params->E); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); +- sprintf(LDict, "/N %d/T %ld>>\nendobj\n", pdev->next_page, linear_params->T); ++ gs_sprintf(LDict, "/N %d/T %ld>>\nendobj\n", pdev->next_page, linear_params->T); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + + /* Return to the secondary xref and write it again filling + * in the missing offsets. + */ + gp_fseek_64(linear_params->sfile, linear_params->FirstxrefOffset, SEEK_SET); +- sprintf(Header, "xref\n%d %d\n", LDictObj, Part1To6 - LDictObj + 1); /* +1 for the primary hint stream */ ++ gs_sprintf(Header, "xref\n%d %d\n", LDictObj, Part1To6 - LDictObj + 1); /* +1 for the primary hint stream */ + fwrite(Header, strlen(Header), 1, linear_params->sfile); + + for (i = LDictObj;i <= linear_params->LastResource + 2; i++) { + for (j = 0; j < pdev->ResourceUsageSize;j++) { + if (pdev->ResourceUsage[j].NewObjectNumber == i) { +- sprintf(Header, "%010ld 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset); ++ gs_sprintf(Header, "%010ld 00000 n \n", pdev->ResourceUsage[j].LinearisedOffset); + fwrite(Header, 20, 1, linear_params->sfile); + } + } +@@ -2097,14 +2097,14 @@ static int pdf_linearise(gx_device_pdf * + * in the missing values. + */ + code = gp_fseek_64(linear_params->sfile, linear_params->FirsttrailerOffset, SEEK_SET); +- sprintf(LDict, "\ntrailer\n<>\nstartxref\r\n0\n%%%%EOF\n", ++ gs_sprintf(LDict, "\ntrailer\n<>\nstartxref\r\n0\n%%%%EOF\n", + linear_params->LastResource + 3, pdev->ResourceUsage[linear_params->Info_id].NewObjectNumber, pdev->ResourceUsage[linear_params->Catalog_id].NewObjectNumber, fileID, fileID, (unsigned long)mainxref); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + + code = gp_fseek_64(linear_params->sfile, pdev->ResourceUsage[HintStreamObj].LinearisedOffset, SEEK_SET); +- sprintf(LDict, "%d 0 obj\n<sfile); +- sprintf(LDict, "\n/S %10ld>>\nstream\n", SharedHintOffset); ++ gs_sprintf(LDict, "\n/S %10ld>>\nstream\n", SharedHintOffset); + fwrite(LDict, strlen(LDict), 1, linear_params->sfile); + + error: +@@ -2605,7 +2605,7 @@ pdf_close(gx_device * dev) + pprintld1(s, "/Encrypt %ld 0 R ", Encrypt_id); + } + stream_puts(s, ">>\n"); +- sprintf(xref_str, "startxref\n%"PRId64"\n%%%%EOF\n", xref); ++ gs_sprintf(xref_str, "startxref\n%"PRId64"\n%%%%EOF\n", xref); + stream_puts(s, xref_str); + } + } +diff -up ghostscript-9.07/base/gdevpdfe.c.gs_sprintf ghostscript-9.07/base/gdevpdfe.c +--- ghostscript-9.07/base/gdevpdfe.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfe.c 2013-05-09 17:02:39.067447089 +0100 +@@ -205,7 +205,7 @@ pdf_xmp_time(char *buf, int buf_length) + + time(&t); + tms = *localtime(&t); +- sprintf(buf1, ++ gs_sprintf(buf1, + "%04d-%02d-%02d", + tms.tm_year + 1900, tms.tm_mon + 1, tms.tm_mday); + strncpy(buf, buf1, buf_length); +@@ -860,7 +860,7 @@ pdf_document_metadata(gx_device_pdf *pde + code = COS_WRITE_OBJECT(pres->object, pdev, resourceNone); + if (code < 0) + return code; +- sprintf(buf, "%ld 0 R", pres->object->id); ++ gs_sprintf(buf, "%ld 0 R", pres->object->id); + pdf_record_usage(pdev, pres->object->id, resource_usage_part9_structure); + + code = cos_dict_put_c_key_object(pdev->Catalog, "/Metadata", pres->object); +diff -up ghostscript-9.07/base/gdevpdfg.c.gs_sprintf ghostscript-9.07/base/gdevpdfg.c +--- ghostscript-9.07/base/gdevpdfg.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfg.c 2013-05-09 17:02:39.068447094 +0100 +@@ -674,7 +674,7 @@ pdf_write_transfer_map(gx_device_pdf *pd + gs_function_free(pfn, false, mem); + if (code < 0) + return code; +- sprintf(ids, "%s%s%ld 0 R", key, (key[0] && key[0] != ' ' ? " " : ""), id); ++ gs_sprintf(ids, "%s%s%ld 0 R", key, (key[0] && key[0] != ' ' ? " " : ""), id); + return 0; + } + static int +@@ -1255,7 +1255,7 @@ pdf_update_halftone(gx_device_pdf *pdev, + } + if (code < 0) + return code; +- sprintf(hts, "%ld 0 R", id); ++ gs_sprintf(hts, "%ld 0 R", id); + pdev->halftone_id = pis->dev_ht->id; + return code; + } +@@ -1392,7 +1392,7 @@ pdf_update_alpha(gx_device_pdf *pdev, co + if (pis->soft_mask_id == 0) + strcpy(buf, "/None"); + else +- sprintf(buf, "%ld 0 R", pis->soft_mask_id); ++ gs_sprintf(buf, "%ld 0 R", pis->soft_mask_id); + code = pdf_open_gstate(pdev, ppres); + if (code < 0) + return code; +@@ -1548,7 +1548,7 @@ pdf_prepare_drawing(gx_device_pdf *pdev, + code = pdf_open_gstate(pdev, ppres); + if (code < 0) + return code; +- sprintf(buf, "[%d %d]", phase.x, phase.y); ++ gs_sprintf(buf, "[%d %d]", phase.x, phase.y); + code = cos_dict_put_string_copy(resource_dict(*ppres), "/HTP", buf); + if (code < 0) + return code; +diff -up ghostscript-9.07/base/gdevpdfi.c.gs_sprintf ghostscript-9.07/base/gdevpdfi.c +--- ghostscript-9.07/base/gdevpdfi.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfi.c 2013-05-09 17:02:39.068447094 +0100 +@@ -1122,7 +1122,7 @@ pdf_end_and_do_image(gx_device_pdf *pdev + if (pdev->image_mask_id != gs_no_id) { + char buf[20]; + +- sprintf(buf, "%ld 0 R", pdev->image_mask_id); ++ gs_sprintf(buf, "%ld 0 R", pdev->image_mask_id); + code = cos_dict_put_string_copy((cos_dict_t *)pres->object, + pdev->image_mask_is_SMask ? "/SMask" : "/Mask", buf); + if (code < 0) +diff -up ghostscript-9.07/base/gdevpdfm.c.gs_sprintf ghostscript-9.07/base/gdevpdfm.c +--- ghostscript-9.07/base/gdevpdfm.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfm.c 2013-05-09 17:02:39.069447098 +0100 +@@ -153,9 +153,9 @@ pdfmark_make_dest(char dstr[MAX_DEST_STR + else if (pdfmark_find_key("/Action", pairs, count, &action) && + pdf_key_eq(&action, "/GoToR") + ) +- sprintf(dstr, "[%d ", page - 1); ++ gs_sprintf(dstr, "[%d ", page - 1); + else +- sprintf(dstr, "[%ld 0 R ", pdf_page_id(pdev, page)); ++ gs_sprintf(dstr, "[%ld 0 R ", pdf_page_id(pdev, page)); + len = strlen(dstr); + if (len + view_string.size > MAX_DEST_STRING) + return_error(gs_error_limitcheck); +@@ -697,7 +697,7 @@ pdfmark_put_ao_pairs(gx_device_pdf * pde + char dstr[1 + (sizeof(long) * 8 / 3 + 1) + 25 + 1]; + long page_id = pdf_page_id(pdev, pdev->next_page + 1); + +- sprintf(dstr, "[%ld 0 R /XYZ null null null]", page_id); ++ gs_sprintf(dstr, "[%ld 0 R /XYZ null null null]", page_id); + cos_dict_put_c_key_string(pcd, "/Dest", (const unsigned char*) dstr, + strlen(dstr)); + } +@@ -1470,7 +1470,7 @@ pdfmark_PS(gx_device_pdf * pdev, gs_para + if (level1_id != gs_no_id) { + char r[MAX_DEST_STRING]; + +- sprintf(r, "%ld 0 R", level1_id); ++ gs_sprintf(r, "%ld 0 R", level1_id); + code = cos_dict_put_c_key_string(cos_stream_dict(pcs), "/Level1", + (byte *)r, strlen(r)); + if (code < 0) +diff -up ghostscript-9.07/base/gdevpdfo.c.gs_sprintf ghostscript-9.07/base/gdevpdfo.c +--- ghostscript-9.07/base/gdevpdfo.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfo.c 2013-05-09 17:02:39.069447098 +0100 +@@ -700,7 +700,7 @@ cos_array_add_int(cos_array_t *pca, int + char str[sizeof(int) * 8 / 3 + 3]; /* sign, rounding, 0 terminator */ + cos_value_t v; + +- sprintf(str, "%d", i); ++ gs_sprintf(str, "%d", i); + return cos_array_add(pca, cos_string_value(&v, (byte *)str, strlen(str))); + } + int +@@ -1081,7 +1081,7 @@ cos_dict_put_c_key_int(cos_dict_t *pcd, + { + char str[sizeof(int) * 8 / 3 + 3]; /* sign, rounding, 0 terminator */ + +- sprintf(str, "%d", value); ++ gs_sprintf(str, "%d", value); + return cos_dict_put_c_key_string(pcd, key, (byte *)str, strlen(str)); + } + int +diff -up ghostscript-9.07/base/gdevpdfr.c.gs_sprintf ghostscript-9.07/base/gdevpdfr.c +--- ghostscript-9.07/base/gdevpdfr.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfr.c 2013-05-09 17:02:39.070447102 +0100 +@@ -140,7 +140,7 @@ pdf_refer_named(gx_device_pdf * pdev, co + } + if (page_number <= 0) + return code; +- sprintf(page_name_chars, "{Page%d}", page_number); ++ gs_sprintf(page_name_chars, "{Page%d}", page_number); + param_string_from_string(pnstr, page_name_chars); + pname = &pnstr; + code = pdf_find_named(pdev, pname, ppco); +@@ -452,7 +452,7 @@ pdf_replace_names(gx_device_pdf * pdev, + + size += sname - scan; + if (pco) { +- sprintf(ref, " %ld 0 R ", pco->id); ++ gs_sprintf(ref, " %ld 0 R ", pco->id); + size += strlen(ref); + } + scan = next; +@@ -480,7 +480,7 @@ pdf_replace_names(gx_device_pdf * pdev, + memcpy(sto, scan, copy); + sto += copy; + if (pco) { +- sprintf(ref, " %ld 0 R ", pco->id); ++ gs_sprintf(ref, " %ld 0 R ", pco->id); + rlen = strlen(ref); + memcpy(sto, ref, rlen); + sto += rlen; +diff -up ghostscript-9.07/base/gdevpdft.c.gs_sprintf ghostscript-9.07/base/gdevpdft.c +--- ghostscript-9.07/base/gdevpdft.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdft.c 2013-05-09 17:02:39.070447102 +0100 +@@ -63,7 +63,7 @@ pdf_make_soft_mask_dict(gx_device_pdf * + code = pdf_write_function(pdev, pparams->transfer_function, &id); + if (code < 0) + return code; +- sprintf(buf, " %ld 0 R", id); ++ gs_sprintf(buf, " %ld 0 R", id); + code = cos_dict_put_c_key_string(soft_mask_dict, "/TR", (const byte *)buf, strlen(buf)); + if (code < 0) + return code; +@@ -317,7 +317,7 @@ pdf_end_transparency_mask(gs_imager_stat + return 0; + /* We need to update the 'where_used' field, in case we substituted a resource */ + pres->where_used |= pdev->used_mask; +- sprintf(buf, "%ld 0 R", pdf_resource_id(pres)); ++ gs_sprintf(buf, "%ld 0 R", pdf_resource_id(pres)); + code = cos_dict_put_c_key_string((cos_dict_t *)pdev->pres_soft_mask_dict->object, + "/G", (const byte *)buf, strlen(buf)); + if (code < 0) +diff -up ghostscript-9.07/base/gdevpdfu.c.gs_sprintf ghostscript-9.07/base/gdevpdfu.c +--- ghostscript-9.07/base/gdevpdfu.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfu.c 2013-05-09 17:02:39.071447106 +0100 +@@ -341,14 +341,14 @@ static int write_tt_encodings(stream *s, + char Buffer[256]; + single_glyph_list_t *entry = (single_glyph_list_t *)&SingleGlyphList; + +- sprintf(Buffer, "/AdobeGlyphList mark\n"); ++ gs_sprintf(Buffer, "/AdobeGlyphList mark\n"); + stream_write(s, Buffer, strlen(Buffer)); + while (entry->Glyph) { +- sprintf(Buffer, "/%s 16#%04x\n", entry->Glyph, entry->Unicode); ++ gs_sprintf(Buffer, "/%s 16#%04x\n", entry->Glyph, entry->Unicode); + stream_write(s, Buffer, strlen(Buffer)); + entry++; + }; +- sprintf(Buffer, ".dicttomark readonly def\n"); ++ gs_sprintf(Buffer, ".dicttomark readonly def\n"); + stream_write(s, Buffer, strlen(Buffer)); + + index = 0; +@@ -425,24 +425,24 @@ int ps2write_dsc_header(gx_device_pdf * + pagecount++; + } + } +- sprintf(BBox, "%%%%BoundingBox: 0 0 %d %d\n", (int)urx, (int)ury); ++ gs_sprintf(BBox, "%%%%BoundingBox: 0 0 %d %d\n", (int)urx, (int)ury); + stream_write(s, (byte *)BBox, strlen(BBox)); +- sprintf(BBox, "%%%%HiResBoundingBox: 0 0 %.2f %.2f\n", urx, ury); ++ gs_sprintf(BBox, "%%%%HiResBoundingBox: 0 0 %.2f %.2f\n", urx, ury); + stream_write(s, (byte *)BBox, strlen(BBox)); + } + cre_date_time_len = pdf_get_docinfo_item(pdev, "/CreationDate", cre_date_time, sizeof(cre_date_time) - 1); + cre_date_time[cre_date_time_len] = 0; +- sprintf(BBox, "%%%%Creator: %s %d (%s)\n", gs_product, (int)gs_revision, ++ gs_sprintf(BBox, "%%%%Creator: %s %d (%s)\n", gs_product, (int)gs_revision, + pdev->dname); + stream_write(s, (byte *)BBox, strlen(BBox)); + stream_puts(s, "%%LanguageLevel: 2\n"); +- sprintf(BBox, "%%%%CreationDate: %s\n", cre_date_time); ++ gs_sprintf(BBox, "%%%%CreationDate: %s\n", cre_date_time); + stream_write(s, (byte *)BBox, strlen(BBox)); +- sprintf(BBox, "%%%%Pages: %d\n", pages); ++ gs_sprintf(BBox, "%%%%Pages: %d\n", pages); + stream_write(s, (byte *)BBox, strlen(BBox)); +- sprintf(BBox, "%%%%EndComments\n"); ++ gs_sprintf(BBox, "%%%%EndComments\n"); + stream_write(s, (byte *)BBox, strlen(BBox)); +- sprintf(BBox, "%%%%BeginProlog\n"); ++ gs_sprintf(BBox, "%%%%BeginProlog\n"); + stream_write(s, (byte *)BBox, strlen(BBox)); + if (pdev->params.CompressPages) { + /* When CompressEntireFile is true and ASCII85EncodePages is false, +@@ -493,7 +493,7 @@ pdfwrite_pdf_open_document(gx_device_pdf + pdev->CompressEntireFile = 0; + else { + stream_write(s, (byte *)"%!\r", 3); +- sprintf(BBox, "%%%%BoundingBox: 0 0 %d %d\n", width, height); ++ gs_sprintf(BBox, "%%%%BoundingBox: 0 0 %d %d\n", width, height); + stream_write(s, (byte *)BBox, strlen(BBox)); + if (pdev->params.CompressPages || pdev->CompressEntireFile) { + /* When CompressEntireFile is true and ASCII85EncodePages is false, +@@ -1340,7 +1340,7 @@ void + pdf_reserve_object_id(gx_device_pdf * pdev, pdf_resource_t *pres, long id) + { + pres->object->id = (id == 0 ? pdf_obj_ref(pdev) : id); +- sprintf(pres->rname, "R%ld", pres->object->id); ++ gs_sprintf(pres->rname, "R%ld", pres->object->id); + } + + /* Begin an aside (resource, annotation, ...). */ +@@ -1802,9 +1802,9 @@ void + pdf_store_default_Producer(char buf[PDF_MAX_PRODUCER]) + { + if ((gs_revision % 100) == 0) +- sprintf(buf, "(%s %1.1f)", gs_product, gs_revision / 100.0); ++ gs_sprintf(buf, "(%s %1.1f)", gs_product, gs_revision / 100.0); + else +- sprintf(buf, "(%s %1.2f)", gs_product, gs_revision / 100.0); ++ gs_sprintf(buf, "(%s %1.2f)", gs_product, gs_revision / 100.0); + } + + /* Write matrix values. */ +@@ -1851,7 +1851,7 @@ pdf_put_name_chars_1_2(stream *s, const + case '[': case ']': + case '{': case '}': + case '/': +- sprintf(hex, "#%02x", c); ++ gs_sprintf(hex, "#%02x", c); + stream_puts(s, hex); + break; + case 0: +diff -up ghostscript-9.07/base/gdevpdfv.c.gs_sprintf ghostscript-9.07/base/gdevpdfv.c +--- ghostscript-9.07/base/gdevpdfv.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdfv.c 2013-05-09 17:02:39.071447106 +0100 +@@ -157,7 +157,7 @@ pdf_pattern(gx_device_pdf *pdev, const g + + if (pcd_XObject == 0) + return_error(gs_error_VMerror); +- sprintf(key, "/R%ld", pcs_image->id); ++ gs_sprintf(key, "/R%ld", pcs_image->id); + /* This is non-obvious code. Previously we would put the image object (pcs_image) + * into the Resources dit. When we come to write out the Resources dict + * that code writes a reference (index 0 R) using the ID from the object. +@@ -201,7 +201,7 @@ pdf_pattern(gx_device_pdf *pdev, const g + { + char buf[MAX_REF_CHARS + 6 + 1]; /* +6 for /R# Do\n */ + +- sprintf(buf, "/R%ld Do\n", pcs_image->id); ++ gs_sprintf(buf, "/R%ld Do\n", pcs_image->id); + cos_stream_add_bytes(pcos, (const byte *)buf, strlen(buf)); + } + +@@ -596,7 +596,7 @@ pdf_put_linear_shading(cos_dict_t *pscd, + if (Extend[0] | Extend[1]) { + char extend_str[1 + 5 + 1 + 5 + 1 + 1]; /* [bool bool] */ + +- sprintf(extend_str, "[%s %s]", ++ gs_sprintf(extend_str, "[%s %s]", + (Extend[0] ? "true" : "false"), + (Extend[1] ? "true" : "false")); + code = cos_dict_put_c_key_string(pscd, "/Extend", +diff -up ghostscript-9.07/base/gdevpdtb.c.gs_sprintf ghostscript-9.07/base/gdevpdtb.c +--- ghostscript-9.07/base/gdevpdtb.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdtb.c 2013-05-09 17:02:39.072447111 +0100 +@@ -345,7 +345,7 @@ pdf_base_font_alloc(gx_device_pdf *pdev, + font_name.size -= SUBSET_PREFIX_SIZE; + } + } else { +- sprintf(fnbuf, ".F%lx", (ulong)copied); ++ gs_sprintf(fnbuf, ".F%lx", (ulong)copied); + font_name.data = (byte *)fnbuf; + font_name.size = strlen(fnbuf); + } +@@ -530,7 +530,7 @@ pdf_adjust_font_name(gx_device_pdf *pdev + size = i + 1; + } + /* Create a unique name. */ +- sprintf(suffix, "%c%lx", SUFFIX_CHAR, id); ++ gs_sprintf(suffix, "%c%lx", SUFFIX_CHAR, id); + suffix_size = strlen(suffix); + data = gs_resize_string(pdev->pdf_memory, chars, size, + size + suffix_size, +diff -up ghostscript-9.07/base/gdevpdtc.c.gs_sprintf ghostscript-9.07/base/gdevpdtc.c +--- ghostscript-9.07/base/gdevpdtc.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdtc.c 2013-05-09 17:02:39.072447111 +0100 +@@ -338,7 +338,7 @@ attach_cmap_resource(gx_device_pdf *pdev + strcpy(pdfont->u.type0.Encoding_name, + (pcmap->WMode ? "/Identity-V" : "/Identity-H")); + else +- sprintf(pdfont->u.type0.Encoding_name, "%ld 0 R", ++ gs_sprintf(pdfont->u.type0.Encoding_name, "%ld 0 R", + pdf_resource_id(pcmres)); + pdfont->u.type0.CMapName.data = chars; + pdfont->u.type0.CMapName.size = size; +@@ -349,7 +349,7 @@ attach_cmap_resource(gx_device_pdf *pdev + */ + return_error(gs_error_invalidfont); + +- sprintf(pdfont->u.type0.Encoding_name, "/%s", *pcmn); ++ gs_sprintf(pdfont->u.type0.Encoding_name, "/%s", *pcmn); + pdfont->u.type0.CMapName.data = (const byte *)*pcmn; + pdfont->u.type0.CMapName.size = strlen(*pcmn); + pdfont->u.type0.cmap_is_standard = true; +diff -up ghostscript-9.07/base/gdevpdtf.c.gs_sprintf ghostscript-9.07/base/gdevpdtf.c +--- ghostscript-9.07/base/gdevpdtf.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdtf.c 2013-05-09 17:02:39.072447111 +0100 +@@ -1152,7 +1152,7 @@ pdf_convert_truetype_font(gx_device_pdf + if (code < 0) + return 0; + pdfont->u.cidfont.CIDSystemInfo_id = pdev->IdentityCIDSystemInfo_id; +- sprintf(pdfont0->u.type0.Encoding_name, "%ld 0 R", pdf_resource_id(pdev->OneByteIdentityH)); ++ gs_sprintf(pdfont0->u.type0.Encoding_name, "%ld 0 R", pdf_resource_id(pdev->OneByteIdentityH)); + /* Move ToUnicode : */ + pdfont0->res_ToUnicode = pdfont->res_ToUnicode; pdfont->res_ToUnicode = 0; + pdfont0->cmap_ToUnicode = pdfont->cmap_ToUnicode; pdfont->cmap_ToUnicode = 0; +diff -up ghostscript-9.07/base/gdevpdti.c.gs_sprintf ghostscript-9.07/base/gdevpdti.c +--- ghostscript-9.07/base/gdevpdti.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdti.c 2013-05-09 17:02:39.073447115 +0100 +@@ -1178,7 +1178,7 @@ pdf_add_resource(gx_device_pdf *pdev, co + if (code < 0) + return code; + } +- sprintf(buf, "%ld 0 R\n", pres->object->id); ++ gs_sprintf(buf, "%ld 0 R\n", pres->object->id); + if (v != NULL) { + if (v->value_type != COS_VALUE_OBJECT && + v->value_type != COS_VALUE_RESOURCE) +diff -up ghostscript-9.07/base/gdevpdtt.c.gs_sprintf ghostscript-9.07/base/gdevpdtt.c +--- ghostscript-9.07/base/gdevpdtt.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdtt.c 2013-05-09 17:02:39.074447119 +0100 +@@ -2752,7 +2752,7 @@ pdf_choose_output_glyph_hame(gx_device_p + p = (byte *)gs_alloc_string(pdev->pdf_memory, gnstr->size, "pdf_text_set_cache"); + if (p == NULL) + return_error(gs_error_VMerror); +- sprintf(buf, "g%04x", (unsigned int)(glyph & 0xFFFF)); ++ gs_sprintf(buf, "g%04x", (unsigned int)(glyph & 0xFFFF)); + memcpy(p, buf, 5); + gnstr->data = p; + } +diff -up ghostscript-9.07/base/gdevpdtw.c.gs_sprintf ghostscript-9.07/base/gdevpdtw.c +--- ghostscript-9.07/base/gdevpdtw.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpdtw.c 2013-05-09 17:02:39.074447119 +0100 +@@ -925,7 +925,7 @@ pdf_write_OneByteIdentityH(gx_device_pdf + code = cos_dict_put_string_copy(pcd, "/CMapName", "/OneByteIdentityH"); + if (code < 0) + return code; +- sprintf(buf, "%ld 0 R", pdev->IdentityCIDSystemInfo_id); ++ gs_sprintf(buf, "%ld 0 R", pdev->IdentityCIDSystemInfo_id); + code = cos_dict_put_string_copy(pcd, "/CIDSystemInfo", buf); + if (code < 0) + return code; +diff -up ghostscript-9.07/base/gdevpng.c.gs_sprintf ghostscript-9.07/base/gdevpng.c +--- ghostscript-9.07/base/gdevpng.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpng.c 2013-05-09 17:02:39.074447119 +0100 +@@ -564,7 +564,7 @@ do_png_print_page(gx_device_png * pdev, + } + /* add comment */ + strncpy(software_key, "Software", sizeof(software_key)); +- sprintf(software_text, "%s %d.%02d", gs_product, ++ gs_sprintf(software_text, "%s %d.%02d", gs_product, + (int)(gs_revision / 100), (int)(gs_revision % 100)); + text_png.compression = -1; /* uncompressed */ + text_png.key = software_key; +diff -up ghostscript-9.07/base/gdevps.c.gs_sprintf ghostscript-9.07/base/gdevps.c +--- ghostscript-9.07/base/gdevps.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevps.c 2013-05-09 17:02:39.075447124 +0100 +@@ -526,7 +526,7 @@ psw_image_write(gx_device_pswrite * pdev + const char *op; + + if (index >= 0) { +- sprintf(str, "%d%c", index / 26, index % 26 + 'A'); ++ gs_sprintf(str, "%d%c", index / 26, index % 26 + 'A'); + pprintd2(s, "%d %d ", x, y); + pprints2(s, "%s %s\n", str, imagestr); + if (s->end_status == ERRC) +@@ -556,12 +556,12 @@ psw_image_write(gx_device_pswrite * pdev + }; + + index = image_cache_lookup(pdev, id, width_bits, height, true); +- sprintf(str, "/%d%c", index / 26, index % 26 + 'A'); ++ gs_sprintf(str, "/%d%c", index / 26, index % 26 + 'A'); + stream_puts(s, str); + if (depth != 1) + pprintld1(s, " %ld", ((width_bits + 7) >> 3) * (ulong) height); + op = cached[encode]; +- sprintf(endstr, "\n%s\n", imagestr); ++ gs_sprintf(endstr, "\n%s\n", imagestr); + } + if (s->end_status == ERRC) + return_error(gs_error_ioerror); +@@ -1261,7 +1261,7 @@ psw_copy_color(gx_device * dev, + return (*dev_proc(dev, fill_rectangle)) + (dev, x, y, w, h, (bits[0] << 16) + (bits[1] << 8) + bits[2]); + } +- sprintf(op, "%d Ic", depth / 3); /* RGB */ ++ gs_sprintf(op, "%d Ic", depth / 3); /* RGB */ + code = gdev_vector_update_clip_path(vdev, NULL); + if (code < 0) + return code; +diff -up ghostscript-9.07/base/gdevpsf1.c.gs_sprintf ghostscript-9.07/base/gdevpsf1.c +--- ghostscript-9.07/base/gdevpsf1.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpsf1.c 2013-05-09 17:02:39.075447124 +0100 +@@ -646,12 +646,12 @@ write_Private(stream *s, gs_font_type1 * + gs_free_object(pfont->memory, SubrsWithMM, "free Subrs record"); + return code; + } +- sprintf(buf, "dup %d %u -| ", i, code); ++ gs_sprintf(buf, "dup %d %u -| ", i, code); + stream_puts(s, buf); + write_CharString(s, stripped, code); + gs_free_object(pfont->memory, stripped, "free Subrs copy for OtherSubrs"); + } else { +- sprintf(buf, "dup %d %u -| ", i, gdata.bits.size); ++ gs_sprintf(buf, "dup %d %u -| ", i, gdata.bits.size); + stream_puts(s, buf); + write_CharString(s, gdata.bits.data, gdata.bits.size); + } +diff -up ghostscript-9.07/base/gdevpsf2.c.gs_sprintf ghostscript-9.07/base/gdevpsf2.c +--- ghostscript-9.07/base/gdevpsf2.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevpsf2.c 2013-05-09 17:02:39.076447128 +0100 +@@ -274,7 +274,7 @@ cff_put_real(cff_writer_t *pcw, floatp f + byte b = 0xff; + const char *p; + +- sprintf(str, "%g", f); ++ gs_sprintf(str, "%g", f); + sputc(pcw->strm, CD_REAL); + for (p = str; ; ++p) { + int digit; +diff -up ghostscript-9.07/base/gdevsppr.c.gs_sprintf ghostscript-9.07/base/gdevsppr.c +--- ghostscript-9.07/base/gdevsppr.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevsppr.c 2013-05-09 17:02:39.076447128 +0100 +@@ -100,7 +100,7 @@ err_code_string(int err_code) + { + if ((err_codeESERIAL)) + { +- sprintf(err_buffer,"err_code out of range: %d",err_code); ++ gs_sprintf(err_buffer,"err_code out of range: %d",err_code); + return err_buffer; + } + return errmsg[err_code]; +diff -up ghostscript-9.07/base/gdevsun.c.gs_sprintf ghostscript-9.07/base/gdevsun.c +--- ghostscript-9.07/base/gdevsun.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevsun.c 2013-05-09 17:02:39.076447128 +0100 +@@ -392,7 +392,7 @@ if ( gs_debug['X'] ) + /* + * Install the colormap. + */ +- sprintf(xdev->cmsname, "%s-%d", CMSNAME, getpid()); ++ gs_sprintf(xdev->cmsname, "%s-%d", CMSNAME, getpid()); + pw_setcmsname(xdev->pw, xdev->cmsname); + pw_putcolormap(xdev->pw, 0, CMS_SIZE, + xdev->red, xdev->green, xdev->blue); +diff -up ghostscript-9.07/base/gdevsvg.c.gs_sprintf ghostscript-9.07/base/gdevsvg.c +--- ghostscript-9.07/base/gdevsvg.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevsvg.c 2013-05-09 17:02:39.076447128 +0100 +@@ -374,22 +374,22 @@ svg_write_header(gx_device_svg *svg) + return 1; + + /* write the initial boilerplate */ +- sprintf(line, "%s\n", XML_DECL); ++ gs_sprintf(line, "%s\n", XML_DECL); + /* svg_write(svg, line); */ + sputs(s, (byte *)line, strlen(line), &used); +- sprintf(line, "%s\n", SVG_DOCTYPE); ++ gs_sprintf(line, "%s\n", SVG_DOCTYPE); + /* svg_write(svg, line); */ + sputs(s, (byte *)line, strlen(line), &used); +- sprintf(line, "\n", ++ gs_sprintf(line, "\n\twidth='%dpt' height='%dpt'>\n", + (int)svg->MediaSize[0], (int)svg->MediaSize[1]); + sputs(s, (byte *)line, strlen(line), &used); + + /* Scale drawing so our coordinates are in pixels */ +- sprintf(line, "\n", ++ gs_sprintf(line, "\n", + 72.0 / svg->HWResolution[0], + 72.0 / svg->HWResolution[1]); + /* svg_write(svg, line); */ +@@ -430,19 +430,19 @@ svg_write_state(gx_device_svg *svg) + /* write out the new current state */ + svg_write(svg, "strokecolor != gx_no_color_index) { +- sprintf(line, " stroke='#%06x'", svg->strokecolor & 0xffffffL); ++ gs_sprintf(line, " stroke='#%06x'", svg->strokecolor & 0xffffffL); + svg_write(svg, line); + } else { + svg_write(svg, " stroke='none'"); + } + if (svg->fillcolor != gx_no_color_index) { +- sprintf(line, "#%06x", svg->fillcolor & 0xffffffL); ++ gs_sprintf(line, "#%06x", svg->fillcolor & 0xffffffL); + svg_write(svg, line); + } else { + svg_write(svg, " fill='none'"); + } + if (svg->linewidth != 1.0) { +- sprintf(line, " stroke-width='%lf'", svg->linewidth); ++ gs_sprintf(line, " stroke-width='%lf'", svg->linewidth); + svg_write(svg, line); + } + if (svg->linecap != SVG_DEFAULT_LINECAP) { +@@ -476,7 +476,7 @@ svg_write_state(gx_device_svg *svg) + } + } + if (svg->miterlimit != SVG_DEFAULT_MITERLIMIT) { +- sprintf(line, " stroke-miterlimit='%lf'", svg->miterlimit); ++ gs_sprintf(line, " stroke-miterlimit='%lf'", svg->miterlimit); + svg_write(svg, line); + } + svg_write(svg, ">\n"); +@@ -653,7 +653,7 @@ svg_dorect(gx_device_vector *vdev, fixed + svg_write(svg, "\n"); + } + +- sprintf(line, "memory, "\n"); + +- sprintf(line, " M%lf,%lf", x, y); ++ gs_sprintf(line, " M%lf,%lf", x, y); + svg_write(svg, line); + + return 0; +@@ -739,7 +739,7 @@ svg_lineto(gx_device_vector *vdev, float + svg_print_path_type(svg, type); + if_debug0m('_', svg->memory, "\n"); + +- sprintf(line, " L%lf,%lf", x, y); ++ gs_sprintf(line, " L%lf,%lf", x, y); + svg_write(svg, line); + + return 0; +@@ -766,7 +766,7 @@ svg_curveto(gx_device_vector *vdev, floa + svg_print_path_type(svg, type); + if_debug0m('_', svg->memory, "\n"); + +- sprintf(line, " C%lf,%lf %lf,%lf %lf,%lf", x1,y1, x2,y2, x3,y3); ++ gs_sprintf(line, " C%lf,%lf %lf,%lf %lf,%lf", x1,y1, x2,y2, x3,y3); + svg_write(svg, line); + + return 0; +diff -up ghostscript-9.07/base/gdevtifs.c.gs_sprintf ghostscript-9.07/base/gdevtifs.c +--- ghostscript-9.07/base/gdevtifs.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevtifs.c 2013-05-09 17:02:39.077447132 +0100 +@@ -500,7 +500,7 @@ int tiff_set_fields_for_printer(gx_devic + + strncpy(softwareValue, gs_product, maxSoftware); + softwareValue[maxSoftware - 1] = 0; +- sprintf(revs, " %1.2f", gs_revision / 100.0); ++ gs_sprintf(revs, " %1.2f", gs_revision / 100.0); + strncat(softwareValue, revs, + maxSoftware - strlen(softwareValue) - 1); + +@@ -513,7 +513,7 @@ int tiff_set_fields_for_printer(gx_devic + + time(&t); + tms = *localtime(&t); +- sprintf(dateTimeValue, "%04d:%02d:%02d %02d:%02d:%02d", ++ gs_sprintf(dateTimeValue, "%04d:%02d:%02d %02d:%02d:%02d", + tms.tm_year + 1900, tms.tm_mon + 1, tms.tm_mday, + tms.tm_hour, tms.tm_min, tms.tm_sec); + +diff -up ghostscript-9.07/base/gdevtsep.c.gs_sprintf ghostscript-9.07/base/gdevtsep.c +--- ghostscript-9.07/base/gdevtsep.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevtsep.c 2013-05-09 17:02:39.077447132 +0100 +@@ -1182,9 +1182,9 @@ tiffsep1_prn_close(gx_device * pdev) + while (*fmt != 'l' && *fmt != '%') + --fmt; + if (*fmt == 'l') +- sprintf(compname, parsed.fname, count1); ++ gs_sprintf(compname, parsed.fname, count1); + else +- sprintf(compname, parsed.fname, (int)count1); ++ gs_sprintf(compname, parsed.fname, (int)count1); + parsed.iodev->procs.delete_file(parsed.iodev, compname); + } else { + parsed.iodev->procs.delete_file(parsed.iodev, tfdev->fname); +@@ -1370,7 +1370,7 @@ create_separation_file_name(tiffsep_devi + /* Max of 10 chars in %d format */ + if (max_size < base_filename_length + 11) + return_error(gs_error_rangecheck); +- sprintf(buffer + base_filename_length, "s%d", sep_num); ++ gs_sprintf(buffer + base_filename_length, "s%d", sep_num); + } + } + if (use_sep_name) +@@ -2385,9 +2385,9 @@ tiffsep1_print_page(gx_device_printer * + while (*fmt != 'l' && *fmt != '%') + --fmt; + if (*fmt == 'l') +- sprintf(compname, parsed.fname, count1); ++ gs_sprintf(compname, parsed.fname, count1); + else +- sprintf(compname, parsed.fname, (int)count1); ++ gs_sprintf(compname, parsed.fname, (int)count1); + parsed.iodev->procs.delete_file(parsed.iodev, compname); + /* we always need an open printer (it will get deleted in tiffsep1_prn_close */ + if ((code = gdev_prn_open_printer((gx_device *)pdev, 1)) < 0) +diff -up ghostscript-9.07/base/gdevtxtw.c.gs_sprintf ghostscript-9.07/base/gdevtxtw.c +--- ghostscript-9.07/base/gdevtxtw.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevtxtw.c 2013-05-09 17:02:39.078447137 +0100 +@@ -633,16 +633,16 @@ static int escaped_Unicode (unsigned sho + { + switch (Unicode) + { +- case 0x3C: sprintf(Buf, "<"); break; +- case 0x3E: sprintf(Buf, ">"); break; +- case 0x26: sprintf(Buf, "&"); break; +- case 0x22: sprintf(Buf, """); break; +- case 0x27: sprintf(Buf, "'"); break; ++ case 0x3C: gs_sprintf(Buf, "<"); break; ++ case 0x3E: gs_sprintf(Buf, ">"); break; ++ case 0x26: gs_sprintf(Buf, "&"); break; ++ case 0x22: gs_sprintf(Buf, """); break; ++ case 0x27: gs_sprintf(Buf, "'"); break; + default: + if (Unicode >= 32 && Unicode <= 127) +- sprintf(Buf, "%c", Unicode); ++ gs_sprintf(Buf, "%c", Unicode); + else +- sprintf(Buf, "&#x%x;", Unicode); ++ gs_sprintf(Buf, "&#x%x;", Unicode); + break; + } + +@@ -665,13 +665,13 @@ static int decorated_text_output(gx_devi + x_entry = tdev->PageData.unsorted_text_list; + while (x_entry) { + next_x = x_entry->next; +- sprintf(TextBuffer, "\n", x_entry->start.x, x_entry->start.y, ++ gs_sprintf(TextBuffer, "\n", x_entry->start.x, x_entry->start.y, + x_entry->end.x, x_entry->end.y, x_entry->FontName,x_entry->size); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos = x_entry->start.x; + for (i=0;iUnicode_Text_Size;i++) { + escaped_Unicode(x_entry->Unicode_Text[i], (char *)&Escaped); +- sprintf(TextBuffer, "\n", xpos, ++ gs_sprintf(TextBuffer, "\n", xpos, + x_entry->start.y, xpos + x_entry->Widths[i], x_entry->end.y, Escaped); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos += x_entry->Widths[i]; +@@ -788,13 +788,13 @@ static int decorated_text_output(gx_devi + fwrite("\n", sizeof(unsigned char), 7, tdev->file); + x_entry = block_line->x_ordered_list; + while(x_entry) { +- sprintf(TextBuffer, "\n", x_entry->start.x, x_entry->start.y, ++ gs_sprintf(TextBuffer, "\n", x_entry->start.x, x_entry->start.y, + x_entry->end.x, x_entry->end.y, x_entry->FontName,x_entry->size); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos = x_entry->start.x; + for (i=0;iUnicode_Text_Size;i++) { + escaped_Unicode(x_entry->Unicode_Text[i], (char *)&Escaped); +- sprintf(TextBuffer, "\n", xpos, ++ gs_sprintf(TextBuffer, "\n", xpos, + x_entry->start.y, xpos + x_entry->Widths[i], x_entry->end.y, Escaped); + fwrite(TextBuffer, 1, strlen(TextBuffer), tdev->file); + xpos += x_entry->Widths[i]; +diff -up ghostscript-9.07/base/gdevupd.c.gs_sprintf ghostscript-9.07/base/gdevupd.c +--- ghostscript-9.07/base/gdevupd.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevupd.c 2013-05-09 17:02:39.079447141 +0100 +@@ -6476,7 +6476,7 @@ upd_open_wrtrtl(upd_device *udev) + if( (B_PAGEWIDTH & upd->flags) && + ((c == 0x73) || (c == 0x53)) ) { /* esc * r # S */ + +- sprintf(cv,"%d",upd->pwidth); ++ gs_sprintf(cv,"%d",upd->pwidth); + ncv = strlen(cv); + + nbp = (j+1) + ncv + (upd->strings[S_BEGIN].size-i); +@@ -6494,7 +6494,7 @@ upd_open_wrtrtl(upd_device *udev) + } else if((B_PAGELENGTH & upd->flags) && + ((c == 0x74) || (c == 0x54)) ) { /* esc * r # T */ + +- sprintf(cv,"%d",upd->pheight); ++ gs_sprintf(cv,"%d",upd->pheight); + ncv = strlen(cv); + + nbp = (j+1) + ncv + (upd->strings[S_BEGIN].size-i); +@@ -6523,7 +6523,7 @@ upd_open_wrtrtl(upd_device *udev) + if( (B_RESOLUTION & upd->flags) && + ((c == 0x72) || (c == 0x52)) ) { /* esc * t # R */ + +- sprintf(cv,"%d",(int) ++ gs_sprintf(cv,"%d",(int) + ((udev->y_pixels_per_inch < udev->x_pixels_per_inch ? + udev->x_pixels_per_inch : udev->y_pixels_per_inch) + +0.5)); +@@ -6730,7 +6730,7 @@ upd_open_wrtrtl(upd_device *udev) + + if(B_PAGELENGTH & upd->flags) { /* insert new number */ + +- sprintf(cv,"%d",(int) ++ gs_sprintf(cv,"%d",(int) + (720.0 * udev->height / udev->y_pixels_per_inch + 0.5)); + ncv = strlen(cv); + +@@ -6795,7 +6795,7 @@ upd_open_wrtrtl(upd_device *udev) + + if(B_PAGEWIDTH & upd->flags) { /* insert new number */ + +- sprintf(cv,"%d",(int) ++ gs_sprintf(cv,"%d",(int) + (720.0 * udev->width / udev->x_pixels_per_inch + 0.5)); + ncv = strlen(cv); + +@@ -6890,7 +6890,7 @@ upd_open_wrtrtl(upd_device *udev) + + if(B_RESOLUTION & upd->flags) { /* insert new number */ + +- sprintf(cv,"%d",(int) ++ gs_sprintf(cv,"%d",(int) + ((udev->y_pixels_per_inch < udev->x_pixels_per_inch ? + udev->x_pixels_per_inch : udev->y_pixels_per_inch) + +0.5)); +@@ -6945,7 +6945,7 @@ It must hold: + char tmp[16]; + + if(0 < upd->strings[S_YMOVE].size) { +- sprintf(tmp,"%d",upd->pheight); ++ gs_sprintf(tmp,"%d",upd->pheight); + ny = upd->strings[S_YMOVE].size + strlen(tmp); + } else { + ny = 1 + upd->string_a[SA_WRITECOMP].data[upd->ocomp-1].size; +@@ -7006,14 +7006,14 @@ upd_wrtrtl(upd_p upd, FILE *out) + */ + if(upd->yscan != upd->yprinter) { /* Adjust Y-Position */ + if(1 < upd->strings[S_YMOVE].size) { +- sprintf((char *)upd->outbuf+ioutbuf, ++ gs_sprintf((char *)upd->outbuf+ioutbuf, + (const char *) upd->strings[S_YMOVE].data, + upd->yscan - upd->yprinter); + ioutbuf += strlen((char *)upd->outbuf+ioutbuf); + } else { + while(upd->yscan > upd->yprinter) { + for(icomp = 0; icomp < upd->ocomp; ++icomp) { +- sprintf((char *)upd->outbuf+ioutbuf, ++ gs_sprintf((char *)upd->outbuf+ioutbuf, + (const char *) upd->string_a[SA_WRITECOMP].data[icomp].data,0); + ioutbuf += strlen((char *)upd->outbuf+ioutbuf); + } +diff -up ghostscript-9.07/base/gdevwpr2.c.gs_sprintf ghostscript-9.07/base/gdevwpr2.c +--- ghostscript-9.07/base/gdevwpr2.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevwpr2.c 2013-05-09 17:02:39.080447145 +0100 +@@ -548,7 +548,7 @@ win_pr2_print_page(gx_device_printer * p + } + + if (!wdev->nocancel) { +- sprintf(dlgtext, "Printing page %d", (int)(pdev->PageCount) + 1); ++ gs_sprintf(dlgtext, "Printing page %d", (int)(pdev->PageCount) + 1); + SetWindowText(GetDlgItem(wdev->hDlgModeless, CANCEL_PRINTING), dlgtext); + ShowWindow(wdev->hDlgModeless, SW_SHOW); + } +@@ -577,7 +577,7 @@ win_pr2_print_page(gx_device_printer * p + + if (!wdev->nocancel) { + /* inform user of progress */ +- sprintf(dlgtext, "%d%% done", (int)(y * 100L / scan_lines)); ++ gs_sprintf(dlgtext, "%d%% done", (int)(y * 100L / scan_lines)); + SetWindowText(GetDlgItem(wdev->hDlgModeless, CANCEL_PCDONE), dlgtext); + } + /* process message loop */ +@@ -1488,9 +1488,9 @@ win_pr2_print_setup_interaction(gx_devic + + wdev->user_changed_settings = TRUE; + if (wdev->use_old_spool_name) { +- sprintf(wdev->fname, "\\\\spool\\%s", (char*)(devnames)+(devnames->wDeviceOffset)); ++ gs_sprintf(wdev->fname, "\\\\spool\\%s", (char*)(devnames)+(devnames->wDeviceOffset)); + } else { +- sprintf(wdev->fname, "%%printer%%%s", (char*)(devnames)+(devnames->wDeviceOffset)); ++ gs_sprintf(wdev->fname, "%%printer%%%s", (char*)(devnames)+(devnames->wDeviceOffset)); + } + + if (mode == 3) { +diff -up ghostscript-9.07/base/gdevxini.c.gs_sprintf ghostscript-9.07/base/gdevxini.c +--- ghostscript-9.07/base/gdevxini.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gdevxini.c 2013-05-09 17:02:39.080447145 +0100 +@@ -377,7 +377,7 @@ gdev_x_open(gx_device_X * xdev) + char gstr[40]; + int bitmask; + +- sprintf(gstr, "%dx%d+%d+%d", sizehints.width, ++ gs_sprintf(gstr, "%dx%d+%d+%d", sizehints.width, + sizehints.height, sizehints.x, sizehints.y); + bitmask = XWMGeometry(xdev->dpy, DefaultScreen(xdev->dpy), + xdev->geometry, gstr, xdev->borderWidth, +diff -up ghostscript-9.07/base/gp_macio.c.gs_sprintf ghostscript-9.07/base/gp_macio.c +--- ghostscript-9.07/base/gp_macio.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gp_macio.c 2013-05-09 17:02:39.080447145 +0100 +@@ -162,7 +162,7 @@ getenv(const char * env) { + convertSpecToPath(&pFile, fpath, 256); + // sprintf(fpath,"%s",fpath); + p = (char*)malloc((size_t) ( 4*strlen(fpath) + 40)); +- sprintf(p,"%s,%sGhostscript:lib,%sGhostscript:fonts", ++ gs_sprintf(p,"%s,%sGhostscript:lib,%sGhostscript:fonts", + (char *)&fpath[0],(char *)&fpath[0], + (char *)&fpath[0] ); + +@@ -402,9 +402,9 @@ gp_open_scratch_file (const gs_memory_t + } + FSMakeFSSpec(foundVRefNum, foundDirID,thepfname, &fSpec); + convertSpecToPath(&fSpec, thefname, sizeof(thefname) - 1); +- sprintf(fname,"%s",thefname); ++ gs_sprintf(fname,"%s",thefname); + } else { +- sprintf((char*)&thefname[0],"%s\0",fname); ++ gs_sprintf((char*)&thefname[0],"%s\0",fname); + memmove((char*)&thepfname[1],(char *)&thefname[0],strlen(thefname)); + thepfname[0]=strlen(thefname); + } +@@ -535,9 +535,9 @@ gp_fopen (const char * fname, const char + //(*pgsdll_callback) (GSDLL_STDOUT, thefname, strlen(fname)); + if ( strrchr(fname,':') == NULL ) + // sprintf((char *)&thefname[0],"%s%s\0",g_homeDir,fname); +- sprintf((char *)&thefname[0],"%s%s\0","",fname); ++ gs_sprintf((char *)&thefname[0],"%s%s\0","",fname); + else +- sprintf((char*)&thefname[0],"%s\0",fname); ++ gs_sprintf((char*)&thefname[0],"%s\0",fname); + + fid = fopen(thefname,mode); + +diff -up ghostscript-9.07/base/gp_mswin.c.gs_sprintf ghostscript-9.07/base/gp_mswin.c +--- ghostscript-9.07/base/gp_mswin.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gp_mswin.c 2013-05-09 17:02:39.081447150 +0100 +@@ -316,7 +316,7 @@ get_queues(void) + char buf[256]; + + free(enumbuffer); +- sprintf(buf, "EnumPrinters() failed, error code = %d", GetLastError()); ++ gs_sprintf(buf, "EnumPrinters() failed, error code = %d", GetLastError()); + MessageBox((HWND) NULL, buf, szAppName, MB_OK | MB_ICONSTOP); + return NULL; + } +@@ -423,7 +423,7 @@ gp_printfile_win32(const char *filename, + if (!gp_OpenPrinter(port, &printer)) { + char buf[256]; + +- sprintf(buf, "OpenPrinter() failed for \042%s\042, error code = %d", port, GetLastError()); ++ gs_sprintf(buf, "OpenPrinter() failed for \042%s\042, error code = %d", port, GetLastError()); + MessageBox((HWND) NULL, buf, szAppName, MB_OK | MB_ICONSTOP); + free(buffer); + return FALSE; +@@ -436,7 +436,7 @@ gp_printfile_win32(const char *filename, + if (!StartDocPrinter(printer, 1, (LPBYTE) & di)) { + char buf[256]; + +- sprintf(buf, "StartDocPrinter() failed, error code = %d", GetLastError()); ++ gs_sprintf(buf, "StartDocPrinter() failed, error code = %d", GetLastError()); + MessageBox((HWND) NULL, buf, szAppName, MB_OK | MB_ICONSTOP); + AbortPrinter(printer); + free(buffer); +@@ -457,7 +457,7 @@ gp_printfile_win32(const char *filename, + if (!EndDocPrinter(printer)) { + char buf[256]; + +- sprintf(buf, "EndDocPrinter() failed, error code = %d", GetLastError()); ++ gs_sprintf(buf, "EndDocPrinter() failed, error code = %d", GetLastError()); + MessageBox((HWND) NULL, buf, szAppName, MB_OK | MB_ICONSTOP); + AbortPrinter(printer); + return FALSE; +@@ -465,7 +465,7 @@ gp_printfile_win32(const char *filename, + if (!ClosePrinter(printer)) { + char buf[256]; + +- sprintf(buf, "ClosePrinter() failed, error code = %d", GetLastError()); ++ gs_sprintf(buf, "ClosePrinter() failed, error code = %d", GetLastError()); + MessageBox((HWND) NULL, buf, szAppName, MB_OK | MB_ICONSTOP); + return FALSE; + } +diff -up ghostscript-9.07/base/gp_wgetv.c.gs_sprintf ghostscript-9.07/base/gp_wgetv.c +--- ghostscript-9.07/base/gp_wgetv.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gp_wgetv.c 2013-05-09 17:02:39.081447150 +0100 +@@ -181,9 +181,9 @@ gp_getenv(const char *name, char *ptr, i + char key[256]; + char dotversion[16]; + +- sprintf(dotversion, "%d.%02d", (int)(gs_revision / 100), ++ gs_sprintf(dotversion, "%d.%02d", (int)(gs_revision / 100), + (int)(gs_revision % 100)); +- sprintf(key, "Software\\%s\\%s", gs_productfamily, dotversion); ++ gs_sprintf(key, "Software\\%s\\%s", gs_productfamily, dotversion); + #else + wchar_t key[256]; + wchar_t dotversion[16]; +@@ -224,7 +224,7 @@ gp_serialnumber(void) + #ifdef WINDOWS_NO_UNICODE + char key[256]; + +- sprintf(key, "Software\\Microsoft\\MSLicensing\\HardwareID"); ++ gs_sprintf(key, "Software\\Microsoft\\MSLicensing\\HardwareID"); + #else /* WINDOWS_NO_UNICODE */ + wchar_t key[256]; + +diff -up ghostscript-9.07/base/gsalloc.c.gs_sprintf ghostscript-9.07/base/gsalloc.c +--- ghostscript-9.07/base/gsalloc.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gsalloc.c 2013-05-09 17:02:39.081447150 +0100 +@@ -2045,7 +2045,7 @@ debug_dump_contents(const gs_memory_t *m + } + continue; + } +- sprintf(label, "0x%lx:", (ulong) block); ++ gs_sprintf(label, "0x%lx:", (ulong) block); + debug_indent(mem, indent); + dmputs(mem, label); + for (i = 0; i < block_size; ++i) { +diff -up ghostscript-9.07/base/gsdevice.c.gs_sprintf ghostscript-9.07/base/gsdevice.c +--- ghostscript-9.07/base/gsdevice.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gsdevice.c 2013-05-09 17:02:39.082447154 +0100 +@@ -1011,11 +1011,11 @@ gx_device_open_output_file(const gx_devi + while (*fmt != 'l' && *fmt != '%') + --fmt; + if (*fmt == 'l') +- sprintf(pfname, parsed.fname, count1); ++ gs_sprintf(pfname, parsed.fname, count1); + else +- sprintf(pfname, parsed.fname, (int)count1); ++ gs_sprintf(pfname, parsed.fname, (int)count1); + } else if (parsed.len && strchr(parsed.fname, '%')) /* filename with "%%" but no "%nnd" */ +- sprintf(pfname, parsed.fname); ++ gs_sprintf(pfname, parsed.fname); + else + pfname[0] = 0; /* 0 to use "fname", not "pfname" */ + if (pfname[0]) { +diff -up ghostscript-9.07/base/gsdparam.c.gs_sprintf ghostscript-9.07/base/gsdparam.c +--- ghostscript-9.07/base/gsdparam.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gsdparam.c 2013-05-09 17:02:39.082447154 +0100 +@@ -377,7 +377,7 @@ gdev_write_input_media(int index, gs_par + int code; + gs_param_string as; + +- sprintf(key, "%d", index); ++ gs_sprintf(key, "%d", index); + mdict.size = 4; + code = param_begin_write_dict(pdict->list, key, &mdict, false); + if (code < 0) +@@ -465,7 +465,7 @@ gdev_write_output_media(int index, gs_pa + gs_param_dict mdict; + int code; + +- sprintf(key, "%d", index); ++ gs_sprintf(key, "%d", index); + mdict.size = 4; + code = param_begin_write_dict(pdict->list, key, &mdict, false); + if (code < 0) +diff -up ghostscript-9.07/base/gsfcmap.c.gs_sprintf ghostscript-9.07/base/gsfcmap.c +--- ghostscript-9.07/base/gsfcmap.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gsfcmap.c 2013-05-09 17:02:39.082447154 +0100 +@@ -567,7 +567,7 @@ gs_cmap_ToUnicode_alloc(gs_memory_t *mem + char sid[10], *pref = "aux-"; + int sid_len, pref_len = strlen(pref); + +- sprintf(sid, "%d", id); ++ gs_sprintf(sid, "%d", id); + sid_len = strlen(sid); + name_len = pref_len + sid_len; + cmap_name = gs_alloc_string(mem, name_len, "gs_cmap_ToUnicode_alloc"); +diff -up ghostscript-9.07/base/gsicc_create.c.gs_sprintf ghostscript-9.07/base/gsicc_create.c +--- ghostscript-9.07/base/gsicc_create.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gsicc_create.c 2013-05-09 17:02:39.083447158 +0100 +@@ -451,7 +451,7 @@ save_profile(unsigned char *buffer, char + char full_file_name[50]; + FILE *fid; + +- sprintf(full_file_name,"%d)Profile_%s.icc",icc_debug_index,filename); ++ gs_sprintf(full_file_name,"%d)Profile_%s.icc",icc_debug_index,filename); + fid = fopen(full_file_name,"wb"); + fwrite(buffer,sizeof(unsigned char),buffer_size,fid); + fclose(fid); +diff -up ghostscript-9.07/base/gsicc_manage.c.gs_sprintf ghostscript-9.07/base/gsicc_manage.c +--- ghostscript-9.07/base/gsicc_manage.c.gs_sprintf 2013-05-09 17:02:39.043446986 +0100 ++++ ghostscript-9.07/base/gsicc_manage.c 2013-05-09 17:02:39.083447158 +0100 +@@ -550,8 +550,8 @@ gsicc_set_srcgtag_struct(gsicc_manager_t + srcgtag = gsicc_new_srcgtag_profile(mem); + /* Now parse through the data opening the profiles that are needed */ + /* First create the format that we should read for the key */ +- sprintf(str_format_key, "%%%ds", GSICC_SRCGTAG_MAX_KEY); +- sprintf(str_format_file, "%%%ds", FILENAME_MAX); ++ gs_sprintf(str_format_key, "%%%ds", GSICC_SRCGTAG_MAX_KEY); ++ gs_sprintf(str_format_file, "%%%ds", FILENAME_MAX); + curr_ptr = buffer_ptr; + /* Initialize that we want color management. Then if profile is not + present we know we did not want anything special done with that +@@ -1296,13 +1296,13 @@ gsicc_set_device_profile_colorants(gx_de + DEFAULT_ICC_PROCESS_LENGTH - 1; /* -1 due to no comma at end */ + name_str = (char*) gs_alloc_bytes(dev->memory, total_len+1, + "gsicc_set_device_profile_colorants"); +- sprintf(name_str, DEFAULT_ICC_PROCESS); ++ gs_sprintf(name_str, DEFAULT_ICC_PROCESS); + for (kk = 0; kk < num_comps-5; kk++) { +- sprintf(temp_str,"ICC_COLOR_%d,",kk); ++ gs_sprintf(temp_str,"ICC_COLOR_%d,",kk); + strcat(name_str,temp_str); + } + /* Last one no comma */ +- sprintf(temp_str,"ICC_COLOR_%d",kk); ++ gs_sprintf(temp_str,"ICC_COLOR_%d",kk); + strcat(name_str,temp_str); + } + str_len = strlen(name_str); +@@ -2344,7 +2344,7 @@ dump_icc_buffer(int buffersize, char fil + char full_file_name[50]; + FILE *fid; + +- sprintf(full_file_name,"%d)%s_debug.icc",global_icc_index,filename); ++ gs_sprintf(full_file_name,"%d)%s_debug.icc",global_icc_index,filename); + fid = fopen(full_file_name,"wb"); + fwrite(Buffer,sizeof(unsigned char),buffersize,fid); + fclose(fid); +diff -up ghostscript-9.07/base/gsiodisk.c.gs_sprintf ghostscript-9.07/base/gsiodisk.c +--- ghostscript-9.07/base/gsiodisk.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gsiodisk.c 2013-05-09 17:02:39.084447162 +0100 +@@ -415,7 +415,7 @@ MapFileOpen(const char * rootpath, const + + if (strlen(rootpath) + strlen(filename) >= BUFFER_LENGTH) + return NULL; +- sprintf(fullname, "%s%s", rootpath, filename); ++ gs_sprintf(fullname, "%s%s", rootpath, filename); + return gp_fopen(fullname, attributes); + } + +@@ -516,7 +516,7 @@ MapFileUnlink(const char * rootpath, con + + if (strlen(rootpath) + strlen(filename) >= BUFFER_LENGTH) + return; +- sprintf(fullname, "%s%s", rootpath, filename); ++ gs_sprintf(fullname, "%s%s", rootpath, filename); + unlink(fullname); + } + +@@ -537,8 +537,8 @@ MapFileRename(const char * rootpath, con + return; + if (strlen(rootpath) + strlen(newfilename) >= BUFFER_LENGTH) + return; +- sprintf(oldfullname, "%s%s", rootpath, oldfilename); +- sprintf(newfullname, "%s%s", rootpath, newfilename); ++ gs_sprintf(oldfullname, "%s%s", rootpath, oldfilename); ++ gs_sprintf(newfullname, "%s%s", rootpath, newfilename); + rename(oldfullname, newfullname); + } + +@@ -711,7 +711,7 @@ map_file_name_get(const char * root_name + if (d != -1) { + /* 20 characters are enough for even a 64 bit integer */ + if ((strlen(root_name) + 20) < BUFFER_LENGTH) { +- sprintf(osname, "%s%d", root_name, d); ++ gs_sprintf(osname, "%s%d", root_name, d); + return true; + } + } +diff -up ghostscript-9.07/base/gs.mak.gs_sprintf ghostscript-9.07/base/gs.mak +--- ghostscript-9.07/base/gs.mak.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gs.mak 2013-05-09 17:02:39.084447162 +0100 +@@ -239,6 +239,8 @@ LCUPSGENDIR=$(GLGENDIR) + LCUPSOBJDIR=$(GLOBJDIR) + LCUPSIGENDIR=$(GLGENDIR) + LCUPSIOBJDIR=$(GLOBJDIR) ++ ++TRIOOBJDIR=$(GLOBJDIR) + #**************** END PATCHES + + GSGEN=$(GLGENDIR)$(D) +diff -up ghostscript-9.07/base/gspmdrv.c.gs_sprintf ghostscript-9.07/base/gspmdrv.c +--- ghostscript-9.07/base/gspmdrv.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gspmdrv.c 2013-05-09 17:02:39.084447162 +0100 +@@ -345,11 +345,11 @@ write_profile(void) + { + char profile[64]; + +- sprintf(profile, "%d %d", option.img_origin.x, option.img_origin.y); ++ gs_sprintf(profile, "%d %d", option.img_origin.x, option.img_origin.y); + PrfWriteProfileString(HINI_USERPROFILE, section, "Origin", profile); +- sprintf(profile, "%d %d", option.img_size.x, option.img_size.y); ++ gs_sprintf(profile, "%d %d", option.img_size.x, option.img_size.y); + PrfWriteProfileString(HINI_USERPROFILE, section, "Size", profile); +- sprintf(profile, "%d", option.img_max); ++ gs_sprintf(profile, "%d", option.img_max); + PrfWriteProfileString(HINI_USERPROFILE, section, "Maximized", profile); + } + +@@ -489,26 +489,26 @@ init_display(int argc, char *argv[]) + find_hwnd_gs(argv[2]); + + if (!rc) { +- sprintf(name, SHARED_NAME, argv[2]); ++ gs_sprintf(name, SHARED_NAME, argv[2]); + rc = DosGetNamedSharedMem((PVOID *) & bitmap.pbmi, name, PAG_READ | PAG_WRITE); + if (rc) { +- sprintf(buf, "Failed to open: bmp shared memory \"%s\" rc = %d", argv[0], rc); ++ gs_sprintf(buf, "Failed to open: bmp shared memory \"%s\" rc = %d", argv[0], rc); + error_message(buf); + } + } + if (!rc) { +- sprintf(name, SYNC_NAME, argv[2]); ++ gs_sprintf(name, SYNC_NAME, argv[2]); + rc = DosOpenEventSem(name, &update_event_sem); + if (rc) { +- sprintf(buf, "Failed to open: update event semaphore \"%s\" rc = %d", argv[1], rc); ++ gs_sprintf(buf, "Failed to open: update event semaphore \"%s\" rc = %d", argv[1], rc); + error_message(buf); + } + } + if (!rc) { +- sprintf(name, MUTEX_NAME, argv[2]); ++ gs_sprintf(name, MUTEX_NAME, argv[2]); + rc = DosOpenMutexSem(name, &bmp_mutex_sem); + if (rc) { +- sprintf(buf, "Failed to open: bmp mutex semaphore \"%s\" rc = %d", argv[1], rc); ++ gs_sprintf(buf, "Failed to open: bmp mutex semaphore \"%s\" rc = %d", argv[1], rc); + error_message(buf); + } + } +@@ -535,19 +535,19 @@ init_bitmap(int argc, char *argv[]) + if ((rc = DosOpen(argv[2], &hf, &action, 0, FILE_NORMAL, FILE_OPEN, + OPEN_ACCESS_READONLY | OPEN_SHARE_DENYREADWRITE, 0)) + != (APIRET) 0) { +- sprintf(buf, "Error opening: %s", argv[2]); ++ gs_sprintf(buf, "Error opening: %s", argv[2]); + error_message(buf); + return rc; + } + rc = DosSetFilePtr(hf, 0, FILE_END, &length); + if (rc) { +- sprintf(buf, "failed seeking to EOF: error = %d", rc); ++ gs_sprintf(buf, "failed seeking to EOF: error = %d", rc); + error_message(buf); + return rc; + } + rc = DosSetFilePtr(hf, 0, FILE_BEGIN, &count); + if (rc) { +- sprintf(buf, "failed seeking to BOF: error = %d", rc); ++ gs_sprintf(buf, "failed seeking to BOF: error = %d", rc); + error_message(buf); + return rc; + }; +@@ -555,14 +555,14 @@ init_bitmap(int argc, char *argv[]) + /* allocate memory for bitmap */ + if ((rc = DosAllocMem((PPVOID) & bbuffer, length, PAG_READ | PAG_WRITE | PAG_COMMIT)) + != (APIRET) 0) { +- sprintf(buf, "failed allocating memory"); ++ gs_sprintf(buf, "failed allocating memory"); + error_message(buf); + return rc; + } + rc = DosRead(hf, bbuffer, length, &count); + DosClose(hf); + if (rc) { +- sprintf(buf, "failed reading bitmap, error = %u, count = %u", rc, count); ++ gs_sprintf(buf, "failed reading bitmap, error = %u, count = %u", rc, count); + error_message(buf); + return rc; + } +@@ -573,7 +573,7 @@ init_bitmap(int argc, char *argv[]) + scan_bitmap(&bitmap); + bitmap.valid = TRUE; + +- sprintf(buf, "bitmap width = %d, height = %d", bitmap.width, bitmap.height); ++ gs_sprintf(buf, "bitmap width = %d, height = %d", bitmap.width, bitmap.height); + message_box(buf, 0); + return rc; + } +@@ -805,7 +805,7 @@ make_bitmap(BMAP * pbm, ULONG left, ULON + char buf[256]; + + eid = WinGetLastError(hab); +- sprintf(buf, "make_bitmap: GpiDrawBits rc = %08x, eid = %08x", rc, eid); ++ gs_sprintf(buf, "make_bitmap: GpiDrawBits rc = %08x, eid = %08x", rc, eid); + message_box(buf, 0); + } + } +diff -up ghostscript-9.07/base/gssprintf.c.gs_sprintf ghostscript-9.07/base/gssprintf.c +--- ghostscript-9.07/base/gssprintf.c.gs_sprintf 2013-05-09 17:02:39.085447167 +0100 ++++ ghostscript-9.07/base/gssprintf.c 2013-05-09 17:02:39.084447162 +0100 +@@ -0,0 +1,60 @@ ++/* Copyright (C) 2001-2012 Artifex Software, Inc. ++ All Rights Reserved. ++ ++ This software is provided AS-IS with no warranty, either express or ++ implied. ++ ++ This software is distributed under license and may not be copied, ++ modified or distributed except as expressly authorized under the terms ++ of the license contained in the file LICENSE in this distribution. ++ ++ Refer to licensing information at http://www.artifex.com or contact ++ Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, ++ CA 94903, U.S.A., +1(415)492-9861, for further information. ++*/ ++ ++ ++/* Simple interface to a sprintf/sscanf without locale */ ++#include "gssprintf.h" ++#include "trio.h" ++#include "triop.h" ++#include "triodef.h" ++#include "trionan.h" ++#include "triostr.h" ++ ++int ++gs_vsnprintf(char *buf, int n, const char *format, va_list ap) ++{ ++ return(trio_vsnprintf(buf, n, format, ap)); ++} ++ ++int ++gs_snprintf(char *buf, int n, const char *format, ...) ++{ ++ int len; ++ va_list ap; ++ ++ va_start(ap, format); ++ len = trio_vsnprintf(buf, n, format, ap); ++ va_end(ap); ++ return len; ++} ++ ++int ++gs_vsprintf(char *buf, const char *format, va_list ap) ++{ ++ return(trio_vsprintf(buf, format, ap)); ++} ++ ++int ++gs_sprintf(char *buf, const char *format, ...) ++{ ++ int len; ++ va_list ap; ++ ++ va_start(ap, format); ++ len = trio_vsprintf(buf, format, ap); ++ va_end(ap); ++ ++ return(len); ++} +diff -up ghostscript-9.07/base/gssprintf.h.gs_sprintf ghostscript-9.07/base/gssprintf.h +--- ghostscript-9.07/base/gssprintf.h.gs_sprintf 2013-05-09 17:02:39.085447167 +0100 ++++ ghostscript-9.07/base/gssprintf.h 2013-05-09 17:02:39.085447167 +0100 +@@ -0,0 +1,33 @@ ++/* Copyright (C) 2001-2012 Artifex Software, Inc. ++ All Rights Reserved. ++ ++ This software is provided AS-IS with no warranty, either express or ++ implied. ++ ++ This software is distributed under license and may not be copied, ++ modified or distributed except as expressly authorized under the terms ++ of the license contained in the file LICENSE in this distribution. ++ ++ Refer to licensing information at http://www.artifex.com or contact ++ Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, ++ CA 94903, U.S.A., +1(415)492-9861, for further information. ++*/ ++ ++#ifndef gssprintf_INCLUDED ++# define gssprintf_INCLUDED ++ ++#include ++ ++int ++gs_vsnprintf(char *zBuf, int n, const char *zFormat, va_list ap); ++ ++int ++gs_snprintf(char *zBuf, int n, const char *zFormat, ...); ++ ++int ++gs_vsprintf(char *zBuf, const char *zFormat, va_list ap); ++ ++int ++gs_sprintf(char *zBuf, const char *zFormat, ...); ++ ++#endif +diff -up ghostscript-9.07/base/gxblend1.c.gs_sprintf ghostscript-9.07/base/gxblend1.c +--- ghostscript-9.07/base/gxblend1.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gxblend1.c 2013-05-09 17:02:39.085447167 +0100 +@@ -643,7 +643,7 @@ dump_planar_rgba(gs_memory_t *mem, const + info_ptr->color_type = PNG_COLOR_TYPE_RGB_ALPHA; + + /* add comment */ +- sprintf(software_text, "%s %d.%02d", gs_product, ++ gs_sprintf(software_text, "%s %d.%02d", gs_product, + (int)(gs_revision / 100), (int)(gs_revision % 100)); + text_png.compression = -1; /* uncompressed */ + text_png.key = (char *)software_key; /* not const, unfortunately */ +diff -up ghostscript-9.07/base/gxblend.c.gs_sprintf ghostscript-9.07/base/gxblend.c +--- ghostscript-9.07/base/gxblend.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gxblend.c 2013-05-09 17:02:39.085447167 +0100 +@@ -1573,7 +1573,7 @@ dump_raw_buffer(int num_rows, int width, + /* FIXME: GRAY + ALPHA + SHAPE + TAGS will be interpreted as RGB + ALPHA */ + if ((n_chan == 2) || (n_chan == 3)) { + int x; +- sprintf(full_file_name,"%02d)%s.pam",global_index,filename); ++ gs_sprintf(full_file_name,"%02d)%s.pam",global_index,filename); + fid = fopen(full_file_name,"wb"); + fprintf(fid, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE GRAYSCALE_ALPHA\nENDHDR\n", + width, num_rows); +@@ -1583,7 +1583,7 @@ dump_raw_buffer(int num_rows, int width, + fputc(Buffer[z*plane_stride + y*rowstride + x], fid); + fclose(fid); + if (n_chan == 3) { +- sprintf(full_file_name,"%02d)%s_shape.pam",global_index,filename); ++ gs_sprintf(full_file_name,"%02d)%s_shape.pam",global_index,filename); + fid = fopen(full_file_name,"wb"); + fprintf(fid, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 1\nMAXVAL 255\nTUPLTYPE GRAYSCALE\nENDHDR\n", + width, num_rows); +@@ -1595,7 +1595,7 @@ dump_raw_buffer(int num_rows, int width, + } + if ((n_chan == 4) || (n_chan == 5) || (n_chan == 6)) { + int x; +- sprintf(full_file_name,"%02d)%s.pam",global_index,filename); ++ gs_sprintf(full_file_name,"%02d)%s.pam",global_index,filename); + fid = fopen(full_file_name,"wb"); + fprintf(fid, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 4\nMAXVAL 255\nTUPLTYPE RGB_ALPHA\nENDHDR\n", + width, num_rows); +@@ -1605,7 +1605,7 @@ dump_raw_buffer(int num_rows, int width, + fputc(Buffer[z*plane_stride + y*rowstride + x], fid); + fclose(fid); + if (n_chan > 4) { +- sprintf(full_file_name,"%02d)%s_shape.pam",global_index,filename); ++ gs_sprintf(full_file_name,"%02d)%s_shape.pam",global_index,filename); + fid = fopen(full_file_name,"wb"); + fprintf(fid, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 1\nMAXVAL 255\nTUPLTYPE GRAYSCALE\nENDHDR\n", + width, num_rows); +@@ -1615,7 +1615,7 @@ dump_raw_buffer(int num_rows, int width, + fclose(fid); + } + if (n_chan == 6) { +- sprintf(full_file_name,"%02d)%s_tags.pam",global_index,filename); ++ gs_sprintf(full_file_name,"%02d)%s_tags.pam",global_index,filename); + fid = fopen(full_file_name,"wb"); + fprintf(fid, "P7\nWIDTH %d\nHEIGHT %d\nDEPTH 1\nMAXVAL 255\nTUPLTYPE GRAYSCALE\nENDHDR\n", + width, num_rows); +@@ -1628,7 +1628,7 @@ dump_raw_buffer(int num_rows, int width, + } + #endif + max_bands = ( n_chan < 57 ? n_chan : 56); /* Photoshop handles at most 56 bands */ +- sprintf(full_file_name,"%02d)%s_%dx%dx%d.raw",global_index,filename,width,num_rows,max_bands); ++ gs_sprintf(full_file_name,"%02d)%s_%dx%dx%d.raw",global_index,filename,width,num_rows,max_bands); + fid = fopen(full_file_name,"wb"); + + for (z = 0; z < max_bands; ++z) { +diff -up ghostscript-9.07/base/gxclmem.c.gs_sprintf ghostscript-9.07/base/gxclmem.c +--- ghostscript-9.07/base/gxclmem.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gxclmem.c 2013-05-09 17:02:39.086447171 +0100 +@@ -401,7 +401,7 @@ memfile_fopen(char fname[gp_file_name_si + + /* Return the address of this memfile as a string for use in future clist_fopen calls */ + fname[0] = 0xff; /* a flag that this is a memfile name */ +- sprintf(fname+1, "%p", f); ++ gs_sprintf(fname+1, "%p", f); + + #ifdef DEBUG + tot_compressed = 0; +diff -up ghostscript-9.07/base/gxhintn.c.gs_sprintf ghostscript-9.07/base/gxhintn.c +--- ghostscript-9.07/base/gxhintn.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gxhintn.c 2013-05-09 17:02:39.086447171 +0100 +@@ -387,7 +387,7 @@ static void t1_hinter__paint_glyph(t1_hi + + for(j = beg_pole; j <= end_pole; j++) { + vd_circle(X(j), Y(j), 3, RGB(0,0,255)); +- sprintf(buf, "%d", j); ++ gs_sprintf(buf, "%d", j); + vd_text(self->pole[j].gx, self->pole[j].gy, buf, RGB(0,0,0)); + if (self->pole[j + 1].type == offcurve) + j+=2; +diff -up ghostscript-9.07/base/gxpath.c.gs_sprintf ghostscript-9.07/base/gxpath.c +--- ghostscript-9.07/base/gxpath.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gxpath.c 2013-05-09 17:02:39.086447171 +0100 +@@ -1035,7 +1035,7 @@ gx_print_segment(const gs_memory_t *mem, + double py = fixed2float(pseg->pt.y); + char out[80]; + +- sprintf(out, "0x%lx<0x%lx,0x%lx>:%u", ++ gs_sprintf(out, "0x%lx<0x%lx,0x%lx>:%u", + (ulong) pseg, (ulong) pseg->prev, (ulong) pseg->next, pseg->notes); + switch (pseg->type) { + case s_start:{ +diff -up ghostscript-9.07/base/gxpcmap.c.gs_sprintf ghostscript-9.07/base/gxpcmap.c +--- ghostscript-9.07/base/gxpcmap.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/gxpcmap.c 2013-05-09 17:02:39.087447175 +0100 +@@ -1147,10 +1147,10 @@ dump_raw_pattern(int height, int width, + is_planar = dev_proc(mdev, dev_spec_op)(mdev, gxdso_is_native_planar, NULL, 0) > 0; + max_bands = ( n_chan < 57 ? n_chan : 56); /* Photoshop handles at most 56 bands */ + if (is_planar) { +- sprintf(full_file_name,"%d)PATTERN_PLANE_%dx%dx%d.raw",global_pat_index, ++ gs_sprintf(full_file_name,"%d)PATTERN_PLANE_%dx%dx%d.raw",global_pat_index, + width,height,max_bands); + } else { +- sprintf(full_file_name,"%d)PATTERN_CHUNK_%dx%dx%d.raw",global_pat_index, ++ gs_sprintf(full_file_name,"%d)PATTERN_CHUNK_%dx%dx%d.raw",global_pat_index, + width,height,max_bands); + } + fid = fopen(full_file_name,"wb"); +diff -up ghostscript-9.07/base/lib.mak.gs_sprintf ghostscript-9.07/base/lib.mak +--- ghostscript-9.07/base/lib.mak.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/lib.mak 2013-05-09 17:02:39.088447180 +0100 +@@ -98,6 +98,9 @@ std_h=$(GLSRC)std.h $(arch_h) $(stdpre_h + + vmsmath_h=$(GLSRC)vmsmath.h + ++# declare here for use by string__h ++gssprintf_h=$(GLSRC)gssprintf.h ++ + dos__h=$(GLSRC)dos_.h + ctype__h=$(GLSRC)ctype_.h $(std_h) + dirent__h=$(GLSRC)dirent_.h $(std_h) $(gconfig__h) +@@ -110,7 +113,7 @@ math__h=$(GLSRC)math_.h $(std_h) $(vmsma + memory__h=$(GLSRC)memory_.h $(std_h) + setjmp__h=$(GLSRC)setjmp_.h + stat__h=$(GLSRC)stat_.h $(std_h) +-stdio__h=$(GLSRC)stdio_.h $(std_h) ++stdio__h=$(GLSRC)stdio_.h $(std_h) $(gssprintf_h) + string__h=$(GLSRC)string_.h $(std_h) + time__h=$(GLSRC)time_.h $(std_h) $(gconfig__h) + unistd__h=$(GLSRC)unistd_.h $(std_h) +@@ -151,6 +154,7 @@ gx_h=$(GLSRC)gx.h $(stdio__h) $(gdebug_h + $(gsio_h) $(gsmemory_h) $(gstypes_h) $(gserrors_h) + gxsync_h=$(GLSRC)gxsync.h $(gpsync_h) $(gsmemory_h) + gxclthrd_h=$(GLSRC)gxclthrd.h $(gxsync_h) ++ + # Out of order + gsmemlok_h=$(GLSRC)gsmemlok.h $(gsmemory_h) $(gxsync_h) + gsnotify_h=$(GLSRC)gsnotify.h $(gsstype_h) +@@ -320,6 +324,10 @@ $(AUX)gsutil.$(OBJ) : $(GLSRC)gsutil.c $ + $(gsrect_h) $(gsuid_h) $(gsutil_h) $(gzstate_h) $(gxdcolor_h) $(MAKEDIRS) + $(GLCCAUX) $(AUXO_)gsutil.$(OBJ) $(C_) $(GLSRC)gsutil.c + ++$(GLOBJ)gssprintf.$(OBJ) : $(GLSRC)gssprintf.c $(gssprintf_h) $(triodef_h) $(trio_h) \ ++$(triop_h) $(triostr_h) $(trionan_h) ++ $(GLCC) $(I_)$(TRIOSRCDIR)$(_I) $(GLO_)gssprintf.$(OBJ) $(C_) $(GLSRC)gssprintf.c ++ + # MD5 digest + md5_h=$(GLSRC)md5.h + # We have to use a slightly different compilation approach in order to +@@ -1309,7 +1317,7 @@ LIB10s=$(GLOBJ)gsmalloc.$(OBJ) $(GLOBJ)m + LIB11s=$(GLOBJ)gsmemory.$(OBJ) $(GLOBJ)gsmemret.$(OBJ) $(GLOBJ)gsmisc.$(OBJ) $(GLOBJ)gsnotify.$(OBJ) $(GLOBJ)gslibctx.$(OBJ) + LIB12s=$(GLOBJ)gspaint.$(OBJ) $(GLOBJ)gsparam.$(OBJ) $(GLOBJ)gspath.$(OBJ) + LIB13s=$(GLOBJ)gsserial.$(OBJ) $(GLOBJ)gsstate.$(OBJ) $(GLOBJ)gstext.$(OBJ)\ +- $(GLOBJ)gsutil.$(OBJ) ++ $(GLOBJ)gsutil.$(OBJ) $(TRIOOBJS) $(GLOBJ)gssprintf.$(OBJ) + LIB1x=$(GLOBJ)gxacpath.$(OBJ) $(GLOBJ)gxbcache.$(OBJ) $(GLOBJ)gxccache.$(OBJ) + LIB2x=$(GLOBJ)gxccman.$(OBJ) $(GLOBJ)gxchar.$(OBJ) $(GLOBJ)gxcht.$(OBJ) + LIB3x=$(GLOBJ)gxclip.$(OBJ) $(GLOBJ)gxcmap.$(OBJ) $(GLOBJ)gxcpath.$(OBJ) +diff -up ghostscript-9.07/base/md5main.c.gs_sprintf ghostscript-9.07/base/md5main.c +--- ghostscript-9.07/base/md5main.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/md5main.c 2013-05-09 17:02:39.088447180 +0100 +@@ -87,7 +87,7 @@ do_test(void) + gs_md5_append(&state, (const gs_md5_byte_t *)test[i], strlen(test[i])); + gs_md5_finish(&state, digest); + for (di = 0; di < 16; ++di) +- sprintf(hex_output + di * 2, "%02x", digest[di]); ++ gs_sprintf(hex_output + di * 2, "%02x", digest[di]); + if (strcmp(hex_output, test[i + 1])) { + printf("MD5 (\"%s\") = ", test[i]); + puts(hex_output); +diff -up ghostscript-9.07/base/mkromfs.c.gs_sprintf ghostscript-9.07/base/mkromfs.c +--- ghostscript-9.07/base/mkromfs.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/mkromfs.c 2013-05-09 17:02:39.088447180 +0100 +@@ -64,6 +64,8 @@ + * + */ + ++/* prevent gp.h redefining sprintf */ ++#define sprintf sprintf + #include "stdpre.h" + #include "stdint_.h" + #include "time_.h" +diff -up ghostscript-9.07/base/sdcparam.c.gs_sprintf ghostscript-9.07/base/sdcparam.c +--- ghostscript-9.07/base/sdcparam.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/sdcparam.c 2013-05-09 17:02:39.088447180 +0100 +@@ -200,7 +200,7 @@ s_DCT_get_quantization_tables(gs_param_l + gs_param_string str; + gs_param_float_array fa; + +- sprintf(key, "%d", i); ++ gs_sprintf(key, "%d", i); + if (QFactor == 1.0) { + code = quant_param_string(&str, DCTSIZE2, + table_ptrs[comp_info[i].quant_tbl_no]->quantval, +@@ -474,7 +474,7 @@ s_DCT_put_quantization_tables(gs_param_l + char istr[5]; /* i converted to string key */ + UINT16 values[DCTSIZE2]; + +- sprintf(istr, "%d", i); ++ gs_sprintf(istr, "%d", i); + code = quant_params(quant_tables.list, istr, DCTSIZE2, values, + pdct->QFactor); + if (code < 0) +@@ -566,7 +566,7 @@ s_DCT_put_huffman_tables(gs_param_list * + UINT8 counts[16], values[256]; + + /* Collect the Huffman parameters. */ +- sprintf(istr, "%d", i); ++ gs_sprintf(istr, "%d", i); + code = s_DCT_byte_params(huff_tables.list, istr, 0, 16, counts); + if (code < 0) + return code; +diff -up ghostscript-9.07/base/sjbig2.c.gs_sprintf ghostscript-9.07/base/sjbig2.c +--- ghostscript-9.07/base/sjbig2.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/sjbig2.c 2013-05-09 17:02:39.089447184 +0100 +@@ -65,7 +65,7 @@ s_jbig2decode_error(void *error_callback + default: type = "unknown message:"; break;; + } + if (seg_idx == -1) segment[0] = '\0'; +- else sprintf(segment, "(segment 0x%02x)", seg_idx); ++ else gs_sprintf(segment, "(segment 0x%02x)", seg_idx); + + if (state) + { +diff -up ghostscript-9.07/base/spprint.c.gs_sprintf ghostscript-9.07/base/spprint.c +--- ghostscript-9.07/base/spprint.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/spprint.c 2013-05-09 17:02:39.089447184 +0100 +@@ -83,7 +83,7 @@ pprintd1(stream * s, const char *format, + if (*fp == 0 || fp[1] != 'd') /* shouldn't happen! */ + lprintf1("Bad format in pprintd1: %s\n", format); + #endif +- sprintf(str, "%d", v); ++ gs_sprintf(str, "%d", v); + pputs_short(s, str); + return pprintf_scan(s, fp + 2); + } +@@ -115,12 +115,12 @@ pprintg1(stream * s, const char *format, + if (*fp == 0 || fp[1] != 'g') /* shouldn't happen! */ + lprintf1("Bad format in pprintg: %s\n", format); + #endif +- sprintf(str, "%f", 1.5); ++ gs_sprintf(str, "%f", 1.5); + dot = str[1]; /* locale-dependent */ +- sprintf(str, "%g", v); ++ gs_sprintf(str, "%g", v); + if (strchr(str, 'e')) { + /* Bad news. Try again using f-format. */ +- sprintf(str, (fabs(v) > 1 ? "%1.1f" : "%1.8f"), v); ++ gs_sprintf(str, (fabs(v) > 1 ? "%1.1f" : "%1.8f"), v); + } + /* Juggling locales isn't thread-safe. Posix me harder. */ + if (dot != '.') { +@@ -165,7 +165,7 @@ pprintld1(stream * s, const char *format + if (*fp == 0 || fp[1] != 'l' || fp[2] != 'd') /* shouldn't happen! */ + lprintf1("Bad format in pprintld: %s\n", format); + #endif +- sprintf(str, "%ld", v); ++ gs_sprintf(str, "%ld", v); + pputs_short(s, str); + return pprintf_scan(s, fp + 3); + } +diff -up ghostscript-9.07/base/trio.mak.gs_sprintf ghostscript-9.07/base/trio.mak +--- ghostscript-9.07/base/trio.mak.gs_sprintf 2013-05-09 17:02:39.089447184 +0100 ++++ ghostscript-9.07/base/trio.mak 2013-05-09 17:02:39.089447184 +0100 +@@ -0,0 +1,57 @@ ++# Copyright (C) 2001-2012 Artifex Software, Inc. ++# All Rights Reserved. ++# ++# This software is provided AS-IS with no warranty, either express or ++# implied. ++# ++# This software is distributed under license and may not be copied, ++# modified or distributed except as expressly authorized under the terms ++# of the license contained in the file LICENSE in this distribution. ++# ++# Refer to licensing information at http://www.artifex.com or contact ++# Artifex Software, Inc., 7 Mt. Lassen Drive - Suite A-134, San Rafael, ++# CA 94903, U.S.A., +1(415)492-9861, for further information. ++# ++# makefile for trio - locale-less s(n)printf/s(n)canf ++# ++# Users of this makefile must define the following: ++# TRIO_CFLAGS - Compiler flags for building the source, ++# TRIOSRCDIR - the expat source top-level directory, ++# TIOOBJDIR - directory for object files. ++ ++# Define the name of this makefile ++TRIO_MAK=$(GLSRCDIR)$(D)trio.mak ++ ++# local aliases ++TRIOSRC=$(TRIOSRCDIR)$(D) ++TRIOOBJ=$(TRIOOBJDIR)$(D) ++TRIOO_=$(O_)$(TRIOOBJ) ++ ++TRIOCFLAGS=$(CFLAGS) $(TRIO_CFLAGS) $(D_)TRIO_EMBED_STRING$(_D) $(D_)TRIO_FEATURE_CLOSURE=0$(_D) \ ++$(D_)TRIO_FEATURE_DYNAMICSTRING=0$(_D) $(D_)TRIO_MINIMAL=0$(_D) \ ++$(D_)TRIO_FEATURE_USER_DEFINED=0$(_D) $(D_)TRIO_EXTENSION=0$(_D)\ ++$(D_)TRIO_FUNC_TO_FLOAT$(_D) $(I_)$(TRIOSRCDIR)$(_I) \ ++$(D_)TRIO_MALLOC=no_malloc$(_D) $(D_)TRIO_REALLOC=no_realloc$(_D) $(D_)TRIO_FREE=no_free$(_D) ++ ++ ++# NB: we can't use the normal $(CC_) here because msvccmd.mak ++# adds /Za which conflicts with the trio source. ++TRIOCC=$(CC) $(TRIOCFLAGS) ++ ++TRIOOBJS=$(TRIOOBJ)triostr.$(OBJ) $(TRIOOBJ)trio.$(OBJ) $(TRIOOBJ)trionan.$(OBJ) ++ ++triodef_h=$(TRIOSRC)triodef.h ++trio_h=$(TRIOSRC)trio.h ++triop_h=$(TRIOSRC)triop.h ++triostr_h=$(TRIOSRC)triostr.h ++ ++TRIOHDRS=$(triodef_h) $(trio_h) $(triop_h) $(triostr_h) ++ ++$(TRIOOBJ)triostr.$(OBJ) : $(TRIOSRC)triostr.c $(TRIOHDRS) $(TRIO_MAK) ++ $(TRIOCC) $(TRIOO_)triostr.$(OBJ) $(C_) $(TRIOSRC)triostr.c ++ ++$(TRIOOBJ)trio.$(OBJ) : $(TRIOSRC)trio.c $(TRIOHDRS) $(TRIO_MAK) ++ $(TRIOCC) $(TRIOO_)trio.$(OBJ) $(C_) $(TRIOSRC)trio.c ++ ++$(TRIOOBJ)trionan.$(OBJ) : $(TRIOSRC)trionan.c $(TRIOHDRS) $(TRIO_MAK) ++ $(TRIOCC) $(TRIOO_)trionan.$(OBJ) $(C_) $(TRIOSRC)trionan.c +diff -up ghostscript-9.07/base/unixansi.mak.gs_sprintf ghostscript-9.07/base/unixansi.mak +--- ghostscript-9.07/base/unixansi.mak.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/unixansi.mak 2013-05-09 17:02:39.089447184 +0100 +@@ -152,6 +152,8 @@ TIFFPLATFORM=unix + TIFFCONFIG_SUFFIX=.unix + LIBTIFF_NAME=tiff + ++TRIOSRCDIR=trio ++ + # Define the directory where the zlib sources are stored. + # See zlib.mak for more information. + +@@ -392,6 +394,7 @@ CC_SHARED=$(CC_) + + include $(GLSRCDIR)/unixhead.mak + include $(GLSRCDIR)/gs.mak ++include $(GLSRCDIR)/trio.mak + # psromfs.mak must precede lib.mak + include $(PSSRCDIR)/psromfs.mak + include $(GLSRCDIR)/lib.mak +diff -up ghostscript-9.07/base/unix-gcc.mak.gs_sprintf ghostscript-9.07/base/unix-gcc.mak +--- ghostscript-9.07/base/unix-gcc.mak.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/unix-gcc.mak 2013-05-09 17:02:39.089447184 +0100 +@@ -165,6 +165,8 @@ TIFFPLATFORM=unix + TIFFCONFIG_SUFFIX=.unix + LIBTIFF_NAME=tiff + ++TRIOSRCDIR=trio ++ + # Define the directory where the zlib sources are stored. + # See zlib.mak for more information. + +@@ -461,6 +463,7 @@ MAKEDIRSTOP=directories + + include $(GLSRCDIR)/unixhead.mak + include $(GLSRCDIR)/gs.mak ++include $(GLSRCDIR)/trio.mak + # psromfs.mak must precede lib.mak + include $(PSSRCDIR)/psromfs.mak + include $(GLSRCDIR)/lib.mak +diff -up ghostscript-9.07/base/winlib.mak.gs_sprintf ghostscript-9.07/base/winlib.mak +--- ghostscript-9.07/base/winlib.mak.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/winlib.mak 2013-05-09 17:02:39.090447188 +0100 +@@ -133,6 +133,7 @@ BEGINFILES=$(GLGENDIR)\ccf32.tr\ + #!include $(COMMONDIR)/pcdefs.mak + #!include $(COMMONDIR)/generic.mak + !include $(GLSRCDIR)\gs.mak ++!include $(GLSRCDIR)\trio.mak + !include $(GLSRCDIR)\lib.mak + !include $(GLSRCDIR)\freetype.mak + !if "$(UFST_BRIDGE)"=="1" +diff -up ghostscript-9.07/base/wrfont.c.gs_sprintf ghostscript-9.07/base/wrfont.c +--- ghostscript-9.07/base/wrfont.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/wrfont.c 2013-05-09 17:02:39.090447188 +0100 +@@ -72,7 +72,7 @@ WRF_wfloat(WRF_output * a_output, double + { + char buffer[32]; + +- sprintf(buffer, "%f", a_float); ++ gs_sprintf(buffer, "%f", a_float); + WRF_wstring(a_output, buffer); + } + +@@ -81,6 +81,6 @@ WRF_wint(WRF_output * a_output, long a_i + { + char buffer[32]; + +- sprintf(buffer, "%ld", a_int); ++ gs_sprintf(buffer, "%ld", a_int); + WRF_wstring(a_output, buffer); + } +diff -up ghostscript-9.07/base/write_t1.c.gs_sprintf ghostscript-9.07/base/write_t1.c +--- ghostscript-9.07/base/write_t1.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/write_t1.c 2013-05-09 17:02:39.090447188 +0100 +@@ -300,7 +300,7 @@ write_main_dictionary(gs_fapi_font * a_f + if (x) + entries++; + +- sprintf(Buffer, "/FontInfo %d dict dup begin\n", entries); ++ gs_sprintf(Buffer, "/FontInfo %d dict dup begin\n", entries); + WRF_wstring(a_output, Buffer); + x = a_fapi_font->get_word(a_fapi_font, + gs_fapi_font_feature_BlendAxisTypes_count, +@@ -330,7 +330,7 @@ write_main_dictionary(gs_fapi_font * a_f + x1 = a_fapi_font->get_float(a_fapi_font, + gs_fapi_font_feature_BlendDesignPositionsArrayValue, + i * 8 + j); +- sprintf(Buffer, "%f ", x1); ++ gs_sprintf(Buffer, "%f ", x1); + WRF_wstring(a_output, Buffer); + } + WRF_wstring(a_output, "]"); +@@ -352,12 +352,12 @@ write_main_dictionary(gs_fapi_font * a_f + x1 = a_fapi_font->get_float(a_fapi_font, + gs_fapi_font_feature_BlendDesignPositionsArrayValue, + i * 64 + j * 64); +- sprintf(Buffer, "%f ", x1); ++ gs_sprintf(Buffer, "%f ", x1); + WRF_wstring(a_output, Buffer); + x1 = a_fapi_font->get_float(a_fapi_font, + gs_fapi_font_feature_BlendDesignPositionsArrayValue, + i * 64 + j * 64 + 1); +- sprintf(Buffer, "%f ", x1); ++ gs_sprintf(Buffer, "%f ", x1); + WRF_wstring(a_output, Buffer); + WRF_wstring(a_output, "]"); + } +@@ -397,7 +397,7 @@ write_main_dictionary(gs_fapi_font * a_f + for (i = 0; i < x; i++) { + x1 = a_fapi_font->get_float(a_fapi_font, + gs_fapi_font_feature_WeightVector, i); +- sprintf(Buffer, "%f ", x1); ++ gs_sprintf(Buffer, "%f ", x1); + WRF_wstring(a_output, Buffer); + } + WRF_wstring(a_output, "] def\n"); +diff -up ghostscript-9.07/base/write_t2.c.gs_sprintf ghostscript-9.07/base/write_t2.c +--- ghostscript-9.07/base/write_t2.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/base/write_t2.c 2013-05-09 17:02:39.090447188 +0100 +@@ -70,7 +70,7 @@ write_type2_float(WRF_output * a_output, + int high = true; + char c = 0; + +- sprintf(buffer, "%f", a_float); ++ gs_sprintf(buffer, "%f", a_float); + WRF_wbyte(a_output, 30); + for (;;) { + char n = 0; +diff -up ghostscript-9.07/contrib/eplaser/gdevescv.c.gs_sprintf ghostscript-9.07/contrib/eplaser/gdevescv.c +--- ghostscript-9.07/contrib/eplaser/gdevescv.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/eplaser/gdevescv.c 2013-05-09 17:02:39.091447193 +0100 +@@ -545,7 +545,7 @@ escv_vector_dopath(gx_device_vector * vd + y = fixed2float(vs[1]) / scale.y; + + /* ¥µ¥Ö¥Ñ¥¹³«»ÏÌ¿Îá p1 */ +- (void)sprintf(obuf, ESC_GS "0;%d;%dmvpG", (int)x, (int)y); ++ (void)gs_sprintf(obuf, ESC_GS "0;%d;%dmvpG", (int)x, (int)y); + lputs(s, obuf); + + if (first) +@@ -556,11 +556,11 @@ escv_vector_dopath(gx_device_vector * vd + cnt = 1; + for (pseg = cenum.pseg; pseg != 0 && pseg->type == s_line; cnt++, pseg = pseg->next); + +- (void)sprintf(obuf, ESC_GS "0;%d", cnt); ++ (void)gs_sprintf(obuf, ESC_GS "0;%d", cnt); + lputs(s, obuf); + + do { +- (void)sprintf(obuf, ";%d;%d", ++ (void)gs_sprintf(obuf, ";%d;%d", + (int)(fixed2float(vs[0]) / scale.x), + (int)(fixed2float(vs[1]) / scale.y)); + lputs(s, obuf); +@@ -577,11 +577,11 @@ escv_vector_dopath(gx_device_vector * vd + case gs_pe_curveto: + cnt = 1; + for (pseg = cenum.pseg; pseg != 0 && pseg->type == s_curve; cnt++, pseg = pseg->next); +- (void)sprintf(obuf, ESC_GS "0;%d", cnt * 3); ++ (void)gs_sprintf(obuf, ESC_GS "0;%d", cnt * 3); + lputs(s, obuf); + + do { +- (void)sprintf(obuf, ";%d;%d;%d;%d;%d;%d", ++ (void)gs_sprintf(obuf, ";%d;%d;%d;%d;%d;%d", + (int)(fixed2float(vs[0]) / scale.x), (int)(fixed2float(vs[1]) / scale.y), + (int)(fixed2float(vs[2]) / scale.x), (int)(fixed2float(vs[3]) / scale.y), + (int)(fixed2float(vs[4]) / scale.x), (int)(fixed2float(vs[5]) / scale.y)); +@@ -637,7 +637,7 @@ escv_vector_dorect(gx_device_vector * vd + + scale = vdev->scale; + +- (void)sprintf(obuf, ESC_GS "0;%d;%d;%d;%d;0;0rrpG", ++ (void)gs_sprintf(obuf, ESC_GS "0;%d;%d;%d;%d;0;0rrpG", + (int)(fixed2float(x0) / scale.x), + (int)(fixed2float(y0) / scale.y), + (int)(fixed2float(x1) / scale.x), +@@ -1116,7 +1116,7 @@ escv_beginpage(gx_device_vector * vdev) + lputs(s, " PU=15"); + } + } else if (pdev->cassetFeed) { +- (void)sprintf(ebuf, " PU=%d", pdev->cassetFeed); ++ (void)gs_sprintf(ebuf, " PU=%d", pdev->cassetFeed); + lputs(s, ebuf); + } else { + lputs(s, " PU=AU"); +@@ -1146,14 +1146,14 @@ escv_beginpage(gx_device_vector * vdev) + + /* lp8000c not have QT */ + if (strcmp(pdev->dname, "lp8000c") == 0) { +- (void)sprintf(ebuf, " QT=1 CO=%d", pdev->NumCopies); ++ (void)gs_sprintf(ebuf, " QT=1 CO=%d", pdev->NumCopies); + } else { + if (pdev->Collate) { + /* CO is 1, when set QT */ +- (void)sprintf(ebuf, " QT=%d CO=1", pdev->NumCopies); ++ (void)gs_sprintf(ebuf, " QT=%d CO=1", pdev->NumCopies); + } else { + /* QT is 1, when not specified QT */ +- (void)sprintf(ebuf, " QT=1 CO=%d", pdev->NumCopies); ++ (void)gs_sprintf(ebuf, " QT=1 CO=%d", pdev->NumCopies); + } + } + lputs(s, ebuf); +@@ -1162,7 +1162,7 @@ escv_beginpage(gx_device_vector * vdev) + } + + if (pdev->toner_density) { +- (void)sprintf(ebuf, " DL=%d", pdev->toner_density); ++ (void)gs_sprintf(ebuf, " DL=%d", pdev->toner_density); + lputs(s, ebuf); + } + +@@ -1320,7 +1320,7 @@ escv_setlinewidth(gx_device_vector * vde + /* ESC/Page ¤Ç¤ÏÀþÉý¡¿½ªÃ¼¡¿ÀܹçÉô¤ÎÀßÄê¤Ï£±¤Ä¤Î¥³¥Þ¥ó¥É¤Ë¤Ê¤Ã¤Æ¤¤¤ë¤¿¤áÊÝ»ý¤·¤Æ¤ª¤¯¡£ */ + pdev -> lwidth = width; + +- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG", ++ (void)gs_sprintf(obuf, ESC_GS "%d;%d;%dlwG", + (int)(pdev -> lwidth), + (int)(pdev -> cap), + (int)(pdev -> join)); +@@ -1341,7 +1341,7 @@ escv_setlinecap(gx_device_vector * vdev, + + if (pdev -> cap >= 3) return -1; + +- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG", ++ (void)gs_sprintf(obuf, ESC_GS "%d;%d;%dlwG", + (int)(pdev -> lwidth), + (int)(pdev -> cap), + (int)(pdev -> join)); +@@ -1372,7 +1372,7 @@ escv_setlinejoin(gx_device_vector * vdev + return -1; + } + +- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG", ++ (void)gs_sprintf(obuf, ESC_GS "%d;%d;%dlwG", + (int)(pdev -> lwidth), + (int)(pdev -> cap), + (int)(pdev -> join)); +@@ -1394,14 +1394,14 @@ escv_setmiterlimit(gx_device_vector * vd + if (pdev -> join != 3) { + /* ¶¯À©Åª¤ËÀܹçÉô»ØÄê¤ò¹Ô¤¦ */ + pdev -> join = 3; +- (void)sprintf(obuf, ESC_GS "%d;%d;%dlwG", ++ (void)gs_sprintf(obuf, ESC_GS "%d;%d;%dlwG", + (int)(pdev -> lwidth), + (int)(pdev -> cap), + (int)(pdev -> join)); + lputs(s, obuf); + } + +- (void)sprintf(obuf, ESC_GS "1;%dmlG", (int)limit); ++ (void)gs_sprintf(obuf, ESC_GS "1;%dmlG", (int)limit); + lputs(s, obuf); + + return 0; +@@ -1433,7 +1433,7 @@ escv_setfillcolor(gx_device_vector * vde + + if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */ + +- (void)sprintf(obuf, /*ESC_GS "1owE"*/ ESC_GS "0;0;100spE" ESC_GS "1;0;%ldccE" ,color); ++ (void)gs_sprintf(obuf, /*ESC_GS "1owE"*/ ESC_GS "0;0;100spE" ESC_GS "1;0;%ldccE" ,color); + lputs(s, obuf); + + if (vdev->x_pixels_per_inch == 1200) { +@@ -1447,7 +1447,7 @@ escv_setfillcolor(gx_device_vector * vde + } else { /* ESC/Page-Color */ + + /* ¥Ñ¥¿¡¼¥ó£Ï£Î»ØÄê¡¿¥½¥ê¥Ã¥É¥Ñ¥¿¡¼¥ó»ØÄê */ +- (void)sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE", ++ (void)gs_sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE", + (unsigned char)(color >> 16 & 0xff), + (unsigned char)(color >> 8 & 0xff), + (unsigned char)(color & 0xff)); +@@ -1477,7 +1477,7 @@ escv_setstrokecolor(gx_device_vector * v + + pdev->current_color = color; + +- (void)sprintf(obuf, /*ESC_GS "1owE"*/ ESC_GS "0;0;100spE" ESC_GS "1;1;%ldccE" , color); ++ (void)gs_sprintf(obuf, /*ESC_GS "1owE"*/ ESC_GS "0;0;100spE" ESC_GS "1;1;%ldccE" , color); + lputs(s, obuf); + + if (vdev->x_pixels_per_inch == 1200) { +@@ -1494,7 +1494,7 @@ escv_setstrokecolor(gx_device_vector * v + + pdev->current_color = color; + /* ¥Ñ¥¿¡¼¥ó£Ï£Î¿§»ØÄê¡¿¥½¥ê¥Ã¥É¥Ñ¥¿¡¼¥ó»ØÄê */ +- (void)sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE" ESC_GS "2;2;1;0;0cpE", ++ (void)gs_sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE" ESC_GS "2;2;1;0;0cpE", + (unsigned char)(color >> 16 & 0xff), + (unsigned char)(color >> 8 & 0xff), + (unsigned char)(color & 0xff)); +@@ -1538,11 +1538,11 @@ escv_setdash(gx_device_vector * vdev, co + if (count) { + if (count == 1) { + #if GS_VERSION_MAJOR == 5 +- (void)sprintf(obuf, ESC_GS "1;%d;%ddlG", ++ (void)gs_sprintf(obuf, ESC_GS "1;%d;%ddlG", + (int)(pattern[0] * scale / vdev->x_pixels_per_inch + 0.5), + (int)(pattern[0] * scale / vdev->x_pixels_per_inch + 0.5)); + #else +- (void)sprintf(obuf, ESC_GS "1;%d;%ddlG", (int) pattern[0], (int) pattern[0]); ++ (void)gs_sprintf(obuf, ESC_GS "1;%d;%ddlG", (int) pattern[0], (int) pattern[0]); + #endif + lputs(s, obuf); + } else { +@@ -1554,10 +1554,10 @@ escv_setdash(gx_device_vector * vdev, co + lputs(s, ESC_GS "1"); + for (i = 0; i < count; ++i) { + #if GS_VERSION_MAJOR == 5 +- (void)sprintf(obuf, ";%d", (int)(pattern[i] * scale / vdev->x_pixels_per_inch + 0.5)); ++ (void)gs_sprintf(obuf, ";%d", (int)(pattern[i] * scale / vdev->x_pixels_per_inch + 0.5)); + + #else +- (void)sprintf(obuf, ";%d", (int) pattern[i]); ++ (void)gs_sprintf(obuf, ";%d", (int) pattern[i]); + #endif + lputs(s, obuf); + } +@@ -1608,7 +1608,7 @@ escv_moveto(gx_device_vector * vdev, + char obuf[64]; + + /* ¥µ¥Ö¥Ñ¥¹³«»ÏÌ¿Îá */ +- (void)sprintf(obuf, ESC_GS "0;%d;%dmvpG", (int)x1, (int)y1); ++ (void)gs_sprintf(obuf, ESC_GS "0;%d;%dmvpG", (int)x1, (int)y1); + lputs(s, obuf); + + return 0; +@@ -1622,7 +1622,7 @@ escv_lineto(gx_device_vector * vdev, + gx_device_escv *pdev = (gx_device_escv *) vdev; + char obuf[64]; + +- (void)sprintf(obuf, ESC_GS "0;1;%d;%dlnpG", (int)x1, (int)y1); ++ (void)gs_sprintf(obuf, ESC_GS "0;1;%d;%dlnpG", (int)x1, (int)y1); + lputs(s, obuf); + pdev->ispath = 1; + +@@ -1639,7 +1639,7 @@ escv_curveto(gx_device_vector * vdev, fl + char obuf[128]; + + /* ¥Ù¥¸¥§¶ÊÀþ */ +- (void)sprintf(obuf, ESC_GS "0;3;%d;%d;%d;%d;%d;%dbzpG", ++ (void)gs_sprintf(obuf, ESC_GS "0;3;%d;%d;%d;%d;%d;%dbzpG", + (int)x1, (int)y1, (int)x2, (int)y2, (int)x3, (int)y3); + lputs(s, obuf); + pdev->ispath = 1; +@@ -2176,7 +2176,7 @@ escv_copy_mono(gx_device * dev, const by + if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */ + + /* lputs(s, ESC_GS "1owE");*/ +- (void)sprintf(obuf, ESC_GS "1;1;%ldccE", c_color); ++ (void)gs_sprintf(obuf, ESC_GS "1;1;%ldccE", c_color); + lputs(s, obuf); + + if (vdev->x_pixels_per_inch == 1200) { +@@ -2263,7 +2263,7 @@ escv_copy_mono(gx_device * dev, const by + } else { /* ESC/Page-Color */ + + /* ¥Ñ¥¿¡¼¥ó£Ï£Î»ØÄê¡¿¥½¥ê¥Ã¥É¥Ñ¥¿¡¼¥ó»ØÄê */ +- (void)sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE", ++ (void)gs_sprintf(obuf, ESC_GS "1;2;3;%d;%d;%dfpE", + (unsigned char)(c_color >> 16 & 0xff), + (unsigned char)(c_color >> 8 & 0xff), + (unsigned char)(c_color & 0xff)); +@@ -2388,7 +2388,7 @@ escv_fill_mask(gx_device * dev, + if (!gx_dc_is_pure(pdcolor)) return_error(gs_error_rangecheck); + pdev->current_color = color; + +- (void)sprintf(obuf, ESC_GS "0;0;100spE" ESC_GS "1;1;%ldccE" ,color); ++ (void)gs_sprintf(obuf, ESC_GS "0;0;100spE" ESC_GS "1;1;%ldccE" ,color); + lputs(s, obuf); + + if (vdev->x_pixels_per_inch == 1200) { +@@ -2428,7 +2428,7 @@ escv_fill_mask(gx_device * dev, + memcpy(buf + i * width_bytes, data + (data_x >> 3) + i * raster, width_bytes); + } + +- (void)sprintf(obuf, ESC_GS "%d;%d;%d;%d;0db{F", num_bytes, (int)(id & VCACHE), w, h); ++ (void)gs_sprintf(obuf, ESC_GS "%d;%d;%d;%d;0db{F", num_bytes, (int)(id & VCACHE), w, h); + lputs(s, obuf); + put_bytes(s, buf, num_bytes); + +@@ -2436,9 +2436,9 @@ escv_fill_mask(gx_device * dev, + pdev -> id_cache[id & VCACHE] = id; + } + +- (void)sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y); ++ (void)gs_sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y); + lputs(s, obuf); +- (void)sprintf(obuf, ESC_GS "%lddbF", id & VCACHE); ++ (void)gs_sprintf(obuf, ESC_GS "%lddbF", id & VCACHE); + lputs(s, obuf); + + return 0; +@@ -2603,7 +2603,7 @@ escv_begin_image(gx_device * dev, + if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */ + + /* lputs(s, ESC_GS "1owE");*/ +- (void)sprintf(obuf, ESC_GS "1;1;%ldccE", color); ++ (void)gs_sprintf(obuf, ESC_GS "1;1;%ldccE", color); + lputs(s, obuf); + + if (vdev->x_pixels_per_inch == 1200) { +@@ -2908,7 +2908,7 @@ static void escv_write_begin(gx_device * + + if( 0 == pdev->colormode ) { /* ESC/Page (Monochrome) */ + +- (void)sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y); ++ (void)gs_sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y); + lputs(s, obuf); + + comp = 10; +@@ -2916,34 +2916,34 @@ static void escv_write_begin(gx_device * + if (bits == 1) { + if (strcmp(pdev->dname, "lp1800") == 0 || + strcmp(pdev->dname, "lp9600") == 0) { +- (void)sprintf(obuf, ESC_GS "0bcI"); ++ (void)gs_sprintf(obuf, ESC_GS "0bcI"); + }else{ +- (void)sprintf(obuf, ESC_GS "5;%d;%d;%d;%d;%dsrI", sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "5;%d;%d;%d;%d;%dsrI", sw, sh, dw, dh, roll); + } + } else if (bits == 4) { + if (pdev -> c4map) { + pdev -> c4map = FALSE; + } +- (void)sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } else if (bits == 8) { + if (pdev -> c8map) { + pdev -> c8map = FALSE; + } +- (void)sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } else { + /* 24 bit */ +- (void)sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "1;1;1;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } + + } else { /* ESC/Page-Color */ + +- (void)sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y); ++ (void)gs_sprintf(obuf, ESC_GS "%dX" ESC_GS "%dY", x, y); + lputs(s, obuf); + + comp = 0; + + if (bits == 1) { +- (void)sprintf(obuf, ESC_GS "2;201;1;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "2;201;1;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } else if (bits == 4) { + if (pdev -> c4map) { + /* ¥«¥é¡¼¥Þ¥Ã¥×ÅÐÏ¿ */ +@@ -2959,7 +2959,7 @@ static void escv_write_begin(gx_device * + gs_free_object(vdev->memory, tmp, "escv_write_begin(tmp4)"); + pdev -> c4map = FALSE; + } +- (void)sprintf(obuf, ESC_GS "2;203;2;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "2;203;2;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } else if (bits == 8) { + if (pdev -> c8map) { + /* ¥«¥é¡¼¥Þ¥Ã¥×ÅÐÏ¿ */ +@@ -2975,10 +2975,10 @@ static void escv_write_begin(gx_device * + gs_free_object(vdev->memory, tmp, "escv_write_begin(tmp)"); + pdev -> c8map = FALSE; + } +- (void)sprintf(obuf, ESC_GS "2;204;4;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "2;204;4;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } else { + /* 24 bit */ +- (void)sprintf(obuf, ESC_GS "2;102;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); ++ (void)gs_sprintf(obuf, ESC_GS "2;102;0;%d;%d;%d;%d;%d;%dscrI", comp, sw, sh, dw, dh, roll); + } + + } /* ESC/Page-Color */ +@@ -3045,12 +3045,12 @@ static void escv_write_data(gx_device *d + if(bits == 1){ + if (strcmp(pdev->dname, "lp1800") == 0 || \ + strcmp(pdev->dname, "lp9600") == 0) { +- (void)sprintf(obuf, ESC_GS "%d;1;%d;%d;0db{I", bsize, w, ras); ++ (void)gs_sprintf(obuf, ESC_GS "%d;1;%d;%d;0db{I", bsize, w, ras); + }else{ +- (void)sprintf(obuf, ESC_GS "%d;%du{I", bsize, ras); ++ (void)gs_sprintf(obuf, ESC_GS "%d;%du{I", bsize, ras); + } + }else{ +- (void)sprintf(obuf, ESC_GS "%d;%dcu{I", bsize, ras); ++ (void)gs_sprintf(obuf, ESC_GS "%d;%dcu{I", bsize, ras); + } + lputs(s, obuf); + +@@ -3077,7 +3077,7 @@ static void escv_write_data(gx_device *d + buf = tmps; + } + +- (void)sprintf(obuf, ESC_GS "%d;%dcu{I", bsize, ras); ++ (void)gs_sprintf(obuf, ESC_GS "%d;%dcu{I", bsize, ras); + lputs(s, obuf); + put_bytes(s, buf, bsize); + +diff -up ghostscript-9.07/contrib/gdevcd8.c.gs_sprintf ghostscript-9.07/contrib/gdevcd8.c +--- ghostscript-9.07/contrib/gdevcd8.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/gdevcd8.c 2013-05-09 17:02:39.092447197 +0100 +@@ -2439,7 +2439,7 @@ do_gcr(int bytecount, byte * inbyte, con + #if 0 + if ((*cyan > 0) && (*magenta > 0) && (*yellow > 0)) + { +- sprintf(output, "%3d %3d %3d %3d - ", *cyan, *magenta, *yellow, *black); ++ gs_sprintf(output, "%3d %3d %3d %3d - ", *cyan, *magenta, *yellow, *black); + debug_print_string(output, strlen(output)); + } + #endif /* 0 */ +@@ -2486,7 +2486,7 @@ do_gcr(int bytecount, byte * inbyte, con + #if 0 + if (ucr > 0) + { +- sprintf(output, "%3d %3d %3d %3d - %5d\n", *cyan, *magenta, *yellow, *black, ucr); ++ gs_sprintf(output, "%3d %3d %3d %3d - %5d\n", *cyan, *magenta, *yellow, *black, ucr); + debug_print_string(output, strlen(output)); + } + #endif /* 0 */ +diff -up ghostscript-9.07/contrib/gdevdj9.c.gs_sprintf ghostscript-9.07/contrib/gdevdj9.c +--- ghostscript-9.07/contrib/gdevdj9.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/gdevdj9.c 2013-05-09 17:02:39.092447197 +0100 +@@ -2563,7 +2563,7 @@ static int cdj970_write_header (gx_devic + + memset (startbuffer, 0, 1260); + +- sprintf (&(startbuffer[600]), "\033E\033%%-12345X@PJL JOB NAME = \"GHOST BY RENE HARSCH\"\n@PJL ENTER LANGUAGE=PCL3GUI\n"); ++ gs_sprintf (&(startbuffer[600]), "\033E\033%%-12345X@PJL JOB NAME = \"GHOST BY RENE HARSCH\"\n@PJL ENTER LANGUAGE=PCL3GUI\n"); + + fwrite (startbuffer, sizeof(char), 678, prn_stream); + +diff -up ghostscript-9.07/contrib/gdevhl12.c.gs_sprintf ghostscript-9.07/contrib/gdevhl12.c +--- ghostscript-9.07/contrib/gdevhl12.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/gdevhl12.c 2013-05-09 17:02:39.092447197 +0100 +@@ -662,7 +662,7 @@ hl1250_print_page_copies(gx_device_print + (-120, 0) compared to the one in the ljet4 driver (-180, 36) + (X, Y coordinates here are specified in 1/720-inch units). */ + +- sprintf(page_init, "\033&l-120U\033*r0F\033&u%dD%s", y_dpi, tray_pcl); ++ gs_sprintf(page_init, "\033&l-120U\033*r0F\033&u%dD%s", y_dpi, tray_pcl); + return dljet_mono_print_page_copies(pdev, prn_stream, num_copies, + y_dpi, PCL_LJ4_FEATURES, + page_init, page_init, false); +diff -up ghostscript-9.07/contrib/gdevxes.c.gs_sprintf ghostscript-9.07/contrib/gdevxes.c +--- ghostscript-9.07/contrib/gdevxes.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/gdevxes.c 2013-05-09 17:02:39.092447197 +0100 +@@ -173,7 +173,7 @@ sixel_print_page(gx_device_printer *pdev + if ( tmp[l] == last ) { + count++; + if (count==32767) { +- run[sprintf(run, "%d", count)]='\0'; ++ run[gs_sprintf(run, "%d", count)]='\0'; + for (t=run; *t; t++)fputc( *t, prn_stream ); + fputc( last, prn_stream ); + last = '\0'; +@@ -186,7 +186,7 @@ sixel_print_page(gx_device_printer *pdev + case 0: break; + case 1: fputc( last, prn_stream ); + break; +- default:run[sprintf(run, "%d", count)]='\0'; ++ default:run[gs_sprintf(run, "%d", count)]='\0'; + for (t=run; *t; t++) fputc( *t, prn_stream ); + fputc( last, prn_stream ); + break; +@@ -203,7 +203,7 @@ sixel_print_page(gx_device_printer *pdev + case 0: break; + case 1: fputc( last, prn_stream ); + break; +- default:run[sprintf(run, "%d", count)]='\0'; ++ default:run[gs_sprintf(run, "%d", count)]='\0'; + for (t=run; *t; t++) fputc( *t, prn_stream ); + fputc( last, prn_stream ); + break; +diff -up ghostscript-9.07/contrib/gomni.c.gs_sprintf ghostscript-9.07/contrib/gomni.c +--- ghostscript-9.07/contrib/gomni.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/gomni.c 2013-05-09 17:02:39.093447201 +0100 +@@ -790,7 +790,7 @@ SetupDevice (gx_device *pgxdev, gs_param + "Devicestring"); + if (pszDeviceLib) + { +- sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cOmnilib); ++ gs_sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cOmnilib); + + pDev->hmodOmni = g_module_open (pszDeviceLib, (GModuleFlags)0); + +@@ -817,7 +817,7 @@ SetupDevice (gx_device *pgxdev, gs_param + "Devicestring"); + if (pszDeviceLib) + { +- sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cOmnilib); ++ gs_sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cOmnilib); + + pModule = g_module_open (pszDeviceLib, (GModuleFlags)0); + +@@ -1053,7 +1053,7 @@ SetupDevice (gx_device *pgxdev, gs_param + + if (pszDeviceLib) + { +- sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cDialogName); ++ gs_sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cDialogName); + + if (fDebugOutput) dprintf1 ("attempting to load - %s\n", pszDeviceLib); + +@@ -1079,7 +1079,7 @@ SetupDevice (gx_device *pgxdev, gs_param + + if (pszDeviceLib) + { +- sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cDialogName); ++ gs_sprintf (pszDeviceLib, "%s%s", apszLibraryPaths[i], cDialogName); + + pModule = g_module_open (pszDeviceLib, (GModuleFlags)0); + +diff -up ghostscript-9.07/contrib/japanese/dviprlib.c.gs_sprintf ghostscript-9.07/contrib/japanese/dviprlib.c +--- ghostscript-9.07/contrib/japanese/dviprlib.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/dviprlib.c 2013-05-09 17:02:39.093447201 +0100 +@@ -106,7 +106,7 @@ dviprt_read_S_cfg(dviprt_cfg_t *pcfg,dvi + goto not_cfg; + pcfg->version = rbuf[2] | ((uint)rbuf[3] << 8); + if (pcfg->version > CFG_VERSION) { +- sprintf(dviprt_message_buffer, ++ gs_sprintf(dviprt_message_buffer, + "This *.CFG file is too new version(ver.%u).\n",pcfg->version); + dviprt_printcfgerror(pinfo,dviprt_message_buffer,-1); + return CFG_ERROR_OTHER; +@@ -129,7 +129,7 @@ dviprt_read_S_cfg(dviprt_cfg_t *pcfg,dvi + if (n >= CFG_INTEGER_TYPE_COUNT) { + ptype = "integer"; + unknown_no: +- sprintf(dviprt_message_buffer, ++ gs_sprintf(dviprt_message_buffer, + "Unknown %s type value No.%d is found.\n",ptype,n); + dviprt_printcfgerror(pinfo,dviprt_message_buffer,-1); + return CFG_ERROR_OTHER; +@@ -346,7 +346,7 @@ dviprt_read_QR_cfg(dviprt_cfg_t *pcfg,dv + ptr++; + break; + default: +- sprintf(dviprt_message_buffer,"Unknown format %02X",type); ++ gs_sprintf(dviprt_message_buffer,"Unknown format %02X",type); + dviprt_printcfgerror(pinfo,dviprt_message_buffer,-1); + goto ex_func; + } +@@ -587,7 +587,7 @@ dviprt_readsrc(char *fname,dviprt_cfg_t + while (*pbuf && isspace(*pbuf)) pbuf++; + if (pitem->spec_f) { + dviprt_printcfgerror(&info,NULL,0); +- sprintf(dviprt_message_buffer, ++ gs_sprintf(dviprt_message_buffer, + "Item `%s' is specified twice.\n",pitem->name); + dviprt_printmessage(dviprt_message_buffer,-1); + code = CFG_ERROR_SYNTAX; +@@ -691,7 +691,7 @@ dviprt_readsrc(char *fname,dviprt_cfg_t + code = 0; + for (pitem = dviprt_items;pitem->name;pitem++) { + if (!pitem->spec_f && pitem->req_f) { +- sprintf(dviprt_message_buffer,"%s not found.\n",pitem->name); ++ gs_sprintf(dviprt_message_buffer,"%s not found.\n",pitem->name); + dviprt_printcfgerror(&info,dviprt_message_buffer,-1); + code++; + } +@@ -749,14 +749,14 @@ dviprt_readsrc(char *fname,dviprt_cfg_t + + for (pitem = dviprt_items;pitem->type>=0;pitem++) { + if (pitem->spec_f == 0) { +- sprintf(dviprt_message_buffer,": %s:",pitem->name); ++ gs_sprintf(dviprt_message_buffer,": %s:",pitem->name); + switch (pitem->type) { + case T_INTEGER: + if (pcfg->integer[pitem->no] >= 0) { + uint v = pcfg->integer[pitem->no]; + dviprt_printmessage(fname,-1); + dviprt_printmessage(dviprt_message_buffer,-1); +- sprintf(dviprt_message_buffer," %d\n",v); ++ gs_sprintf(dviprt_message_buffer," %d\n",v); + dviprt_printmessage(dviprt_message_buffer,-1); + } + break; +@@ -802,7 +802,7 @@ dviprt_set_integer(dviprt_cfg_item_t *pi + out_of_range: + dviprt_printtokenerror(pinfo,buf,strlen(buf),ERROR_OUTOFRANGE); + dviprt_printcfgerror(pinfo,"",-1); +- sprintf(dviprt_message_buffer, ++ gs_sprintf(dviprt_message_buffer, + "(%u <= value <= %u).\n",(uint)min,(uint)max); + dviprt_printmessage(dviprt_message_buffer,-1); + return CFG_ERROR_RANGE; +@@ -1108,10 +1108,10 @@ dviprt_set_rpexpr(dviprt_cfg_item_t *pit + pitem->no != CFG_AFTER_BIT_IMAGE) { + unavailable_value: + dviprt_printcfgerror(pinfo,"",-1); +- sprintf(dviprt_message_buffer,"Variable `%c' in ",(int)*pbuf); ++ gs_sprintf(dviprt_message_buffer,"Variable `%c' in ",(int)*pbuf); + dviprt_printmessage(dviprt_message_buffer,-1); + dviprt_printmessage(pbuf,(int)(pend-pbuf)); +- sprintf(dviprt_message_buffer," cannot be used in %s.\n",pitem->name); ++ gs_sprintf(dviprt_message_buffer," cannot be used in %s.\n",pitem->name); + dviprt_printmessage(dviprt_message_buffer,-1); + return CFG_ERROR_RANGE; + } +@@ -1144,7 +1144,7 @@ dviprt_set_rpexpr(dviprt_cfg_item_t *pit + case '^': op = CFG_OP_XOR; break; + default: + dviprt_printcfgerror(pinfo,NULL,0); +- sprintf(dviprt_message_buffer,"Unknown operator %c in ",(int)*pbuf); ++ gs_sprintf(dviprt_message_buffer,"Unknown operator %c in ",(int)*pbuf); + dviprt_printmessage(dviprt_message_buffer,-1); + dviprt_printmessage(pbuf,(int)(pend-pbuf)); + dviprt_printmessage(".\n",-1); +@@ -1520,7 +1520,7 @@ dviprt_printcfgerrorheader(dviprt_cfg_i + dviprt_printmessage(fn,-1); + dviprt_printmessage(": ",-1); + if (pinfo->line_no>0) { +- sprintf(dviprt_message_buffer,"%d: ",pinfo->line_no); ++ gs_sprintf(dviprt_message_buffer,"%d: ",pinfo->line_no); + dviprt_printmessage(dviprt_message_buffer,-1); + } + } +@@ -2210,9 +2210,9 @@ dviprt_output_expr(dviprt_print *pprint, + if (cols == 0) + strcpy(fmtbuf,"%"); + else +- sprintf(fmtbuf,"%%0%d",cols); ++ gs_sprintf(fmtbuf,"%%0%d",cols); + strcat(fmtbuf,f); +- sprintf(valbuf,fmtbuf,stack[stack_p]); ++ gs_sprintf(valbuf,fmtbuf,stack[stack_p]); + cols = strlen(valbuf); + if (fmt & CFG_FMT_ISO_BIT) + valbuf[cols-1] |= 0x10; +diff -up ghostscript-9.07/contrib/japanese/gdevfmlbp.c.gs_sprintf ghostscript-9.07/contrib/japanese/gdevfmlbp.c +--- ghostscript-9.07/contrib/japanese/gdevfmlbp.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/gdevfmlbp.c 2013-05-09 17:02:39.094447206 +0100 +@@ -112,7 +112,7 @@ gdev_fmlbp_paper_size(gx_device_printer + height_inches = t; + landscape = 1; + } +- sprintf(paper, "%s;%d", ++ gs_sprintf(paper, "%s;%d", + (height_inches >= 15.9 ? PAPER_SIZE_A3 : + height_inches >= 11.8 ? + (width_inches >= 9.2 ? PAPER_SIZE_B4 : PAPER_SIZE_LEGAL) : +@@ -136,7 +136,7 @@ static void goto_xy(FILE *prn_stream,int + + fputc(CEX,prn_stream); + fputc('"',prn_stream); +- sprintf(buff,"%d",x); ++ gs_sprintf((char *)buff,"%d",x); + while (*p) + { + if (!*(p+1)) fputc((*p)+0x30,prn_stream); +@@ -146,7 +146,7 @@ static void goto_xy(FILE *prn_stream,int + } + + p=buff; +- sprintf(buff,"%d",y); ++ gs_sprintf((char *)buff,"%d",y); + while (*p) + { + if (!*(p+1)) fputc((*p)+0x40,prn_stream); +diff -up ghostscript-9.07/contrib/japanese/gdevfmpr.c.gs_sprintf ghostscript-9.07/contrib/japanese/gdevfmpr.c +--- ghostscript-9.07/contrib/japanese/gdevfmpr.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/gdevfmpr.c 2013-05-09 17:02:39.094447206 +0100 +@@ -184,13 +184,13 @@ fmpr_print_page(gx_device_printer *pdev, + } + out_beg -= (out_beg - out) % bytes_per_column; + +- sprintf(prn_buf, "\033[%da", ++ gs_sprintf(prn_buf, "\033[%da", + (out_beg - out) / bytes_per_column); + prn_puts(pdev, prn_buf); + + /* Dot graphics */ + size = out_end - out_beg + 1; +- sprintf(prn_buf, "\033Q%d W", size / bytes_per_column); ++ gs_sprintf(prn_buf, "\033Q%d W", size / bytes_per_column); + prn_puts(pdev, prn_buf); + prn_write(pdev, out_beg, size); + +diff -up ghostscript-9.07/contrib/japanese/gdevj100.c.gs_sprintf ghostscript-9.07/contrib/japanese/gdevj100.c +--- ghostscript-9.07/contrib/japanese/gdevj100.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/gdevj100.c 2013-05-09 17:02:39.094447206 +0100 +@@ -128,12 +128,12 @@ jj100_print_page(gx_device_printer *pdev + + /* Vertical tab to the appropriate position. */ + while(skip > 15) { +- sprintf(prn_buf, "\037%c", 16 + 15); ++ gs_sprintf(prn_buf, "\037%c", 16 + 15); + fputs(prn_buf, pdev->file); + skip -= 15; + } + if(skip > 0) { +- sprintf(prn_buf, "\037%c", 16 + skip); ++ gs_sprintf(prn_buf, "\037%c", 16 + skip); + fputs(prn_buf, pdev->file); + } + +@@ -170,13 +170,13 @@ jj100_print_page(gx_device_printer *pdev + out_beg -= (out_beg - out) % (bytes_per_column * 2); + + /* Dot addressing */ +- sprintf(prn_buf, "\033F%04d", ++ gs_sprintf(prn_buf, "\033F%04d", + (out_beg - out) / bytes_per_column / 2); + fputs(prn_buf, pdev->file); + + /* Dot graphics */ + size = out_end - out_beg + 1; +- sprintf(prn_buf, "\034bP,48,%04d.", size / bytes_per_column); ++ gs_sprintf(prn_buf, "\034bP,48,%04d.", size / bytes_per_column); + fputs(prn_buf, pdev->file); + fwrite(out_beg, 1, size, pdev->file); + +diff -up ghostscript-9.07/contrib/japanese/gdevlbp3.c.gs_sprintf ghostscript-9.07/contrib/japanese/gdevlbp3.c +--- ghostscript-9.07/contrib/japanese/gdevlbp3.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/gdevlbp3.c 2013-05-09 17:02:39.094447206 +0100 +@@ -81,7 +81,7 @@ lbp310PrintPage(gx_device_printer *pDev, + DataSize = CompressImage(pDev, &Box, fp, "\x1b[1;%d;%d;11;%d;.r"); + + /* ----==== Set size ====---- */ +- sprintf(Buf, "0%ld", DataSize); ++ gs_sprintf((char *)Buf, "0%ld", DataSize); + i = (DataSize+strlen(Buf)+1)&1; + /* ----==== escape to LIPS ====---- */ + fprintf(fp, "\x80%s\x80\x80\x80\x80\x0c",Buf+i); +@@ -110,7 +110,7 @@ lbp320PrintPage(gx_device_printer *pDev, + DataSize = CompressImage(pDev, &Box, fp, "\x1b[1;%d;%d;11;%d;.&r"); + + /* ----==== Set size ====---- */ +- sprintf(Buf, "000%ld", DataSize); ++ gs_sprintf((char *)Buf, "000%ld", DataSize); + i = (DataSize+strlen(Buf)+1)&3; + /* ----==== escape to LIPS ====---- */ + fprintf(fp, "\x80%s\x80\x80\x80\x80\x0c",Buf+i); +diff -up ghostscript-9.07/contrib/japanese/gdevmag.c.gs_sprintf ghostscript-9.07/contrib/japanese/gdevmag.c +--- ghostscript-9.07/contrib/japanese/gdevmag.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/gdevmag.c 2013-05-09 17:02:39.094447206 +0100 +@@ -137,8 +137,8 @@ mag_print_page(gx_device_printer *pdev, + + if (user == 0) user = "Unknown"; + strcpy(check,magic); +- sprintf(check+strlen(check),"%-18s",user); +- sprintf(check+31," Ghostscript with %s driver\x1a", pdev->dname); ++ gs_sprintf(check+strlen(check),"%-18s",user); ++ gs_sprintf(check+31," Ghostscript with %s driver\x1a", pdev->dname); + + /* check sizes of flag and pixel data. */ + pixel_bytes = 0; +diff -up ghostscript-9.07/contrib/japanese/gdevnpdl.c.gs_sprintf ghostscript-9.07/contrib/japanese/gdevnpdl.c +--- ghostscript-9.07/contrib/japanese/gdevnpdl.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/japanese/gdevnpdl.c 2013-05-09 17:02:39.094447206 +0100 +@@ -592,31 +592,31 @@ npdl_print_page_copies(gx_device_printer + /* Check paper size */ + switch (npdl_get_paper_size((gx_device *) pdev)) { + case PAPER_SIZE_POSTCARD: +- sprintf(paper_command, "PC"); ++ gs_sprintf(paper_command, "PC"); + break; + case PAPER_SIZE_A5: +- sprintf(paper_command, "A5"); ++ gs_sprintf(paper_command, "A5"); + break; + case PAPER_SIZE_A4: +- sprintf(paper_command, "A4"); ++ gs_sprintf(paper_command, "A4"); + break; + case PAPER_SIZE_A3: +- sprintf(paper_command, "A3"); ++ gs_sprintf(paper_command, "A3"); + break; + case PAPER_SIZE_B5: +- sprintf(paper_command, "B5"); ++ gs_sprintf(paper_command, "B5"); + break; + case PAPER_SIZE_B4: +- sprintf(paper_command, "B4"); ++ gs_sprintf(paper_command, "B4"); + break; + case PAPER_SIZE_LETTER: +- sprintf(paper_command, "LT"); ++ gs_sprintf(paper_command, "LT"); + break; + case PAPER_SIZE_ENV4: +- sprintf(paper_command, "ENV4"); ++ gs_sprintf(paper_command, "ENV4"); + break; + case PAPER_SIZE_BPOSTCARD: +- sprintf(paper_command, "UPPC"); ++ gs_sprintf(paper_command, "UPPC"); + break; + } + +diff -up ghostscript-9.07/contrib/lips4/gdevl4r.c.gs_sprintf ghostscript-9.07/contrib/lips4/gdevl4r.c +--- ghostscript-9.07/contrib/lips4/gdevl4r.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/lips4/gdevl4r.c 2013-05-09 17:02:39.095447210 +0100 +@@ -775,9 +775,9 @@ lips2p_image_out(gx_device_printer * pde + move_cap(pdev, prn_stream, x, y); + + Len = lips_mode3format_encode(lprn->TmpBuf, lprn->CompBuf, width / 8 * height); +- sprintf(raw_str, "%c%d;%d;%d.r", LIPS_CSI, ++ gs_sprintf(raw_str, "%c%d;%d;%d.r", LIPS_CSI, + width / 8 * height, width / 8, (int)pdev->x_pixels_per_inch); +- sprintf(comp_str, "%c%d;%d;%d;9;%d.r", LIPS_CSI, ++ gs_sprintf(comp_str, "%c%d;%d;%d;9;%d.r", LIPS_CSI, + Len, width / 8, (int)pdev->x_pixels_per_inch, height); + + if (Len < width / 8 * height - strlen(comp_str) + strlen(raw_str)) { +@@ -806,11 +806,11 @@ lips4_image_out(gx_device_printer * pdev + Len = lips_packbits_encode(lprn->TmpBuf, lprn->CompBuf, width / 8 * height); + Len_rle = lips_rle_encode(lprn->TmpBuf, lprn->CompBuf2, width / 8 * height); + +- sprintf(raw_str, "%c%d;%d;%d.r", LIPS_CSI, ++ gs_sprintf(raw_str, "%c%d;%d;%d.r", LIPS_CSI, + width / 8 * height, width / 8, (int)pdev->x_pixels_per_inch); + + if (Len < Len_rle) { +- sprintf(comp_str, "%c%d;%d;%d;11;%d.r", LIPS_CSI, ++ gs_sprintf(comp_str, "%c%d;%d;%d;11;%d.r", LIPS_CSI, + Len, width / 8, (int)pdev->x_pixels_per_inch, height); + if (Len < width / 8 * height - strlen(comp_str) + strlen(raw_str)) { + fprintf(prn_stream, "%s", comp_str); +@@ -821,7 +821,7 @@ lips4_image_out(gx_device_printer * pdev + fwrite(lprn->TmpBuf, 1, width / 8 * height, prn_stream); + } + } else { +- sprintf(comp_str, "%c%d;%d;%d;10;%d.r", LIPS_CSI, ++ gs_sprintf(comp_str, "%c%d;%d;%d;10;%d.r", LIPS_CSI, + Len, width / 8, (int)pdev->x_pixels_per_inch, height); + if (Len_rle < width / 8 * height - strlen(comp_str) + strlen(raw_str)) { + fprintf(prn_stream, "%s", comp_str); +diff -up ghostscript-9.07/contrib/lips4/gdevl4v.c.gs_sprintf ghostscript-9.07/contrib/lips4/gdevl4v.c +--- ghostscript-9.07/contrib/lips4/gdevl4v.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/lips4/gdevl4v.c 2013-05-09 17:02:39.095447210 +0100 +@@ -459,17 +459,17 @@ lips4v_set_cap(gx_device * dev, int x, i + int dy = y - pdev->prev_y; + + if (dx > 0) { +- sprintf(cap, "%c%da", LIPS_CSI, dx); ++ gs_sprintf(cap, "%c%da", LIPS_CSI, dx); + lputs(s, cap); + } else if (dx < 0) { +- sprintf(cap, "%c%dj", LIPS_CSI, -dx); ++ gs_sprintf(cap, "%c%dj", LIPS_CSI, -dx); + lputs(s, cap); + } + if (dy > 0) { +- sprintf(cap, "%c%dk", LIPS_CSI, dy); ++ gs_sprintf(cap, "%c%dk", LIPS_CSI, dy); + lputs(s, cap); + } else if (dy < 0) { +- sprintf(cap, "%c%de", LIPS_CSI, -dy); ++ gs_sprintf(cap, "%c%de", LIPS_CSI, -dy); + lputs(s, cap); + } + pdev->prev_x = x; +@@ -544,10 +544,10 @@ lips4v_copy_text_char(gx_device * dev, c + if (download) { + if (ccode % 128 == 0 && ccode == pdev->count) { + /* ʸ»ú¥»¥Ã¥ÈÅÐÏ¿Êä½õÌ¿Îá */ +- sprintf(cset_sub, "%c%dx%c", LIPS_DCS, ccode / 128, LIPS_ST); ++ gs_sprintf(cset_sub, "%c%dx%c", LIPS_DCS, ccode / 128, LIPS_ST); + lputs(s, cset_sub); + /* ʸ»ú¥»¥Ã¥ÈÅÐÏ¿Ì¿Îá */ +- sprintf(cset, ++ gs_sprintf(cset, + "%c%d;1;0;0;3840;8;400;100;0;0;200;%d;%d;0;0;;;;;%d.p", + LIPS_CSI, + size + 9, cell_length, /* Cell Width */ +@@ -556,7 +556,7 @@ lips4v_copy_text_char(gx_device * dev, c + lputs(s, cset); + } else { + /* 1ʸ»úÅÐÏ¿Ì¿Îá */ +- sprintf(cset, ++ gs_sprintf(cset, + "%c%d;%d;8;%d.q", LIPS_CSI, + size + 9, ccode / 128, (int)dev->x_pixels_per_inch); + lputs(s, cset); +@@ -575,13 +575,13 @@ lips4v_copy_text_char(gx_device * dev, c + /* ʸ»ú¥»¥Ã¥È¡¦¥¢¥µ¥¤¥óÈÖ¹æÁªÂòÌ¿Îá2 */ + if (download) { + if (pdev->current_font != ccode / 128) { +- sprintf(cset_number, "%c%d%%v", LIPS_CSI, ccode / 128); ++ gs_sprintf(cset_number, "%c%d%%v", LIPS_CSI, ccode / 128); + lputs(s, cset_number); + pdev->current_font = ccode / 128; + } + } else { + if (pdev->current_font != ccode / 128) { +- sprintf(cset_number, "%c%d%%v", LIPS_CSI, ccode / 128); ++ gs_sprintf(cset_number, "%c%d%%v", LIPS_CSI, ccode / 128); + lputs(s, cset_number); + pdev->current_font = ccode / 128; + } +@@ -592,7 +592,7 @@ lips4v_copy_text_char(gx_device * dev, c + if (pdev->color_info.depth == 8) { + sputc(s, LIPS_CSI); + lputs(s, "?10;2;"); +- sprintf(text_color, "%d", ++ gs_sprintf(text_color, "%d", + (int)(pdev->color_info.max_gray - pdev->current_color)); + } else { + int r = (pdev->current_color >> 16) * 1000.0 / 255.0; +@@ -601,7 +601,7 @@ lips4v_copy_text_char(gx_device * dev, c + + sputc(s, LIPS_CSI); + lputs(s, "?10;;"); +- sprintf(text_color, "%d;%d;%d", r, g, b); ++ gs_sprintf(text_color, "%d;%d;%d", r, g, b); + } + lputs(s, text_color); + lputs(s, "%p"); +@@ -717,16 +717,16 @@ lips4v_beginpage(gx_device_vector * vdev + lputs(s, "@PJL SET RESOLUTION = QUICK\n"); + lputs(s, l4v_file_header2); + if (pdev->toner_density) { +- sprintf(toner_d, "@PJL SET TONER-DENSITY=%d\n", ++ gs_sprintf(toner_d, "@PJL SET TONER-DENSITY=%d\n", + pdev->toner_density); + lputs(s, toner_d); + } + if (pdev->toner_saving_set) { + lputs(s, "@PJL SET TONER-SAVING="); + if (pdev->toner_saving) +- sprintf(toner_s, "ON\n"); ++ gs_sprintf(toner_s, "ON\n"); + else +- sprintf(toner_s, "OFF\n"); ++ gs_sprintf(toner_s, "OFF\n"); + lputs(s, toner_s); + } + lputs(s, l4v_file_header3); +@@ -737,7 +737,7 @@ lips4v_beginpage(gx_device_vector * vdev + return_error(gs_error_rangecheck); + + /* set reaolution (dpi) */ +- sprintf(dpi_char, "%d", dpi); ++ gs_sprintf(dpi_char, "%d", dpi); + lputs(s, dpi_char); + + if (pdev->color_info.depth == 8) +@@ -746,7 +746,7 @@ lips4v_beginpage(gx_device_vector * vdev + lputs(s, l4vcolor_file_header); + + /* username */ +- sprintf(username, "%c2y%s%c", LIPS_DCS, pdev->Username, LIPS_ST); ++ gs_sprintf(username, "%c2y%s%c", LIPS_DCS, pdev->Username, LIPS_ST); + lputs(s, username); + } + if (strcmp(pdev->mediaType, "PlainPaper") == 0) { +@@ -773,13 +773,13 @@ lips4v_beginpage(gx_device_vector * vdev + && strcmp(pdev->mediaType, LIPS_MEDIATYPE_DEFAULT) != 0)) { + /* Use ManualFeed */ + if (pdev->prev_feed_mode != 10) { +- sprintf(feedmode, "%c10q", LIPS_CSI); ++ gs_sprintf(feedmode, "%c10q", LIPS_CSI); + lputs(s, feedmode); + pdev->prev_feed_mode = 10; + } + } else { + if (pdev->prev_feed_mode != pdev->cassetFeed) { +- sprintf(feedmode, "%c%dq", LIPS_CSI, pdev->cassetFeed); ++ gs_sprintf(feedmode, "%c%dq", LIPS_CSI, pdev->cassetFeed); + lputs(s, feedmode); + pdev->prev_feed_mode = pdev->cassetFeed; + } +@@ -791,10 +791,10 @@ lips4v_beginpage(gx_device_vector * vdev + if (pdev->prev_paper_size != paper_size) { + if (paper_size == USER_SIZE) { + /* modified by shige 06/27 2003 +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, width * 10, height * 10); */ ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, width * 10, height * 10); */ + /* modified by shige 11/09 2003 +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, height * 10, width * 10); */ +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, height * 10, width * 10); */ ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, + (height * 10 > LIPS_HEIGHT_MAX_720)? + LIPS_HEIGHT_MAX_720 : (height * 10), + (width * 10 > LIPS_WIDTH_MAX_720)? +@@ -802,27 +802,27 @@ lips4v_beginpage(gx_device_vector * vdev + lputs(s, paper); + } else if (paper_size == USER_SIZE + LANDSCAPE) { + /* modified by shige 06/27 2003 +- sprintf(paper, "%c81;%d;%dp", LIPS_CSI, height * 10, width * 10); */ ++ gs_sprintf(paper, "%c81;%d;%dp", LIPS_CSI, height * 10, width * 10); */ + /* modified by shige 11/09 2003 +- sprintf(paper, "%c81;%d;%dp", LIPS_CSI, width * 10, height * 10); */ +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, ++ gs_sprintf(paper, "%c81;%d;%dp", LIPS_CSI, width * 10, height * 10); */ ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, + (width * 10 > LIPS_HEIGHT_MAX_720)? + LIPS_HEIGHT_MAX_720 : (width * 10), + (height * 10 > LIPS_WIDTH_MAX_720)? + LIPS_WIDTH_MAX_720 : (height * 10)); + lputs(s, paper); + } else { +- sprintf(paper, "%c%dp", LIPS_CSI, paper_size); ++ gs_sprintf(paper, "%c%dp", LIPS_CSI, paper_size); + lputs(s, paper); + } + } else if (paper_size == USER_SIZE) { + if (pdev->prev_paper_width != width || + pdev->prev_paper_height != height) + /* modified by shige 06/27 2003 +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, width * 10, height * 10); */ ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, width * 10, height * 10); */ + /* modified by shige 11/09 2003 +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, height * 10, width * 10); */ +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, height * 10, width * 10); */ ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, + (height * 10 > LIPS_HEIGHT_MAX_720)? + LIPS_HEIGHT_MAX_720 : (height * 10), + (width * 10 > LIPS_WIDTH_MAX_720)? +@@ -832,10 +832,10 @@ lips4v_beginpage(gx_device_vector * vdev + if (pdev->prev_paper_width != width || + pdev->prev_paper_height != height) + /* modified by shige 06/27 2003 +- sprintf(paper, "%c81;%d;%dp", LIPS_CSI, height * 10, width * 10); */ ++ gs_sprintf(paper, "%c81;%d;%dp", LIPS_CSI, height * 10, width * 10); */ + /* modified by shige 11/09 2003 +- sprintf(paper, "%c81;%d;%dp", LIPS_CSI, width * 10, height * 10); */ +- sprintf(paper, "%c80;%d;%dp", LIPS_CSI, ++ gs_sprintf(paper, "%c81;%d;%dp", LIPS_CSI, width * 10, height * 10); */ ++ gs_sprintf(paper, "%c80;%d;%dp", LIPS_CSI, + (width * 10 > LIPS_HEIGHT_MAX_720)? + LIPS_HEIGHT_MAX_720 : (width * 10), + (height * 10 > LIPS_WIDTH_MAX_720)? +@@ -847,32 +847,32 @@ lips4v_beginpage(gx_device_vector * vdev + pdev->prev_paper_height = height; + + if (pdev->faceup) { +- sprintf(faceup_char, "%c11;12;12~", LIPS_CSI); ++ gs_sprintf(faceup_char, "%c11;12;12~", LIPS_CSI); + lputs(s, faceup_char); + } + /* N-up Printing Setting */ + if (pdev->first_page) { + if (pdev->nup != 1) { +- sprintf(nup_char, "%c%d1;;%do", LIPS_CSI, pdev->nup, paper_size); ++ gs_sprintf(nup_char, "%c%d1;;%do", LIPS_CSI, pdev->nup, paper_size); + lputs(s, nup_char); + } + } + /* Duplex Setting */ + if (dupset && dup) { + if (pdev->prev_duplex_mode == 0 || pdev->prev_duplex_mode == 1) { +- sprintf(duplex_char, "%c2;#x", LIPS_CSI); /* duplex */ ++ gs_sprintf(duplex_char, "%c2;#x", LIPS_CSI); /* duplex */ + lputs(s, duplex_char); + if (!tum) { + /* long edge binding */ + if (pdev->prev_duplex_mode != 2) { +- sprintf(tumble_char, "%c0;#w", LIPS_CSI); ++ gs_sprintf(tumble_char, "%c0;#w", LIPS_CSI); + lputs(s, tumble_char); + } + pdev->prev_duplex_mode = 2; + } else { + /* short edge binding */ + if (pdev->prev_duplex_mode != 3) { +- sprintf(tumble_char, "%c2;#w", LIPS_CSI); ++ gs_sprintf(tumble_char, "%c2;#w", LIPS_CSI); + lputs(s, tumble_char); + } + pdev->prev_duplex_mode = 3; +@@ -880,7 +880,7 @@ lips4v_beginpage(gx_device_vector * vdev + } + } else if (dupset && !dup) { + if (pdev->prev_duplex_mode != 1) { +- sprintf(duplex_char, "%c0;#x", LIPS_CSI); /* simplex */ ++ gs_sprintf(duplex_char, "%c0;#x", LIPS_CSI); /* simplex */ + lputs(s, duplex_char); + } + pdev->prev_duplex_mode = 1; +@@ -893,9 +893,9 @@ lips4v_beginpage(gx_device_vector * vdev + /* size unit (dpi) */ + sputc(s, LIPS_CSI); + lputs(s, "11h"); +- sprintf(unit, "%c?7;%d I", LIPS_CSI, (int)pdev->x_pixels_per_inch); ++ gs_sprintf(unit, "%c?7;%d I", LIPS_CSI, (int)pdev->x_pixels_per_inch); + lputs(s, unit); +- sprintf(page_header, "%c[0&}#%c", LIPS_ESC, LIPS_IS2); ++ gs_sprintf(page_header, "%c[0&}#%c", LIPS_ESC, LIPS_IS2); + lputs(s, page_header); /* vector mode */ + + lputs(s, "!0"); /* size unit (dpi) */ +@@ -904,10 +904,10 @@ lips4v_beginpage(gx_device_vector * vdev + sputc(s, LIPS_IS2); + + if (pdev->color_info.depth == 8) { +- sprintf(l4vmono_page_header, "!13%c$%c", LIPS_IS2, LIPS_IS2); ++ gs_sprintf(l4vmono_page_header, "!13%c$%c", LIPS_IS2, LIPS_IS2); + lputs(s, l4vmono_page_header); + } else { +- sprintf(l4vcolor_page_header, "!11%c$%c", LIPS_IS2, LIPS_IS2); ++ gs_sprintf(l4vcolor_page_header, "!11%c$%c", LIPS_IS2, LIPS_IS2); + lputs(s, l4vcolor_page_header); + } + +@@ -1010,7 +1010,7 @@ lips4v_setlinecap(gx_device_vector * vde + break; + } + /* Àþü·Á¾õ»ØÄêÌ¿Îá */ +- sprintf(c, "}E%d%c", line_cap, LIPS_IS2); ++ gs_sprintf(c, "}E%d%c", line_cap, LIPS_IS2); + lputs(s, c); + + pdev->linecap = cap; +@@ -1050,7 +1050,7 @@ lips4v_setlinejoin(gx_device_vector * vd + break; + } + +- sprintf(c, "}F%d%c", lips_join, LIPS_IS2); ++ gs_sprintf(c, "}F%d%c", lips_join, LIPS_IS2); + lputs(s, c); + + return 0; +@@ -1486,7 +1486,7 @@ lips4v_output_page(gx_device * dev, int + if (num_copies > 255) + num_copies = 255; + if (pdev->prev_num_copies != num_copies) { +- sprintf(str, "%c%dv", LIPS_CSI, num_copies); ++ gs_sprintf(str, "%c%dv", LIPS_CSI, num_copies); + lputs(s, str); + pdev->prev_num_copies = num_copies; + } +diff -up ghostscript-9.07/contrib/pcl3/src/gdevpcl3.c.gs_sprintf ghostscript-9.07/contrib/pcl3/src/gdevpcl3.c +--- ghostscript-9.07/contrib/pcl3/src/gdevpcl3.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/contrib/pcl3/src/gdevpcl3.c 2013-05-09 17:02:39.095447210 +0100 +@@ -302,7 +302,7 @@ static void get_string_for_int(int in_va + else { + static char buffer[22]; /* Must be sufficient for an 'int' */ + +- sprintf(buffer, "%d", in_value); ++ gs_sprintf(buffer, "%d", in_value); + assert(strlen(buffer) < sizeof(buffer)); + out_value->data = (const byte *)buffer; + out_value->size = strlen(buffer); +diff -up ghostscript-9.07/cups/gdevcups.c.gs_sprintf ghostscript-9.07/cups/gdevcups.c +--- ghostscript-9.07/cups/gdevcups.c.gs_sprintf 2013-05-09 17:02:39.048447008 +0100 ++++ ghostscript-9.07/cups/gdevcups.c 2013-05-09 17:02:39.096447214 +0100 +@@ -60,6 +60,9 @@ + * cups_print_planar() - Print a page of planar pixels. + */ + ++/* prevent gp.h redefining fopen */ ++#define sprintf sprintf ++ + /* + * Include necessary headers... + */ +diff -up ghostscript-9.07/base/Makefile.in.gs_sprintf ghostscript-9.07/base/Makefile.in +--- ghostscript-9.07/base/Makefile.in.gs_sprintf 2013-05-09 17:02:46.190477741 +0100 ++++ ghostscript-9.07/base/Makefile.in 2013-05-09 17:03:22.377633508 +0100 +@@ -302,6 +302,8 @@ LCUPSISRCDIR=cups + CUPS_CC=$(CC) + + ++TRIOSRCDIR=trio ++ + # Define how to build the library archives. (These are not used in any + # standard configuration.) + +@@ -583,6 +585,7 @@ MAKEDIRSTOP= + INSTALL_CONTRIB=@INSTALL_CONTRIB@ + include $(GLSRCDIR)/unixhead.mak + include $(GLSRCDIR)/gs.mak ++include $(GLSRCDIR)/trio.mak + # psromfs.mak must precede lib.mak + include $(PSSRCDIR)/psromfs.mak + include $(GLSRCDIR)/lib.mak +diff -up ghostscript-9.07/psi/dmmain.c.gs_sprintf ghostscript-9.07/psi/dmmain.c +--- ghostscript-9.07/psi/dmmain.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/dmmain.c 2013-05-09 17:02:39.096447214 +0100 +@@ -644,8 +644,8 @@ void main(void) + argv[1] = ddevice; + argv[2] = dformat; + +- sprintf(ddevice, "-sDEVICE=display"); +- sprintf(dformat, "-dDisplayFormat=%d", display_format); ++ gs_sprintf(ddevice, "-sDEVICE=display"); ++ gs_sprintf(dformat, "-dDisplayFormat=%d", display_format); + + /* Run Ghostscript */ + if (gsapi_new_instance(&instance, NULL) < 0) +diff -up ghostscript-9.07/psi/dpmain.c.gs_sprintf ghostscript-9.07/psi/dpmain.c +--- ghostscript-9.07/psi/dpmain.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/dpmain.c 2013-05-09 17:02:39.097447219 +0100 +@@ -100,9 +100,9 @@ gs_free_dll(void) + return TRUE; + rc = DosFreeModule(gsdll.hmodule); + if (rc) { +- sprintf(buf, "DosFreeModule returns %d\n", rc); ++ gs_sprintf(buf, "DosFreeModule returns %d\n", rc); + gs_addmess(buf); +- sprintf(buf, "Unloaded GSDLL\n\n"); ++ gs_sprintf(buf, "Unloaded GSDLL\n\n"); + gs_addmess(buf); + } + return !rc; +@@ -150,7 +150,7 @@ gs_load_dll(void) + dllname = szDllName; + #ifdef DEBUG + if (debug) { +- sprintf(buf, "Trying to load %s\n", dllname); ++ gs_sprintf(buf, "Trying to load %s\n", dllname); + gs_addmess(buf); + } + #endif +@@ -172,7 +172,7 @@ gs_load_dll(void) + dllname = fullname; + #ifdef DEBUG + if (debug) { +- sprintf(buf, "Trying to load %s\n", dllname); ++ gs_sprintf(buf, "Trying to load %s\n", dllname); + gs_addmess(buf); + } + #endif +@@ -183,7 +183,7 @@ gs_load_dll(void) + dllname = shortname; + #ifdef DEBUG + if (debug) { +- sprintf(buf, "Trying to load %s\n", dllname); ++ gs_sprintf(buf, "Trying to load %s\n", dllname); + gs_addmess(buf); + } + #endif +@@ -197,21 +197,21 @@ gs_load_dll(void) + #endif + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_REVISION", + (PFN *) (&gsdll.revision))) != 0) { +- sprintf(buf, "Can't find GSAPI_REVISION, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_REVISION, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + /* check DLL version */ + if (gsdll.revision(&rv, sizeof(rv)) != 0) { +- sprintf(buf, "Unable to identify Ghostscript DLL revision - it must be newer than needed.\n"); ++ gs_sprintf(buf, "Unable to identify Ghostscript DLL revision - it must be newer than needed.\n"); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + + if (rv.revision != GS_REVISION) { +- sprintf(buf, "Wrong version of DLL found.\n Found version %ld\n Need version %ld\n", rv.revision, (long)GS_REVISION); ++ gs_sprintf(buf, "Wrong version of DLL found.\n Found version %ld\n Need version %ld\n", rv.revision, (long)GS_REVISION); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; +@@ -219,35 +219,35 @@ gs_load_dll(void) + + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_NEW_INSTANCE", + (PFN *) (&gsdll.new_instance))) != 0) { +- sprintf(buf, "Can't find GSAPI_NEW_INSTANCE, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_NEW_INSTANCE, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_DELETE_INSTANCE", + (PFN *) (&gsdll.delete_instance))) != 0) { +- sprintf(buf, "Can't find GSAPI_DELETE_INSTANCE, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_DELETE_INSTANCE, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_SET_STDIO", + (PFN *) (&gsdll.set_stdio))) != 0) { +- sprintf(buf, "Can't find GSAPI_SET_STDIO, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_SET_STDIO, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_SET_DISPLAY_CALLBACK", + (PFN *) (&gsdll.set_display_callback))) != 0) { +- sprintf(buf, "Can't find GSAPI_SET_DISPLAY_CALLBACK, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_SET_DISPLAY_CALLBACK, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_SET_POLL", + (PFN *) (&gsdll.set_poll))) != 0) { +- sprintf(buf, "Can't find GSAPI_SET_POLL, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_SET_POLL, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; +@@ -255,27 +255,27 @@ gs_load_dll(void) + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, + "GSAPI_INIT_WITH_ARGS", + (PFN *) (&gsdll.init_with_args))) != 0) { +- sprintf(buf, "Can't find GSAPI_INIT_WITH_ARGS, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_INIT_WITH_ARGS, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_RUN_STRING", + (PFN *) (&gsdll.run_string))) != 0) { +- sprintf(buf, "Can't find GSAPI_RUN_STRING, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_RUN_STRING, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + if ((rc = DosQueryProcAddr(gsdll.hmodule, 0, "GSAPI_EXIT", + (PFN *) (&gsdll.exit))) != 0) { +- sprintf(buf, "Can't find GSAPI_EXIT, rc = %d\n", rc); ++ gs_sprintf(buf, "Can't find GSAPI_EXIT, rc = %d\n", rc); + gs_addmess(buf); + gs_load_dll_cleanup(); + return FALSE; + } + } else { +- sprintf(buf, "Can't load Ghostscript DLL %s \nDosLoadModule rc = %d\n", ++ gs_sprintf(buf, "Can't load Ghostscript DLL %s \nDosLoadModule rc = %d\n", + szDllName, rc); + gs_addmess(buf); + gs_load_dll_cleanup(); +@@ -373,10 +373,10 @@ static int run_gspmdrv(IMAGE *img) + if (debug) + fprintf(stdout, "run_gspmdrv: starting\n"); + #endif +- sprintf(id, ID_NAME, img->pid, (ULONG)img->device); ++ gs_sprintf(id, ID_NAME, img->pid, (ULONG)img->device); + + /* Create termination queue - used to find out when gspmdrv terminates */ +- sprintf(term_queue_name, "\\QUEUES\\TERMQ_%s", id); ++ gs_sprintf(term_queue_name, "\\QUEUES\\TERMQ_%s", id); + if (DosCreateQueue(&(img->term_queue), QUE_FIFO, term_queue_name)) { + fprintf(stdout, "run_gspmdrv: failed to create termination queue\n"); + return e_limitcheck; +@@ -404,7 +404,7 @@ static int run_gspmdrv(IMAGE *img) + /* arguments are: */ + /* (1) -d (display) option */ + /* (2) id string */ +- sprintf(arg, "-d %s", id); ++ gs_sprintf(arg, "-d %s", id); + + /* because gspmdrv.exe is a different EXE type to gs.exe, + * we must use start session not DosExecPgm() */ +@@ -592,17 +592,17 @@ int display_open(void *handle, void *dev + return e_limitcheck; + } + img->pid = pppib->pib_ulppid; /* use parent (CMD.EXE) pid */ +- sprintf(id, ID_NAME, img->pid, (ULONG) img->device); ++ gs_sprintf(id, ID_NAME, img->pid, (ULONG) img->device); + + /* Create update event semaphore */ +- sprintf(name, SYNC_NAME, id); ++ gs_sprintf(name, SYNC_NAME, id); + if (DosCreateEventSem(name, &(img->sync_event), 0, FALSE)) { + fprintf(stdout, "display_open: failed to create event semaphore %s\n", name); + return e_limitcheck; + } + /* Create mutex - used for preventing gspmdrv from accessing */ + /* bitmap while we are changing the bitmap size. Initially unowned. */ +- sprintf(name, MUTEX_NAME, id); ++ gs_sprintf(name, MUTEX_NAME, id); + if (DosCreateMutexSem(name, &(img->bmp_mutex), 0, FALSE)) { + DosCloseEventSem(img->sync_event); + fprintf(stdout, "display_open: failed to create mutex semaphore %s\n", name); +@@ -612,7 +612,7 @@ int display_open(void *handle, void *dev + /* Shared memory is common to all processes so we don't want to + * allocate too much. + */ +- sprintf(name, SHARED_NAME, id); ++ gs_sprintf(name, SHARED_NAME, id); + if (DosAllocSharedMem((PPVOID) & img->bitmap, name, + 13 * 1024 * 1024, PAG_READ | PAG_WRITE)) { + fprintf(stdout, "display_open: failed allocating shared BMP memory %s\n", name); +@@ -1020,7 +1020,7 @@ main(int argc, char *argv[]) + else if (depth >= 4) + format = DISPLAY_COLORS_NATIVE | DISPLAY_ALPHA_NONE | + DISPLAY_DEPTH_4 | DISPLAY_LITTLEENDIAN | DISPLAY_BOTTOMFIRST; +- sprintf(dformat, "-dDisplayFormat=%d", format); ++ gs_sprintf(dformat, "-dDisplayFormat=%d", format); + } + nargc = argc + 1; + +diff -up ghostscript-9.07/psi/dscparse.c.gs_sprintf ghostscript-9.07/psi/dscparse.c +--- ghostscript-9.07/psi/dscparse.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/dscparse.c 2013-05-09 17:02:39.097447219 +0100 +@@ -38,7 +38,7 @@ + % %%ViewingOrientation: xx xy yx yy + */ + +-#include /* for sprintf(), not file I/O */ ++#include /* for sprintf(), not file I/O */ + #include + #include + #include +@@ -584,7 +584,7 @@ dsc_fixup(CDSC *dsc) + /* make sure all pages have a label */ + for (i=0; ipage_count; i++) { + if (strlen(dsc->page[i].label) == 0) { +- sprintf(buf, "%d", i+1); ++ gs_sprintf(buf, "%d", i+1); + if ((dsc->page[i].label = dsc_alloc_string(dsc, buf, (int)strlen(buf))) + == (char *)NULL) + return CDSC_ERROR; /* no memory */ +@@ -1178,7 +1178,7 @@ dsc_unknown(CDSC *dsc) + if (dsc->debug_print_fn) { + char line[DSC_LINE_LENGTH]; + unsigned int length = min(DSC_LINE_LENGTH-1, dsc->line_length); +- sprintf(line, "Unknown in %s section at line %d:\n ", ++ gs_sprintf(line, "Unknown in %s section at line %d:\n ", + dsc_scan_section_name[dsc->scan_section], dsc->line_count); + dsc_debug_print(dsc, line); + strncpy(line, dsc->line, length); +@@ -2669,7 +2669,7 @@ dsc_check_match_prompt(CDSC *dsc, const + strncpy(buf, dsc->line, dsc->line_length); + buf[dsc->line_length] = '\0'; + } +- sprintf(buf+strlen(buf), "\n%%%%Begin%.40s: / %%%%End%.40s\n", str, str); ++ gs_sprintf(buf+strlen(buf), "\n%%%%Begin%.40s: / %%%%End%.40s\n", str, str); + return dsc_error(dsc, CDSC_MESSAGE_BEGIN_END, buf, (int)strlen(buf)); + } + return CDSC_RESPONSE_CANCEL; +diff -up ghostscript-9.07/psi/dwimg.c.gs_sprintf ghostscript-9.07/psi/dwimg.c +--- ghostscript-9.07/psi/dwimg.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/dwimg.c 2013-05-09 17:02:39.098447223 +0100 +@@ -36,6 +36,11 @@ + + #define STRICT + #include ++ ++ ++/* prevent gp.h redefining sprintf */ ++#define sprintf sprintf ++ + #include "stdio_.h" + + #include "dwres.h" +diff -up ghostscript-9.07/psi/dwmainc.c.gs_sprintf ghostscript-9.07/psi/dwmainc.c +--- ghostscript-9.07/psi/dwmainc.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/dwmainc.c 2013-05-09 17:02:39.098447223 +0100 +@@ -13,6 +13,8 @@ + CA 94903, U.S.A., +1(415)492-9861, for further information. + */ + ++/* prevent gp.h redefining sprintf */ ++#define sprintf sprintf + + /* dwmainc.c */ + +diff -up ghostscript-9.07/psi/dxmain.c.gs_sprintf ghostscript-9.07/psi/dxmain.c +--- ghostscript-9.07/psi/dxmain.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/dxmain.c 2013-05-09 17:02:39.098447223 +0100 +@@ -1160,7 +1160,7 @@ int main(int argc, char *argv[]) + use_gui = gtk_init_check(&argc, &argv); + + /* insert display device parameters as first arguments */ +- sprintf(dformat, "-dDisplayFormat=%d", ++ gs_sprintf(dformat, "-dDisplayFormat=%d", + DISPLAY_COLORS_RGB | DISPLAY_ALPHA_NONE | DISPLAY_DEPTH_8 | + DISPLAY_BIGENDIAN | DISPLAY_TOPFIRST); + nargc = argc + 1; +diff -up ghostscript-9.07/psi/int.mak.gs_sprintf ghostscript-9.07/psi/int.mak +--- ghostscript-9.07/psi/int.mak.gs_sprintf 2013-05-09 17:02:39.018446879 +0100 ++++ ghostscript-9.07/psi/int.mak 2013-05-09 17:02:39.098447223 +0100 +@@ -651,7 +651,7 @@ $(PSOBJ)zdscpars.$(OBJ) : $(PSSRC)zdscpa + $(gsstruct_h) + $(PSCC) $(PSO_)zdscpars.$(OBJ) $(C_) $(PSSRC)zdscpars.c + +-$(PSOBJ)dscparse.$(OBJ) : $(PSSRC)dscparse.c $(dscparse_h) ++$(PSOBJ)dscparse.$(OBJ) : $(PSSRC)dscparse.c $(dscparse_h) $(stdio__h) + $(PSCC) $(PSO_)dscparse.$(OBJ) $(C_) $(PSSRC)dscparse.c + + dscparse_=$(PSOBJ)zdscpars.$(OBJ) $(PSOBJ)dscparse.$(OBJ) +diff -up ghostscript-9.07/psi/iparam.c.gs_sprintf ghostscript-9.07/psi/iparam.c +--- ghostscript-9.07/psi/iparam.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/iparam.c 2013-05-09 17:02:39.099447227 +0100 +@@ -65,7 +65,7 @@ ref_to_key(const ref * pref, gs_param_ke + int len; + byte *buf; + +- sprintf(istr, "%"PRIpsint, pref->value.intval); ++ gs_sprintf(istr, "%"PRIpsint, pref->value.intval); + len = strlen(istr); + /* GC will take care of freeing this: */ + buf = gs_alloc_string(plist->memory, len, "ref_to_key"); +diff -up ghostscript-9.07/psi/iutil2.c.gs_sprintf ghostscript-9.07/psi/iutil2.c +--- ghostscript-9.07/psi/iutil2.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/iutil2.c 2013-05-09 17:02:39.099447227 +0100 +@@ -56,7 +56,7 @@ param_read_password(gs_param_list * plis + code = param_read_long(plist, kstr, &ipass); + if (code != 0) /* error or missing */ + return code; +- sprintf((char *)ppass->data, "%ld", ipass); ++ gs_sprintf((char *)ppass->data, "%ld", ipass); + ppass->size = strlen((char *)ppass->data); + return 0; + } +diff -up ghostscript-9.07/psi/iutil.c.gs_sprintf ghostscript-9.07/psi/iutil.c +--- ghostscript-9.07/psi/iutil.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/iutil.c 2013-05-09 17:02:39.099447227 +0100 +@@ -340,10 +340,10 @@ obj_cvp(const ref * op, byte * str, uint + float value = op->value.realval; + float scanned; + +- sprintf(buf, "%g", value); ++ gs_sprintf(buf, "%g", value); + sscanf(buf, "%f", &scanned); + if (scanned != value) +- sprintf(buf, "%.9g", value); ++ gs_sprintf(buf, "%.9g", value); + ensure_dot(buf); + goto rs; + } +@@ -494,7 +494,7 @@ other: + data = (const byte *)(op->value.boolval ? "true" : "false"); + break; + case t_integer: +- sprintf(buf, "%"PRIpsint, op->value.intval); ++ gs_sprintf(buf, "%"PRIpsint, op->value.intval); + break; + case t_string: + check_read(*op); +@@ -529,7 +529,7 @@ other: + break; + } + /* Internal operator, no name. */ +- sprintf(buf, "@0x%lx", (ulong) op->value.opproc); ++ gs_sprintf(buf, "@0x%lx", (ulong) op->value.opproc); + break; + } + case t_real: +@@ -542,7 +542,7 @@ other: + if (op->value.realval == (float)0.0001) { + strcpy(buf, "0.0001"); + } else { +- sprintf(buf, "%g", op->value.realval); ++ gs_sprintf(buf, "%g", op->value.realval); + } + ensure_dot(buf); + break; +@@ -573,9 +573,9 @@ ensure_dot(char *buf) + sscanf(pe + 1, "%d", &i); + /* MSVC .net 2005 express doesn't support "%+02d" */ + if (i >= 0) +- sprintf(pe + 1, "+%02d", i); ++ gs_sprintf(pe + 1, "+%02d", i); + else +- sprintf(pe + 1, "-%02d", -i); ++ gs_sprintf(pe + 1, "-%02d", -i); + } else if (strchr(buf, '.') == NULL) { + strcat(buf, ".0"); + } +diff -up ghostscript-9.07/psi/msvc.mak.gs_sprintf ghostscript-9.07/psi/msvc.mak +--- ghostscript-9.07/psi/msvc.mak.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/msvc.mak 2013-05-09 17:02:39.099447227 +0100 +@@ -332,6 +332,10 @@ TIFFCONFIG_SUFFIX=.vc + TIFFPLATFORM=win32 + !endif + ++!ifndef TRIOSRCDIR ++TRIOSRCDIR=trio ++!endif ++ + # Define the directory where the zlib sources are stored. + # See zlib.mak for more information. + +diff -up ghostscript-9.07/psi/zbfont.c.gs_sprintf ghostscript-9.07/psi/zbfont.c +--- ghostscript-9.07/psi/zbfont.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/zbfont.c 2013-05-09 17:02:39.099447227 +0100 +@@ -109,7 +109,7 @@ zfont_encode_char(gs_font *pfont, gs_cha + + if (gspace == GLYPH_SPACE_NOGEN) + return gs_no_glyph; +- sprintf(buf, "j%ld", chr); /* 'j' is arbutrary. */ ++ gs_sprintf(buf, "j%ld", chr); /* 'j' is arbutrary. */ + code = name_ref(pfont->memory, (const byte *)buf, strlen(buf), &tname, 1); + if (code < 0) { + /* Can't propagate the error due to interface limitation, +@@ -131,7 +131,7 @@ zfont_glyph_name(gs_font *font, gs_glyph + char cid_name[sizeof(gs_glyph) * 3 + 1]; + int code; + +- sprintf(cid_name, "%lu", (ulong) index); ++ gs_sprintf(cid_name, "%lu", (ulong) index); + code = name_ref(font->memory, (const byte *)cid_name, strlen(cid_name), + &nref, 1); + if (code < 0) +diff -up ghostscript-9.07/psi/zdouble.c.gs_sprintf ghostscript-9.07/psi/zdouble.c +--- ghostscript-9.07/psi/zdouble.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/zdouble.c 2013-05-09 17:02:39.100447231 +0100 +@@ -323,7 +323,7 @@ zcvsd(i_ctx_t *i_ctx_p) + len = r_size(op - 1); + if (len > MAX_CHARS) + return_error(e_limitcheck); +- sprintf(buf, "%f", 1.5); ++ gs_sprintf(buf, "%f", 1.5); + dot = buf[1]; /* locale-dependent */ + memcpy(str, op[-1].value.bytes, len); + /* +@@ -406,7 +406,7 @@ zdcvs(i_ctx_t *i_ctx_p) + if (code < 0) + return code; + check_write_type(*op, t_string); +- sprintf(str, "%f", 1.5); ++ gs_sprintf(str, "%f", 1.5); + dot = str[1]; /* locale-dependent */ + /* + * To get fully accurate output results for IEEE double- +@@ -420,10 +420,10 @@ zdcvs(i_ctx_t *i_ctx_p) + { + double scanned; + +- sprintf(str, "%g", num); ++ gs_sprintf(str, "%g", num); + sscanf(str, "%lf", &scanned); + if (scanned != num) +- sprintf(str, "%.16g", num); ++ gs_sprintf(str, "%.16g", num); + } + len = strlen(str); + if (len > r_size(op)) +diff -up ghostscript-9.07/psi/zfapi.c.gs_sprintf ghostscript-9.07/psi/zfapi.c +--- ghostscript-9.07/psi/zfapi.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/zfapi.c 2013-05-09 17:02:39.100447231 +0100 +@@ -583,11 +583,11 @@ FAPI_FF_get_word(gs_fapi_font *ff, gs_fa + length += r_size(&string) + 1; + break; + case t_real: +- sprintf(Buffer, "%f", Element.value.realval); ++ gs_sprintf(Buffer, "%f", Element.value.realval); + length += strlen(Buffer) + 1; + break; + case t_integer: +- sprintf(Buffer, "%"PRIpsint, Element.value.intval); ++ gs_sprintf(Buffer, "%"PRIpsint, Element.value.intval); + length += strlen(Buffer) + 1; + break; + case t_operator: +@@ -823,12 +823,12 @@ FAPI_FF_get_proc(gs_fapi_font *ff, gs_fa + ptr += r_size(&string); + break; + case t_real: +- sprintf(Buf, "%f", Element.value.realval); ++ gs_sprintf(Buf, "%f", Element.value.realval); + strcpy(ptr, Buf); + ptr += strlen(Buf); + break; + case t_integer: +- sprintf(Buf, "%"PRIpsint, Element.value.intval); ++ gs_sprintf(Buf, "%"PRIpsint, Element.value.intval); + strcpy(ptr, Buf); + ptr += strlen(Buf); + break; +diff -up ghostscript-9.07/psi/zfont2.c.gs_sprintf ghostscript-9.07/psi/zfont2.c +--- ghostscript-9.07/psi/zfont2.c.gs_sprintf 2013-02-14 07:58:13.000000000 +0000 ++++ ghostscript-9.07/psi/zfont2.c 2013-05-09 17:02:39.101447236 +0100 +@@ -2666,7 +2666,7 @@ parse_font(i_ctx_t *i_ctx_p, ref *topdi + return sid; + if ((code = make_name_from_sid(i_ctx_p, &name, strings, data, sid)) < 0) { + char buf[40]; +- int len = sprintf(buf, "sid-%d", sid); ++ int len = gs_sprintf(buf, "sid-%d", sid); + + if ((code = name_ref(imemory, (unsigned char *)buf, len, &name, 1)) < 0) + return code; +diff -up ghostscript-9.07/trio/autogen.sh.gs_sprintf ghostscript-9.07/trio/autogen.sh +--- ghostscript-9.07/trio/autogen.sh.gs_sprintf 2013-05-09 17:02:39.101447236 +0100 ++++ ghostscript-9.07/trio/autogen.sh 2013-05-09 17:02:39.101447236 +0100 +@@ -0,0 +1,3 @@ ++#!/bin/sh ++autoconf ++rm -rf autom4te.cache +diff -up ghostscript-9.07/trio/CHANGES.gs_sprintf ghostscript-9.07/trio/CHANGES +--- ghostscript-9.07/trio/CHANGES.gs_sprintf 2013-05-09 17:02:39.101447236 +0100 ++++ ghostscript-9.07/trio/CHANGES 2013-05-09 17:02:39.101447236 +0100 +@@ -0,0 +1,785 @@ ++CHANGES -- trio ++ ++ ++The changes listed without a name attributed to them were most likely done by ++Bjorn Reese and/or Daniel Stenberg. ++ ++Version 1.14 - 2010/01/26 ++------------------------- ++* David Byron ++ Added trio_xstring_append_max. ++ ++* Fixed compilation problem on Cygwin due to lack of long double math ++ (reported by Matthias Andree). ++ ++* David Boyce ++ Added #undef of standard stdio function names before assigning trio functions ++ to them. ++ ++* Matthias Andree ++ Upgraded configure.in to use new macros instead of obsoleted macros. ++ ++* Matthias Andree ++ Added VPATH to Makefile.in ++ ++* Tom Honermann ++ Fixed problem with subnormal numbers which caused an infinite loop outputting ++ leading spaces. ++ ++* Adam McLaurin ++ Improved parsing performance by avoiding memset() and memcpy() on character ++ arrays. ++ ++* Gideon Smeding ++ Fixed %u scanning of signed numbers. ++ ++* Gideon Smeding ++ Fixed group scanning for non-matching input. ++ ++* Fixed missing undo of look-ahead reading for scanf functions. This does only ++ work for the scanf* and fscanf* functions, not dscanf* and cscanf* functions ++ (reported by Gideon Smeding). ++ ++* If the format string is empty, scanf does not attempt to read any input. ++ ++* Ralf Junker ++ Fixed Borland compilation for user-defined specifiers. ++ ++ ++Version 1.13 - 2008/11/09 ++------------------------- ++* Ives Aerts ++ Added the $ format for user-defined specifiers, which is ++ compatible with compiler warnings about mismatches between specifiers and ++ arguments. ++ ++* Added TRIO_DEPRECATED flag (reported by David Boyce) ++ ++* Fixed rounding adjustment for long double (reported as bug item #2136686). ++ ++* Added Makefile dependency for test target (reported as bug item #2136636). ++ ++* David Boyce ++ Fixed long long support for MSVC. ++ ++* Fixed potential problem with read after buffer end for non-zero terminated ++ strings (reported as bug item #1828465). ++ ++* Andreas Stricker ++ Added WinCE support. ++ ++* Fixed number of significant digits for %g. ++ ++ ++Version 1.12 - 2006/10/22 ++------------------------- ++* Fixed scanning of floats (reported by Bernd Ahlers). ++ ++* Fixed configure.in for GCC on Tru64 and MIPSpro on IRIX (reported by Andreas ++ Maus). ++ ++* Olli Savia ++ Added support for LynxOS. ++ ++ ++Version 1.11 - 2006/04/08 ++------------------------- ++* Mark Pickelmann ++ Fixed trio_unregister. If the first element was removed, the remaining ++ list would be removed as well. ++ ++* Fixed unintended formatting of %e that would result in non-zero numbers ++ starting with zero (reported by Mark Pickelmann and Gisli Ottarsson). ++ ++* Fixed compilation with Sun Workshop 6 (reported by Matthias Andree). ++ ++* Fixed accuracy for denormalized numbers (bug item #758327). ++ ++* Glen Davidson ++ Fixed scanning of floating-point numbers without a decimal-point (bug item ++ #1370427). ++ ++* David Byron ++ Fixed more compiler warnings. ++ ++* Fixed compilation of trio_to_long_double and TRIO_FEATURE_FLOAT (reported by ++ David Byron). ++ ++* Fixed precision of large floating-point numbers (bug item #1314524). ++ ++* Karl Bochert ++ Fixed trio_fpclassify_and_signbit to only restore the floating-point ++ precision. ++ ++* Fixed detection of need for ieee option on FreeBSD/Alpha. ++ ++* Added TRIO_SNPRINTF_ONLY compilation. ++ ++* Fixed trio_to_double by not using strtod() on Tru64/DECC because it does not ++ support hex-floats. ++ ++* Fixed crash on 64 bits machines related to a previous workaround in version ++ 1.9 for uninitialized va_list (reported by Nicolai Tufar, suggestion by ++ Douglas Gwyn). ++ ++* Patrick Jessee ++ Fixed width calculation for %g. ++ ++* Added macros for internal features. ++ ++* Jon Foster ++ Added macros for conditional compilation of many features. Documented all ++ the features. ++ ++* Karl Bochert ++ Fixed problem with Borland C++, which changes the floating-point precision ++ for certain math functions (log10() and _fpclass()). ++ ++* Karl Bochert ++ Fixed compilation warnings on Borland C++. ++ ++* Removed any occurrence of #elif because Borland C++ reports wrong line ++ numbers when they are present (reported by Karl Bochert). ++ ++* David Byron ++ Added trio_asprintfv. ++ ++* Brian Chapman ++ Fixed Mac OS X compilation. ++ ++* David Byron ++ Fixed several compiler warnings. ++ ++* Fixed printing of out-of-range arguments for %hhd and %hd. These arguments ++ can be out of range because of default integer promotion. ++ ++* Bob Friesenhahn ++ Fixed installation of header files. ++ ++* Joe Orton ++ Added SHELL to Makefile.in to avoid problems with CShells. ++ ++* Shaun Tancheff ++ Fixed regresion tests for MSVC. ++ ++* Craig Berry ++ Fixed the VMS C99 workaround. ++ ++ ++Version 1.10 - 2003/03/06 ++------------------------- ++* Rearranged some include files to accommodate large file support (reported by ++ Albert Chin-A-Young). ++ ++* Added support for SunOS 4.1.x lack of strerror, tolower, and toupper ++ (reported by Peter McCluskey). ++ ++* Fixed pedantic compilation with TRIO_MINIMAL. ++ ++* Jose Kahan ++ Moved to avoid redefinition problems. ++ ++* Fixed hex-float exponents (reported by Matthias Clasen). ++ ++* Fixed handling of negative width and precision via paramters (reported by ++ Jacob Navia). ++ ++* Nigel Hall ++ Fixed TRIO_VA_START for VMS. ++ ++* Rune Enggaard Lausen ++ Fixed compilation for Borland C++ Builder. ++ ++* Fixed precision of hex-float numbers (reported by James Antill). ++ ++* Fixed plus sign only to be added for signed numbers. ++ ++* Fixed printing of integers with value and precision of zero (reported by ++ James Antill). ++ ++* Fixed %#.o to only print one zero if the value is zero (reported by James ++ Antill). ++ ++* Rewrote check for IEEE compilation option to remove dependency on additional ++ scripts. ++ ++* Mehdi Lavasani ++ Makefile install target fixed to work with older install programs. ++ ++* Collapsed the DECC, MSVC, HP-UX, and AIX code for trio_fpclassify_and_sign() ++ with further preprocessing. ++ ++ ++Version 1.9 - 2002/10/13 ++------------------------ ++* Fixed trio_fpclassify_and_signbit on AIX 3.2 ++ ++* Added configure check for -ieee/-mieee compilation option for Alpha machines. ++ ++* Craig Berry ++ Fixed compilation on VMS. ++ ++* Albert Chin-A-Young ++ Fixed incorrect conditional expression in trio_isinf. ++ ++* Fixed the warnings about uninitialized va_list in the printfv and scanfv ++ family without the use of compiler specific pragmas (suggested by Ian ++ Pilcher). ++ ++* Fixed space flag for floating-point numbers (reported by Ian Main). ++ ++ ++Version 1.8 - 2002/07/10 ++------------------------ ++* Fixed infinite loop in multibyte handling (reported by Gisli Ottarsson). ++ ++* Added the customizable cprintf/cscanf family which enables to user to specify ++ input and output stream functions (suggested by Florian Schulze). ++ ++* Fixed trio_isinf by removing the HP-UX workaround, and instead making sure ++ that the C99 macro will adhere to the trio return values (reported by Luke ++ Dunstan). ++ ++* Alexander Lukyanov ++ Fixed boundary case for scanning and EOF. ++ ++* Jacob Navia ++ Enabled the L modifier for formatting. ++ ++* Added TRIO_MINIMAL to build trio without the string functions. ++ ++* Added the R modifier to print rounded floating-point numbers. ++ ++* Added trio_to_long_double and long double scanning (the L modifier). ++ ++* Added trio_locale_decimal_point, trio_locale_thousand_separator, ++ trio_locale_grouping to overwrite locale settings. ++ ++* Rewrote TrioWriteDouble to avoid temporary buffers and thus the danger of ++ buffer overflows (for instance %.5000f). ++ ++* Improved floating-point formatting accuracy. ++ ++* Fixed formatting of non-decimal exponents. ++ ++* Fixed thousand separator checking. ++ ++* Fixed %f scanning to get a float and %lf to get a double. ++ ++* Fixed WIN32 compilation (reported by Emmanuel Mogenet) ++ ++* Fixed regression test cases to exclude disabled features. ++ ++ ++Version 1.7 - 2002/05/07 ++------------------------ ++* Fixed trio_to_double to handle hex-floats properly. ++ ++* Fixed printing of %a-format to be like %e, not like %g. ++ ++* Fixed floating-point printing of values beyond the machine accuracy. ++ ++* Fixed %f for printing with large precision. ++ ++* Fixed the usage of C99 nan(), which caused a crash on OSF/1 (reported by ++ Georg Bolz) ++ ++* Joe Orton ++ Fixed %p on 64-bit platforms. ++ ++* Made trio compile with K&R compilers. ++ ++* Emmanuel Mogenet ++ Fixed bug in trio_asprintf. ++ ++* Emmanuel Mogenet ++ Various WIN32 fixes. ++ ++* Joe Orton ++ Fixed trio_isinf() on HP-UX, and added test cases. ++ ++* Joe Orton ++ Fixed non-portable use of $^ in Makefile. ++ ++* Joe Orton ++ Added autoconf. ++ ++* Alexander Lukyanov ++ Fixed a number of bugs in the scanning of EOF and the count specifier. ++ ++* Richard Jinks ++ Added trio_nzero ++ ++* Fixed incorrect handling of return code from TrioReadChar (reported by ++ Henrik Löf) ++ ++* Fixed parsing of character class expressions. ++ ++* Fixed trio_to_double which did not work with long fractions. ++ ++* Fixed %f for printing of large numbers. ++ ++* Fixed %#s to handle whitespaces as non-printable characters. ++ ++* Added trio_isfinite, trio_signbit, and trio_fpclassify. ++ ++* Added new test cases. ++ ++ ++Version 1.6 - 2002/01/13 ++------------------------ ++* Added dynamic string functions. ++ ++* Rewrote and extended documentation in JavaDoc (using Doxygen). ++ ++* Moved and renamed strio functions to triostr. ++ ++* Robert Collins ++ Added definition for Cygwin. ++ ++* Markus Henke ++ Added long double workaround for the HP C/iX compiler. ++ ++* Marc Verwerft ++ Improved error handling for dynamically allocated strings. ++ ++* John Fotheringham ++ Made trionan compile on OpenVMS. ++ ++* Added 'd' and 'D' as exponent letters when using TRIO_MICROSOFT. ++ ++* Fixed uninitial memory read for the parameter modifiers. ++ ++ ++Version 1.5 - 2001/09/08 ++------------------------ ++* Merged with libxml changes. ++ ++* Moved NaN and Inf handling to separate file to enable reuse in other ++ projects. ++ ++* Igor Zlatkovic ++ Fixed TrioGenerateNan for MSVC. ++ ++* Fixed lots of preprocessor macros and internal data structure names. ++ ++ ++Version 1.4 - 2001/06/03 ++------------------------ ++* Added hex-float (%a and %A) for scanning. ++ ++* Added wide character arguments (%ls, %ws, %S, %lc, %wc, and %C) for both ++ printf and scanf. ++ ++* Added mutex callbacks for user-specified specifiers to enable applications to ++ add thread-safety. These are registered with trio_register, where the ++ namespace is set to either ":enter" to lock a mutex, or ":leave" to unlock a ++ mutex. ++ ++* Added equivalence class expressions for scanning. For example, %[[=a=]] scans ++ for all letters in the same equivalence class as the letter 'a' as defined ++ by the locale. ++ ++* Changed character class expressions for scanning. The expressions must now ++ be embedded withing an extra set of brackets, e.g. %[[:alpha:]]. This was ++ done to adhere to the syntax of UNIX98 regular expressions. ++ ++* Added the possibility to specify standard support (TRIO_C99 etc.) as compiler ++ options. ++ ++* Fixed conversion of hex-float in StrToDouble. ++ ++* Fixed formatting of hex-float numbers. ++ ++* Stan Boehm ++ Fixed crash on QNX, which happend because some buffers on the stack were too ++ big. ++ ++* Fixed default precision for %f and %g (reported by Jose Ortiz) ++ ++* Howard Kapustein ++ Added the I8, I16, I32, and I64 modifiers. ++ ++* Jose Ortiz ++ Fixed rounding problem for %e. ++ ++* Jose Ortiz ++ Fixed various problems with the xlC and Sun C++ compilers. ++ ++ ++Version 1.3 - 2001/05/16 ++------------------------ ++* trio's treatment of the field width when the %e code was used was not ++ correct (reported by Gisli Ottarsson). It turns out the fraction part should ++ be zero-padded by default and the exponent part should be zero-prefixed if ++ it is only one digit. At least that's how the GNU and Sun libc's work. The ++ trio floating point output looks identical to them now. ++ ++* Fixed group scanning with modifiers. ++ ++* Fixed compilation for 64-bit Digital Unix. ++ ++* Igor Zlatkovic ++ Fixed compilation of dprintf, which uses read/write, for MSVC. ++ ++* Fixed various compilation problems on Digital Unix (mainly associated with ++ va_list). ++ ++ ++Version 1.2 - 2001/04/11 ++------------------------ ++* Added autoconf integration. If compiled with HAVE_CONFIG_H the following ++ happens. Firstly, is included. Secondly, trio will only be ++ compiled if WITH_TRIO is defined herein. Thirdly, if TRIO_REPLACE_STDIO is ++ defined, only stdio functions that have not been detected by autoconf, i.e. ++ those not defined by HAVE_PRINTF or similar, will be replaced by trio ++ functions (suggested by Daniel Veillard). ++ ++* Fixed '%m.nf' output. Previously trio did not treat the width properly ++ in all cases (reported by Gisli Ottarsson). ++ ++* Added explicit promotion for the scanfv family. ++ ++* Fixed more C++ compilation warnings. ++ ++ ++Version 1.1 - 2001/02/25 ++------------------------ ++* Added explicit promotion for the printfv familiy. A float must be specified ++ by %hf. ++ ++* Fixed positionals for printfv (reported by Gisli Ottarsson). ++ ++* Fixed an integer to pointer conversion problem on the SGI MIPS C compiler ++ (reported by Gisli Ottarsson). ++ ++* Fixed ANSI C++ warnings (type casting, and namespace is a reserved keyword). ++ ++* Added \n to all examples in the documentation to prevent confusion. ++ ++* Fixed StrSubstringMax ++ ++ ++Version 1.0 - 2000/12/10 ++------------------------ ++* Bumped Version number. ++ ++ ++Version 0.25 - 2000/12/09 ++------------------------- ++* Wrote more documentation. ++ ++* Improved NaN support and added NaN to regression test. ++ ++* Fixed C99 support. ++ ++* Added missing getter/setter functions. ++ ++ ++Version 0.24 - 2000/12/02 ++------------------------- ++* Added callback functionality for the user-defined specifier (<>). All ++ the necessary functions are defined in triop.h header file. See the ++ documentation for trio_register for further detail. ++ ++* Wrote initial documentation on the callback functionality. ++ ++* Added the printfv and scanfv family of functions, which takes a pointer ++ array rather than variadic arguments. Each pointer in the array must point ++ to the associated data (requested by Bruce Korb). ++ ++* As indicated in version 0.21 the extension modifiers (<>) have now been ++ completely removed. ++ ++* Added skipping of thousand-separators in floating-point number scanning. ++ ++ ++Version 0.23 - 2000/10/21 ++------------------------- ++* Added width to scanning of floating-point numbers. ++ ++* Wrote more documentation on trio_printf. ++ ++* Fixed problem with trailing zeroes after decimal-point. ++ ++ ++Version 0.22 - 2000/08/06 ++------------------------- ++* Added LC_CTYPE locale dependent character class expressions to scan lists. ++ Included are [:alnum:], [:alpha:], [:cntrl:], [:digit:], [:graph:], ++ [:lower:], [:print:], [:punct:], [:space:], [:upper:], [:xdigit:] ++ ++* Added C escapes to alternative string formatting and scanning. ++ ++* Added StrSubstringMax. ++ ++* Wrote a little more documentation. ++ ++* Fixed scanf return values. ++ ++* Fixed a sign error for non-ascii characters. ++ ++ ++Version 0.21 - 2000/07/19 ++------------------------- ++* Converted the documentation to TeX. With latex2man the documentation can ++ automatically be converted into man pages. ++ ++* Added trio_scanf, trio_vscanf, trio_fscanf, and trio_vfscanf. ++ ++* Added trio_dprintf, trio_vdprintf, trio_dscanf, and trio_vdscanf. These ++ functions can be used to write and read directly to pipes and sockets (the ++ assume blocking sockets). Stdio buffering is surpassed, so the functions are ++ async-safe. However, reading from stdin (STDIN_FILENO) or writing to stdout ++ (STDOUT_FILENO) reintroduces the buffering. ++ ++* Paul Janzen ++ Added trio_asprintf and trio_vasprintf, which are compatible with the GNU ++ and BSD interfaces. ++ ++* Added scanlist ranges for group scanning (%[]). ++ ++* Added width for scanning (missing for floating-point numbers though). ++ ++* Added variable size modifier (&) to handle system defined types of unknown ++ size. This modifier makes certain assumptions about the integer sizes, which ++ may not be valid on any machine. Consequently, the modifier will remain ++ undocumented, as it may be removed later. ++ ++* Added \777 and \xFF to alternative string scanning (%#s) ++ ++* Added the TRIO_REPLACE_STDIO check in the header. ++ ++* Improved performance of the multibyte character parsing. ++ ++* Fixed positionals (%n$) which had stopped working. ++ ++* Fixed hh and ll modifiers to allow exactly two letters and no more. ++ ++* Fixed ANSI C++ warnings. Also fixed the compiler warning about casting ++ between integer and pointer (this has been annoying me for ages). ++ ++* Fixed snprintf and vsnprintf with zero buffer size. ++ ++* Fixed NAN problems (reported by Keith Briggs). ++ ++* Fixed parsing of multibyte characters. The format string was not correctly ++ advanced in case of a multibyte character. ++ ++* Renamed many of the internal functions to have more consistant names. ++ ++* Removed the and modifiers. They are not really worth ++ including. The other <> modifiers may disappear as well. ++ ++ ++Version 0.20 - 2000/06/05 ++------------------------- ++* Added intmax_t and ptrdiff_t support. ++ ++* Added support for LC_NUMERIC grouping. ++ ++* Added double-dot notation for the conversion base. The style is now ++ %width.precision.base, where any argument can be a number, an asterix ++ indicating a parameter, or be omitted entirely. For example, %*..2i is ++ to specify binary numbers without precision, and with width as a parameter ++ on the va_list. ++ ++* Added sticky modifier (!), which makes subsequent specifiers of the same ++ type reuse the current modifiers. Inspired by a suggestion from Gary Porter. ++ ++* Added group scanning (%[]). Scanlist ranges and multibyte sequences are not ++ supported yet. ++ ++* Added count scanning (%n). ++ ++* Changed the number scanning to accept thousand separators and any base. ++ ++* Fixed positional for parameters. It is possible to write something like ++ %3$*1$.*2$d (which happens to be the same as %*.*d). ++ ++* Fixed precision of integers. ++ ++* Fixed parameter flags. Before trio could only handle one parameter flag per ++ specifier, although two (three with double-dot base) were possible. ++ ++* Fixed isinf() for those platforms where it is unimplemented. ++ ++ ++Version 0.18 - 2000/05/27 ++------------------------- ++* Rewrote the entire floating-point formatting function (Danny Dulai had ++ reported several errors and even supplied some patches, which unfortunately ++ were lost due to the refactoring). ++ ++* Removed the use of strlen() in the declaration of a stack array. This ++ caused problems on some compilers (besides it isn't really ANSI C compliant ++ anyways). Using some arbitrarily chosen maximum value; should examine if ++ some standard defines an upper limit on the length of decimal-point and ++ thousands-separator (sizeof(wchar_t) perhaps?) ++ ++* Changed the parsing of the format string to be multibyte aware. ++ ++ ++Version 0.17 - 2000/05/19 ++------------------------- ++* Added INF, -INF, and NAN for floating-point numbers. ++ ++* Fixed %#.9g -- alternative with precision. ++ ++* Ken Gibson ++ Fixed printing of negative hex numbers ++ ++* Joerg (last name unknown) ++ Fixed convertion of non-ASCII characters ++ ++ ++Version 0.16 - 1999/08/06 ++------------------------- ++* Changed the constness of the second argument of StrFloat and StrDouble. The ++ lack of parameter overloading in C is the reason for the strange use of ++ constness in strtof and strtod. ++ ++* Cleaned up constness. ++ ++ ++Version 0.15 - 1999/07/23 ++------------------------- ++* Fixed the internal representation of numbers from signed to unsigned. Signed ++ numbers posed a problem for large unsigned numbers (reported by Tero) ++ ++* Fixed a tiny bug in trio_vsprintfcat ++ ++* Changed the meaning of the max argument of StrAppendMax to be consistant ++ with StrFormatAppendMax. Now it is the maximal size of the entire target ++ buffer, not just the appended size. This makes it easier to avoid buffer ++ overflows (requested by Tero) ++ ++ ++Version 0.14 - 1999/05/16 ++------------------------- ++* Added size_t support (just waiting for a C99 compliant compiler to add ++ ptrdiff_t and intmax_t) ++ ++* Rewrote TrioOutStreamDouble so it does not use the libc sprintf to emulate ++ floating-point anylonger. ++ ++* Fixed width, precision, and adjustment for numbers and doubles. ++ ++ ++Version 0.13 - 1999/05/06 ++------------------------- ++* Fixed zero padding for %d. Now %d will only zero pad if explicitly requested ++ to do so with the 0 flag (reported by Tero). ++ ++* Fixed an incorrect while() condition in TrioGetString (reported by Tero). ++ ++ ++Version 0.12 - 1999/04/19 ++------------------------- ++* Fixed incorrect zero padding of pointers ++ ++* Added StrHash with STRIO_HASH_PLAIN ++ ++* Added StrFormatDateMax ++ ++ ++Version 0.11 - 1999/03/25 ++------------------------- ++* Made it compile under cygwin ++ ++* Fixed a bug were TrioPreprocess would return an error if no formatting chars ++ were found (reported by Tero). ++ ++ ++Version - 1999/03/19 ++-------------------- ++* Added trio_strerror and TRIO_ERROR_NAME. ++ ++* Changed the error codes to be positive (as errno) ++ ++* Fixed two reads of uninitialized memory reported by Purify ++ ++* Added binary specifiers 'b' and 'B' (like SCO.) ThousandSeparator can be ++ used to separate nibbles (4 bit) ++ ++* Renamed all Internal* functions to Trio*, which seems like a better ++ namespace (even though it is of no practical interest because these ++ functions are not visible beyond the scope of this file.) ++ ++ ++Version - 1999/03/12 ++-------------------- ++* Added hex-float format for StrToDouble ++ ++* Double references and gaps in the arguments are not allowed (for the %n$ ++ format) and in both cases an error code is returned. ++ ++* Added StrToDouble (and StrToFloat) ++ ++ ++Version - 1999/03/08 ++-------------------- ++* Added InStream and OutStream to the trio_T structure. ++ ++* Started work on TrioScan. ++ ++* Return values for errors changed. Two macros to unpack the error code has ++ been added to the header. ++ ++* Shortshort (hh) flag added. ++ ++* %#s also quotes the quote-char now. ++ ++* Removed the 'errorInFormat' boolean, which isn't used anymore after the ++ functions bail out with an error instead. ++ ++ ++Version - 1999/03/04 ++-------------------- ++* More than MAX_PARAMETERS parametes will now cause the TrioPreprocess() ++ function to return error. ++ ++* Unknown flags and/or specifiers cause errors too. ++ ++* Added trio_snprintfcat and trio_vsnprintfcat and the defined name ++ StrFormatAppendMax. They append a formatted string to the end of a string. ++ ++* Define MAX_PARAMETERS to 128 at all times instead of using NL_ARGMAX when ++ that exists. ++ ++* Added platform fixes for Amiga as suggested by Tero Jänkä ++ ++ ++Version - 1999/01/31 ++-------------------- ++* vaprintf did add a zero byte even when it had failed. ++ ++* Cleaned up the code for locale handling and thousand separator ++ ++* Added trio_aprintf() and trio_vaprintf(). They return an allocated string. ++ ++* Added thousands separator for numbers ++ ++* Added floating point support for *printf ++ ++ ++Version - 1998/10/20 ++-------------------- ++* StrMatchCase() called StrMatch() instead of itself recursively ++ ++* Rewrote the implementation of *printf and *scanf and put all the code in ++ this file. Extended qualifiers and qualifiers from other standards were ++ added. ++ ++* Added StrSpanFunction, StrToLong, and StrToUnsignedLong ++ ++ ++Version - 1998/05/23 ++-------------------- ++* Made the StrEqual* functions resistant to NULL pointers ++ ++* Turns out strdup() is no standard at all, and some platforms (I seem to ++ recall HP-UX) has problems with it. Made our own StrDuplicate() instead. ++ ++* Added StrFormat() and StrFormatMax() to serve as sprintf() and snprintf() ++ respectively. +diff -up ghostscript-9.07/trio/compare.c.gs_sprintf ghostscript-9.07/trio/compare.c +--- ghostscript-9.07/trio/compare.c.gs_sprintf 2013-05-09 17:02:39.101447236 +0100 ++++ ghostscript-9.07/trio/compare.c 2013-05-09 17:02:39.101447236 +0100 +@@ -0,0 +1,53 @@ ++#include "trio.h" ++ ++#define compare(format, value) printf("FORMAT: %s\n", format); printf("TRIO: "); trio_printf(format,value); printf("\nLIBC: "); \ ++printf(format,value); printf("\n\n"); ++ ++int main() ++{ ++ compare("\"%e\"",2.342E+02); ++ compare("\"%10.4e\"",-2.342E-02); ++ compare("\"%11.4e\"",-2.342E-02); ++ compare("\"%12.4e\"",-2.342E-02); ++ compare("\"%13.4e\"",-2.342E-02); ++ compare("\"%14.4e\"",-2.342E-02); ++ compare("\"%15.4e\"",-2.342E-02); ++ compare("\"%16.4e\"",-2.342E-02); ++ compare("\"%16.4e\"",-2.342E-22); ++ compare("\"%G\"",-2.342E-02); ++ compare("\"%G\"",3.1415e-6); ++ compare("%016e", 3141.5); ++ compare("%16e", 3141.5); ++ compare("%-16e", 3141.5); ++ compare("%010.3e", 3141.5); ++ ++ compare("*%5f*", 3.3); ++ compare("*%5f*", 3.0); ++ compare("*%5f*", .999999E-4); ++ compare("*%5f*", .99E-3); ++ compare("*%5f*", 3333.0); ++ ++ compare("*%5g*", 3.3); ++ compare("*%5g*", 3.0); ++ compare("*%5g*", .999999E-4); ++ compare("*%5g*", .99E-3); ++ compare("*%5g*", 3333.0); ++ compare("*%5g*", 0.01); ++ ++ compare("*%5.g*", 3.3); ++ compare("*%5.g*", 3.0); ++ compare("*%5.g*", .999999E-4); ++ compare("*%5.g*", 1.0E-4); ++ compare("*%5.g*", .99E-3); ++ compare("*%5.g*", 3333.0); ++ compare("*%5.g*", 0.01); ++ ++ compare("*%5.2g*", 3.3); ++ compare("*%5.2g*", 3.0); ++ compare("*%5.2g*", .999999E-4); ++ compare("*%5.2g*", .99E-3); ++ compare("*%5.2g*", 3333.0); ++ compare("*%5.2g*", 0.01); ++ ++ return 0; ++} +diff -up ghostscript-9.07/trio/configure.in.gs_sprintf ghostscript-9.07/trio/configure.in +--- ghostscript-9.07/trio/configure.in.gs_sprintf 2013-05-09 17:02:39.101447236 +0100 ++++ ghostscript-9.07/trio/configure.in 2013-05-09 17:02:39.101447236 +0100 +@@ -0,0 +1,54 @@ ++dnl ++dnl Configuration for trio ++dnl ++ ++AC_INIT ++AC_CONFIG_SRCDIR([triodef.h]) ++AC_PREREQ(2.55) dnl autoconf 2.55 was released in 2002 ++ ++AC_PROG_CC ++ifdef([AC_PROG_CC_STDC], [AC_PROG_CC_STDC]) ++AC_LANG([C]) ++ ++AC_PROG_INSTALL ++AC_PROG_RANLIB ++ ++dnl ++dnl Alpha floating-point compiler option. ++dnl ++ ++AC_MSG_CHECKING(for IEEE compilation options) ++AC_CACHE_VAL(ac_cv_ieee_option, [ ++ AC_COMPILE_IFELSE(AC_LANG_PROGRAM(,[[[ ++ #if !(defined(__alpha) && (defined(__DECC) || defined(__DECCXX) || (defined(__osf__) && defined(__LANGUAGE_C__))) && (defined(VMS) || defined(__VMS))) ++ # error "Option needed" ++ typedef int option_needed[-1]; ++ #endif ++ ]]]), ++ ac_cv_ieee_option="/IEEE_MODE=UNDERFLOW_TO_ZERO/FLOAT=IEEE", ++ AC_COMPILE_IFELSE(AC_LANG_PROGRAM(,[[[ ++ #if !(defined(__alpha) && (defined(__DECC) || defined(__DECCXX) || (defined(__osf__) && defined(__LANGUAGE_C__) && !defined(__GNUC__))) && !(defined(VMS) || defined(__VMS)) && !defined(_CFE)) ++ # error "Option needed" ++ typedef int option_needed[-1]; ++ #endif ++ ]]]), ++ ac_cv_ieee_option="-ieee", ++ AC_COMPILE_IFELSE(AC_LANG_PROGRAM(,[[[ ++ #if !(defined(__alpha) && (defined(__GNUC__) && (defined(__osf__) || defined(__linux__)))) ++ # error "Option needed" ++ typedef int option_needed[-1]; ++ #endif ++ ]]]), ++ ac_cv_ieee_option="-mieee", ++ ac_cv_ieee_option="none" ++ ) ++ ) ++ ) ++]) ++AC_MSG_RESULT($ac_cv_ieee_option) ++if test $ac_cv_ieee_option != none; then ++ CFLAGS="${CFLAGS} ${ac_cv_ieee_option}" ++fi ++ ++AC_CONFIG_FILES([Makefile]) ++AC_OUTPUT +diff -up ghostscript-9.07/trio/doc/doc_dynamic.h.gs_sprintf ghostscript-9.07/trio/doc/doc_dynamic.h +--- ghostscript-9.07/trio/doc/doc_dynamic.h.gs_sprintf 2013-05-09 17:02:39.102447240 +0100 ++++ ghostscript-9.07/trio/doc/doc_dynamic.h 2013-05-09 17:02:39.102447240 +0100 +@@ -0,0 +1,31 @@ ++/************************************************************************* ++ * ++ * $Id: doc_dynamic.h,v 1.1 2001/12/27 17:29:20 breese Exp $ ++ * ++ * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ++ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND ++ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. ++ * ++ ************************************************************************/ ++ ++/** @addtogroup DynamicStrings Dynamic String Functions. ++Dynamic string functions. ++ ++@b SYNOPSIS ++ ++@verbatim ++cc ... -ltrio -lm ++ ++#include ++@endverbatim ++ ++@b DESCRIPTION ++ ++*/ +diff -up ghostscript-9.07/trio/doc/doc.h.gs_sprintf ghostscript-9.07/trio/doc/doc.h +--- ghostscript-9.07/trio/doc/doc.h.gs_sprintf 2013-05-09 17:02:39.102447240 +0100 ++++ ghostscript-9.07/trio/doc/doc.h 2013-05-09 17:02:39.102447240 +0100 +@@ -0,0 +1,172 @@ ++/************************************************************************* ++ * ++ * $Id: doc.h,v 1.20 2006/08/18 11:32:08 breese Exp $ ++ * ++ * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ++ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND ++ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. ++ * ++ ************************************************************************/ ++ ++/** ++@mainpage ++ ++@author Bjørn Reese ++@author Daniel Stenberg ++ ++@section intro Introduction ++ ++Trio is a fully matured and stable set of printf and string functions ++designed be used by applications with focus on portability or with the ++need for additional features that are not supported by standard stdio ++implementation. ++ ++There are several cases where you may want to consider using trio: ++ ++@li Portability across heterogeneous platforms. ++@li Embedded systems without stdio support. ++@li Extendability of unsupported features. ++@li Your native version does not do everything you need. ++ ++When you write applications that must be portable to a wide range of ++platforms you often have to deal with inadequate implementations of the ++stdio library functions. Most notably is the lack of secure formatting ++functions, such as snprintf, or the lack of parameter reordering commonly ++used for the internationalization of applications, such as the $ ++modifier. Sometimes the feature you need is simply not present in stdio. ++So you end up spending much effort on determining which platforms supports ++what, and to write your own versions of various features. This is where ++trio can help you. Trio is a platform-independent implementation of the ++stdio printf and scanf functions and the string library functions. ++ ++The functionality described in the stdio standards is a compromise, and ++does unfortunately not include a mechanism to extend the functionality for ++an individual application. Oftentimes an application has the need for an ++extra feature, and the application code can become much more clear and ++readable by using an extension mechanism. Trio supports a range of useful ++extensions such as user-defined specifiers, passing of arguments in arrays, ++localized string scanning, thousand-separators, and arbitrary integer bases. ++ ++Trio fully implements the C99 (ISO/IEC 9899:1999) and UNIX98 (the Single ++Unix Specification, Version 2) standards, as well as many features from ++other implemenations, e.g. the GNU libc and BSD4. ++ ++@section examples Examples ++ ++@subsection ex1 Binary Numbers ++Output an integer as a binary number using a trio extension. ++@verbatim ++ trio_printf("%..2i\n", number); ++@endverbatim ++ ++@subsection ex2 Thousand-separator ++Output a number with thousand-separator using a trio extension. ++@verbatim ++ trio_printf("%'f\n", 12345.6); ++@endverbatim ++The thousand-separator described by the locale is used. ++ ++@subsection ex3 Fixed Length Array and Sticky Modifier ++Output an fixed length array of floating-point numbers. ++@verbatim ++ double array[] = {1.0, 2.0, 3.0}; ++ printf("%.2f %.2f %.2f\n", array[0], array[1], array[2]); ++@endverbatim ++The same with two trio extensions (arguments are passed in an array, and ++the first formatting specifier sets the sticky option so we do not have ++to type all the formatting modifiers for the remaining formatting specifiers) ++@verbatim ++ trio_printfv("%!.2f %f %f\n", array); ++@endverbatim ++Another, and more powerful, application of being able to pass arguments in ++an array is the creation of the printf/scanf statement at run-time, where ++the formatting string, and thus the argument list, is based on an external ++configuration file. ++ ++@subsection ex4 Localized scanning ++Parse a string consisting of one or more upper-case alphabetic characters ++followed by one or more numeric characters. ++@verbatim ++ sscanf(buffer, "%[A-Z]%[0-9]", alphabetic, numeric); ++@endverbatim ++The same but with locale using a trio extension. ++@verbatim ++ trio_sscanf(buffer, "%[[:upper:]]%[[:digit:]]", alphabetic, numeric); ++@endverbatim ++ ++@section legal Legal Issues ++Trio is distributed under the following license, which allows practically ++anybody to use it in almost any kind of software, including proprietary ++software, without difficulty. ++ ++"Copyright (C) 1998-2001 Bjorn Reese and Daniel Stenberg. ++ ++Permission to use, copy, modify, and distribute this software for any ++purpose with or without fee is hereby granted, provided that the above ++copyright notice and this permission notice appear in all copies. ++ ++THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ++WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ++MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND ++CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER." ++ ++@section contribution Contribution ++ ++@subsection contribute Contribute ++We appreciate any type of contribution, from ideas over improvements to ++error corrections. ++ ++The project space contains references to bug and feature tracking, ++mailing-list, and the CVS repository. We prefer communication via the ++mailing-list, but do not require you to be subscribed, because trio is a ++small project. ++ ++The project space is located at http://sourceforge.net/projects/ctrio/ ++ ++@subsection contributors Contributors ++We have received contributions from the following persons (in alphabetic ++order sorted by surname) ++ ++@li Craig Berry ++@li Karl Bochert ++@li Stan Boehm ++@li David Byron ++@li Brian Chapman ++@li Robert Collins ++@li Danny Dulai ++@li Bob Friesenhahn ++@li Jon Foster ++@li John Fotheringham ++@li Markus Henke ++@li Ken Gibson ++@li Paul Janzen ++@li Patrick Jessee ++@li Richard Jinks ++@li Tero Jänkä ++@li Howard Kapustein ++@li Rune Enggaard Lausen ++@li Mehdi Lavasani ++@li Alexander Lukyanov ++@li Andreas Maus ++@li Mikey Menezes ++@li Emmanuel Mogenet ++@li Jacob Navia ++@li Jose Ortiz ++@li Joe Orton ++@li Gisli Ottarsson ++@li Mark Pickelmann ++@li Olli Savia ++@li Shaun Tancheff ++@li Marc Werwerft ++@li Igor Zlatkovic ++ ++Please let us know, and accept our apology, if we have omitted anybody. ++ ++*/ +diff -up ghostscript-9.07/trio/doc/doc_printf.h.gs_sprintf ghostscript-9.07/trio/doc/doc_printf.h +--- ghostscript-9.07/trio/doc/doc_printf.h.gs_sprintf 2013-05-09 17:02:39.102447240 +0100 ++++ ghostscript-9.07/trio/doc/doc_printf.h 2013-05-09 17:02:39.102447240 +0100 +@@ -0,0 +1,532 @@ ++/************************************************************************* ++ * ++ * $Id: doc_printf.h,v 1.5 2008/10/12 12:09:51 breese Exp $ ++ * ++ * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ++ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND ++ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. ++ * ++ ************************************************************************/ ++ ++/** @addtogroup Printf Formatted Printing Functions. ++Variations of formatted printing functions. ++ ++@b SYNOPSIS ++ ++@verbatim ++cc ... -ltrio -lm ++ ++#include ++@endverbatim ++ ++@b DESCRIPTION ++ ++This documentation is incomplete. ++The documentation of the printf family in [C99] and [UNIX98] also applies ++to the trio counterparts. ++ ++All these functions outputs a string which is formatted according to the ++@p format string and the consecutive arguments. The @p format string is ++described in the Formatting section below. ++ ++@ref trio_printf, @ref trio_vprintf, and @ref trio_printfv writes the ++output to the standard output stream (stdout). ++ ++@ref trio_fprintf, @ref trio_vfprintf, and @ref trio_fprintfv writes the ++output to a given output stream. ++ ++@ref trio_dprintf, @ref trio_vdprintf, and @ref trio_dprintfv writes the ++output to a file descriptor (this includes, for example, sockets). ++ ++@ref trio_sprintf, @ref trio_vsprintf, and @ref trio_sprintfv writes the ++output into @p buffer. ++ ++@ref trio_snprintf, @ref trio_vsnprintf, and @ref trio_snprintfv writes @p ++max - 1 characters into @p buffer followed by a terminating zero character. ++If @p max is 1, then @p buffer will be an empty string. If @p max is 0, ++then @p buffer is left untouched, and can consequently be NULL. The number ++of characters that would have been written to @p buffer, had there been ++sufficient space, is returned. ++ ++@ref trio_snprintfcat appends the formatted text at the end of @p buffer. ++ ++@ref trio_asprintf, @ref trio_vasprintf, and @ref trio_asprintfv allocates ++and returns an allocated string in @p buffer containing the formatted text. ++ ++@b FORMATTING ++ ++The @p format string can contain normal text and conversion indicators. ++The normal text can be any character except the nil character (\000 = ++'\0') and the percent character (\045 = '%'). Conversion indicators ++consists of an indication character (%), followed by zero or more conversion ++modifiers, and exactly one conversion specifier. ++ ++@b Modifiers ++ ++Some modifiers exhibit the same behaviour for all specifiers, other modifiers ++indicate different behaviours for different specifiers, and other modifiers ++are only applicable to certain specifiers. The relationship is described for ++each modifier. The number 9 is used to denotes an arbitrary integer. ++ ++@em Positional ( @c 9$ ) [UNIX98] ++ ++Normally the arguments supplied to these functions are interpreted ++incrementially from left to right. Arguments can be referenced specifically in ++the format string. The modifier n$ selects the nth argument. The first ++argument is referred as 1$. If this modifier is used, it must be the first ++modifier after the indication character. n$ can also be used for argument ++width, precision, and base. ++ ++The performance penalty of using positionals is almost neglible (contrary to ++most other printf implementations). ++ ++@li @em Reference @em Mix. ++Mixing normal and positional specifiers is allowed [TRIO]. For example, ++@verbatim ++ trio_printf("%d %3$d %2$d\n", 1, 2, 3); ++@endverbatim ++results in ++@verbatim ++ 1 3 2 ++@endverbatim ++Arguments for the printf family are passed on the stack. On most platforms it ++is not possible to determine the size of individual stack elements, so it is ++essential that the format string corresponds exactly to the passed arguments. ++If this is not the case, incorrect values may be put into the result. ++ ++@li @em Reference @em Gap. ++For the same reason it is also essential that the format string does not ++contain any "gaps" in the positional arguments. For example, ++@verbatim ++ trio_printf("%1$d %3$d\n", 1, 2, 3); ++@endverbatim ++is NOT allowed. The format string parser has no knowledge about whether the ++second argument is, say, an integer or a long double (which have different ++sizes). ++@verbatim ++@endverbatim ++[UNIX98] describes this as unspecified behaviour. [TRIO] will detect reference ++gaps and return an error. ++ ++@li @em Double @em Reference. ++It is also not allowed to reference an argument twice or more. For example, ++@verbatim ++ trio_printf("%1$d %1$lf\n", 1); ++@endverbatim ++is NOT allowed, because it references the first argument as two differently ++sized objects. ++@verbatim ++@endverbatim ++[UNIX98] describes this as unspecified behaviour. [TRIO] will detect double ++references and return an error. ++ ++The following two statements are equivalent ++@verbatim ++ trio_printf("|%d %s\n|", 42, "meanings"); ++ |42 meanings| ++ ++ trio_printf("|%1$d %2$s|\n", 42, "meanings"); ++ |42 meanings| ++@endverbatim ++ ++@em Width ( @c 9 ) ++ ++Specifies the minimum width of a field. If the fields has less characters than ++specified by the width, the field will be left adjusted and padded by spaces. ++The adjustment and padding can be changed by the Alignment ( @c - ) and ++Padding ( @c 0 ) modifiers. ++ ++The width is specified as a number. If an asterix ( @c * ) is used instead, the ++width will be read from the argument list. ++ ++Prefixes, such as 0x for hexadecimal integers, are part of width. ++@verbatim ++ trio_printf("|%10i|\n", 42); ++ | 42| ++@endverbatim ++ ++@em Precision ( @c .9 ) ++ ++The precision has different semantics for the various data types. ++The precision specifies the maximum number of printed characters for strings, ++the number of digits after the decimal-point for floating-point numbers, ++the number of significant digits for the @c g (and @c G) representation of ++floating-point numbers, the minimum number of printed digits for integers. ++@verbatim ++ trio_printf("|%10.8i|%.8i|\n", 42, 42); ++ | 00000042|00000042| ++@endverbatim ++ ++@em Base ( @c ..9 ) [TRIO] ++ ++Sets the base that the associated integer must be converted to. The base can ++be between 2 and 36 (both included). ++@verbatim ++ trio_printf("|%10.8.2i|%10..2i|%..2i|\n", 42, 42, 42); ++ | 00101010| 101010|101010| ++ ++ trio_printf("|%*.8.*i|\n", 10, 2, 42); ++ | 00101010| ++@endverbatim ++ ++@em Padding ( @c 0 ) ++ ++Integer and floating point numbers are prepended by zeros. The number of ++leading zeros are determined by the precision. If precision is not present, ++width is used instead. ++ ++@em Short ( @c h ) ++ ++Integer arguments are read as an ( @c unsigned ) @c short @c int. String ++and character arguments are read as @c char @c * and @c char respectively. ++ ++@em Short @em short ( @c hh ) [C99, GNU] ++ ++The argument is read as an ( @c unsigned ) @c char. ++ ++@em Fixed @em Size ( @c I ) [MSVC] ++ ++The argument is read as a fixed sized integer. The modifier is followed by ++a number, which specifies the number of bits in the integer, and can be one ++of the following ++ ++@li @c I8 ++@li @c I16 ++@li @c I32 ++@li @c I64 (if 64-bits integers are supported) ++ ++Works only for integers (i, u, d, o, x, X) ++ ++@em Largest ( @c j ) [C99] ++ ++The argument is read as an @c intmax_t / @c uintmax_t, which is defined to ++be the largest signed/unsigned integer. ++ ++@em Long ( @c l ) ++ ++An integral argument is read as an ( @c unsigned ) @c long @c int. A string ++argument is read as a @c wchar_t @c *, and output as a multi-byte character ++sequence. ++ ++@em Long @em long ( @c ll ) [C99, UNIX98, GNU] ++ ++The argument is read as an ( @c unsigned ) @c long @c long @c int. ++ ++@em Long @em double ( @c L ) [C99, UNIX98, GNU] ++ ++The argument is read as a @c long @c double. ++ ++@em ptrdiff_t ( @c t ) [C99] ++ ++The argument is read as a @c ptrdiff_t, which is defined to be the signed ++integer type of the result of subtracting two pointers. ++ ++@em Quad ( @c q ) [BSD, GNU] ++ ++Corresponds to the long long modifier ( @c ll ). ++ ++@em Wide ( @c w ) [MISC] ++ ++For a string argument this is equivalent to using the long modifier ( @c l ). ++ ++@em size_t ( @c z ) [C99] ++ ++The argument is read as a @c size_t, which is defined to be the type ++returned by the @c sizeof operator. ++ ++@em size_t ( @c Z ) [GNU] ++ ++Corresponds to the size_t modifier ( @c z ). ++ ++@em Alternative ( @c # ) ++ ++Prepend radix indicator for hexadecimal, octal, and binary integer numbers ++and for pointers. ++Always add a decimal-point for floating-point numbers. ++Escape non-printable characters for strings. ++ ++@em Spacing ( ) ++ ++Prepend leading spaces when necessary. ++ ++@em Sign ( @c + ) ++ ++Always prepend a sign to numbers. Normally only the negative sign is prepended ++to a number. With this modifier the positive sign may also be prepended. ++ ++@em Alignment ( @c - ) ++ ++The output will be left-justified in the field specified by the width. ++ ++@em Argument ( @c * ) ++ ++Width, precision, or base is read from the argument list, rather than from ++the formatting string. ++ ++@em Quote / @em Grouping ( @c ' ) [MISC] ++ ++Groups integers and the integer-part of floating-point numbers according to ++the locale. Quote strings and characters. ++ ++@em Sticky ( @c ! ) [TRIO] ++ ++The modifiers listed for the current specifier will be reused by subsequent ++specifiers of the same group. ++The following specifier groups exists ++@li Integer ( @c i, @c u, @c d, @c o, @c x, @c X ) ++@li Floating-point ( @c f, @c F, @c e, @c E, @c g, @c G, @c a, @c A ) ++@li Character ( @c c ) ++@li String ( @c s ) ++@li Pointer ( @c p ) ++@li Count ( @c n ) ++@li Errno ( @c m ) ++@li Group ( @c [] ) ++ ++The sticky modifiers are active until superseeded by other sticky modifiers, ++or the end of the format string is reached. ++Local modifiers overrides sticky modifiers for the given specifier only. ++@verbatim ++ trio_printf("|%!08#x|%04x|%x|\n", 42, 42, 42); ++ |0x00002a|0x2a|0x00002a| ++@endverbatim ++ ++@b Specifiers ++ ++@em Percent ( @c % ) ++ ++Produce a percent ( @c % ) character. This is used to quote the indication ++character. No modifiers are allowed. ++The full syntax is @c %%. ++@verbatim ++ trio_printf("Percent is %%\n"); ++ Percent is % ++@endverbatim ++ ++@em Hex @em floats ( @c a, @c A ) [C99] ++ ++Output a hexadecimal (base 16) representation of a floating point number. The ++number is automatically preceeded by @c 0x ( or @c 0X ). The exponent is ++@c p ( or @c P ). ++@verbatim ++ trio_printf("|%a|%A|\n", 3.1415, 3.1415e20); ++ |0x3.228bc|0X3.228BCP+14| ++@endverbatim ++ ++@em Binary @em numbers ( @c b, @c B ) [MISC - SCO UnixWare 7] ++ ++DEPRECATED: Use Base modifier @c %..2i instead. ++ ++@em Character ( @c c ) ++ ++Output a single character. ++ ++@li Quote ( @c ' ) [TRIO]. ++Quote the character. ++ ++@em Decimal ( @c d ) ++ ++Output a decimal (base 10) representation of a number. ++ ++@li Grouping ( @c ' ) [TRIO]. ++The number is separated by the locale thousand separator. ++@verbatim ++ trio_printf("|%'ld|\n", 1234567); ++ |1,234,567| ++@endverbatim ++ ++@em Floating-point ( @c e, @c E) ++ ++Output a decimal floating-point number. ++The style is @c [-]9.99e[-]9, where ++@li @c [-]9.99 is the mantissa (as described for the @c f, @c F specifier), and ++@li @c e[-]9 is the exponent indicator (either @c e or @c E, depending on the ++floating-point specifier), followed by an optional sign and the exponent ++ ++If the precision is wider than the maximum number of digits that can be ++represented by the floating-point unit, then the number will be adequately ++rounded. For example, assuming DBL_DIG is 15 ++@verbatim ++ trio_printf("|%.18e|\n", (1.0 / 3.0)); ++ |3.333333333333333000e-01| ++@endverbatim ++ ++@em Floating-point ( @c f, @c F ) ++ ++Output a decimal floating-point number. ++The style is @c [-]9.99, where ++@li @c [-] is an optional sign (either @c + or @c -), ++@li @c 9 is the integer-part (possibly interspersed with thousand-separators), ++@li @c . is the decimal-point (depending on the locale), and ++@li @c 99 is the fractional-part. ++ ++If more digits are needed to output the number, than can be represented with ++the accuracy of the floating-point unit, then the number will be adequately ++rounded. For example, assuming that DBL_DIG is 15 ++@verbatim ++ trio_printf("|%f|\n", (2.0 / 3.0) * 1E18); ++ |666666666666666700.000000| ++@endverbatim ++ ++The following modifiers holds a special meaning for this specifier ++@li Alternative ( @c # ) [C99]. ++Add decimal point. ++@li Grouping ( @c ' ) [TRIO]. ++Group integer part of number into thousands (according to locale). ++ ++@em Floating-point ( @c g, @c G) ++ ++Output a decimal floating-point representation of a number. The format of ++either the @c f, @c F specifier or the @c e, @c E specifier is used, whatever ++produces the shortest result. ++ ++@em Integer ( @c i ) ++ ++Output a signed integer. Default base is 10. ++ ++@em Errno ( @c m ) [GNU] ++ ++@em Count ( @c n ) ++ ++Insert into the location pointed to by the argument, the number of octets ++written to the output so far. ++ ++@em Octal ( @c o ) ++ ++Output an octal (base 8) representation of a number. ++ ++@em Pointer ( @c p ) ++ ++Ouput the address of the argument. The address is printed as a hexadecimal ++number. If the argument is the NULL pointer the text @c (nil) will be used ++instead. ++@li Alternative ( @c # ) [TRIO]. ++Prepend 0x ++ ++@em String ( @c s, @c S ) ++ ++Output a string. The argument must point to a zero terminated string. If the ++argument is the NULL pointer the text @c (nil) will be used instead. ++@c S is equivalent to @c ls. ++@li Alternative ( @c # ) [TRIO]. ++Escape non-printable characters. ++ ++Non-printable characters are converted into C escapes, or hexadecimal numbers ++where no C escapes exists for the character. The C escapes, the hexadecimal ++number, and all backslashes are prepended by a backslash ( @c \ ). ++The supported C escapes are ++@li @c \a (\007) = alert ++@li @c \b (\010) = backspace ++@li @c \f (\014) = formfeed ++@li @c \n (\012) = newline ++@li @c \r (\015) = carriage return ++@li @c \t (\011) = horizontal tab ++@li @c \v (\013) = vertical tab ++ ++@verbatim ++ trio_printf("|One %s Three|One %'s Three|\n", "Two", "Two"); ++ |One Two Three|One "Two" Three| ++ ++ trio_printf("|Argument missing %s|\n", NULL); ++ |Argument missing (nil)| ++ ++ trio_printf("|%#s|\n", "\007 \a."); ++ |\a \a.| ++@endverbatim ++ ++@em Unsigned ( @c u ) ++ ++Output an unsigned integer. Default base is 10. ++ ++@em Hex ( @c x, @c X ) ++ ++Output a hexadecimal (base 16) representation of a number. ++ ++@li Alternative ( @c # ). ++Preceed the number by @c 0x ( or @c 0X ). The two characters are counted ++as part of the width. ++ ++@em User-defined ( @c <> ) ++ ++Invoke user-defined formatting. ++See @ref trio_register for further information. ++ ++@b RETURN @b VALUES ++ ++All functions returns the number of outputted characters. If an error occured ++then a negative error code is returned [TRIO]. Note that this is a deviation ++from the standard, which simply returns -1 (or EOF) and errno set ++appropriately. ++The error condition can be detected by checking whether the function returns ++a negative number or not, and the number can be parsed with the following ++macros. The error codes are primarily intended as debugging aide for the ++developer. ++ ++@li TRIO_EINVAL: Invalid argument. ++@li TRIO_ETOOMANY: Too many arguments. ++@li TRIO_EDBLREF: Double argument reference. ++@li TRIO_EGAP: Argument reference gap. ++@li TRIO_ENOMEM: Out of memory. ++@li TRIO_ERANGE: Invalid range. ++@li TRIO_ERRNO: The error is specified by the errno variable. ++ ++Example: ++@verbatim ++ int rc; ++ ++ rc = trio_printf("%r\n", 42); ++ if (rc < 0) { ++ if (TRIO_ERROR_CODE(rc) != TRIO_EOF) { ++ trio_printf("Error: %s at position %d\n", ++ TRIO_ERROR_NAME(rc), ++ TRIO_ERROR_POSITION(rc)); ++ } ++ } ++@endverbatim ++ ++@b SEE @b ALSO ++ ++@e trio_scanf, @e trio_register. ++ ++@b NOTES ++ ++The printfv family uses an array rather than the stack to pass arguments. ++This means that @c short @c int and @c float values will not be handled by ++the default argument promotion in C. Instead, these values must be explicitly ++converted with the Short (h) modifier in both cases. ++ ++Example: ++@verbatim ++ void *array[2]; ++ float float_number = 42.0; ++ short short_number = 42; ++ ++ array[0] = &float_number; ++ array[1] = &short_number; ++ ++ trio_printfv("%hf %hd\n", array); /* CORRECT */ ++ trio_printfv("%f %d\n", array); /* WRONG */ ++@endverbatim ++ ++@b CONFORMING @b TO ++ ++Throughout this document the following abbreviations have been used to ++indicate what standard a feature conforms to. If nothing else is indicated ++ANSI C (C89) is assumed. ++ ++@li [C89] ANSI X3.159-1989 ++@li [C99] ISO/IEC 9899:1999 ++@li [UNIX98] The Single UNIX Specification, Version 2 ++@li [BSD] 4.4BSD ++@li [GNU] GNU libc ++@li [MSVC] Microsoft Visual C ++@li [MISC] Other non-standard sources ++@li [TRIO] Extensions specific for this package ++ ++*/ +diff -up ghostscript-9.07/trio/doc/doc_register.h.gs_sprintf ghostscript-9.07/trio/doc/doc_register.h +--- ghostscript-9.07/trio/doc/doc_register.h.gs_sprintf 2013-05-09 17:02:39.102447240 +0100 ++++ ghostscript-9.07/trio/doc/doc_register.h 2013-05-09 17:02:39.102447240 +0100 +@@ -0,0 +1,384 @@ ++/************************************************************************* ++ * ++ * $Id: doc_register.h,v 1.3 2008/10/12 12:09:51 breese Exp $ ++ * ++ * Copyright (C) 2001 Bjorn Reese and Daniel Stenberg. ++ * ++ * Permission to use, copy, modify, and distribute this software for any ++ * purpose with or without fee is hereby granted, provided that the above ++ * copyright notice and this permission notice appear in all copies. ++ * ++ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR IMPLIED ++ * WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED WARRANTIES OF ++ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS AND ++ * CONTRIBUTORS ACCEPT NO RESPONSIBILITY IN ANY CONCEIVABLE MANNER. ++ * ++ ************************************************************************/ ++ ++/** @addtogroup UserDefined User-defined Formatted Printing Functions. ++Functions for using customized formatting specifiers. ++ ++@b SYNOPSIS ++ ++@verbatim ++cc ... -ltrio -lm ++ ++#include ++#include ++@endverbatim ++ ++@b DESCRIPTION ++ ++This documentation is incomplete. ++ ++@b User-defined @b Specifier ++ ++The user-defined specifier consists of a start character (\074 = '<'), an ++optional namespace string followed by a namespace separator (\072 = ':'), ++a format string, an optional skipping separator (\174 = '|'), and an end ++character (\076 = '>'). ++ ++The namespace string can consist of alphanumeric characters, and is used to ++define a named reference (see below). The namespace is case-sensitive. If no ++namespace is specified, then we use an unnamed reference (see below). ++ ++The format can consist of any character except the end character ('>'), the ++namespace separator (':'), the skipping separator ('|'), and the nil character ++(\000). ++ ++Any modifier can be used together with the user-defined specifier. ++ ++There are two formats for invoking a user-defined specifier. The first format ++is an extension of the normal printf/scanf formatting. It uses the percent ++character (\045 = '%') followed by optional qualifiers and a specifier. For ++example: ++ ++@verbatim ++ trio_printf("%\n", my_handle, my_data); ++@endverbatim ++ ++Some C compilers can issue a warning if there is a mismatch between specifiers ++and arguments. Unfortunately, these warnings does not work with the first ++format for user-defined specifiers. Therefore the second format has been ++introduced. The second format can only be applied to user-defined specifiers. ++ ++The second format starts with a dollar character (\044 = '$') instead of the ++percent character, and is followed by optional qualifiers and the user-defined ++specifier. If the specifier contains a pipe character (\174 = '|'), then ++everything between the pipe character and the end character ('>') is ignored. ++The ignored part can be used to list the normal specifiers that the C compiler ++uses to determine mismatches. For example: ++ ++@verbatim ++ trio_printf("$\n", my_handle, my_data); ++@endverbatim ++ ++@b Registering ++ ++A user-defined specifier must be registered before it can be used. ++Unregistered user-defined specifiers are ignored. The @ref trio_register ++function is used to register a user-defined specifier. It takes two argument, ++a callback function and a namespace, and it returns a handle. The handle must ++be used to unregister the specifier later. ++ ++The following example registers a user-define specifier with the "my_namespace" ++namespace: ++ ++@verbatim ++ my_handle = trio_register(my_callback, "my_namespace"); ++@endverbatim ++ ++There can only be one user-defined specifier with a given namespace. There ++can be an unlimited number (subject to maximum length of the namespace) of ++different user-defined specifiers. ++ ++Passing NULL as the namespace argument results in an anonymous reference. ++There can be an unlimited number of anonymous references. ++ ++@b REFERENCES ++ ++There are two ways that a registered callback can be called. Either the ++user-defined specifier must contain the registered namespace in the format ++string, or the handle is passed as an argument to the formatted printing ++function. ++ ++If the namespace is used, then a user-defined pointer must be passed as an ++argument: ++ ++@verbatim ++ trio_printf("%\n", my_data); ++@endverbatim ++ ++If the handle is used, then the user-defined specifier must not contain a ++namespace. Instead the handle must be passed as an argument, followed by a ++user-defined pointer: ++ ++@verbatim ++ trio_printf("%\n", my_handle, my_data); ++@endverbatim ++ ++The two examples above are equivalent. ++ ++There must be exactly one user-defined pointer per user-defined specifier. ++This pointer can be used within the callback function with the ++@ref trio_get_argument getter function (see below). ++ ++The format string is optional. It can be used within the callback function ++with the @ref trio_get_format getter function. ++ ++@b Anonymous @b References ++Anonymous references are specified by passing NULL as the namespace. ++ ++The handle must be passed as an argument followed by a user-defined pointer. ++No namespace can be specified. ++ ++@verbatim ++ anon_handle = trio_register(callback, NULL); ++ trio_printf("%\n", anon_handle, my_data); ++@endverbatim ++ ++@b Restrictions ++ ++@li The length of the namespace string cannot exceed 63 characters. ++@li The length of the user-defined format string cannot exceed 255 characters. ++@li User-defined formatting cannot re-define existing specifiers. ++This restriction was imposed because the existing formatting specifiers have ++a well-defined behaviour, and any re-definition would apply globally to an ++application (imagine a third-party library changing the behaviour of a ++specifier that is crusial to your application). ++ ++@b CALLBACK @b FUNCTION ++ ++The callback function will be called if a matching user-defined specifier ++is found within the formatting string. The callback function takes one input ++parameter, an opaque reference which is needed by the private functions. It ++returns an @c int, which is currently ignored. The prototype is ++ ++@verbatim ++ int (*trio_callback_t)(void *ref); ++@endverbatim ++ ++See the Example section for full examples. ++ ++@b PRINTING @b FUNCTIONS ++ ++The following printing functions must only be used inside a callback function. ++These functions will print to the same output medium as the printf function ++which invoked the callback function. For example, if the user-defined ++specifier is used in an sprintf function, then these print functions will ++output their result to the same string. ++ ++@b Elementary @b Printing ++ ++There are a number of function to print elementary data types. ++ ++@li @ref trio_print_int Print a signed integer. For example: ++@verbatim ++ trio_print_int(42); ++@endverbatim ++@li @ref trio_print_uint Print an unsigned integer. ++@li @ref trio_print_double Print a floating-point number. ++@li @ref trio_print_string Print a string. For example: ++@verbatim ++ trio_print_string("Hello World"); ++ trio_print_string(trio_get_format()); ++@endverbatim ++@li @ref trio_print_pointer Print a pointer. ++ ++@b Formatted @b Printing ++ ++The functions @ref trio_print_ref, @ref trio_vprint_ref, and ++@ref trio_printv_ref outputs a formatted string just like its printf ++equivalents. ++ ++@verbatim ++ trio_print_ref(ref, "There are %d towels\n", 42); ++ trio_print_ref(ref, "%\n", recursive_writer, trio_get_argument(ref)); ++@endverbatim ++ ++@b GETTER @b AND @b SETTER @b FUNCTIONS ++ ++The following getter and setter functions must only be used inside a callback ++function. They can either operate on the modifiers or on special data. ++ ++@b Modifiers ++ ++The value of a modifier, or a boolean indication of its presence or absence, ++can be found or set with the getter and setter functions. ++The generic prototypes of the these getter and setter functions are ++ ++@verbatim ++ int trio_get_???(void *ref); ++ void trio_set_???(void *ref, int); ++@endverbatim ++ ++where @c ??? refers to a modifier. For example, to get the width of the ++user-defined specifier use ++ ++@verbatim ++ int width = trio_get_width(ref); ++@endverbatim ++ ++@b Special @b Data ++ ++Consider the following user-defined specifier, in its two possible referencing ++presentations. ++ ++@verbatim ++ trio_printf("%\n", namespace_writer, argument); ++ trio_printf("%\n", argument); ++@endverbatim ++ ++@ref trio_get_format will get the @p format string, and ++@ref trio_get_argument} will get the @p argument parameter. ++There are no associated setter functions. ++ ++@b EXAMPLES ++ ++The following examples show various types of user-defined specifiers. Although ++each specifier is demonstrated in isolation, they can all co-exist within the ++same application. ++ ++@b Time @b Example ++ ++Print the time in the format "HOUR:MINUTE:SECOND" if "time" is specified inside ++the user-defined specifier. ++ ++@verbatim ++ static int time_print(void *ref) ++ { ++ const char *format; ++ time_t *data; ++ char buffer[256]; ++ ++ format = trio_get_format(ref); ++ if ((format) && (strcmp(format, "time") == 0)) { ++ data = trio_get_argument(ref); ++ if (data == NULL) ++ return -1; ++ strftime(buffer, sizeof(buffer), "%H:%M:%S", localtime(data)); ++ trio_print_string(ref, buffer); ++ } ++ return 0; ++ } ++@endverbatim ++ ++@verbatim ++ int main(void) ++ { ++ void *handle; ++ time_t now = time(NULL); ++ ++ handle = trio_register(time_print, "my_time"); ++ ++ trio_printf("%