]> granicus.if.org Git - graphviz/commitdiff
implement next 'gvputs_nonascii' function
authorMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 27 Nov 2021 21:54:28 +0000 (13:54 -0800)
committerMatthew Fernandez <matthew.fernandez@gmail.com>
Sat, 4 Dec 2021 06:11:30 +0000 (22:11 -0800)
This is based on `fig_string`, `mp_string`, and `pic_string`, but outputting
data directly into the output file rather than a temporary buffer.

Related to #2051.

CHANGELOG.md
lib/gvc/gvc.def
lib/gvc/gvdevice.c
lib/gvc/gvio.h

index d35708f12d0e61cad00209c460a58d65735be7d6..f5b8ca51d4ee637c7b2fe1734900be916367119f 100644 (file)
@@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
 
 - hard-coded lookup tables for fallback font metrics for more fonts and font
   variants
+- a new `gvputs_nonascii` API function has been implemented for GVC I/O with C
+  escaping
 
 ### Changed
 
index e9f87095051f0325443f2db573de0f70d3e51754..6ba3025950c654b1c9272113506e07a0b97ac10c 100644 (file)
@@ -149,6 +149,7 @@ gvprintpointf
 gvprintpointflist    
 gvputc    
 gvputs    
+gvputs_nonascii
 gvputs_xml
 gvRender    
 gvRenderData    
index de53cdefb38f272de6b1296957b435b78af228f1..40fce3c576798669d44539a97960cbbe4e4dbc49 100644 (file)
@@ -277,6 +277,18 @@ int gvputs_xml(GVJ_t *job, const char *s) {
   return xml_escape(s, flags, (int (*)(void *, const char *))gvputs, job);
 }
 
+void gvputs_nonascii(GVJ_t *job, const char *s) {
+  for (; *s != '\0'; ++s) {
+    if (*s == '\\') {
+      gvputs(job, "\\\\");
+    } else if (isascii((int)*s)) {
+      gvputc(job, *s);
+    } else {
+      gvprintf(job, "%03o", (unsigned)*s);
+    }
+  }
+}
+
 int gvputc(GVJ_t * job, int c)
 {
     const char cc = c;
index 1be27c037e0bd65d860791cc1c4a64fadd388495..eaf6fc65e841987c0b7a30e04391f7ad25e74978 100644 (file)
@@ -42,6 +42,9 @@ extern "C" {
     // `gvputs`, but XML-escape the input string
     GVIO_API int gvputs_xml(GVJ_t* job, const char *s);
 
+    // `gvputs`, C-escaping '\' and non-ASCII bytes
+    GVIO_API void gvputs_nonascii(GVJ_t* job, const char *s);
+
     GVIO_API int gvflush (GVJ_t * job);
     GVIO_API void gvprintf(GVJ_t * job, const char *format, ...);
     GVIO_API void gvprintdouble(GVJ_t * job, double num);