On Tue, May 02, 2023 at 09:34:43AM -0600, Todd C. Miller wrote: > On Tue, 02 May 2023 14:13:27 +0200, Claudio Jeker wrote: > > > Add a json_do_string() a function to print a JSON string. > > This function does the needed encoding of control chars and escape chars. > > I skipped the optional encoding of the forward slash (/) since this is > > only needed if the json output is embedded in HTML/SGML/XML. > > People putting JSON into such documents need to pass this through an extra > > step. > > Unless you can guarantee that other control characters cannot occur > you probably want to output them in unicode hex form. For example, > something like: > > default: > const char hex[] = "0123456789abcdef"; > if (iscntrl(c)) { > /* Escape control characters like \u0000 */ > if (!eb) > eb = fprintf(jsonfh, "\\u00%c%c", hex[c >> 4], > hex[c & 0x0f]) < 0; > }
I think this is not really needed. All strings are previously checked for any bad characters. In general I think covering more than \n, \r and \t makes little sense (but I added the other ones just for completeness). Maybe the best is to check but error out for iscntrl(c). > In this case you probably want to assign c as an unsigned char. > E.g. > > while ((c = (unsigned char)*v++) != '\0') { > ... > } > > Or better yet just declare c as unsigned char instead of int. Good point. I guess it is better to use unsigned char here. -- :wq Claudio